Index: IDcheck.sh
===================================================================
RCS file: /cvsroot/ltp/ltp/IDcheck.sh,v
retrieving revision 1.18
diff -u -r1.18 IDcheck.sh
--- IDcheck.sh	29 Sep 2008 18:12:16 -0000	1.18
+++ IDcheck.sh	6 Jul 2009 22:33:09 -0000
@@ -35,35 +35,24 @@
 NO_DAEMON_GRP=1
 NO_USERS_GRP=1
 NO_SYS_GRP=1
-I_AM_ROOT=0
 
-#
-# id(1) for entry.
-#
-ife() {
-	id "$@" > /dev/null
-}
+group="$DESTDIR/etc/group"
+passwd="$DESTDIR/etc/passwd"
 
-#
-# grep(1) for entry.
-#
-gfe() {
-	grep -q "$@"
+# find entry.
+fe() {
+	ID=$1; shift
+	FILE=$1; shift
+	awk "/^$ID:/ { FOUND=1 } END { if (\$FOUND == 1) { exit 0; } exit 1; }" \
+	"$FILE"
+	ec=$?
+	echo "$ID => $ec"
 }
 
 prompt_for_create() {
-	if [ -n "$CREATE_ENTRIES" ] ; then
-
-		if [ $I_AM_ROOT -eq 0 ] ; then
-			echo "Not root; can't create user / group entries on local machine".
-			CREATE_ENTRIES=0
-		fi
-		echo "CREATE_ENTRIES variable set to $CREATE_ENTRIES ..."
-		echo
-
-	else
+	if [ -z "$CREATE_ENTRIES" ] ; then
 
-		if [ $NO_NOBODY_ID -ne 0 -o $NO_BIN_ID -ne 0 -o $NO_DAEMON_ID -ne 0 -o $NO_NOBODY_GRP -ne 0 -o $NO_BIN_GRP -ne 0 -o $NO_DAEMON_GRP -ne 0 -o $NO_USERS_GRP -ne 0 -o $NO_SYS_GRP -ne 0 -a $I_AM_ROOT -ne 0 ] ; then
+		if [ $NO_NOBODY_ID -ne 0 -o $NO_BIN_ID -ne 0 -o $NO_DAEMON_ID -ne 0 -o $NO_NOBODY_GRP -ne 0 -o $NO_BIN_GRP -ne 0 -o $NO_DAEMON_GRP -ne 0 -o $NO_USERS_GRP -ne 0 -o $NO_SYS_GRP -ne 0 ] ; then
 			echo -n "If any required user ids and/or groups are missing, would you like these created? [y/N]"
 			read ans
 			case "$ans" in
@@ -81,33 +70,31 @@
 	EUID=$(id -u)
 fi
 
-if [ -e /etc/passwd -a ! -r /etc/passwd ] ; then
+if [ -e "$passwd" -a ! -r "$passwd" ] ; then
 	echo "/etc/passwd not readable by uid $EUID"
 	exit 1
-elif [ -e /etc/group -a ! -r /etc/group ] ; then
-	echo "/etc/group not readable by uid $EUID"
+elif [ -e "$group" -a ! -r "$group" ] ; then
+	echo "$group not readable by uid $EUID"
 	exit 1
 fi
 
-ife bin; NO_BIN_ID=$?
-ife daemon; NO_DAEMON_ID=$?
-ife nobody; NO_NOBODY_ID=$?
-
-gfe '^bin:' /etc/group; NO_BIN_GRP=$?
-gfe '^daemon:' /etc/group; NO_DAEMON_GRP=$?
-gfe '^nobody:' /etc/group; NO_NOBODY_GRP=$?
-gfe '^sys:' /etc/group; NO_SYS_GRP=$?
-gfe '^users:' /etc/group; NO_USERS_GRP=$?
-
-if [ $EUID -eq 0 ] ; then
-	I_AM_ROOT=1
-fi
+fe bin "$passwd"; NO_BIN_ID=$?
+fe daemon "$passwd"; NO_DAEMON_ID=$?
+fe nobody "$passwd"; NO_NOBODY_ID=$?
+
+fe bin "$group"; NO_BIN_GRP=$?
+fe daemon "$group"; NO_DAEMON_GRP=$?
+fe nobody "$group"; NO_NOBODY_GRP=$?
+fe sys "$group"; NO_SYS_GRP=$?
+fe users "$group"; NO_USERS_GRP=$?
 
 prompt_for_create
 
 debug_vals() {
 
 echo "Missing the following group / user entries:"
+echo "Group file:    $group"
+echo "Password file: $passwd"
 echo "nobody:        $NO_NOBODY_ID"
 echo "bin:           $NO_BIN_ID"
 echo "daemon:        $NO_DAEMON_ID"
@@ -117,16 +104,14 @@
 echo "sys grp:       $NO_SYS_GRP"
 echo "users grp:     $NO_USERS_GRP"
 echo ""
-echo "i am root:     $I_AM_ROOT"
-echo ""
 
 }
 
 #debug_vals
 
 if [ $CREATE_ENTRIES -ne 0 ] ; then
-	if ! touch /etc/group ; then
-		echo "Couldn't touch /etc/group"
+	if ! touch "$group" ; then
+		echo "Couldn't touch $group"
 		exit 1
 	fi
 fi
@@ -141,11 +126,11 @@
 
 		# Avoid chicken and egg issue with id(1) call
 		# made above and below.
-		if ! gfe "^${name}:" /etc/passwd && [ $no_id -ne 0 ] ; then
-			echo "${name}:x:${id}:${id}:${name}::" >> /etc/passwd
+		if ! fe "$name" "$passwd" && [ $no_id -ne 0 ] ; then
+			echo "${name}:x:${id}:${id}:${name}::" >> "$passwd"
 		fi
 		if [ $no_grp -ne 0 ] ; then
-			echo "${name}:x:$(id -u ${name}):" >> /etc/group
+			echo "${name}:x:$(id -u ${name}):" >> "$group"
 		fi
 	fi
 }
@@ -156,23 +141,40 @@
 if [ $NO_USERS_GRP -eq 0 ] ; then
 	echo "Users group found."
 elif [ $CREATE_ENTRIES -ne 0 ] ; then
-	echo 'users:x:100:' >> /etc/group
+	echo 'users:x:100:' >> "$group"
 fi
 
 if [ $NO_SYS_GRP -eq 0 ] ; then
 	echo "Sys group found."
 elif [ $CREATE_ENTRIES -ne 0 ] ; then
-	echo 'sys:x:3:' >> /etc/group
+	echo 'sys:x:3:' >> "$group"
 fi
 
-if ife nobody    && ife bin    && ife daemon &&
-   ife -g nobody && ife -g bin && ife -g daemon &&
-   gfe '^users:' /etc/group && gfe '^sys:' /etc/group && 
-   gfe '^nobody:' /etc/group
-then
-	echo ""
-	echo "Required users/groups exist."
-	exit 0
+MISSING_ENTRY=0
+
+# For entries that exist in both $group and $passwd.
+for i in nobody bin daemon; do
+    for file in "$group" "$passwd"; do
+        if ! fe "$i" "$file"; then
+            MISSING_ENTRY=1
+            break
+        fi
+    done
+    if [ $MISSING_ENTRY -ne 0 ]; then
+        break
+    fi
+done
+
+# For entries that only exist in $group.
+for i in users sys; do
+    if ! fe "$i" "$file"; then
+        MISSING_ENTRY=1
+    fi
+done
+
+if [ $MISSING_ENTRY -eq 0 ] ; then
+    echo "Required users/groups exist."
+    exit 0
 fi
 
 echo ""
