xref: /netbsd-src/sbin/devpubd/hooks/02-wedgenames (revision 76c7fc5f6b13ed0b1508e6b313e88e59977ed78e)
1#!/bin/sh
2#
3# $NetBSD: 02-wedgenames,v 1.4 2016/08/15 12:54:40 mlelstv Exp $
4#
5# Try to maintain symlinks to wedge devices
6#
7
8event="$1"
9shift
10devices=$@
11
12wedgedir=/dev/wedges
13
14remove_wedge() {
15	test -d $wedgedir && 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		if oldlink=$(readlink "$wedgedir/$n"); then
56			if [ x"$oldlink" != "/dev/$1" ]; then
57				rm -f "$wedgedir/$n"
58				ln -s "/dev/$1" "$wedgedir/$n"
59			fi
60		else
61			ln -s "/dev/$1" "$wedgedir/$n"
62		fi
63		;;
64	esac
65}
66
67for device in $devices; do
68	case $device in
69	dk*)
70		case $event in
71		device-attach)
72			remove_wedge $device
73			add_wedge $device
74			;;
75		device-detach)
76			remove_wedge $device
77			;;
78		esac
79		;;
80	esac
81done
82