From 0935d6a7e907e20381a42882ae728051f9bece02 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Fri, 4 Sep 2009 14:21:19 -0700 Subject: [PATCH 1/1] Parse the USB serial number as an integer. AltOS devices use simple integer serial numbers, so parse the USB value as such to make matching values more forgiving. Signed-off-by: Keith Packard --- ao-tools/ao-view/aoview_dev_dialog.c | 2 +- ao-tools/lib/cc-usbdev.c | 97 ++++++++++++++++++++++++++-- ao-tools/lib/cc.h | 5 +- 3 files changed, 98 insertions(+), 6 deletions(-) diff --git a/ao-tools/ao-view/aoview_dev_dialog.c b/ao-tools/ao-view/aoview_dev_dialog.c index 87396c1f..2ea43203 100644 --- a/ao-tools/ao-view/aoview_dev_dialog.c +++ b/ao-tools/ao-view/aoview_dev_dialog.c @@ -29,7 +29,7 @@ aoview_dev_dialog_map(GtkWidget *widget, gpointer data) list_store = gtk_list_store_new(3, G_TYPE_STRING, - G_TYPE_STRING, + G_TYPE_INT, G_TYPE_STRING); devs = cc_usbdevs_scan(); diff --git a/ao-tools/lib/cc-usbdev.c b/ao-tools/lib/cc-usbdev.c index d8bb8b11..ed39c062 100644 --- a/ao-tools/lib/cc-usbdev.c +++ b/ao-tools/lib/cc-usbdev.c @@ -16,8 +16,8 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#define _GNU_SOURCE #include "cc.h" - #include #include #include @@ -64,6 +64,23 @@ load_hex(char *dir, char *file) return i; } +static int +load_dec(char *dir, char *file) +{ + char *line; + char *end; + long i; + + line = load_string(dir, file); + if (!line) + return -1; + i = strtol(line, &end, 10); + free(line); + if (end == line) + return -1; + return i; +} + static int dir_filter_tty_colon(const struct dirent *d) { @@ -141,7 +158,7 @@ usb_scan_device(char *sys) usbdev->sys = strdup(sys); usbdev->manufacturer = load_string(sys, "manufacturer"); usbdev->product = load_string(sys, "product"); - usbdev->serial = load_string(sys, "serial"); + usbdev->serial = load_dec(sys, "serial"); usbdev->idProduct = load_hex(sys, "idProduct"); usbdev->idVendor = load_hex(sys, "idVendor"); usbdev->tty = usb_tty(sys); @@ -154,8 +171,9 @@ usbdev_free(struct cc_usbdev *usbdev) free(usbdev->sys); free(usbdev->manufacturer); free(usbdev->product); - free(usbdev->serial); - free(usbdev->tty); + /* this can get used as a return value */ + if (usbdev->tty) + free(usbdev->tty); free(usbdev); } @@ -226,3 +244,74 @@ cc_usbdevs_free(struct cc_usbdevs *usbdevs) usbdev_free(usbdevs->dev[i]); free(usbdevs); } + +static char * +match_dev(char *product, int serial) +{ + struct cc_usbdevs *devs; + struct cc_usbdev *dev; + int i; + char *tty = NULL; + + devs = cc_usbdevs_scan(); + if (!devs) + return NULL; + for (i = 0; i < devs->ndev; i++) { + dev = devs->dev[i]; + if (product && strcmp (product, dev->product) != 0) + continue; + if (serial && serial != dev->serial) + continue; + break; + } + if (i < devs->ndev) { + tty = devs->dev[i]->tty; + devs->dev[i]->tty = NULL; + } + cc_usbdevs_free(devs); + return tty; +} + +char * +cc_usbdevs_find_by_arg(char *arg, char *default_product) +{ + char *product; + int serial; + char *end; + char *colon; + char *tty; + + if (arg) + { + /* check for */ + serial = strtol(arg, &end, 0); + if (end != arg) { + if (*end != '\0') + return NULL; + product = NULL; + } else { + /* check for : */ + colon = strchr(arg, ':'); + if (colon) { + product = strndup(arg, colon - arg); + serial = strtol(colon + 1, &end, 0); + if (*end != '\0') + return NULL; + } else { + product = arg; + serial = 0; + } + } + } else { + product = NULL; + serial = 0; + } + tty = NULL; + if (!product && default_product) + tty = match_dev(default_product, serial); + if (!tty) + tty = match_dev(product, serial); + if (product && product != arg) + free(product); + return tty; +} diff --git a/ao-tools/lib/cc.h b/ao-tools/lib/cc.h index dad11bf3..0933f272 100644 --- a/ao-tools/lib/cc.h +++ b/ao-tools/lib/cc.h @@ -32,7 +32,7 @@ struct cc_usbdev { char *tty; char *manufacturer; char *product; - char *serial; + int serial; /* AltOS always uses simple integer serial numbers */ int idProduct; int idVendor; }; @@ -48,4 +48,7 @@ cc_usbdevs_free(struct cc_usbdevs *usbdevs); struct cc_usbdevs * cc_usbdevs_scan(void); +char * +cc_usbdevs_find_by_arg(char *arg, char *default_product); + #endif /* _CC_H_ */ -- 2.30.2