Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/netbsd-6]: src Pull up the following revisions(s) (requested by martin i...



details:   https://anonhg.NetBSD.org/src/rev/563195c201d0
branches:  netbsd-6
changeset: 774456:563195c201d0
user:      sborrill <sborrill%NetBSD.org@localhost>
date:      Wed Aug 15 17:36:46 2012 +0000

description:
Pull up the following revisions(s) (requested by martin in ticket #503):
        usr.sbin/postinstall/postinstall:       revision 1.142-1.145
        Makefile:                               revision 1.295-1.298

Make test for and removal of old pty device nodes more portable.

diffstat:

 Makefile                         |   15 +++-
 usr.sbin/postinstall/postinstall |  132 +++++++++++++++++++++-----------------
 2 files changed, 83 insertions(+), 64 deletions(-)

diffs (226 lines):

diff -r deca4893bc50 -r 563195c201d0 Makefile
--- a/Makefile  Wed Aug 15 15:34:04 2012 +0000
+++ b/Makefile  Wed Aug 15 17:36:46 2012 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: Makefile,v 1.291.2.1 2012/05/09 20:06:36 riz Exp $
+#      $NetBSD: Makefile,v 1.291.2.2 2012/08/15 17:36:46 sborrill Exp $
 
 #
 # This is the top-level makefile for building NetBSD. For an outline of
@@ -188,20 +188,27 @@
 .endif
 
 _POSTINSTALL=  ${.CURDIR}/usr.sbin/postinstall/postinstall
+_POSTINSTALL_ENV= \
+       AWK=${TOOL_AWK:Q}               \
+       DB=${TOOL_DB:Q}                 \
+       HOST_SH=${HOST_SH:Q}            \
+       MAKE=${MAKE:Q}                  \
+       PWD_MKDB=${TOOL_PWD_MKDB:Q}     \
+       STAT=${TOOL_STAT:Q}
 
 postinstall-check: .PHONY
        @echo "   === Post installation checks ==="
-       AWK=${TOOL_AWK:Q} MAKE=${MAKE:Q} ${HOST_SH} ${_POSTINSTALL} -s ${.CURDIR} -d ${DESTDIR}/ check; if [ $$? -gt 1 ]; then exit 1; fi
+       ${_POSTINSTALL_ENV} ${HOST_SH} ${_POSTINSTALL} -s ${.CURDIR} -d ${DESTDIR}/ check; if [ $$? -gt 1 ]; then exit 1; fi
        @echo "   ================================"
 
 postinstall-fix: .NOTMAIN .PHONY
        @echo "   === Post installation fixes ==="
-       AWK=${TOOL_AWK:Q} MAKE=${MAKE:Q} ${HOST_SH} ${_POSTINSTALL} -s ${.CURDIR} -d ${DESTDIR}/ fix
+       ${_POSTINSTALL_ENV} ${HOST_SH} ${_POSTINSTALL} -s ${.CURDIR} -d ${DESTDIR}/ fix
        @echo "   ==============================="
 
 postinstall-fix-obsolete: .NOTMAIN .PHONY
        @echo "   === Removing obsolete files ==="
-       AWK=${TOOL_AWK:Q} MAKE=${MAKE:Q} ${HOST_SH} ${_POSTINSTALL} -s ${.CURDIR} -d ${DESTDIR}/ fix obsolete
+       ${_POSTINSTALL_ENV} ${HOST_SH} ${_POSTINSTALL} -s ${.CURDIR} -d ${DESTDIR}/ fix obsolete
        @echo "   ==============================="
 
 
diff -r deca4893bc50 -r 563195c201d0 usr.sbin/postinstall/postinstall
--- a/usr.sbin/postinstall/postinstall  Wed Aug 15 15:34:04 2012 +0000
+++ b/usr.sbin/postinstall/postinstall  Wed Aug 15 17:36:46 2012 +0000
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# $NetBSD: postinstall,v 1.129.2.8 2012/08/13 20:22:20 riz Exp $
+# $NetBSD: postinstall,v 1.129.2.9 2012/08/15 17:36:46 sborrill Exp $
 #
 # Copyright (c) 2002-2008 The NetBSD Foundation, Inc.
 # All rights reserved.
@@ -54,11 +54,11 @@
 # environment to override the locations of some tools.
 : ${AWK:=awk}
 : ${DB:=db}
-: ${EGREP:=egrep}
-: ${FGREP:=fgrep}
 : ${GREP:=grep}
+: ${HOST_SH:=sh}
 : ${MAKE:=make}
 : ${PWD_MKDB:=/usr/sbin/pwd_mkdb}
+: ${STAT:=stat}
 
 #
 #      helper functions
@@ -411,31 +411,6 @@
        return 1
 }
 
-# stat op format target value
-#      Call stat(1) on the given target according to the given format,
-#      if stat(1) is available (it is presumed to live in /usr/bin).
-#      If it is not available, this routine will always succeed, otherwise
-#      it returns 0 or 1, depending on whether or not the output from
-#      stat(1) matches the expected value.
-#
-stat()
-{
-       _stop="$1"
-       _stfmt="$2"
-       _sttgt="$3"
-       _stval="$4"
-
-       if [ ! -x /usr/bin/stat ]; then
-               msg \
-    "(/usr/bin/stat not available; skipping ${_stop} on ${_sttgt})"
-               return 0
-       fi
-
-       _stres="$(/usr/bin/stat -q -f "${_stfmt}" "${_sttgt}")"
-       [ "${_stres}" = "${_stval}" ]
-       return $?
-}
-
 # file_exists_exact path
 #      Returns true if a file exists in the ${DEST_DIR} whose name
 #      is exactly ${path}, interpreted in a case-sensitive way
@@ -454,7 +429,7 @@
                _dirname="$(dirname "${_path}" 2>/dev/null)"
                _basename="$(basename "${_path}" 2>/dev/null)"
                ls -fa "${DEST_DIR}${_dirname}" 2> /dev/null \
-                       | ${FGREP} -x "${_basename}" >/dev/null \
+                       | ${GREP} -F -x "${_basename}" >/dev/null \
                        || return 1
                _path="${_dirname}"
        done
@@ -1515,7 +1490,7 @@
        # then it will not be deleted.
        ( [ -f "${DEST_DIR}"/var/db/obsolete/xbase ] \
            &&  sort -ru "${DEST_DIR}"/var/db/obsolete/xbase \
-           | ${EGREP} "^\\.?${pcpath}/" ;
+           | ${GREP} -E "^\\.?${pcpath}/" ;
            echo "${pcpath}" ) \
        | obsolete_paths "${op}"
        failed=$(( ${failed} + $? ))
@@ -1751,43 +1726,80 @@
 do_ptyfsoldnodes()
 {
        [ -n "$1" ] || err 3 "USAGE: do_ptyfsoldnodes  fix|check"
+       _ptyfs_op="$1"
 
-       # check if ptyfs is in use
+       # Check whether ptyfs is in use
        failed=0;
-       if ${EGREP} "^ptyfs" "${DEST_DIR}/etc/fstab" > /dev/null; then
-               maj_t=$( ${AWK} < "${DEST_DIR}/dev/MAKEDEV" \
-                       '/mkdev ttyp0 c [0-9]* 0 666/{print $4}' )
-               maj_p=$( ${AWK} < "${DEST_DIR}/dev/MAKEDEV" \
-                       '/mkdev ptyp0 c [0-9]* 0 666/{print $4}' )
-
-               pcnt=$( find "${DEST_DIR}/dev" -xdev -type c -ls | \
-                       ${AWK} '{print $7 $12}' | \
-                       ${AWK} -F, "/^${maj_p},/{ print \$2}" | wc -l )
-               tcnt=$( find "${DEST_DIR}/dev" -xdev -type c -ls | \
-                       ${AWK} '{print $7 $12}' | \
-                       ${AWK} -F, "/^${maj_t},/{ print \$2}" | wc -l )
+       if ! ${GREP} -E "^ptyfs" "${DEST_DIR}/etc/fstab" > /dev/null; then
+               msg "ptyfs is not in use"
+               return 0
+       fi
 
-               if [ ${pcnt} -gt 0 -o ${tcnt} -gt 0 ]; then
-                       if [ "$1" = "fix" ]; then
-                               tmp="$(mktemp /tmp/postinstall.ptyfs.XXXXXXXX)"
-                               find "${DEST_DIR}/dev" -xdev -type c -ls | \
-                                       ${AWK} '{print $7 $12}' | \
-                                       ${AWK} -F, "/^${maj_p},/{ print \$2}" \
-                                       > "${tmp}"
-                               find "${DEST_DIR}/dev" -xdev -type c -ls | \
-                                       ${AWK} '{print $7 $12}' | \
-                                       ${AWK} -F, "/^${maj_t},/{ print \$2}" \
-                                       >> "${tmp}"
-                               while read node; do
-                                       rm "${node}"
-                                       msg "Removed ${node}"
-                               done < "${tmp}"
-                               rm "${tmp}"
+       # 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
+       # 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;
+       # otherwise we could have used a single glob pattern.
+       #
+       # If there are no files that match a particular pattern,
+       # then stat prints something like:
+       #    stat: /dev/[pt]tyx?: lstat: No such file or directory
+       # and we ignore it.  XXX: We also ignore other error messages.
+       #
+       _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 "%Hr %N" "${DEST_DIR}/dev/"[pt]ty${d1}? 2>&1
+       done \
+       | 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
+               if [ "${_ptyfs_op}" = "check" ]; then
+                       msg "Remove ${_desc} ${node}"
+                       failed=1
+               else # "fix"
+                       if rm "${node}"; then
+                               msg "Removed ${_desc} ${node}"
                        else
+                               warn "Failed to remove ${_desc} ${node}"
                                failed=1
                        fi
                fi
-       fi
+       done < "${_ptyfs_tmp}"
+       rm "${_ptyfs_tmp}"
+
        return ${failed}
 }
 



Home | Main Index | Thread Index | Old Index