Re: [PATCH] Add USB sys file-system support (v6)

2008-09-25 Thread Anthony Liguori

TJ wrote:

This patch adds support for host USB devices discovered via:

/sys/bus/usb/devices/* and opened from /dev/bus/usb/*/*
/dev/bus/usb/devices and opened from /dev/bus/usb/*/*

in addition to the existing discovery via:

/proc/bus/usb/devices and opened from /proc/bus/usb/*/*

Signed-off-by: TJ [EMAIL PROTECTED]
---
--- a/usb-linux.c   2008-09-17 22:39:38.0 +0100
+++ b/usb-linux.c   2008-09-23 02:28:48.0 +0100
@@ -7,6 +7,10 @@
  *  Support for host device auto connect  disconnect
  *  Major rewrite to support fully async operation
  *
+ * Copyright 2008 TJ [EMAIL PROTECTED]
+ *  Added flexible support for /dev/bus/usb /sys/bus/usb/devices in 
addition
+ *  to the legacy /proc/bus/usb USB device discovery and handling
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the Software), to 
deal
  * in the Software without restriction, including without limitation the rights
@@ -72,9 +76,20 @@
 #define dprintf(...)
 #endif
 
-#define USBDEVFS_PATH /proc/bus/usb

+#define USBPROCBUS_PATH /proc/bus/usb
 #define PRODUCT_NAME_SZ 32
 #define MAX_ENDPOINTS 16
