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