cd `pwd`
#FILELIST=./filelist
MASTER=/usr/src/local/release/master.list

findperm()
{
	LSPERM=""
	LSUFIELD="-"
	LSGFIELD="-"
	PERM_ALL=`echo $LSLINE | cut -c2-10`
	case $PERM_ALL in
		rwxrwxrwx)
			LSPERM=777;;
		rwxrwxr-x)
			LSPERM=775;;
		rwxr-xr-x)
			LSPERM=755;;
		r-xr-xr-x)
			LSPERM=555;;
		--s--x--x)
			LSPERM=111
			LSUFIELD=u;;
		r-sr-xr-x)
			LSPERM=555
			LSUFIELD=u;;
		r-sr-sr-x)
			LSPERM=555
			LSUFIELD=u
			LSGFIELD=g;;
		--s--x--x)
			LSPERM=111
			LSUFIELD=u;;
		--x--x--x)
			LSPERM=111;;
		rw-rw-rw-)
			LSPERM=666;;
		rw-rw-r--)
			LSPERM=664;;
		rw-r--r--)
			LSPERM=644;;
		r--r--r--)
			LSPERM=444;;
		*)
			PERM_OWN=`echo $LSLINE | cut -c2-4`
			PERM_GRP=`echo $LSLINE | cut -c5-7`
			PERM_OTH=`echo $LSLINE | cut -c8-10`
			for PERM in PERM_OWN PERM_GRP PERM_OTH; do
				PERMTEMP=`eval echo \\$$PERM`
				case $PERMTEMP in
					rwx)
						eval $PERM=7;;
					rw-)
						eval $PERM=6;;
					r-x)
						eval $PERM=5;;
					r--)
						eval $PERM=4;;
					-wx)
						eval $PERM=3;;
					-w-)
						eval $PERM=2;;
					--x)
						eval $PERM=1;;
					---)
						eval $PERM=0;;
					??s)
						if [ $PERM = PERM_OWN ]; then
							LSUFIELD=u
						elif [ $PERM = PERM_GRP ]; then
							LSGFIELD=g
						else
							echo "\n***Permission error for file: $NAME"
							return 1
						fi
						case $PERMTEMP in
							rws)
								eval $PERM=7;;
							r-s)
								eval $PERM=5;;
							-ws)
								eval $PERM=3;;
							--s)
								eval $PERM=1;;
							*)
								echo "\n***Permission error for file: $NAME"
								return 1;;
						esac;;
					*)
						echo "\n***Invalid permission for file: $NAME"
				 		return 1;;
				esac
				LSPERM=`eval echo ${LSPERM}\\$${PERM}`
			done;;
	esac
	return 0
}

WFLAG=0
case $1 in
	-w|-W|-write|-WRITE)
		WFLAG=1;;
esac
IFS="
"
COUNT=1
TOTAL=`egrep -v '^:|NS|\..32|NONE|ROOT|3$' $MASTER | wc -l | awk '{ print $1 }'`
echo "\nProcessing $TOTAL lines:"

