e1aa49e1c65c8b10aea4c70185fb0586bb4f2857
[pkgusr] / usr / lib / pkgusr / chmod
1 #!/bin/bash
2 # Original...
3 # Copyright (c) 2004 Matthias S. Benkmann <article AT winterdrache DOT de>
4 # You may do everything with this code except misrepresent its origin.
5 # PROVIDED `AS IS' WITH ABSOLUTELY NO WARRANTY OF ANY KIND!
6
7 # Copyright (C) 2014 Steve Youngs <steve@steveyoungs.com>
8 #  Handle all possible file modes as well as chmod options and symbolic
9 #  modes.
10
11 DAISY_CHAIN=""
12
13 for p in $(type -ap chmod) ; do
14     if [ ! $p -ef $0 ]; then
15         DAISY_CHAIN=$p
16         break
17     fi
18 done
19
20 if [ ! -n "$DAISY_CHAIN" ]; then
21     echo 1>&2 '***' Cannot find real ${0##*/} command 
22     exit 1
23 fi
24
25 if [ $UID == 0 ]; then
26     echo 1>&2 '***' $(dirname $0) should not be in root\'s \$PATH
27     echo 1>&2 '***' call '"'$DAISY_CHAIN $@'"' directly.
28     exit 1
29 fi
30
31 # Save the original cmdline as we're gonna mess with it
32 cmdline="$@"
33
34 # Remove any options so $1 becomes the perm arg, however save the
35 # options for later
36 opts=""
37 while [ -n "$1" ]; do
38     case $1 in
39         (-*) opts="$opts $1" ; shift ;;
40         (*) break ;;
41     esac
42 done
43 # $1 should now be the perm arg
44
45 # Octal or symbolic?
46 printf '%d' $1 &>/dev/null
47 if [ $? -eq 0 ]; then
48     perm=$1
49 else
50     touch /tmp/hack-o-matic-4500
51     $DAISY_CHAIN $1 /tmp/hack-o-matic-4500
52     perm=$(stat --printf "%a" /tmp/hack-o-matic-4500)
53     rm -f /tmp/hack-o-matic-4500
54 fi
55
56 # if it is 4 digits, they're trying to do funky shit
57 if [ $perm -gt 999 ]; then
58     # Chop off the 1st digit (the set{uid,gid,sticky} bit)
59     perm=${perm/?/}
60     echo 1>&2 '***' chmod ${cmdline}
61 fi
62
63 # kill off $1 and replace it with our maybe sanitised $perm
64 shift 1; set -- $perm "$@"
65
66 exec $DAISY_CHAIN ${opts} $@ || exit $?
67 exit 0
68
69 # Local variables:
70 # sh-basic-offset: 4
71 # End: