From 74a992e86623819c938bb83c06614ff6ecd4982b Mon Sep 17 00:00:00 2001 From: apb Date: Wed, 15 Aug 2012 12:48:19 +0000 Subject: [PATCH] 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. --- usr.sbin/postinstall/postinstall | 40 ++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/usr.sbin/postinstall/postinstall b/usr.sbin/postinstall/postinstall index d3b402f38323..0eabf4f1ceeb 100755 --- a/usr.sbin/postinstall/postinstall +++ b/usr.sbin/postinstall/postinstall @@ -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