Exemple #1
0
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);
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}