changeset 45:a94bd4002076

fteeprom-prog: implement -d option for interface detach
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 11 Sep 2023 02:48:22 +0000
parents 5160f6717903
children d682cac178c2
files fteeprom/fteeprom-prog.c
diffstat 1 files changed, 50 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/fteeprom/fteeprom-prog.c	Mon Sep 11 02:27:11 2023 +0000
+++ b/fteeprom/fteeprom-prog.c	Mon Sep 11 02:48:22 2023 +0000
@@ -19,9 +19,52 @@
 #include "../libuwrap/open_close.h"
 #include "../libftmini/eeprom_func.h"
 
+char *device_selector, *input_filename;
+int detach_num, ft232r_mode;
 unsigned eeprom_size;
 u_short eeprom[256];
 
+process_cmdline(argc, argv)
+	char **argv;
+{
+	int c;
+	extern int optind;
+	extern char *optarg;
+
+	while ((c = getopt(argc, argv, "d:r")) != 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;
+		case 'r':
+			ft232r_mode = 1;
+			detach_num = 1;
+			continue;
+		default:
+			/* error msg already printed */
+			exit(1);
+		}
+	}
+	if (argc < optind + 1 || argc > optind + 2) {
+		fprintf(stderr,
+			"usage: %s [options] device-selector [eeprom-image]\n",
+			argv[0]);
+		exit(1);
+	}
+	device_selector = argv[optind];
+	input_filename = argv[optind + 1];
+}
+
 read_eeprom_common(inf, filename_for_errs)
 	FILE *inf;
 	char *filename_for_errs;
@@ -83,33 +126,16 @@
 main(argc, argv)
 	char **argv;
 {
-	char **ap, *devsel;
 	struct usb_device *dev;
 	usb_dev_handle *usbh;
-	int ft232r_mode = 0;
 	unsigned n;
 
-	if (argc < 2) {
-usage:		fprintf(stderr,
-			"usage: %s [-r] device-selector [eeprom-image]\n",
-			argv[0]);
-		exit(1);
-	}
-	ap = argv + 1;
-	if (!strcmp(*ap, "-r")) {
-		ft232r_mode = 1;
-		ap++;
-	}
-	if (!*ap)
-		goto usage;
-	devsel = *ap++;
-	if (*ap) {
-		if (ap[1])
-			goto usage;
-		read_eeprom_from_file(*ap);
-	} else
+	process_cmdline(argc, argv);
+	if (input_filename)
+		read_eeprom_from_file(input_filename);
+	else
 		read_eeprom_from_stdin();
-	dev = find_usbdev_by_desc_string(devsel);
+	dev = find_usbdev_by_desc_string(device_selector);
 	if (!dev) {
 		fprintf(stderr, "error: specified USB device not found\n");
 		exit(1);
@@ -119,6 +145,8 @@
 		fprintf(stderr, "error: usb_open() failed\n");
 		exit(1);
 	}
+	if (detach_num)
+		usbwrap_claim_all_ifs(usbh, detach_num);
 	if (ft232r_mode)
 		ft232r_eeprom_magic(usbh);
 	for (n = 0; n < eeprom_size; n++)