02-wedgenames revision 1.5
11.1Smlelstv#!/bin/sh
21.1Smlelstv#
31.5Smlelstv# $NetBSD: 02-wedgenames,v 1.5 2021/01/09 14:00:05 mlelstv 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.2Sjmcneilldevices=$@
131.1Smlelstv
141.1Smlelstvwedgedir=/dev/wedges
151.1Smlelstv
161.5Smlelstvrecurse()
171.5Smlelstv{
181.5Smlelstv	test -d "$1" && ls -1af "$1" \
191.5Smlelstv	| while read n; do
201.5Smlelstv		case $n in
211.5Smlelstv		.|..) ;;
221.5Smlelstv		*)
231.5Smlelstv			echo "$1/$n"
241.5Smlelstv			if [ -L "$1/$n" ]; then
251.5Smlelstv				: #nothing
261.5Smlelstv			elif [ -d "$1/$n" ]; then
271.5Smlelstv				recurse "$1/$n"
281.5Smlelstv			fi
291.5Smlelstv			;;
301.5Smlelstv		esac
311.5Smlelstv	done
321.5Smlelstv}
331.5Smlelstv
341.5Smlelstvsimple_readlink()
351.5Smlelstv{
361.5Smlelstv	local x
371.5Smlelstv
381.5Smlelstv	x=$(test -e "$1" && ls -ld "$1")
391.5Smlelstv	case $x in
401.5Smlelstv	*'-> '*) echo ${x#*-> };;
411.5Smlelstv	esac
421.5Smlelstv}
431.5Smlelstv
441.5Smlelstvordtable=$(
451.5Smlelstv	for n1 in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do
461.5Smlelstv	for n2 in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do
471.5Smlelstv		echo "\$'\x$n1$n2') x=$n1$n2;;"
481.5Smlelstv	done
491.5Smlelstv	done
501.5Smlelstv)
511.5Smlelstv
521.5Smlelstvord()
531.5Smlelstv{
541.5Smlelstv	local x
551.5Smlelstv	eval "case \$1 in $ordtable esac"
561.5Smlelstv	echo -n $x
571.5Smlelstv}
581.5Smlelstv
591.5Smlelstvencode()
601.5Smlelstv{
611.5Smlelstv	local a
621.5Smlelstv
631.5Smlelstv	a=$1
641.5Smlelstv	while [ -n "$a" ]; do
651.5Smlelstv		c="${a%"${a#?}"}"
661.5Smlelstv		a=${a#?}
671.5Smlelstv		case $c in
681.5Smlelstv		[[:alnum:]._:\;!^$\&~\(\)[\]{}=,+\-/])
691.5Smlelstv			;;
701.5Smlelstv		*)
711.5Smlelstv			c='%%'$(ord "$c")
721.5Smlelstv			;;
731.5Smlelstv		esac
741.5Smlelstv		echo -n "$c"
751.5Smlelstv	done
761.5Smlelstv}
771.5Smlelstv
781.1Smlelstvremove_wedge() {
791.5Smlelstv	recurse "$wedgedir" \
801.1Smlelstv	| while read w; do
811.5Smlelstv		t=$(simple_readlink "$w")
821.2Sjmcneill		if [ x"$t" = x"/dev/$1" ]; then
831.1Smlelstv			rm -f "$w"
841.1Smlelstv			basedir=$(dirname "$w")
851.1Smlelstv			rmdir -p "$basedir" 2>/dev/null
861.1Smlelstv		fi
871.1Smlelstv	done
881.1Smlelstv}
891.1Smlelstv
901.1Smlelstvadd_wedge() {
911.5Smlelstv	dkctl "$1" getwedgeinfo \
921.5Smlelstv	| while read l; do
931.5Smlelstv		case $l in
941.5Smlelstv		*': '*)
951.5Smlelstv			n="${l#*: }"
961.5Smlelstv			n=$(encode "$n")
971.5Smlelstv			test -d $wedgedir || mkdir -m 755 $wedgedir
981.5Smlelstv			basedir=$(dirname "$wedgedir/$n")
991.5Smlelstv			test -d "$basedir" || mkdir -p -m 755 "$basedir"
1001.5Smlelstv			if oldlink=$(simple_readlink "$wedgedir/$n"); then
1011.5Smlelstv				if [ x"$oldlink" != x"/dev/$1" ]; then
1021.5Smlelstv					rm -f "$wedgedir/$n"
1031.5Smlelstv					ln -s "/dev/$1" "$wedgedir/$n"
1041.5Smlelstv				fi
1051.5Smlelstv			else
1061.3Smlelstv				ln -s "/dev/$1" "$wedgedir/$n"
1071.3Smlelstv			fi
1081.5Smlelstv			;;
1091.5Smlelstv		esac
1101.5Smlelstv		break
1111.5Smlelstv	done
1121.1Smlelstv}
1131.1Smlelstv
1141.2Sjmcneillfor device in $devices; do
1151.2Sjmcneill	case $device in
1161.2Sjmcneill	dk*)
1171.2Sjmcneill		case $event in
1181.2Sjmcneill		device-attach)
1191.2Sjmcneill			remove_wedge $device
1201.2Sjmcneill			add_wedge $device
1211.2Sjmcneill			;;
1221.2Sjmcneill		device-detach)
1231.2Sjmcneill			remove_wedge $device
1241.2Sjmcneill			;;
1251.2Sjmcneill		esac
1261.1Smlelstv		;;
1271.1Smlelstv	esac
1281.2Sjmcneilldone
129