Home | History | Annotate | Line # | Download | only in hooks
      1  1.1   mlelstv #!/bin/sh
      2  1.1   mlelstv #
      3  1.8    martin # $NetBSD: 02-wedgenames,v 1.8 2021/08/08 10:48:35 martin Exp $
      4  1.1   mlelstv #
      5  1.1   mlelstv # Try to maintain symlinks to wedge devices
      6  1.1   mlelstv #
      7  1.1   mlelstv 
      8  1.5   mlelstv export LC_ALL=C
      9  1.5   mlelstv 
     10  1.1   mlelstv event="$1"
     11  1.2  jmcneill shift
     12  1.1   mlelstv 
     13  1.1   mlelstv wedgedir=/dev/wedges
     14  1.1   mlelstv 
     15  1.5   mlelstv recurse()
     16  1.5   mlelstv {
     17  1.7       kre 	test -d "$1" &&
     18  1.7       kre 	    ls -1af "$1" | while read n; do
     19  1.5   mlelstv 		case $n in
     20  1.7       kre 		.|..)	;;
     21  1.5   mlelstv 		*)
     22  1.5   mlelstv 			echo "$1/$n"
     23  1.5   mlelstv 			if [ -L "$1/$n" ]; then
     24  1.5   mlelstv 				: #nothing
     25  1.5   mlelstv 			elif [ -d "$1/$n" ]; then
     26  1.5   mlelstv 				recurse "$1/$n"
     27  1.5   mlelstv 			fi
     28  1.5   mlelstv 			;;
     29  1.5   mlelstv 		esac
     30  1.7       kre 	    done
     31  1.5   mlelstv }
     32  1.5   mlelstv 
     33  1.5   mlelstv simple_readlink()
     34  1.5   mlelstv {
     35  1.5   mlelstv 	local x
     36  1.5   mlelstv 
     37  1.5   mlelstv 	x=$(test -e "$1" && ls -ld "$1")
     38  1.5   mlelstv 	case $x in
     39  1.5   mlelstv 	*'-> '*) echo ${x#*-> };;
     40  1.5   mlelstv 	esac
     41  1.5   mlelstv }
     42  1.5   mlelstv 
     43  1.7       kre #ordtable=$(
     44  1.7       kre #	for n1 in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do
     45  1.7       kre #	for n2 in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do
     46  1.7       kre #		echo "\$'\x$n1$n2') x=$n1$n2;;"
     47  1.7       kre #	done
     48  1.7       kre #	done
     49  1.7       kre #)
     50  1.7       kre #
     51  1.7       kre #ord()
     52  1.7       kre #{
     53  1.7       kre #	local x
     54  1.7       kre #	eval "case \$1 in $ordtable esac"
     55  1.7       kre #	echo -n $x
     56  1.7       kre #}
     57  1.5   mlelstv 
     58  1.5   mlelstv ord()
     59  1.5   mlelstv {
     60  1.7       kre 	printf %2.2x "'$1"
     61  1.5   mlelstv }
     62  1.5   mlelstv 
     63  1.5   mlelstv encode()
     64  1.5   mlelstv {
     65  1.7       kre 	local a b c
     66  1.5   mlelstv 
     67  1.5   mlelstv 	a=$1
     68  1.7       kre 	b=
     69  1.5   mlelstv 	while [ -n "$a" ]; do
     70  1.5   mlelstv 		c="${a%"${a#?}"}"
     71  1.5   mlelstv 		a=${a#?}
     72  1.5   mlelstv 		case $c in
     73  1.7       kre 		[][:alnum:]._:\;!^$\&~\(\)[{}=,+/-])
     74  1.5   mlelstv 			;;
     75  1.5   mlelstv 		*)
     76  1.7       kre 			c=%%$(ord "$c")
     77  1.5   mlelstv 			;;
     78  1.5   mlelstv 		esac
     79  1.7       kre 		b=${b}${c}
     80  1.5   mlelstv 	done
     81  1.7       kre 	printf %s "$b"
     82  1.5   mlelstv }
     83  1.5   mlelstv 
     84  1.1   mlelstv remove_wedge() {
     85  1.7       kre 	recurse "$wedgedir" | while read w; do
     86  1.5   mlelstv 		t=$(simple_readlink "$w")
     87  1.2  jmcneill 		if [ x"$t" = x"/dev/$1" ]; then
     88  1.1   mlelstv 			rm -f "$w"
     89  1.6   mlelstv 			basedir=${w%/*}
     90  1.1   mlelstv 			rmdir -p "$basedir" 2>/dev/null
     91  1.1   mlelstv 		fi
     92  1.1   mlelstv 	done
     93  1.1   mlelstv }
     94  1.1   mlelstv 
     95  1.7       kre wedge_label() {
     96  1.7       kre 	local l
     97  1.7       kre 
     98  1.7       kre 	# dkctl getwedgeinfo always outputs 2 "lines", the first
     99  1.7       kre 	# contains the label (and may contain embedded \n chars)
    100  1.7       kre 	# the second contains the size, offset, and type, and one
    101  1.7       kre 	# trailing \n (stripped by the $()) - so we can safely
    102  1.7       kre 	# extract the label by deleting from the final \n in the
    103  1.7       kre 	# value getwedgeinfo prints to the end
    104  1.7       kre 
    105  1.7       kre 	l=$(dkctl "$1" getwedgeinfo)
    106  1.7       kre 	l=${l%$'\n'*}
    107  1.7       kre 	case "${l}" in
    108  1.7       kre 	$1' at '*': '*)
    109  1.7       kre 		l=${l#*: }
    110  1.7       kre 		;;
    111  1.7       kre 	*)	
    112  1.7       kre 		l=$1
    113  1.7       kre 		;;
    114  1.7       kre 	esac
    115  1.7       kre 
    116  1.7       kre 	# The trailing <END> is to ensure a trailing \n in the label
    117  1.7       kre 	# is not deleted by a command substitution which invokes us.
    118  1.7       kre 	# That will be rmeoved by the caller.
    119  1.7       kre 	printf %s "${l}<END>"
    120  1.7       kre }
    121  1.7       kre 
    122  1.1   mlelstv add_wedge() {
    123  1.7       kre 	local l n
    124  1.7       kre 
    125  1.7       kre 	l=$(wedge_label "$1")
    126  1.7       kre 	l=${l%'<END>'}
    127  1.7       kre 	case "$l" in */) l="${l}Wedge";; esac
    128  1.7       kre 
    129  1.7       kre 	n=$(encode "${l}")
    130  1.7       kre 
    131  1.7       kre 	(
    132  1.7       kre 		umask 022
    133  1.7       kre 
    134  1.7       kre 		test -d "$wedgedir" || mkdir -m 755 "$wedgedir"
    135  1.7       kre 		basedir="$wedgedir/$n"
    136  1.7       kre 		basedir=${basedir%/*}
    137  1.7       kre 		test -d "$basedir" || mkdir -p -m 755 "$basedir"
    138  1.7       kre 		if oldlink=$(simple_readlink "$wedgedir/$n"); then
    139  1.7       kre 			if [ x"$oldlink" != x"/dev/$1" ]; then
    140  1.7       kre 				rm -f "$wedgedir/$n"
    141  1.3   mlelstv 				ln -s "/dev/$1" "$wedgedir/$n"
    142  1.3   mlelstv 			fi
    143  1.7       kre 		else
    144  1.7       kre 			ln -s "/dev/$1" "$wedgedir/$n"
    145  1.7       kre 		fi
    146  1.7       kre 	)
    147  1.1   mlelstv }
    148  1.1   mlelstv 
    149  1.7       kre for device do
    150  1.2  jmcneill 	case $device in
    151  1.2  jmcneill 	dk*)
    152  1.2  jmcneill 		case $event in
    153  1.2  jmcneill 		device-attach)
    154  1.7       kre 			remove_wedge "$device"
    155  1.7       kre 			add_wedge "$device"
    156  1.2  jmcneill 			;;
    157  1.2  jmcneill 		device-detach)
    158  1.7       kre 			remove_wedge "$device"
    159  1.2  jmcneill 			;;
    160  1.2  jmcneill 		esac
    161  1.1   mlelstv 		;;
    162  1.1   mlelstv 	esac
    163  1.8    martin done
    164