|
@@ -0,0 +1,100 @@
+Index: packages/lshw/development/src/core/scsi.cc
+===================================================================
+--- a/packages/lshw/development/src/core/scsi.cc
++++ b/packages/lshw/development/src/core/scsi.cc
+@@ -30,5 +30,5 @@
+ __ID("@(#) $Id$");
+
+-#define SG_X "/dev/sg%d"
++#define SG_X "/dev/sg*"
+ #define SG_MAJOR 21
+
+@@ -654,8 +654,7 @@
+
+
+-static bool scan_sg(int sg,
+-hwNode & n)
+-{
+- char buffer[20];
++static void scan_sg(hwNode & n)
++{
++ int sg;
+ int fd = -1;
+ My_sg_scsi_id m_id;
+@@ -666,14 +665,22 @@
+ int emulated = 0;
+ bool ghostdeventry = false;
+-
+- snprintf(buffer, sizeof(buffer), SG_X, sg);
+-
+- ghostdeventry = !exists(buffer);
+-
+- if(ghostdeventry) mknod(buffer, (S_IFCHR | S_IREAD), MKDEV(SG_MAJOR, sg));
+- fd = open(buffer, OPEN_FLAG | O_NONBLOCK);
+- if(ghostdeventry) unlink(buffer);
++ size_t j;
++ glob_t entries;
++
++ if(glob(SG_X, 0, NULL, &entries) == 0)
++ {
++ for(j=0; j < entries.gl_pathc; j++)
++ {
++ sg = strtol(strpbrk(entries.gl_pathv[j], "0123456789"), NULL, 10);
++
++ ghostdeventry = !exists(entries.gl_pathv[j]);
++
++ if(ghostdeventry)
++ mknod(entries.gl_pathv[j], (S_IFCHR | S_IREAD), MKDEV(SG_MAJOR, sg));
++ fd = open(entries.gl_pathv[j], OPEN_FLAG | O_NONBLOCK);
++ if(ghostdeventry)
++ unlink(entries.gl_pathv[j]);
+ if (fd < 0)
+- return false;
++ continue;
+
+ memset(&m_id, 0, sizeof(m_id));
+@@ -681,5 +688,5 @@
+ {
+ close(fd);
+- return true; // we failed to get info but still hope we can continue
++ continue; // we failed to get info but still hope we can continue
+ }
+
+@@ -774,9 +781,6 @@
+ parent = n.addChild(hwNode("scsi", hw::storage));
+
+- if (!parent)
+- {
+- close(fd);
+- return true;
+- }
++ if (parent)
++ {
+
+ if(parent->getBusInfo() == "")
+@@ -790,8 +794,10 @@
+ }
+ parent->addChild(device);
++ }
+
+ close(fd);
+-
+- return true;
++ }
++ globfree(&entries);
++ }
+ }
+
+@@ -890,10 +896,7 @@
+ bool scan_scsi(hwNode & n)
+ {
+- int i = 0;
+-
+ scan_devices();
+
+- while (scan_sg(i, n))
+- i++;
++ scan_sg(n);
+
+ scan_hosts(n);
+
|