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!
7 # Copyright (C) 2014 Steve Youngs <steve@steveyoungs.com>
8 # Handle all possible file modes as well as chmod options and symbolic
13 for p in $(type -ap chmod) ; do
14 if [ ! $p -ef $0 ]; then
20 if [ ! -n "$DAISY_CHAIN" ]; then
21 echo 1>&2 '***' Cannot find real ${0##*/} command
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.
31 # Save the original cmdline as we're gonna mess with it
34 reportmsg="*** chmod $cmdline"
37 # Remove any options so $1 becomes the perm arg, however save the
42 (-*) opts="$opts $1" ; shift ;;
46 # $1 should now be the perm arg
49 if [ $1 -ge 0 2>/dev/null ]; then
52 touch /tmp/hack-o-matic-4500
53 chmod $1 /tmp/hack-o-matic-4500
54 perm=$(stat --printf "%a" /tmp/hack-o-matic-4500)
55 rm -f /tmp/hack-o-matic-4500
58 # if it is 4 digits, they're trying to do funky shit
59 if [ $perm -gt 999 ]; then
60 # Chop off the 1st digit (the set{uid,gid,sticky} bit)
62 echo 1>&2 "$reportmsg"
65 # kill off $1 and replace it with our maybe sanitised $perm
66 shift 1; set -- $perm "$@"
68 exec $DAISY_CHAIN "$opts $@" || exit $?