1 1.1 mlelstv #!/bin/sh 2 1.1 mlelstv # 3 1.6 mlelstv # $NetBSD: 02-wedgenames,v 1.6 2021/01/09 16:25:19 mlelstv 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.2 jmcneill devices=$@ 13 1.1 mlelstv 14 1.1 mlelstv wedgedir=/dev/wedges 15 1.1 mlelstv 16 1.5 mlelstv recurse() 17 1.5 mlelstv { 18 1.5 mlelstv test -d "$1" && ls -1af "$1" \ 19 1.5 mlelstv | while read n; do 20 1.5 mlelstv case $n in 21 1.5 mlelstv .|..) ;; 22 1.5 mlelstv *) 23 1.5 mlelstv echo "$1/$n" 24 1.5 mlelstv if [ -L "$1/$n" ]; then 25 1.5 mlelstv : #nothing 26 1.5 mlelstv elif [ -d "$1/$n" ]; then 27 1.5 mlelstv recurse "$1/$n" 28 1.5 mlelstv fi 29 1.5 mlelstv ;; 30 1.5 mlelstv esac 31 1.5 mlelstv done 32 1.5 mlelstv } 33 1.5 mlelstv 34 1.5 mlelstv simple_readlink() 35 1.5 mlelstv { 36 1.5 mlelstv local x 37 1.5 mlelstv 38 1.5 mlelstv x=$(test -e "$1" && ls -ld "$1") 39 1.5 mlelstv case $x in 40 1.5 mlelstv *'-> '*) echo ${x#*-> };; 41 1.5 mlelstv esac 42 1.5 mlelstv } 43 1.5 mlelstv 44 1.5 mlelstv ordtable=$( 45 1.5 mlelstv for n1 in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do 46 1.5 mlelstv for n2 in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do 47 1.5 mlelstv echo "\$'\x$n1$n2') x=$n1$n2;;" 48 1.5 mlelstv done 49 1.5 mlelstv done 50 1.5 mlelstv ) 51 1.5 mlelstv 52 1.5 mlelstv ord() 53 1.5 mlelstv { 54 1.5 mlelstv local x 55 1.5 mlelstv eval "case \$1 in $ordtable esac" 56 1.5 mlelstv echo -n $x 57 1.5 mlelstv } 58 1.5 mlelstv 59 1.5 mlelstv encode() 60 1.5 mlelstv { 61 1.5 mlelstv local a 62 1.5 mlelstv 63 1.5 mlelstv a=$1 64 1.5 mlelstv while [ -n "$a" ]; do 65 1.5 mlelstv c="${a%"${a#?}"}" 66 1.5 mlelstv a=${a#?} 67 1.5 mlelstv case $c in 68 1.5 mlelstv [[:alnum:]._:\;!^$\&~\(\)[\]{}=,+\-/]) 69 1.5 mlelstv ;; 70 1.5 mlelstv *) 71 1.5 mlelstv c='%%'$(ord "$c") 72 1.5 mlelstv ;; 73 1.5 mlelstv esac 74 1.5 mlelstv echo -n "$c" 75 1.5 mlelstv done 76 1.5 mlelstv } 77 1.5 mlelstv 78 1.1 mlelstv remove_wedge() { 79 1.5 mlelstv recurse "$wedgedir" \ 80 1.1 mlelstv | while read w; do 81 1.5 mlelstv t=$(simple_readlink "$w") 82 1.2 jmcneill if [ x"$t" = x"/dev/$1" ]; then 83 1.1 mlelstv rm -f "$w" 84 1.6 mlelstv basedir=${w%/*} 85 1.1 mlelstv rmdir -p "$basedir" 2>/dev/null 86 1.1 mlelstv fi 87 1.1 mlelstv done 88 1.1 mlelstv } 89 1.1 mlelstv 90 1.1 mlelstv add_wedge() { 91 1.5 mlelstv dkctl "$1" getwedgeinfo \ 92 1.5 mlelstv | while read l; do 93 1.5 mlelstv case $l in 94 1.5 mlelstv *': '*) 95 1.5 mlelstv n="${l#*: }" 96 1.5 mlelstv n=$(encode "$n") 97 1.5 mlelstv test -d $wedgedir || mkdir -m 755 $wedgedir 98 1.6 mlelstv basedir="$wedgedir/$n" 99 1.6 mlelstv basedir=${basedir%/*} 100 1.5 mlelstv test -d "$basedir" || mkdir -p -m 755 "$basedir" 101 1.5 mlelstv if oldlink=$(simple_readlink "$wedgedir/$n"); then 102 1.5 mlelstv if [ x"$oldlink" != x"/dev/$1" ]; then 103 1.5 mlelstv rm -f "$wedgedir/$n" 104 1.5 mlelstv ln -s "/dev/$1" "$wedgedir/$n" 105 1.5 mlelstv fi 106 1.5 mlelstv else 107 1.3 mlelstv ln -s "/dev/$1" "$wedgedir/$n" 108 1.3 mlelstv fi 109 1.5 mlelstv ;; 110 1.5 mlelstv esac 111 1.5 mlelstv break 112 1.5 mlelstv done 113 1.1 mlelstv } 114 1.1 mlelstv 115 1.2 jmcneill for device in $devices; do 116 1.2 jmcneill case $device in 117 1.2 jmcneill dk*) 118 1.2 jmcneill case $event in 119 1.2 jmcneill device-attach) 120 1.2 jmcneill remove_wedge $device 121 1.2 jmcneill add_wedge $device 122 1.2 jmcneill ;; 123 1.2 jmcneill device-detach) 124 1.2 jmcneill remove_wedge $device 125 1.2 jmcneill ;; 126 1.2 jmcneill esac 127 1.1 mlelstv ;; 128 1.1 mlelstv esac 129 1.2 jmcneill done 130