+#define USBDEVBUS_PATH /dev/bus/usb
+#define USBSYSBUS_PATH /sys/bus/usb
+
+static char *usb_host_device_path;
+
+#define USB_FS_NONE 0
+#define USB_FS_PROC 1
+#define USB_FS_DEV 2
+#define USB_FS_SYS 3
+
+static int usb_fs_type = 0;
 
 /* endpoint association data */

 struct endp_data {
@@ -890,13 +905,18 @@
 
 printf(husb: open device %d.%d\n, bus_num, addr);
 
-snprintf(buf, sizeof(buf), USBDEVFS_PATH /%03d/%03d,

+   if (!usb_host_device_path) {
+   perror(husb: USB Host Device Path not set);
+   goto fail;
+   }
+snprintf(buf, sizeof(buf), %s/%03d/%03d, usb_host_device_path,
  bus_num, addr);
  


You have tabs here.


 fd = open(buf, O_RDWR | O_NONBLOCK);
 if (fd  0) {
 perror(buf);
 goto fail;
 }
+dprintf(husb: opened %s\n, buf);
 
 /* read the device description */

 dev-descr_len = read(fd, dev-descr, sizeof(dev-descr));
@@ -1038,23 +1058,29 @@
 return q - buf;
 }
 
-static int usb_host_scan(void *opaque, USBScanFunc *func)

+/*
+ Use /proc/bus/usb/devices or /dev/bus/usb/devices file to determine
+ host's USB devices. This is legacy support since many distributions
+ are moving to /sys/bus/usb
+*/
+static int usb_host_scan_dev(void *opaque, USBScanFunc *func)
 {
-FILE *f;
+FILE *f = 0;
 char line[1024];
 char buf[1024];
 int bus_num, addr, speed, device_count, class_id, product_id, vendor_id;
-int ret;
 char product_name[512];
+int ret = 0;
 
-f = fopen(USBDEVFS_PATH /devices, r);

+snprintf(line, sizeof(line), %s/devices, usb_host_device_path);
+f = fopen(line, r);
 if (!f) {
-term_printf(husb: could not open %s\n, USBDEVFS_PATH /devices);
-return 0;
+   perror(husb: cannot open devices file);
+   goto the_end;
 }
  


And here and almost everywhere.


+
 device_count = 0;
 bus_num = addr = speed = class_id = product_id = vendor_id = 0;
-ret = 0;
 for(;;) {
 if (fgets(line, sizeof(line), f) == NULL)
 break;
@@ -1106,12 +1132,191 @@
 fail: ;
 }
 if (device_count  (vendor_id || product_id)) {
-/* Add the last device.  */
-ret = func(opaque, bus_num, addr, class_id, vendor_id,
-   product_id, product_name, speed);
+   /* Add the last device.  */
+   ret = func(opaque, bus_num, addr, class_id, vendor_id,
+   product_id, product_name, speed);
+}
+ the_end:
+if (f) fclose(f);
+return ret;
+}
+
+/*
+ Use /sys/bus/usb/devices/ directory to determine host's USB devices.
+
+ This code is taken from Robert Schiele's original patches posted to the
+ Novell bug-tracker https://bugzilla.novell.com/show_bug.cgi?id=241950
+*/
+static int usb_host_scan_sys(void *opaque, USBScanFunc *func)
+{
+FILE *f;
+DIR *dir = 0;
+char line[1024];
+int bus_num, addr, speed, class_id, product_id, vendor_id;
+int ret = 0;
+char product_name[512];
+struct dirent* de;
+
+dir = opendir(USBSYSBUS_PATH /devices);
+if (!dir) {
+   perror(husb: cannot open devices directory);
+   goto the_end;
+}
+
+while ((de = readdir(dir))) {
+   if (de-d_name[0] != '.'  ! strchr(de-d_name, ':')) {
+   char filename[PATH_MAX];
+   char* tmpstr = de-d_name;
+   if (!strncmp(de-d_name, usb, 3))
+   tmpstr += 3;
  


This is indented wrong.


+
+   bus_num = atoi(tmpstr);
+   snprintf(filename, PATH_MAX, USBSYSBUS_PATH /devices/%s/devnum, 
de-d_name);
+   f = fopen(filename, r);
+   if (!f) {
+   term_printf(Could not open %s\n, filename);
+   goto the_end;
+   

[PATCH] Add USB sys file-system support (v6)

2008-09-22 Thread TJ
This patch adds support for host USB devices discovered via:

/sys/bus/usb/devices/* and opened from /dev/bus/usb/*/*
/dev/bus/usb/devices and opened from /dev/bus/usb/*/*

in addition to the existing discovery via:

/proc/bus/usb/devices and opened from /proc/bus/usb/*/*

Signed-off-by: TJ [EMAIL PROTECTED]
---
--- a/usb-linux.c   2008-09-17 22:39:38.0 +0100
+++ b/usb-linux.c   2008-09-23 02:28:48.0 +0100
@@ -7,6 +7,10 @@
  *  Support for host device auto connect  disconnect
  *  Major rewrite to support fully async operation
  *
+ * Copyright 2008 TJ [EMAIL PROTECTED]
+ *  Added flexible support for /dev/bus/usb /sys/bus/usb/devices in 
addition
+ *  to the legacy /proc/bus/usb USB device discovery and handling
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the Software), to 
deal
  * in the Software without restriction, including without limitation the rights
@@ -72,9 +76,20 @@
 #define dprintf(...)
 #endif
 
-#define USBDEVFS_PATH /proc/bus/usb
+#define USBPROCBUS_PATH /proc/bus/usb
 #define PRODUCT_NAME_SZ 32
 #define MAX_ENDPOINTS 16
+#define USBDEVBUS_PATH /dev/bus/usb
+#define USBSYSBUS_PATH /sys/bus/usb
+
+static char *usb_host_device_path;
+
+#define USB_FS_NONE 0
+#define USB_FS_PROC 1
+#define USB_FS_DEV 2
+#define USB_FS_SYS 3
+
+static int usb_fs_type = 0;
 
 /* endpoint association data */
 struct endp_data {
@@ -890,13 +905,18 @@
 
 printf(husb: open device %d.%d\n, bus_num, addr);
 
-snprintf(buf, sizeof(buf), USBDEVFS_PATH /%03d/%03d,
+   if (!usb_host_device_path) {
+   perror(husb: USB Host Device Path not set);
+   goto fail;
+   }
+snprintf(buf, sizeof(buf), %s/%03d/%03d, usb_host_device_path,
  bus_num, addr);
 fd = open(buf, O_RDWR | O_NONBLOCK);
 if (fd  0) {
 perror(buf);
 goto fail;
 }
+dprintf(husb: opened %s\n, buf);
 
 /* read the device description */
 dev-descr_len = read(fd, dev-descr, sizeof(dev-descr));
@@ -1038,23 +1058,29 @@
 return q - buf;
 }
 
-static int usb_host_scan(void *opaque, USBScanFunc *func)
+/*
+ Use /proc/bus/usb/devices or /dev/bus/usb/devices file to determine
+ host's USB devices. This is legacy support since many distributions
+ are moving to /sys/bus/usb
+*/
+static int usb_host_scan_dev(void *opaque, USBScanFunc *func)
 {
-FILE *f;
+FILE *f = 0;
 char line[1024];
 char buf[1024];
 int bus_num, addr, speed, device_count, class_id, product_id, vendor_id;
-int ret;
 char product_name[512];
+int ret = 0;
 
-f = fopen(USBDEVFS_PATH /devices, r);
+snprintf(line, sizeof(line), %s/devices, usb_host_device_path);
+f = fopen(line, r);
 if (!f) {
-term_printf(husb: could not open %s\n, USBDEVFS_PATH /devices);
-return 0;
+   perror(husb: cannot open devices file);
+   goto the_end;
 }
+
 device_count = 0;
 bus_num = addr = speed = class_id = product_id = vendor_id = 0;
-ret = 0;
 for(;;) {
 if (fgets(line, sizeof(line), f) == NULL)
 break;
@@ -1106,12 +1132,191 @@
 fail: ;
 }
 if (device_count  (vendor_id || product_id)) {
-/* Add the last device.  */
-ret = func(opaque, bus_num, addr, class_id, vendor_id,
-   product_id, product_name, speed);
+   /* Add the last device.  */
+   ret = func(opaque, bus_num, addr, class_id, vendor_id,
+   product_id, product_name, speed);
+}
+ the_end:
+if (f) fclose(f);
+return ret;
+}
+
+/*
+ Use /sys/bus/usb/devices/ directory to determine host's USB devices.
+
+ This code is taken from Robert Schiele's original patches posted to the
+ Novell bug-tracker https://bugzilla.novell.com/show_bug.cgi?id=241950
+*/
+static int usb_host_scan_sys(void *opaque, USBScanFunc *func)
+{
+FILE *f;
+DIR *dir = 0;
+char line[1024];
+int bus_num, addr, speed, class_id, product_id, vendor_id;
+int ret = 0;
+char product_name[512];
+struct dirent* de;
+
+dir = opendir(USBSYSBUS_PATH /devices);
+if (!dir) {
+   perror(husb: cannot open devices directory);
+   goto the_end;
+}
+
+while ((de = readdir(dir))) {
+   if (de-d_name[0] != '.'  ! strchr(de-d_name, ':')) {
+   char filename[PATH_MAX];
+   char* tmpstr = de-d_name;
+   if (!strncmp(de-d_name, usb, 3))
+   tmpstr += 3;
+
+   bus_num = atoi(tmpstr);
+   snprintf(filename, PATH_MAX, USBSYSBUS_PATH 
/devices/%s/devnum, de-d_name);
+   f = fopen(filename, r);
+   if (!f) {
+   term_printf(Could not open %s\n, filename);
+   goto the_end;
+   }
+   fgets(line, sizeof(line), f);
+   fclose(f);
+   addr = atoi(line);
+