#!/bin/sh # # CDDL HEADER START # # The contents of this file are subject to the terms of the # Common Development and Distribution License (the "License"). # You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. # See the License for the specific language governing permissions # and limitations under the License. # # When distributing Covered Code, include this CDDL HEADER in each # file and include the License file at usr/src/OPENSOLARIS.LICENSE. # If applicable, add the following below this CDDL HEADER, with the # fields enclosed by brackets "[]" replaced with your own identifying # information: Portions Copyright [yyyy] [name of copyright owner] # # CDDL HEADER END # #pragma ident "%Z%%M% %I% %E% SMI" # # Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # SUNWpd postinstall script PATH="/usr/bin:/usr/sbin:${PATH}" export PATH EXIT=0 status=0 ISA_TYPE_I386="i386" ISA_TYPE_SPARC="sparc" ISA_TYPE="$ARCH" # # Driver info # DRV=glm DRVALIAS="pci1000,b" DRVPERM='* 0755 root sys' NAMEMAJOR="$BASEDIR/etc/name_to_major" MINORPERM="$BASEDIR/etc/minor_perm" DEVLINKTB="$BASEDIR/etc/devlink.tab" DRIVERALS="$BASEDIR/etc/driver_aliases" PATH_TO_INST="$BASEDIR/etc/path_to_inst" IUAP="$BASEDIR/etc/iu.ap" if test ! -f ${NAMEMAJOR} -o ! -w ${NAMEMAJOR}; then echo "add_major: data file ${NAMEMAJOR} is missing/inaccessible." >&2 exit 1 fi if test ! -f ${MINORPERM} -o ! -w ${MINORPERM}; then echo "add_minor: data file ${MINORPERM} is missing/inaccessible." >&2 exit 1 fi if test ! -f ${DEVLINKTB} -o ! -w ${DEVLINKTB}; then echo "add_devlink: data file ${DEVLINKTB} is missing/inaccessible." >&2 exit 1 fi if test ! -f ${DRIVERALS} -o ! -w ${DRIVERALS}; then echo "add_drv_alias: data file ${DRIVERALS} is missing/inaccessible." >&2 exit 1 fi trap "rm -f /tmp/$$.*;exit 1" 1 2 3 13 15 TMP=/tmp/$$ # adds new major numbers to system for device drivers # Usage: # add_major name1 name2 name3 name4 .... add_major() { sort +1 -2n ${NAMEMAJOR} | nawk '# BEGIN {oldmajor = -1} NR == 1 {n=split(namelist,x) if (n < 1) exit(1) for (i=1; i<=n; i++) chklist[x[i]]++ } {for (name in chklist) { if ($1 == name) delete chklist[name] } if (($2 - oldmajor) > 1) { gap++ gaplist[gap] = oldmajor " " $2; } oldmajor = $2; } END {addsize=1 for (name in chklist) addlist[addsize++] = name addidx = 1 for (i=1; i<=gap && addidx < addsize; i++) { split(gaplist[i],x) begmajor = x[1] endmajor = x[2] for (begmajor++;begmajor < endmajor && addidx < addsize;) { printf "%s %d\n",addlist[addidx],begmajor addidx++ begmajor++ } } for (; addidx < addsize; addidx++) { oldmajor++ printf "%s %d\n",addlist[addidx],oldmajor } } ' namelist="$*" - > $TMP.new if [ -s $TMP.new ] then # echo "Adding following devices to ${NAMEMAJOR}" # cat $TMP.new sort +1 -2n ${NAMEMAJOR} $TMP.new -o ${NAMEMAJOR} fi } # adds new minor permissions to system for device drivers # Usage: # add_minor perm1 perm2 perm3 perm4 .... # i.e. # add_minor 'sd:* 0666 bin bin' 'sd:a 0644 root sys' add_minor() { for p in "$@" do echo "$p" done | nawk '# FILENAME != "-" {permtab[$1] = $0;next} FILENAME == "-" { if ($4 == "") { printf("Missing token: (%s), skipping.\n", $0) next } if ($5 != "") { printf("Too many arguments: (%s), skipping.\n", $0) next } if ($1 !~ /:/) { printf("Bad name:minor pair: %s, skipping.\n", $1) next } if ($2 < "0000" || $2 > "4777") { printf("Bad mode: %s, skipping %s.\n", $2, $1) next } if (!($1 in permtab)) print >> permtmp next } ' permtmp=$TMP.perm ${MINORPERM} - >&2 if [ -s $TMP.perm ] then # echo "Adding following permissions to ${MINORPERM}" # cat $TMP.perm sort +0 -1 ${MINORPERM} $TMP.perm -o ${MINORPERM} fi } add_devlink() { while test $# -ge 2 do echo "$1 $2" shift 2 done | nawk '-F ' '# FILENAME == "-" {devlinktab[$1] = $0;next} FILENAME != "-" {if ($1 in devlinktab) delete devlinktab[$1] } END {for (d in devlinktab) print devlinktab[d] >> devlinktmp } ' devlinktmp=$TMP.devlink - ${DEVLINKTB} >&2 if [ -s $TMP.devlink ] then # echo "Adding following entries to ${DEVLINKTB}" # cat $TMP.devlink cat $TMP.devlink >> ${DEVLINKTB} fi } # adds new entries to driver_aliases file # Usage: # add_drv_alias spec1 spec2 spec3 # # where spec is: # <driver> <alias> # add_drv_alias() { while test $# -ge 2 do echo "$1 $2" shift 2 done | nawk '# FILENAME == "-" {newaliases[$2] = $1;next} FILENAME != "-" {if ($2 in newaliases) { if ($1 == newaliases[$2]) delete newaliases[$2] } } END {for (d in newaliases) print newaliases[d],d > drvalias } ' drvalias=$TMP.drvalias - ${DRIVERALS} >&2 if [ -s $TMP.drvalias ] then # echo "Adding following entries to ${DRIVERALS}" # cat $TMP.drvalias cat $TMP.drvalias >> ${DRIVERALS} fi } # SUNWpd contains ecpp on SPARC only - run on SPARC only if [ "${ISA_TYPE}" = "${ISA_TYPE_SPARC}" ]; then # modunload the driver if installing on running system if [ "${BASEDIR}" = "/" ]; then modnum=`set -- \`modinfo | grep ecpp\`; echo $1` if [ "$modnum" ]; then modunload -i $modnum fi fi # add_drv ecpp driver if not already installed modnum=`grep -c ecpp ${NAMEMAJOR}` if [ "$modnum" = "0" ]; then # add new entries to # name_to_major, minor_perm, driver_classes files /usr/sbin/add_drv -b ${BASEDIR} -i '"pnpALI,1533,3" "ns87317-ecpp"' \ -m '* 0666 root sys' -n ecpp || status=1 fi fi rm -f /tmp/$$.* # Do nothing on sparc machine. if [ "${ISA_TYPE}" = "${ISA_TYPE_I386}" ]; then # # Select the correct add_drv options to execute for glm # if [ "${BASEDIR}" = "/" ]; then # # Irrespective of whether hardware exists # or not don't attempt to attach driver # to the hardware. This is to avoid problems # with installing a 32 bit driver on a 64 bit # running system. # ADD_DRV="add_drv -n" else # # On a client, # modify the system files and touch/reconfigure # for reconfigure reboot # ADD_DRV="add_drv -b ${BASEDIR}" fi # Remove references to symhisl if any in /etc/driver_aliases to # avoid confusion. grep -v "symhisl \"${DRVALIAS}\"\>" $DRIVERALS > $DRIVERALS.new mv $DRIVERALS.new $DRIVERALS # Remove references to symhisl if any in /etc/path_to_inst to # avoid confusion. grep -v $DRVALIAS $PATH_TO_INST > $PATH_TO_INST.new mv $PATH_TO_INST.new $PATH_TO_INST # # Make sure add_drv has *not* been previously executed # before attempting to add glm driver. # grep -w "${DRV}" ${BASEDIR}/etc/name_to_major > /dev/null 2>&1 if [ $? -eq 1 ]; then ${ADD_DRV} -m "${DRVPERM}" -i "\"${DRVALIAS}\"" -c scsi ${DRV} if [ $? -ne 0 ]; then echo "\nFailed add_drv!\n" >&2 exit 1 fi else exit 0 fi fi exit $status