11.1Smlelstv#!/bin/sh
21.1Smlelstv#
31.8Smartin# $NetBSD: 02-wedgenames,v 1.8 2021/08/08 10:48:35 martin Exp $
41.1Smlelstv#
51.1Smlelstv# Try to maintain symlinks to wedge devices
61.1Smlelstv#
71.1Smlelstv
81.5Smlelstvexport LC_ALL=C
91.5Smlelstv
101.1Smlelstvevent="$1"
111.2Sjmcneillshift
121.1Smlelstv
131.1Smlelstvwedgedir=/dev/wedges
141.1Smlelstv
151.5Smlelstvrecurse()
161.5Smlelstv{
171.7Skre	test -d "$1" &&
181.7Skre	    ls -1af "$1" | while read n; do
191.5Smlelstv		case $n in
201.7Skre		.|..)	;;
211.5Smlelstv		*)
221.5Smlelstv			echo "$1/$n"
231.5Smlelstv			if [ -L "$1/$n" ]; then
241.5Smlelstv				: #nothing
251.5Smlelstv			elif [ -d "$1/$n" ]; then
261.5Smlelstv				recurse "$1/$n"
271.5Smlelstv			fi
281.5Smlelstv			;;
291.5Smlelstv		esac
301.7Skre	    done
311.5Smlelstv}
321.5Smlelstv
331.5Smlelstvsimple_readlink()
341.5Smlelstv{
351.5Smlelstv	local x
361.5Smlelstv
371.5Smlelstv	x=$(test -e "$1" && ls -ld "$1")
381.5Smlelstv	case $x in
391.5Smlelstv	*'-> '*) echo ${x#*-> };;
401.5Smlelstv	esac
411.5Smlelstv}
421.5Smlelstv
431.7Skre#ordtable=$(
441.7Skre#	for n1 in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do
451.7Skre#	for n2 in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do
461.7Skre#		echo "\$'\x$n1$n2') x=$n1$n2;;"
471.7Skre#	done
481.7Skre#	done
491.7Skre#)
501.7Skre#
511.7Skre#ord()
521.7Skre#{
531.7Skre#	local x
541.7Skre#	eval "case \$1 in $ordtable esac"
551.7Skre#	echo -n $x
561.7Skre#}
571.5Smlelstv
581.5Smlelstvord()
591.5Smlelstv{
601.7Skre	printf %2.2x "'$1"
611.5Smlelstv}
621.5Smlelstv
631.5Smlelstvencode()
641.5Smlelstv{
651.7Skre	local a b c
661.5Smlelstv
671.5Smlelstv	a=$1
681.7Skre	b=
691.5Smlelstv	while [ -n "$a" ]; do
701.5Smlelstv		c="${a%"${a#?}"}"
711.5Smlelstv		a=${a#?}
721.5Smlelstv		case $c in
731.7Skre		[][:alnum:]._:\;!^$\&~\(\)[{}=,+/-])
741.5Smlelstv			;;
751.5Smlelstv		*)
761.7Skre			c=%%$(ord "$c")
771.5Smlelstv			;;
781.5Smlelstv		esac
791.7Skre		b=${b}${c}
801.5Smlelstv	done
811.7Skre	printf %s "$b"
821.5Smlelstv}
831.5Smlelstv
841.1Smlelstvremove_wedge() {
851.7Skre	recurse "$wedgedir" | while read w; do
861.5Smlelstv		t=$(simple_readlink "$w")
871.2Sjmcneill		if [ x"$t" = x"/dev/$1" ]; then
881.1Smlelstv			rm -f "$w"
891.6Smlelstv			basedir=${w%/*}
901.1Smlelstv			rmdir -p "$basedir" 2>/dev/null
911.1Smlelstv		fi
921.1Smlelstv	done
931.1Smlelstv}
941.1Smlelstv
951.7Skrewedge_label() {
961.7Skre	local l
971.7Skre
981.7Skre	# dkctl getwedgeinfo always outputs 2 "lines", the first
991.7Skre	# contains the label (and may contain embedded \n chars)
1001.7Skre	# the second contains the size, offset, and type, and one
1011.7Skre	# trailing \n (stripped by the $()) - so we can safely
1021.7Skre	# extract the label by deleting from the final \n in the
1031.7Skre	# value getwedgeinfo prints to the end
1041.7Skre
1051.7Skre	l=$(dkctl "$1" getwedgeinfo)
1061.7Skre	l=${l%$'\n'*}
1071.7Skre	case "${l}" in
1081.7Skre	$1' at '*': '*)
1091.7Skre		l=${l#*: }
1101.7Skre		;;
1111.7Skre	*)	
1121.7Skre		l=$1
1131.7Skre		;;
1141.7Skre	esac
1151.7Skre
1161.7Skre	# The trailing <END> is to ensure a trailing \n in the label
1171.7Skre	# is not deleted by a command substitution which invokes us.
1181.7Skre	# That will be rmeoved by the caller.
1191.7Skre	printf %s "${l}<END>"
1201.7Skre}
1211.7Skre
1221.1Smlelstvadd_wedge() {
1231.7Skre	local l n
1241.7Skre
1251.7Skre	l=$(wedge_label "$1")
1261.7Skre	l=${l%'<END>'}
1271.7Skre	case "$l" in */) l="${l}Wedge";; esac
1281.7Skre
1291.7Skre	n=$(encode "${l}")
1301.7Skre
1311.7Skre	(
1321.7Skre		umask 022
1331.7Skre
1341.7Skre		test -d "$wedgedir" || mkdir -m 755 "$wedgedir"
1351.7Skre		basedir="$wedgedir/$n"
1361.7Skre		basedir=${basedir%/*}
1371.7Skre		test -d "$basedir" || mkdir -p -m 755 "$basedir"
1381.7Skre		if oldlink=$(simple_readlink "$wedgedir/$n"); then
1391.7Skre			if [ x"$oldlink" != x"/dev/$1" ]; then
1401.7Skre				rm -f "$wedgedir/$n"
1411.3Smlelstv				ln -s "/dev/$1" "$wedgedir/$n"
1421.3Smlelstv			fi
1431.7Skre		else
1441.7Skre			ln -s "/dev/$1" "$wedgedir/$n"
1451.7Skre		fi
1461.7Skre	)
1471.1Smlelstv}
1481.1Smlelstv
1491.7Skrefor device do
1501.2Sjmcneill	case $device in
1511.2Sjmcneill	dk*)
1521.2Sjmcneill		case $event in
1531.2Sjmcneill		device-attach)
1541.7Skre			remove_wedge "$device"
1551.7Skre			add_wedge "$device"
1561.2Sjmcneill			;;
1571.2Sjmcneill		device-detach)
1581.7Skre			remove_wedge "$device"
1591.2Sjmcneill			;;
1601.2Sjmcneill		esac
1611.1Smlelstv		;;
1621.1Smlelstv	esac
1631.8Smartindone
164