02-wedgenames revision 1.2
1#!/bin/sh
2#
3# $NetBSD: 02-wedgenames,v 1.2 2015/02/15 15:56:30 jmcneill Exp $
4#
5# Try to maintain symlinks to wedge devices
6#
7
8event="$1"
9shift
10devices=$@
11
12wedgedir=/dev/wedges
13
14remove_wedge() {
15	find $wedgedir -print \
16	| sed -e 's# #\\ #g' \
17	| while read w; do
18		t=$(readlink "$w")
19		if [ x"$t" = x"/dev/$1" ]; then
20			rm -f "$w"
21			basedir=$(dirname "$w")
22			rmdir -p "$basedir" 2>/dev/null
23		fi
24	done
25}
26
27add_wedge() {
28	n=$(dkctl "$1" getwedgeinfo \
29		| sed -ne '1s#^[^:]*: ##p' \
30		| awk -v GOOD='._:;!^$&~()[]{}=,+-/' '
31		BEGIN {
32			for (i=0; i<256; ++i)
33				ord[sprintf("%c",i)] = i
34		}
35		{
36			n = length($0)
37			o = ""
38			for (i=1; i<=n; ++i) {
39				c = substr($0,i,1)
40				if (c ~ /^[[:alnum:]]$/ || index(GOOD,c) > 0) {
41					o = o c
42				} else {
43					o = o sprintf("%%%02x",ord[c])
44				}
45			}
46			printf "%s",o
47		}'
48	)
49	case $n in
50	"") ;;
51	*)
52		test -d $wedgedir || mkdir -m 755 $wedgedir
53		basedir=$(dirname "$wedgedir/$n")
54		test -d "$basedir" || mkdir -p -m 755 "$basedir"
55		ln -s "/dev/$1" "$wedgedir/$n"
56		;;
57	esac
58}
59
60for device in $devices; do
61	case $device in
62	dk*)
63		case $event in
64		device-attach)
65			remove_wedge $device
66			add_wedge $device
67			;;
68		device-detach)
69			remove_wedge $device
70			;;
71		esac
72		;;
73	esac
74done
75