diff options
author | Francesco Colista <fcolista@alpinelinux.org> | 2014-07-09 10:19:27 +0000 |
---|---|---|
committer | Francesco Colista <fcolista@alpinelinux.org> | 2014-07-09 10:19:34 +0000 |
commit | 3f3f2fdd034dd77d718a212551b3208039961e8a (patch) | |
tree | 5d6caac368e8d0b731c19c4a1c4bff82cbe0c344 /testing/usbip-utils/usbip.initd | |
parent | 9c7ee0d598cee4bf91596f1e18b53805cb8f7ddd (diff) | |
download | aports-3f3f2fdd034dd77d718a212551b3208039961e8a.tar.bz2 aports-3f3f2fdd034dd77d718a212551b3208039961e8a.tar.xz |
testing/usbip-utils: fixes #690
Diffstat (limited to 'testing/usbip-utils/usbip.initd')
-rw-r--r-- | testing/usbip-utils/usbip.initd | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/testing/usbip-utils/usbip.initd b/testing/usbip-utils/usbip.initd new file mode 100644 index 0000000000..58e2358c31 --- /dev/null +++ b/testing/usbip-utils/usbip.initd @@ -0,0 +1,244 @@ +#!/sbin/runscript + +description="Load USBIP kernel modules and run daemon" + +: ${USBIP_EXEC:=$(which usbip)} +: ${USBIP_EXEC_DAEMON:=$(which usbipd)} + +depend() +{ + provide usbip + need sysfs net +} + +LoadKernelModule () +{ + local module=$1 + #----------------- + result= + if [ -z "$(/sbin/lsmod | grep "^$(basename $module)")" ] + then + local filename=$(/sbin/modprobe -l $module) + if [ -n "$filename" ] + then + if ! /sbin/modprobe $filename + then + eerror "Cannot load kernel module '$filename'." + result=failed + fi + else + eerror "Cannot find kernel module '$module'." + result=failed + fi + fi + [ -z "$result" ] +} + +IsAvailable () +{ + local bus_or_device=$(echo $1 | tr '[A-Z]' '[a-z]') + local host=$2 + #----------------- + host=${host:+--remote=$host} + : ${host:=--local} + $USBIP_EXEC list --parsable $host | + sed -n 's|.*busid='$bus_or_device'#.*|yes|p; \ + s|.*usbid='$bus_or_device'#.*|yes|p' +} + +GetBus () +{ + local device=$(echo $1 | tr '[A-Z]' '[a-z]') + local host=$2 + #----------------- + host=${host:+--remote=$host} + : ${host:=--local} + case "$host" in + "--remote"*) # FIXME: USBIP bug causing remote devices not to be listed parsable + $USBIP_EXEC list --parsable $host | + sed -n 's|^[ \t]*\([0-9][0-9]*-[0-9][0-9]*\):.*('"$device"').*|\1|p';; + *) + $USBIP_EXEC list --parsable $host | + sed -n 's|.*busid=\([0-9][0-9]*-[0-9][0-9]*\)#usbid='"$device"'#.*|\1|p';; + esac +} + +ExecuteUsbip() +{ + local command=$1 + local bus=$2 + local host=$3 + local port=$4 + #----------------- + local result= + if [ -n "$command" ] + then + if $USBIP_EXEC $command ${bus:+--busid=$bus} ${host:+--remote=$host} ${port:+--port $port} 1> /dev/null 2> /dev/null + then + einfo "Executed command '$command'${bus:+ with bus '$bus'}${host:+ on host '$host'}${port:+ on port '$port'}, successfully." + else + ewarn "Executing command '$command'${bus:+ with bus '$bus'}${host:+ on host '$host'}${port:+ on port '$port'} failed." + result=failed + fi + fi + [ -z "$result" ] +} + +ValidateCommand () +{ + local command=$1 + local bus_or_device=$2 + local host=$3 + #----------------- + local result= + local bus= + if [ -z "$host" -o -n "$(echo $host | grep '^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$')" ] + then + if [ -n "$(echo $bus_or_device | grep '^[[:xdigit:]]\{4\}:[[:xdigit:]]\{4\}$')" ] + then + bus="$(GetBus $bus_or_device $host)" + if [ -z "$bus" ] + then + ewarn "Device '$bus_or_device' not available${host:+ on host '$host'}." + result=failed + fi + else + if [ -n "$(echo $bus_or_device | grep '^[0-9][0-9]*-[0-9][0-9]*$')" ] + then + bus=$bus_or_device + else + ewarn "Unrecognized bus or device '$bus_or_device'." + result=failed + fi + fi + if [ -n "$bus" ] + then + case "$command" in + "bind"|"unbind") + ExecuteUsbip $command $bus || result=failed;; + "attach") + if [ -n "$host" ] + then + ExecuteUsbip $command $bus $host || result=failed + else + ewarn "Host statement is missing in command '$command'." + result=failed + fi + ;; + *) + ewarn "Unhandled command '$command'."; result=failed;; + esac + fi + else + ewarn "Illegal host ip address '$host'." + result=failed + fi + [ -z "$result" ] +} + +ProcessList () +{ + local command=$1 + shift + local list=$* + #----------------- + local result= + local no_host= + case "$command" in + "bind"|"unbind") no_host=yes;; + *) no_host=;; + esac + local host= + local item= + ( for item in $list + do + if [ -n "$host" -o -n "$no_host" ] + then + ValidateCommand $command $item $host || result=failed + host= + else + host=$item + fi + done + [ -z "$result" ] ) +} + +DetachAll () +{ + # FIXME: At this stage, there is no way to get the vhci_hcd port id of any attached device + for port in $(seq 0 15) + do + $USBIP_EXEC detach --port $port 2> /dev/null + done + [ 1 -eq 1 ] +} + +UnbindAll () +{ + local result= + ProcessList unbind "$($USBIP_EXEC list --parsable --local | sed -n 's|^busid=\([0-9][0-9]*-[0-9][0-9]*\)#.*=usbip-host#$|\1|p' | tr '\n' ' ')" +} + +start_daemon() +{ + ebegin "Starting usbip daemon" + if LoadKernelModule usbip-host + then + start-stop-daemon --start --exec $USBIP_EXEC_DAEMON -- -D + fi + eend $? +} + +start() +{ + ebegin "Starting usbip" + if LoadKernelModule usbip-core + then + if LoadKernelModule vhci-hcd + then + eend 0 + if yesno "${USBIP_START_DAEMON:-no}" + then + start_daemon + fi + if [ -n "$USBIP_AUTO_BIND" ] + then + ebegin "Auto-binding local busses" + ProcessList bind $USBIP_AUTO_BIND + eend $? + fi + if [ -n "$USBIP_AUTO_ATTACH" ] + then + ebegin "Auto-attaching remote busses" + ProcessList attach $USBIP_AUTO_ATTACH + eend $? + fi + else + eend 1 + fi + else + eend 1 + fi +} + +stop_daemon() +{ + ebegin "Stopping usbip daemon" + start-stop-daemon --stop --exec $USBIP_EXEC_DAEMON + eend $? +} + +stop() +{ + ebegin "Detaching remote busses" + DetachAll + eend $? + ebegin "Un-binding local busses" + UnbindAll + eend $? + if [ -n "$(pidof $(basename "$USBIP_EXEC_DAEMON"))" ] + then + stop_daemon + fi +} + |