diff fteeprom/fteeprom-erase.c @ 46:d682cac178c2

fteeprom-erase: implement -d option for interface detach
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 11 Sep 2023 02:59:10 +0000
parents 2746b160afb7
children 5cbde3c80c24
line wrap: on
line diff
--- a/fteeprom/fteeprom-erase.c	Mon Sep 11 02:48:22 2023 +0000
+++ b/fteeprom/fteeprom-erase.c	Mon Sep 11 02:59:10 2023 +0000
@@ -19,17 +19,52 @@
 #include "../libuwrap/open_close.h"
 #include "../libftmini/eeprom_func.h"
 
+char *device_selector;
+int detach_num;
+
+process_cmdline(argc, argv)
+	char **argv;
+{
+	int c;
+	extern int optind;
+	extern char *optarg;
+
+	while ((c = getopt(argc, argv, "d:")) != EOF) {
+		switch (c) {
+		case 'd':
+			detach_num = atoi(optarg);
+			switch (detach_num) {
+			case 0:
+			case 1:
+			case 2:
+			case 4:
+				break;
+			default:
+				fprintf(stderr, "error: invalid -d argument\n");
+				exit(1);
+			}
+			continue;
+		default:
+			/* error msg already printed */
+			exit(1);
+		}
+	}
+	if (argc != optind + 1) {
+		fprintf(stderr, "usage: %s [options] device-selector\n",
+			argv[0]);
+		exit(1);
+	}
+	device_selector = argv[optind];
+}
+
 main(argc, argv)
 	char **argv;
 {
 	struct usb_device *dev;
 	usb_dev_handle *usbh;
 
-	if (argc != 2) {
-		fprintf(stderr, "usage: %s device-selector\n");
-		exit(1);
-	}
-	dev = find_usbdev_by_desc_string(argv[1]);
+	process_cmdline(argc, argv);
+	dev = find_usbdev_by_desc_string(device_selector);
 	if (!dev) {
 		fprintf(stderr, "error: specified USB device not found\n");
 		exit(1);
@@ -39,6 +74,8 @@
 		fprintf(stderr, "error: usb_open() failed\n");
 		exit(1);
 	}
+	if (detach_num)
+		usbwrap_claim_all_ifs(usbh, detach_num);
 	ftmini_erase_eeprom(usbh);
 	usb_close(usbh);
 	exit(0);