1 1.1 mlelstv #!/bin/sh 2 1.1 mlelstv # 3 1.8 martin # $NetBSD: 02-wedgenames,v 1.8 2021/08/08 10:48:35 martin 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.1 mlelstv 13 1.1 mlelstv wedgedir=/dev/wedges 14 1.1 mlelstv 15 1.5 mlelstv recurse() 16 1.5 mlelstv { 17 1.7 kre test -d "$1" && 18 1.7 kre ls -1af "$1" | while read n; do 19 1.5 mlelstv case $n in 20 1.7 kre .|..) ;; 21 1.5 mlelstv *) 22 1.5 mlelstv echo "$1/$n" 23 1.5 mlelstv if [ -L "$1/$n" ]; then 24 1.5 mlelstv : #nothing 25 1.5 mlelstv elif [ -d "$1/$n" ]; then 26 1.5 mlelstv recurse "$1/$n" 27 1.5 mlelstv fi 28 1.5 mlelstv ;; 29 1.5 mlelstv esac 30 1.7 kre done 31 1.5 mlelstv } 32 1.5 mlelstv 33 1.5 mlelstv simple_readlink() 34 1.5 mlelstv { 35 1.5 mlelstv local x 36 1.5 mlelstv 37 1.5 mlelstv x=$(test -e "$1" && ls -ld "$1") 38 1.5 mlelstv case $x in 39 1.5 mlelstv *'-> '*) echo ${x#*-> };; 40 1.5 mlelstv esac 41 1.5 mlelstv } 42 1.5 mlelstv 43 1.7 kre #ordtable=$( 44 1.7 kre # for n1 in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do 45 1.7 kre # for n2 in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do 46 1.7 kre # echo "\$'\x$n1$n2') x=$n1$n2;;" 47 1.7 kre # done 48 1.7 kre # done 49 1.7 kre #) 50 1.7 kre # 51 1.7 kre #ord() 52 1.7 kre #{ 53 1.7 kre # local x 54 1.7 kre # eval "case \$1 in $ordtable esac" 55 1.7 kre # echo -n $x 56 1.7 kre #} 57 1.5 mlelstv 58 1.5 mlelstv ord() 59 1.5 mlelstv { 60 1.7 kre printf %2.2x "'$1" 61 1.5 mlelstv } 62 1.5 mlelstv 63 1.5 mlelstv encode() 64 1.5 mlelstv { 65 1.7 kre local a b c 66 1.5 mlelstv 67 1.5 mlelstv a=$1 68 1.7 kre b= 69 1.5 mlelstv while [ -n "$a" ]; do 70 1.5 mlelstv c="${a%"${a#?}"}" 71 1.5 mlelstv a=${a#?} 72 1.5 mlelstv case $c in 73 1.7 kre [][:alnum:]._:\;!^$\&~\(\)[{}=,+/-]) 74 1.5 mlelstv ;; 75 1.5 mlelstv *) 76 1.7 kre c=%%$(ord "$c") 77 1.5 mlelstv ;; 78 1.5 mlelstv esac 79 1.7 kre b=${b}${c} 80 1.5 mlelstv done 81 1.7 kre printf %s "$b" 82 1.5 mlelstv } 83 1.5 mlelstv 84 1.1 mlelstv remove_wedge() { 85 1.7 kre recurse "$wedgedir" | while read w; do 86 1.5 mlelstv t=$(simple_readlink "$w") 87 1.2 jmcneill if [ x"$t" = x"/dev/$1" ]; then 88 1.1 mlelstv rm -f "$w" 89 1.6 mlelstv basedir=${w%/*} 90 1.1 mlelstv rmdir -p "$basedir" 2>/dev/null 91 1.1 mlelstv fi 92 1.1 mlelstv done 93 1.1 mlelstv } 94 1.1 mlelstv 95 1.7 kre wedge_label() { 96 1.7 kre local l 97 1.7 kre 98 1.7 kre # dkctl getwedgeinfo always outputs 2 "lines", the first 99 1.7 kre # contains the label (and may contain embedded \n chars) 100 1.7 kre # the second contains the size, offset, and type, and one 101 1.7 kre # trailing \n (stripped by the $()) - so we can safely 102 1.7 kre # extract the label by deleting from the final \n in the 103 1.7 kre # value getwedgeinfo prints to the end 104 1.7 kre 105 1.7 kre l=$(dkctl "$1" getwedgeinfo) 106 1.7 kre l=${l%$'\n'*} 107 1.7 kre case "${l}" in 108 1.7 kre $1' at '*': '*) 109 1.7 kre l=${l#*: } 110 1.7 kre ;; 111 1.7 kre *) 112 1.7 kre l=$1 113 1.7 kre ;; 114 1.7 kre esac 115 1.7 kre 116 1.7 kre # The trailing <END> is to ensure a trailing \n in the label 117 1.7 kre # is not deleted by a command substitution which invokes us. 118 1.7 kre # That will be rmeoved by the caller. 119 1.7 kre printf %s "${l}<END>" 120 1.7 kre } 121 1.7 kre 122 1.1 mlelstv add_wedge() { 123 1.7 kre local l n 124 1.7 kre 125 1.7 kre l=$(wedge_label "$1") 126 1.7 kre l=${l%'<END>'} 127 1.7 kre case "$l" in */) l="${l}Wedge";; esac 128 1.7 kre 129 1.7 kre n=$(encode "${l}") 130 1.7 kre 131 1.7 kre ( 132 1.7 kre umask 022 133 1.7 kre 134 1.7 kre test -d "$wedgedir" || mkdir -m 755 "$wedgedir" 135 1.7 kre basedir="$wedgedir/$n" 136 1.7 kre basedir=${basedir%/*} 137 1.7 kre test -d "$basedir" || mkdir -p -m 755 "$basedir" 138 1.7 kre if oldlink=$(simple_readlink "$wedgedir/$n"); then 139 1.7 kre if [ x"$oldlink" != x"/dev/$1" ]; then 140 1.7 kre rm -f "$wedgedir/$n" 141 1.3 mlelstv ln -s "/dev/$1" "$wedgedir/$n" 142 1.3 mlelstv fi 143 1.7 kre else 144 1.7 kre ln -s "/dev/$1" "$wedgedir/$n" 145 1.7 kre fi 146 1.7 kre ) 147 1.1 mlelstv } 148 1.1 mlelstv 149 1.7 kre for device do 150 1.2 jmcneill case $device in 151 1.2 jmcneill dk*) 152 1.2 jmcneill case $event in 153 1.2 jmcneill device-attach) 154 1.7 kre remove_wedge "$device" 155 1.7 kre add_wedge "$device" 156 1.2 jmcneill ;; 157 1.2 jmcneill device-detach) 158 1.7 kre remove_wedge "$device" 159 1.2 jmcneill ;; 160 1.2 jmcneill esac 161 1.1 mlelstv ;; 162 1.1 mlelstv esac 163 1.8 martin done 164