Import the remaining utilities.
[utils/utils.git] / setexec
... / ...
CommitLineData
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];
6shift @ARGV;
7
8if ($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
24sub 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
33file: 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}