Add web log analysis tools.
[utils/utils.git] / setexec
1 #!/usr/bin/perl
2 # setexec: turns a file's executability on or off, same semantics as rsync's --executability
3 # usage: setexec { + | - | --reference=<file> } <file> [...]
4
5 $cmd = $ARGV[0];
6 shift @ARGV;
7
8 if ($cmd =~ /^--reference=(.*)$/) {
9         $ref_file = $1;
10         @stbuf = stat($ref_file);
11         if (@stbuf == 0) {
12                 die "setexec: stat($ref_file): $!\n";
13         }
14         $ref_perms = $stbuf[2] & 07777;
15         if (($ref_perms & 0111) == 0) {
16                 $cmd = '-';
17         } else {
18                 $cmd = '+';
19         }
20 } elsif ($cmd ne '+' && $cmd ne '-') {
21         die "usage: setexec { + | - | --reference=<file> } <file> [...]\n";
22 }
23
24 sub docmd($$) {
25         my ($cmd, $perms) = @_;
26         if ($cmd eq '+') {
27                 return $perms | ($perms & 0444) >> 2;
28         } elsif ($cmd eq '-') {
29                 return $perms & ~0111;
30         }
31 }
32
33 file: foreach $file (@ARGV) {
34         @stbuf = stat($file);
35         if (@stbuf == 0) {
36                 warn "setexec: stat($file): $!, skipping file\n";
37                 next file;
38         }
39         $perms = $stbuf[2] & 07777;
40         $perms = docmd($cmd, $perms);
41         chmod($perms, $file) or warn "setexec: chmod($perms, $file): $!, skipping file\n";
42 }