1 1.1 mlelstv #!/bin/sh 2 1.1 mlelstv # 3 1.5 mlelstv # $NetBSD: 02-wedgenames,v 1.5 2021/01/09 14:00:05 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.1 mlelstv basedir=$(dirname "$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.5 mlelstv basedir=$(dirname "$wedgedir/$n") 99 1.5 mlelstv test -d "$basedir" || mkdir -p -m 755 "$basedir" 100 1.5 mlelstv if oldlink=$(simple_readlink "$wedgedir/$n"); then 101 1.5 mlelstv if [ x"$oldlink" != x"/dev/$1" ]; then 102 1.5 mlelstv rm -f "$wedgedir/$n" 103 1.5 mlelstv ln -s "/dev/$1" "$wedgedir/$n" 104 1.5 mlelstv fi 105 1.5 mlelstv else 106 1.3 mlelstv ln -s "/dev/$1" "$wedgedir/$n" 107 1.3 mlelstv fi 108 1.5 mlelstv ;; 109 1.5 mlelstv esac 110 1.5 mlelstv break 111 1.5 mlelstv done 112 1.1 mlelstv } 113 1.1 mlelstv 114 1.2 jmcneill for device in $devices; do 115 1.2 jmcneill case $device in 116 1.2 jmcneill dk*) 117 1.2 jmcneill case $event in 118 1.2 jmcneill device-attach) 119 1.2 jmcneill remove_wedge $device 120 1.2 jmcneill add_wedge $device 121 1.2 jmcneill ;; 122 1.2 jmcneill device-detach) 123 1.2 jmcneill remove_wedge $device 124 1.2 jmcneill ;; 125 1.2 jmcneill esac 126 1.1 mlelstv ;; 127 1.1 mlelstv esac 128 1.2 jmcneill done 129