X-Git-Url: https://mattmccutchen.net/utils/utils.git/blobdiff_plain/40ea9b7868f2b7746e7cbabfba6aba982096392a..273c390351c42303171c25215304d1cfd6ca02d4:/setexec diff --git a/setexec b/setexec new file mode 100755 index 0000000..6f071eb --- /dev/null +++ b/setexec @@ -0,0 +1,42 @@ +#!/usr/bin/perl +# setexec: turns a file's executability on or off, same semantics as rsync's --executability +# usage: setexec { + | - | --reference= } [...] + +$cmd = $ARGV[0]; +shift @ARGV; + +if ($cmd =~ /^--reference=(.*)$/) { + $ref_file = $1; + @stbuf = stat($ref_file); + if (@stbuf == 0) { + die "setexec: stat($ref_file): $!\n"; + } + $ref_perms = $stbuf[2] & 07777; + if (($ref_perms & 0111) == 0) { + $cmd = '-'; + } else { + $cmd = '+'; + } +} elsif ($cmd ne '+' && $cmd ne '-') { + die "usage: setexec { + | - | --reference= } [...]\n"; +} + +sub docmd($$) { + my ($cmd, $perms) = @_; + if ($cmd eq '+') { + return $perms | ($perms & 0444) >> 2; + } elsif ($cmd eq '-') { + return $perms & ~0111; + } +} + +file: foreach $file (@ARGV) { + @stbuf = stat($file); + if (@stbuf == 0) { + warn "setexec: stat($file): $!, skipping file\n"; + next file; + } + $perms = $stbuf[2] & 07777; + $perms = docmd($cmd, $perms); + chmod($perms, $file) or warn "setexec: chmod($perms, $file): $!, skipping file\n"; +}