int launch_usb_modeswitch(int vid, int pid, int inquire) { char eject_file[64], addon[32]; char *arg_inq = ""; addon[0] = 0; if ((vid == 0x0471 && pid == 0x1210) || (vid == 0x05c6 && pid == 0x1000)) { usb_info_t *usb_info, *follow_usb; const char *uMa[8] = {"AnyDATA", "CELOT", "DGT", "SAMSUNG", "SSE", "StrongRising", "Vertex", "Philips"}; usb_info = get_usb_info(); for (follow_usb = usb_info; follow_usb != NULL; follow_usb = follow_usb->next) { if (follow_usb->dev_vid == vid && follow_usb->dev_pid == pid) { if (vid == 0x05c6 && pid == 0x1000) { int i; for (i = 0; i < 7; i++) { if (strncmp(follow_usb->manuf, uMa[i], strlen(uMa[i])) == 0) { sprintf(addon, ":uMa=%s", uMa[i]); break; } } } else { /* 0471:1210:uMa=Philips */ if (strncmp(follow_usb->manuf, uMa[7], strlen(uMa[7])) == 0) sprintf(addon, ":uMa=%s", uMa[7]); } break; } } free_usb_info(usb_info); } /* first, check custom rule in /etc/storage */ sprintf(eject_file, "/etc/storage/%04x:%04x", vid, pid); if (!check_if_file_exist(eject_file)) { sprintf(eject_file, "%s/usb_modeswitch.d/%04x:%04x%s", MODEM_SCRIPTS_DIR, vid, pid, addon); if (!check_if_file_exist(eject_file)) { logmessage("usb_modeswitch", "no rule for device %04x:%04x", vid, pid); return 1; } } if (inquire) arg_inq = "-D -I "; return doSystem("/bin/usb_modeswitch %s-v 0x%04x -p 0x%04x -c %s", arg_inq, vid, pid, eject_file); }
static int find_usb_device(int vid, int pid) { int i_found = 0; usb_info_t *usb_info, *follow_usb; usb_info = get_usb_info(); for (follow_usb = usb_info; follow_usb != NULL; follow_usb = follow_usb->next) { if (follow_usb->dev_vid == vid && follow_usb->dev_pid == pid) { i_found = 1; break; } } free_usb_info(usb_info); return i_found; }
int safe_remove_usb_device(int port, const char *dev_name, int do_spindown) { int modem_devnum = 0; if (dev_name && strncmp(dev_name, "sd", 2) != 0) { modem_devnum = atoi(dev_name); if (modem_devnum < 0) modem_devnum = 0; } if (port == 1 || port == 2) { if (modem_devnum) { usb_info_t *usb_info, *follow_usb; int has_modem_port = 0; usb_info = get_usb_info(); for (follow_usb = usb_info; follow_usb != NULL; follow_usb = follow_usb->next) { if ((follow_usb->port_root == port) && (follow_usb->id_devnum == modem_devnum) && (follow_usb->dev_type == DEVICE_TYPE_MODEM_TTY || follow_usb->dev_type == DEVICE_TYPE_MODEM_ETH)) has_modem_port |= 1; } free_usb_info(usb_info); if (has_modem_port) { if ( get_usb_modem_dev_wan(0, modem_devnum) ) { safe_remove_usb_modem(); try_wan_reconnect(0, 0); } } } else { int has_mounted_port = 0; disk_info_t *disks_info, *follow_disk; disks_info = read_disk_data(); for (follow_disk = disks_info; follow_disk != NULL; follow_disk = follow_disk->next) { if (follow_disk->port_root == port && follow_disk->mounted_number > 0) has_mounted_port |= 1; } if (has_mounted_port) { stop_usb_apps(); umount_usb_path(disks_info, port, dev_name, do_spindown); umount_ejected(); if (count_sddev_mountpoint()) start_usb_apps(); #if defined(APP_NFSD) else unload_nfsd(); #endif } free_disk_data(disks_info); } } else if (port == 0) { disk_info_t *disks_info; stop_usb_apps(); disks_info = read_disk_data(); umount_usb_path(disks_info, 0, NULL, do_spindown); free_disk_data(disks_info); umount_sddev_all(); umount_ejected(); #if defined(APP_NFSD) unload_nfsd(); #endif } return 0; }