X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/243dc6900194c533e49daae0d30623918ef31252..d19929cbe8d681b60496ca6d9d9cbd806822e163:/client/proxusb.c diff --git a/client/proxusb.c b/client/proxusb.c index 15513bf0..3c2b20b4 100644 --- a/client/proxusb.c +++ b/client/proxusb.c @@ -1,4 +1,5 @@ //----------------------------------------------------------------------------- +// Copyright (C) 2009 Michael Gernoth // Copyright (C) 2010 iZsh // // This code is licensed to you under the terms of the GNU GPL, version 2 or, @@ -112,6 +113,8 @@ usb_dev_handle* findProxmark(int verbose, unsigned int *iface) { struct usb_bus *busses, *bus; usb_dev_handle *handle = NULL; + struct prox_unit units[50]; + int iUnit = 0; usb_find_busses(); usb_find_devices(); @@ -128,14 +131,47 @@ usb_dev_handle* findProxmark(int verbose, unsigned int *iface) handle = usb_open(dev); if (!handle) { if (verbose) - fprintf(stderr, "open failed: %s!\n", usb_strerror()); - return NULL; + fprintf(stderr, "open fabiled: %s!\n", usb_strerror()); + //return NULL; + continue; } *iface = dev->config[0].interface[0].altsetting[0].bInterfaceNumber; - return handle; + + struct prox_unit unit = {handle, {0}}; + usb_get_string_simple(handle, desc->iSerialNumber, unit.serial_number, sizeof(unit.serial_number)); + units[iUnit++] = unit; + + //return handle; } + } + } + + if (iUnit > 0) { + int iSelection = 0; + fprintf(stdout, "\nConnected units:\n"); + + for (int i = 0; i < iUnit; i++) { + struct usb_device * dev = usb_device(units[i].handle); + fprintf(stdout, "\t%d. SN: %s [%s/%s]\n", i+1, units[i].serial_number, dev->bus->dirname, dev->filename); + } + if (iUnit > 1) { + while (iSelection < 1 || iSelection > iUnit) { + fprintf(stdout, "Which unit do you want to connect to? "); + fscanf(stdin, "%d", &iSelection); + } + } + else + iSelection = 1; + iSelection --; + + for (int i = 0; i < iUnit; i++) { + if (iSelection == i) continue; + usb_close(units[i].handle); + units[i].handle = NULL; } + + return units[iSelection].handle; } return NULL; @@ -147,15 +183,6 @@ usb_dev_handle* OpenProxmark(int verbose) usb_dev_handle *handle = NULL; unsigned int iface; -#ifdef __linux__ - handle = findProxmark(verbose, &iface); - if (!handle) - return NULL; - - /* Whatever... */ - usb_reset(handle); -#endif - handle = findProxmark(verbose, &iface); if (!handle) return NULL;