[alt.sources] Friendly UMASK wanted

maart@cs.vu.nl (Maarten Litmaath) (02/02/90)

In article <2069@syma.sussex.ac.uk>,
	andy@syma.sussex.ac.uk (Andy Clews) writes:
\...
\		umask go-rw

Csh:
	alias	mask    'set tmp="`/full/path/of/mask \!*`"; eval $tmp'

Sh (supporting shell functions):

	mask()
	{
		tmp="`/full/path/of/mask $*`" 
		eval $tmp 
	}

...mask being the following shell script hack (Perl, Randal?).

: This is a shar archive.  Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
: --------------------------- cut here --------------------------
PATH=/bin:/usr/bin:/usr/ucb
echo Extracting 'mask'
sed 's/^X//' > 'mask' << '+ END-OF-FILE ''mask'
X#!/bin/sh
X# @(#)mask 1.0 90/02/02 Maarten Litmaath
X# mask g-wx,o=
X# mask -s
X
XUSAGE="
Xname=`basename $0`
Xecho 'Usage: '\$name' mode' >&2
Xecho '   or: '\$name' [-s]' >&2
Xecho 'mode: a symbolic string like \`g-wx,o='\\' >&2
Xecho '  or: the equivalent octal number' >&2
Xecho 'see chmod(1)' >&2
Xexit 1
X"
X
Xcase $# in
X0)
X	echo echo `umask`
X	exit 0
X	;;
X1)
X	;;
X*)
X	eval "$USAGE"
Xesac
X
Xcase $1 in
X-s)
X	set `
X		umask | sed -e 's/^0*//' -e 's/^.$/0&/' -e 's/^..$/0&/' \
X			-e 's/./& /g'
X	`
X	modes_7=
X	modes_6=x
X	modes_5=w
X	modes_4=wx
X	modes_3=r
X	modes_2=rx
X	modes_1=rw
X	modes_0=rwx
X	eval echo echo u=\$modes_$1,g=\$modes_$2,o=\$modes_$3
X	exit 0
Xesac
X
Xexpr x"$1" : 'x.*[^0-9]' > /dev/null || {
X	echo umask "$1"
X	exit 0
X}
X
Xset `
X	echo x"$1" | sed -e 's/.//' -e 's/^[-+=]/a&/' \
X		-e 's/,\\([-+=]\\)/,a\\1/g' \
X		-e 's/[-=],/-rwx,/g' -e 's/[-=]$/-rwx/' \
X		-e 's/+,/+rwx,/g' -e 's/+$/+rwx/' -e 's/./& /g' -e 's/$/,/'
X`
X
Xu_r=r
Xu_w=w
Xu_x=x
Xg_r=r
Xg_w=w
Xg_x=x
Xo_r=r
Xo_w=w
Xo_x=x
X
Xgroups=
Xperms=
X
Xfor i
Xdo
X	case $i in
X	[ugo])
X		groups="$groups $i"
X		;;
X	a)
X		groups="u g o"
X		;;
X	[-+=])
X		op=$i
X		;;
X	[rwx])
X		perms="$perms $i"
X		;;
X	,)
X		for group in $groups
X		do
X			case $op in
X			=)
X				eval ${group}_r=_
X				eval ${group}_w=_
X				eval ${group}_x=_
X			esac
X			for perm in $perms
X			do
X				case $op in
X				-)
X					bit=_
X					;;
X				*)
X					bit=$perm
X				esac
X				eval ${group}_$perm=$bit
X			done
X		done
X		groups=
X		perms=
X		;;
X	*)
X		eval "$USAGE"
X	esac
Xdone
X
X___=7
X__x=6
X_w_=5
X_wx=4
Xr__=3
Xr_x=2
Xrw_=1
Xrwx=0
X
Xeval echo umask 0\${$u_r$u_w$u_x}\${$g_r$g_w$g_x}\${$o_r$o_w$o_x}
+ END-OF-FILE mask
chmod 'u=rwx,g=,o=' 'mask'
set `wc -c 'mask'`
count=$1
case $count in
1555)	:;;
*)	echo 'Bad character count in ''mask' >&2
		echo 'Count should be 1555' >&2
esac
exit 0
--
  What do the following have in common:  access(2), SysV echo, O_NONDELAY?  |
  Maarten Litmaath @ VU Amsterdam:  maart@cs.vu.nl,  uunet!mcsun!botter!maart