8 static int did_usb_init 
= 0; 
  11 static int  usb_get_string_ascii(usb_dev_handle 
*dev
, int index
, int langid
, char *buf
, int buflen
) 
  16         if((rval 
= usb_control_msg(dev
,  
  18                                    USB_REQ_GET_DESCRIPTOR
,  
  19                                    (USB_DT_STRING 
<< 8) + index
,  
  20                                    langid
, buffer
, sizeof(buffer
),  
  23         if(buffer
[1] != USB_DT_STRING
) 
  25         if((unsigned char)buffer
[0] < rval
) 
  26                 rval 
= (unsigned char)buffer
[0]; 
  28         /* lossy conversion to ISO Latin1 */ 
  29         for(i
=1; i
<rval
; i
++) { 
  30                 if(i 
> buflen
)  /* destination buffer overflow */ 
  32                 buf
[i
-1] = buffer
[2 * i
]; 
  33                 if(buffer
[2 * i 
+ 1] != 0)  /* outside of ISO Latin1 range */ 
  41 int usb_match_string(usb_dev_handle 
*handle
, int index
, char* string
) 
  45                 return 1; /* NULL matches anything */ 
  46         usb_get_string_ascii(handle
, index
, 0x409, tmp
, 256); 
  47         return (strcmp(string
,tmp
)==0); 
  50 usb_dev_handle 
*usb_check_device(struct usb_device 
*dev
, 
  55         usb_dev_handle      
*handle 
= usb_open(dev
); 
  57                 fprintf(stderr
, "Warning: cannot open USB device: %s\n", usb_strerror()); 
  61                 usb_match_string(handle
, dev
->descriptor
.iManufacturer
, vendor_name
) && 
  62                 usb_match_string(handle
, dev
->descriptor
.iProduct
,      product_name
) && 
  63                 usb_match_string(handle
, dev
->descriptor
.iSerialNumber
, serial
) 
  72 usb_dev_handle 
*nc_usb_open(int vendor
, int product
, char *vendor_name
, char *product_name
, char *serial
) 
  75         struct usb_device   
*dev
; 
  76         usb_dev_handle      
*handle 
= NULL
; 
  84         for(bus
=usb_get_busses(); bus
; bus
=bus
->next
) { 
  85                 for(dev
=bus
->devices
; dev
; dev
=dev
->next
) { 
  86                                     if(dev
->descriptor
.idVendor 
== vendor 
&&  
  87                                        dev
->descriptor
.idProduct 
== product
) { 
  88                                             handle 
= usb_check_device(dev
, vendor_name
, product_name
, serial
);