wwan: Double quote to prevent globbing and word splitting
[openwrt/openwrt.git] / package / network / utils / wwan / files / wwan.sh
index 6b33600..1ffb94a 100755 (executable)
@@ -32,49 +32,76 @@ proto_wwan_init_config() {
        proto_config_add_string pincode
        proto_config_add_string delay
        proto_config_add_string modes
+       proto_config_add_string bus
 }
 
 proto_wwan_setup() {
-       local driver usb devicename desc
-
-       for a in `ls /sys/bus/usb/devices`; do
-               local vendor product
-               [ -z "$usb" -a -f /sys/bus/usb/devices/$a/idVendor -a -f /sys/bus/usb/devices/$a/idProduct ] || continue
-               vendor=$(cat /sys/bus/usb/devices/$a/idVendor)
-               product=$(cat /sys/bus/usb/devices/$a/idProduct)
-               [ -f /lib/network/wwan/$vendor:$product ] && {
-                       usb=/lib/network/wwan/$vendor:$product
-                       devicename=$a
-               }
-       done
+       local driver usb devicename desc bus
+
+       json_get_vars bus
+
+       if [ -L "/sys/bus/usb/devices/${bus}" ]; then
+               if [ -f "/sys/bus/usb/devices/${bus}/idVendor" ] \
+                       && [ -f "/sys/bus/usb/devices/${bus}/idProduct" ]; then
+                       local vendor product
+                       vendor=$(cat /sys/bus/usb/devices/${bus}/idVendor)
+                       product=$(cat /sys/bus/usb/devices/${bus}/idProduct)
+                       [ -f /lib/network/wwan/$vendor:$product ] && {
+                               usb=/lib/network/wwan/$vendor:$product
+                               devicename=$bus
+                       }
+               else
+                       echo "wwan[$$]" "Specified usb bus ${bus} was not found"
+                       proto_notify_error "$interface" NO_USB
+                       proto_block_restart "$interface"
+                       return 1
+               fi
+       else
+               echo "wwan[$$]" "Searching for a valid wwan usb device..."
+               for a in `ls /sys/bus/usb/devices`; do
+                       local vendor product
+                       [ -z "$usb" -a -f /sys/bus/usb/devices/$a/idVendor -a  -f /sys/bus/usb/devices/$a/idProduct ] || continue
+                       vendor=$(cat /sys/bus/usb/devices/$a/idVendor)
+                       product=$(cat /sys/bus/usb/devices/$a/idProduct)
+                       [ -f /lib/network/wwan/$vendor:$product ] && {
+                               usb=/lib/network/wwan/$vendor:$product
+                               devicename=$a
+                       }
+               done
+       fi
+
+       echo "wwan[$$]" "Using wwan usb device on bus $devicename"
 
        [ -n "$usb" ] && {
                local old_cb control data
 
                json_set_namespace wwan old_cb
                json_init
-               json_load "$(cat $usb)"
+               json_load "$(cat "$usb")"
                json_select
                json_get_vars desc control data
-               json_set_namespace $old_cb
+               json_set_namespace "$old_cb"
 
                [ -n "$control" -a -n "$data" ] && {
-                       ttys=$(ls -d /sys/bus/usb/devices/$devicename/${devicename}*/tty* | sed "s/.*\///g" | tr "\n" " ")
+                       ttys=$(ls -d /sys/bus/usb/devices/$devicename/${devicename}*/tty?* /sys/bus/usb/devices/$devicename/${devicename}*/tty/tty?* | sed "s/.*\///g" | tr "\n" " ")
                        ctl_device=/dev/$(echo $ttys | cut -d" " -f $((control + 1)))
                        dat_device=/dev/$(echo $ttys | cut -d" " -f $((data + 1)))
                        driver=comgt
                }
        }
 
-       [ -z "$ctl_device" ] && for net in $(ls /sys/class/net/ | grep wwan); do
+       [ -z "$ctl_device" ] && for net in $(ls /sys/class/net/ | grep -e wwan -e usb); do
                [ -z "$ctl_device" ] || continue
+               [ -n "$bus" ] && {
+                       [ $(readlink /sys/class/net/$net | grep $bus) ] || continue
+               }
                driver=$(grep DRIVER /sys/class/net/$net/device/uevent | cut -d= -f2)
                case "$driver" in
                qmi_wwan|cdc_mbim)
                        ctl_device=/dev/$(ls /sys/class/net/$net/device/usbmisc)
                        ;;
-               sierra_net|*cdc_ncm)
-                       ctl_device=/dev/$(cd /sys/class/net/$net/; find ../../../ -name ttyUSB* |xargs basename | head -n1)
+               sierra_net|cdc_ether|*cdc_ncm)
+                       ctl_device=/dev/$(cd /sys/class/net/$net/; find ../../../ -name ttyUSB* |xargs -n1 basename | head -n1)
                        ;;
                *) continue;;
                esac
@@ -88,31 +115,31 @@ proto_wwan_setup() {
                return 1
        }
 
-       uci_set_state network $interface driver "$driver"
-       uci_set_state network $interface ctl_device "$ctl_device"
-       uci_set_state network $interface dat_device "$dat_device"
+       uci_set_state network "$interface" driver "$driver"
+       uci_set_state network "$interface" ctl_device "$ctl_device"
+       uci_set_state network "$interface" dat_device "$dat_device"
 
        case $driver in
-       qmi_wwan)       proto_qmi_setup $@ ;;
-       cdc_mbim)       proto_mbim_setup $@ ;;
-       sierra_net)     proto_directip_setup $@ ;;
-       comgt)          proto_3g_setup $@ ;;
-       *cdc_ncm)       proto_ncm_setup $@ ;;
+       qmi_wwan)               proto_qmi_setup $@ ;;
+       cdc_mbim)               proto_mbim_setup $@ ;;
+       sierra_net)             proto_directip_setup $@ ;;
+       comgt)                  proto_3g_setup $@ ;;
+       cdc_ether|*cdc_ncm)     proto_ncm_setup $@ ;;
        esac
 }
 
 proto_wwan_teardown() {
        local interface=$1
-       local driver=$(uci_get_state network $interface driver)
-       ctl_device=$(uci_get_state network $interface ctl_device)
-       dat_device=$(uci_get_state network $interface dat_device)
+       local driver=$(uci_get_state network "$interface" driver)
+       ctl_device=$(uci_get_state network "$interface" ctl_device)
+       dat_device=$(uci_get_state network "$interface" dat_device)
 
        case $driver in
-       qmi_wwan)       proto_qmi_teardown $@ ;;
-       cdc_mbim)       proto_mbim_teardown $@ ;;
-       sierra_net)     proto_mbim_teardown $@ ;;
-       comgt)          proto_3g_teardown $@ ;;
-       *cdc_ncm)       proto_ncm_teardown $@ ;;
+       qmi_wwan)               proto_qmi_teardown $@ ;;
+       cdc_mbim)               proto_mbim_teardown $@ ;;
+       sierra_net)             proto_directip_teardown $@ ;;
+       comgt)                  proto_3g_teardown $@ ;;
+       cdc_ether|*cdc_ncm)     proto_ncm_teardown $@ ;;
        esac
 }