Module Name:    src
Committed By:   apb
Date:           Wed Aug 15 12:48:20 UTC 2012

Modified Files:
        src/usr.sbin/postinstall: postinstall

Log Message:
Don't rely on stat(1) with format "%SHr" to print the correct names.
That uses devname(3) internally, which doesn't work at all in a cross
build environment, and doesn't do what I thought even in a native
environment.

Instead, parse the device major numbers for the pty master and slave
devices from the output of "MAKEDEV -s pty0" and check those against the
actual device node that we are thinking of removing.


To generate a diff of this commit:
cvs rdiff -u -r1.144 -r1.145 src/usr.sbin/postinstall/postinstall

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.sbin/postinstall/postinstall
diff -u src/usr.sbin/postinstall/postinstall:1.144 src/usr.sbin/postinstall/postinstall:1.145
--- src/usr.sbin/postinstall/postinstall:1.144	Tue Aug 14 13:11:24 2012
+++ src/usr.sbin/postinstall/postinstall	Wed Aug 15 12:48:19 2012
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# $NetBSD: postinstall,v 1.144 2012/08/14 13:11:24 apb Exp $
+# $NetBSD: postinstall,v 1.145 2012/08/15 12:48:19 apb Exp $
 #
 # Copyright (c) 2002-2008 The NetBSD Foundation, Inc.
 # All rights reserved.
@@ -55,6 +55,7 @@
 : ${AWK:=awk}
 : ${DB:=db}
 : ${GREP:=grep}
+: ${HOST_SH:=sh}
 : ${MAKE:=make}
 : ${PWD_MKDB:=/usr/sbin/pwd_mkdb}
 : ${STAT:=stat}
@@ -1739,8 +1740,35 @@ do_ptyfsoldnodes()
 		return 0
 	fi
 
+	# Find the device major numbers for the pty master and slave
+	# devices, by parsing the output from "MAKEDEV -s pty0".
+	#
+	# Output from MAKEDEV looks like this:
+	# ./ttyp0 type=char device=netbsd,5,0 mode=666 gid=0 uid=0
+	# ./ptyp0 type=char device=netbsd,6,0 mode=666 gid=0 uid=0
+	#
+	# Output from awk, used in the eval statement, looks like this:
+	# maj_ptym=6; maj_ptys=5;
+	#
+	eval "$(
+	    ${HOST_SH} "${DEST_DIR}/dev/MAKEDEV" -s pty0 2>/dev/null \
+	    | ${AWK} '\
+	    BEGIN { before_re = ".*device=[a-zA-Z]*,"; after_re = ",.*"; }
+	    /ptyp0/ { maj_ptym = gensub(before_re, "", 1, $0);
+		      maj_ptym = gensub(after_re, "", 1, maj_ptym); }
+	    /ttyp0/ { maj_ptys = gensub(before_re, "", 1, $0);
+		      maj_ptys = gensub(after_re, "", 1, maj_ptys); }
+	    END { print "maj_ptym=" maj_ptym "; maj_ptys=" maj_ptys ";"; }
+	    '
+	    )"
+	#msg "Major numbers are maj_ptym=${maj_ptym} maj_ptys=${maj_ptys}"
+	if [ -z "$maj_ptym" ] || [ -z "$maj_ptys" ]; then
+		msg "Cannot find device major numbers for pty master and slave"
+		return 1
+	fi
+
 	# look for /dev/[pt]ty[p-zP-T][0-9a-zA-Z], and check that they
-	# are tty or pty device nodes.  ttyv* is typically not a
+	# have the expected device major numbers.  ttyv* is typically not a
 	# pty device, but we check it anyway.
 	#
 	# The "for d1" loop is intended to avoid overflowing ARG_MAX;
@@ -1753,9 +1781,13 @@ do_ptyfsoldnodes()
 	#
 	_ptyfs_tmp="$(mktemp /tmp/postinstall.ptyfs.XXXXXXXX)"
 	for d1 in p q r s t u v w x y z P Q R S T; do
-		${STAT} -f "%SHr %N" "${DEST_DIR}/dev/"[pt]ty${d1}? 2>&1
+		${STAT} -f "%Hr %N" "${DEST_DIR}/dev/"[pt]ty${d1}? 2>&1
 	done \
-	| ${AWK} '/^[pt]ty/ {print $2}' >"${_ptyfs_tmp}"
+	| while read -r major node ; do
+		case "$major" in
+		${maj_ptym}|${maj_ptys}) echo "$node" ;;
+		esac
+	done >"${_ptyfs_tmp}"
 
 	_desc="legacy device node"
 	while read node; do

Reply via email to