11.1Smlelstv#!/bin/sh 21.1Smlelstv# 31.8Smartin# $NetBSD: 02-wedgenames,v 1.8 2021/08/08 10:48:35 martin Exp $ 41.1Smlelstv# 51.1Smlelstv# Try to maintain symlinks to wedge devices 61.1Smlelstv# 71.1Smlelstv 81.5Smlelstvexport LC_ALL=C 91.5Smlelstv 101.1Smlelstvevent="$1" 111.2Sjmcneillshift 121.1Smlelstv 131.1Smlelstvwedgedir=/dev/wedges 141.1Smlelstv 151.5Smlelstvrecurse() 161.5Smlelstv{ 171.7Skre test -d "$1" && 181.7Skre ls -1af "$1" | while read n; do 191.5Smlelstv case $n in 201.7Skre .|..) ;; 211.5Smlelstv *) 221.5Smlelstv echo "$1/$n" 231.5Smlelstv if [ -L "$1/$n" ]; then 241.5Smlelstv : #nothing 251.5Smlelstv elif [ -d "$1/$n" ]; then 261.5Smlelstv recurse "$1/$n" 271.5Smlelstv fi 281.5Smlelstv ;; 291.5Smlelstv esac 301.7Skre done 311.5Smlelstv} 321.5Smlelstv 331.5Smlelstvsimple_readlink() 341.5Smlelstv{ 351.5Smlelstv local x 361.5Smlelstv 371.5Smlelstv x=$(test -e "$1" && ls -ld "$1") 381.5Smlelstv case $x in 391.5Smlelstv *'-> '*) echo ${x#*-> };; 401.5Smlelstv esac 411.5Smlelstv} 421.5Smlelstv 431.7Skre#ordtable=$( 441.7Skre# for n1 in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do 451.7Skre# for n2 in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do 461.7Skre# echo "\$'\x$n1$n2') x=$n1$n2;;" 471.7Skre# done 481.7Skre# done 491.7Skre#) 501.7Skre# 511.7Skre#ord() 521.7Skre#{ 531.7Skre# local x 541.7Skre# eval "case \$1 in $ordtable esac" 551.7Skre# echo -n $x 561.7Skre#} 571.5Smlelstv 581.5Smlelstvord() 591.5Smlelstv{ 601.7Skre printf %2.2x "'$1" 611.5Smlelstv} 621.5Smlelstv 631.5Smlelstvencode() 641.5Smlelstv{ 651.7Skre local a b c 661.5Smlelstv 671.5Smlelstv a=$1 681.7Skre b= 691.5Smlelstv while [ -n "$a" ]; do 701.5Smlelstv c="${a%"${a#?}"}" 711.5Smlelstv a=${a#?} 721.5Smlelstv case $c in 731.7Skre [][:alnum:]._:\;!^$\&~\(\)[{}=,+/-]) 741.5Smlelstv ;; 751.5Smlelstv *) 761.7Skre c=%%$(ord "$c") 771.5Smlelstv ;; 781.5Smlelstv esac 791.7Skre b=${b}${c} 801.5Smlelstv done 811.7Skre printf %s "$b" 821.5Smlelstv} 831.5Smlelstv 841.1Smlelstvremove_wedge() { 851.7Skre recurse "$wedgedir" | while read w; do 861.5Smlelstv t=$(simple_readlink "$w") 871.2Sjmcneill if [ x"$t" = x"/dev/$1" ]; then 881.1Smlelstv rm -f "$w" 891.6Smlelstv basedir=${w%/*} 901.1Smlelstv rmdir -p "$basedir" 2>/dev/null 911.1Smlelstv fi 921.1Smlelstv done 931.1Smlelstv} 941.1Smlelstv 951.7Skrewedge_label() { 961.7Skre local l 971.7Skre 981.7Skre # dkctl getwedgeinfo always outputs 2 "lines", the first 991.7Skre # contains the label (and may contain embedded \n chars) 1001.7Skre # the second contains the size, offset, and type, and one 1011.7Skre # trailing \n (stripped by the $()) - so we can safely 1021.7Skre # extract the label by deleting from the final \n in the 1031.7Skre # value getwedgeinfo prints to the end 1041.7Skre 1051.7Skre l=$(dkctl "$1" getwedgeinfo) 1061.7Skre l=${l%$'\n'*} 1071.7Skre case "${l}" in 1081.7Skre $1' at '*': '*) 1091.7Skre l=${l#*: } 1101.7Skre ;; 1111.7Skre *) 1121.7Skre l=$1 1131.7Skre ;; 1141.7Skre esac 1151.7Skre 1161.7Skre # The trailing <END> is to ensure a trailing \n in the label 1171.7Skre # is not deleted by a command substitution which invokes us. 1181.7Skre # That will be rmeoved by the caller. 1191.7Skre printf %s "${l}<END>" 1201.7Skre} 1211.7Skre 1221.1Smlelstvadd_wedge() { 1231.7Skre local l n 1241.7Skre 1251.7Skre l=$(wedge_label "$1") 1261.7Skre l=${l%'<END>'} 1271.7Skre case "$l" in */) l="${l}Wedge";; esac 1281.7Skre 1291.7Skre n=$(encode "${l}") 1301.7Skre 1311.7Skre ( 1321.7Skre umask 022 1331.7Skre 1341.7Skre test -d "$wedgedir" || mkdir -m 755 "$wedgedir" 1351.7Skre basedir="$wedgedir/$n" 1361.7Skre basedir=${basedir%/*} 1371.7Skre test -d "$basedir" || mkdir -p -m 755 "$basedir" 1381.7Skre if oldlink=$(simple_readlink "$wedgedir/$n"); then 1391.7Skre if [ x"$oldlink" != x"/dev/$1" ]; then 1401.7Skre rm -f "$wedgedir/$n" 1411.3Smlelstv ln -s "/dev/$1" "$wedgedir/$n" 1421.3Smlelstv fi 1431.7Skre else 1441.7Skre ln -s "/dev/$1" "$wedgedir/$n" 1451.7Skre fi 1461.7Skre ) 1471.1Smlelstv} 1481.1Smlelstv 1491.7Skrefor device do 1501.2Sjmcneill case $device in 1511.2Sjmcneill dk*) 1521.2Sjmcneill case $event in 1531.2Sjmcneill device-attach) 1541.7Skre remove_wedge "$device" 1551.7Skre add_wedge "$device" 1561.2Sjmcneill ;; 1571.2Sjmcneill device-detach) 1581.7Skre remove_wedge "$device" 1591.2Sjmcneill ;; 1601.2Sjmcneill esac 1611.1Smlelstv ;; 1621.1Smlelstv esac 1631.8Smartindone 164