Home | History | Annotate | Line # | Download | only in hooks
02-wedgenames revision 1.6
      1 #!/bin/sh
      2 #
      3 # $NetBSD: 02-wedgenames,v 1.6 2021/01/09 16:25:19 mlelstv Exp $
      4 #
      5 # Try to maintain symlinks to wedge devices
      6 #
      7 
      8 export LC_ALL=C
      9 
     10 event="$1"
     11 shift
     12 devices=$@
     13 
     14 wedgedir=/dev/wedges
     15 
     16 recurse()
     17 {
     18 	test -d "$1" && ls -1af "$1" \
     19 	| while read n; do
     20 		case $n in
     21 		.|..) ;;
     22 		*)
     23 			echo "$1/$n"
     24 			if [ -L "$1/$n" ]; then
     25 				: #nothing
     26 			elif [ -d "$1/$n" ]; then
     27 				recurse "$1/$n"
     28 			fi
     29 			;;
     30 		esac
     31 	done
     32 }
     33 
     34 simple_readlink()
     35 {
     36 	local x
     37 
     38 	x=$(test -e "$1" && ls -ld "$1")
     39 	case $x in
     40 	*'-> '*) echo ${x#*-> };;
     41 	esac
     42 }
     43 
     44 ordtable=$(
     45 	for n1 in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do
     46 	for n2 in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do
     47 		echo "\$'\x$n1$n2') x=$n1$n2;;"
     48 	done
     49 	done
     50 )
     51 
     52 ord()
     53 {
     54 	local x
     55 	eval "case \$1 in $ordtable esac"
     56 	echo -n $x
     57 }
     58 
     59 encode()
     60 {
     61 	local a
     62 
     63 	a=$1
     64 	while [ -n "$a" ]; do
     65 		c="${a%"${a#?}"}"
     66 		a=${a#?}
     67 		case $c in
     68 		[[:alnum:]._:\;!^$\&~\(\)[\]{}=,+\-/])
     69 			;;
     70 		*)
     71 			c='%%'$(ord "$c")
     72 			;;
     73 		esac
     74 		echo -n "$c"
     75 	done
     76 }
     77 
     78 remove_wedge() {
     79 	recurse "$wedgedir" \
     80 	| while read w; do
     81 		t=$(simple_readlink "$w")
     82 		if [ x"$t" = x"/dev/$1" ]; then
     83 			rm -f "$w"
     84 			basedir=${w%/*}
     85 			rmdir -p "$basedir" 2>/dev/null
     86 		fi
     87 	done
     88 }
     89 
     90 add_wedge() {
     91 	dkctl "$1" getwedgeinfo \
     92 	| while read l; do
     93 		case $l in
     94 		*': '*)
     95 			n="${l#*: }"
     96 			n=$(encode "$n")
     97 			test -d $wedgedir || mkdir -m 755 $wedgedir
     98 			basedir="$wedgedir/$n"
     99 			basedir=${basedir%/*}
    100 			test -d "$basedir" || mkdir -p -m 755 "$basedir"
    101 			if oldlink=$(simple_readlink "$wedgedir/$n"); then
    102 				if [ x"$oldlink" != x"/dev/$1" ]; then
    103 					rm -f "$wedgedir/$n"
    104 					ln -s "/dev/$1" "$wedgedir/$n"
    105 				fi
    106 			else
    107 				ln -s "/dev/$1" "$wedgedir/$n"
    108 			fi
    109 			;;
    110 		esac
    111 		break
    112 	done
    113 }
    114 
    115 for device in $devices; do
    116 	case $device in
    117 	dk*)
    118 		case $event in
    119 		device-attach)
    120 			remove_wedge $device
    121 			add_wedge $device
    122 			;;
    123 		device-detach)
    124 			remove_wedge $device
    125 			;;
    126 		esac
    127 		;;
    128 	esac
    129 done
    130