IFS='
'
for LINE in `egrep -v '^:|NS|\..32|NONE|ROOT|3$' $MASTER`; do
#for LINE in `egrep -v '^:|NS|\..32|NONE|ROOT|3$' $MASTER | awk '{ print $1 }'`; do
	#LINE=`grep "^$FILE[ 	].*" $MASTER`
	if [ $? -ne 0 ]; then
		echo "$NAME: NOT FOUND IN THE MASTER LIST"
		COUNT=`expr $COUNT + 1`
		continue
	fi
	echo "\r$COUNT: \c"
	NAME=`echo $LINE | awk '{ print $1 }'`
	if [ ! -b $NAME -a ! -c $NAME -a ! -d $NAME -a ! -f $NAME ]; then
		echo "$NAME: NOT FOUND"
		COUNT=`expr $COUNT + 1`
		continue
	fi
	LSLINE=`ls -ld $NAME`

	FIELD2=`echo $LINE | awk '{ print $2 }'`
	LISTTYPE=`echo $FIELD2 | cut -c1`
	if [ -f $NAME ]; then
		LSTYPE=-
	elif [ -b $NAME ]; then
		LSTYPE=b
	elif [ -c $NAME ]; then
		LSTYPE=c
	elif [ -d $NAME ]; then
		LSTYPE=d
	else
		LSTYPE=`echo $LSLINE | cut -c1`
	fi

	LISTUFIELD=`echo $FIELD2 | cut -c2`
	LISTGFIELD=`echo $FIELD2 | cut -c3`
	LISTPERM=`echo $FIELD2 | cut -c4-6`
	findperm
	if [ $? -ne 0 ]; then
		COUNT=`expr $COUNT + 1`
		continue
	fi

	LISTOWNER=`echo $LINE | awk '{ print $3 }'`
	LSOWNER=`echo $LSLINE | awk '{ print $3 }'`
	case $LSOWNER in
		root)
			LSOWNER=0;;
		daemon)
			LSOWNER=1;;
		bin)
			LSOWNER=2;;
		sys)
			LSOWNER=3;;
		adm)
			LSOWNER=4;;
		uucp)
			LSOWNER=5;;
		nuucp)
			LSOWNER=10;;
		rje)
			LSOWNER=18;;
		trouble)
			LSOWNER=70;;
		lp)
			LSOWNER=71;;
		*)
			LSOWNER=`grep "^${LSOWNER}:" /etc/passwd | cut -d":" -f3`;;
	esac

	LISTGROUP=`echo $LINE | awk '{ print $4 }'`
	LSGROUP=`echo $LSLINE | awk '{ print $4 }'`
	case $LSGROUP in
		root)
			LSGROUP=0;;
		other)
			LSGROUP=1;;
		bin)
			LSGROUP=2;;
		sys)
			LSGROUP=3;;
		adm)
			LSGROUP=4;;
		mail)
			LSGROUP=6;;
		daemon)
			LSGROUP=12;;
		*)
			LSGROUP=`grep "^${LSGROUP}:" /etc/group | cut -d":" -f3`;;
	esac

	if [ "$LISTTYPE" = b -o "$LISTTYPE" = c ]; then
		LSMAJ_MIN=`echo $LSLINE | awk '{ print $5 $6 }' | sed 's/[A-Z].*//'`
		LISTMAJ_MIN=`echo $LINE | awk '{ print $5 }'`
	fi

	ERROR=0
	if [ "$LISTTYPE" != "$LSTYPE" ]; then
		if [ $ERROR = 0 ]; then
			echo "$NAME: ***** TYPE ERROR *****"
		fi
		echo "$NAME (type: -/b/c/d):  Master list is $LISTTYPE, file system is $LSTYPE"
		ERROR=1
	fi

	if [ $LISTPERM != $LSPERM ]; then
		if [ $ERROR = 0 ]; then
			echo "$NAME: ERROR"
		fi
		echo "$NAME (mode):  Master list is $LISTPERM, file system is $LSPERM"
		if [ $WFLAG = 1 ]; then
			chmod $LISTPERM $NAME
			echo "chmod $LISTPERM $NAME"
		fi
		ERROR=1
	fi

	if [ $LISTUFIELD != $LSUFIELD ]; then
		if [ $ERROR = 0 ]; then
			echo "$NAME: ERROR"
		fi
		echo "$NAME (ufield):  Master list is $LISTUFIELD, file system is $LSUFIELD"
		if [ $WFLAG = 1 ]; then
			if [ $LISTUFIELD = u ]; then
				chmod u+s $NAME
				echo "chmod u+s $NAME"
			else
				chmod u-s $NAME
				echo "chmod u-s $NAME"
			fi
		fi
		ERROR=1
	fi

	if [ $LISTGFIELD != $LSGFIELD ]; then
		if [ $ERROR = 0 ]; then
			echo "$NAME: ERROR"
		fi
		echo "$NAME (gfield):  Master list is $LISTGFIELD, file system is $LSGFIELD"
		if [ $WFLAG = 1 ]; then
			if [ $LISTGFIELD = g ]; then
				chmod g+s $NAME
				echo "chmod g+s $NAME"
			else
				chmod g-s $NAME
				echo "chmod g-s $NAME"
			fi
		fi
		ERROR=1
	fi

	if [ "$LISTOWNER" != "$LSOWNER" ]; then
		if [ $ERROR = 0 ]; then
			echo "$NAME: ERROR"
		fi
		echo "$NAME (owner):  Master list is $LISTOWNER, file system is $LSOWNER"
		if [ $WFLAG = 1 ]; then
			chown $LISTOWNER $NAME
			echo "chown $LISTOWNER $NAME"
		fi
		ERROR=1
	fi

	if [ "$LISTGROUP" != "$LSGROUP" ]; then
		if [ $ERROR = 0 ]; then
			echo "$NAME: ERROR"
		fi
		echo "$NAME (group):  Master list is $LISTGROUP, file system is $LSGROUP"
		if [ $WFLAG = 1 ]; then
			chgrp $LISTGROUP $NAME
			echo "chgrp $LISTGROUP $NAME"
		fi
		ERROR=1
	fi

	if [ \( "$LISTTYPE" = b -o "$LISTTYPE" = c \) -a \( "$LISTMAJ_MIN" != "$LSMAJ_MIN" \) ]; then
		if [ $ERROR = 0 ]; then
			echo "$NAME: ERROR"
		fi
		echo "NAME (maj,min):  Master list is $LISTMIN, file system is $LSMAJ_MIN"
		ERROR=1
	fi
	if [ $ERROR = 0 ]; then
		echo $NAME is OK
	fi
	COUNT=`expr $COUNT + 1`
done
echo "\rDONE"
