tags 356352 + patch
thanks

On Mon, Jun 26, 2006 at 09:06:39PM +0200, Morten Werner Olsen wrote:
> The patch applies fine with 12.33 (newest upstream I found atm), but I
> get this error when running hwinfo (this is the shared libary one -
> similar source package that is in experimental, but with your patch and
> newer upstream release):

Newest upstream is now 13.0. I've taken the patch, forward-ported it to 13.0
and fixed a few errors (valgrind is very useful for this kind of work, by the
way). It works without crashing or giving valgrind hits (at least "hwinfo"
and "hwinfo --pci"), but it has a number of small memory leaks. (I suspect
the latter is not a consequence of the patch, though.)

/* Steinar */
-- 
Homepage: http://www.sesse.net/
Only in hwinfo-13.0.patched: .depend
Only in hwinfo-13.0.patched: hwinfo
Only in hwinfo-13.0.patched: hwinfo.o
Only in hwinfo-13.0.patched/src/hd: adb.o
Only in hwinfo-13.0.patched/src/hd: bios.o
Only in hwinfo-13.0.patched/src/hd: block.o
Only in hwinfo-13.0.patched/src/hd: braille.o
Only in hwinfo-13.0.patched/src/hd: cpu.o
Only in hwinfo-13.0.patched/src/hd: .depend
diff -ur hwinfo-13.0/src/hd/edd.c hwinfo-13.0.patched/src/hd/edd.c
--- hwinfo-13.0/src/hd/edd.c    2006-06-29 16:03:37.000000000 +0200
+++ hwinfo-13.0.patched/src/hd/edd.c    2006-07-08 23:47:31.000000000 +0200
@@ -53,9 +53,9 @@
   bios_info_t *bt;
   edd_info_t *ei;
 
-  struct sysfs_directory *sf_dir;
-  struct sysfs_directory *sf_dir_2;
-  struct sysfs_link *sf_link;
+  struct dlist *sf_dir_list;
+  struct sysfs_attribute *node, *tmpattr;
+  char attrpath[SYSFS_PATH_MAX], linkpath[SYSFS_PATH_MAX];
 
   for(u = 0; u < sizeof hd_data->edd / sizeof *hd_data->edd; u++) {
     free_mem(hd_data->edd[u].sysfs_id);
@@ -63,69 +63,92 @@
 
   memset(hd_data->edd, 0, sizeof hd_data->edd);
 
-  sf_dir = sysfs_open_directory("/sys/firmware/edd");
-
-  if(sf_dir) {
-    if(!sysfs_read_all_subdirs(sf_dir)) {
-      if(sf_dir->subdirs) {
-        dlist_for_each_data(sf_dir->subdirs, sf_dir_2, struct sysfs_directory) 
{
+  sf_dir_list = sysfs_open_directory_list("/sys/firmware/edd");
+  
+  if(sf_dir_list) {
+        dlist_for_each_data(sf_dir_list, node, struct sysfs_attribute) {
 
           if(
-            sscanf(sf_dir_2->name, "int13_dev%02x", &u) == 1 &&
+            sscanf(node->name, "int13_dev%02x", &u) == 1 &&
             u >= 0x80 &&
             u <= 0xff
           ) {
+            
             edd_cnt++;
 
             u -= 0x80;
 
             ei = hd_data->edd + u;
-
-            if(hd_attr_uint(sysfs_get_directory_attribute(sf_dir_2, 
"sectors"), &ul0, 0)) {
+            
+            sprintf(attrpath, "/sys/firmware/edd/%s/sectors", node->name);
+            tmpattr = sysfs_open_attribute(attrpath); 
+            if(hd_attr_uint(tmpattr, &ul0, 0)) {
               ei->sectors = ul0;
             }
+            sysfs_close_attribute(tmpattr);
 
-            if(hd_attr_uint(sysfs_get_directory_attribute(sf_dir_2, 
"default_cylinders"), &ul0, 0)) {
+            sprintf(attrpath, "/sys/firmware/edd/%s/default_cylinders", 
node->name);
+            tmpattr = sysfs_open_attribute(attrpath); 
+            if(hd_attr_uint(tmpattr, &ul0, 0)) {
               ei->edd.cyls = ul0;
             }
+            sysfs_close_attribute(tmpattr);
 
-            if(hd_attr_uint(sysfs_get_directory_attribute(sf_dir_2, 
"default_heads"), &ul0, 0)) {
+            sprintf(attrpath, "/sys/firmware/edd/%s/default_heads", 
node->name);
+            tmpattr = sysfs_open_attribute(attrpath); 
+            if(hd_attr_uint(tmpattr, &ul0, 0)) {
               ei->edd.heads = ul0;
             }
+            sysfs_close_attribute(tmpattr);
 
-            if(hd_attr_uint(sysfs_get_directory_attribute(sf_dir_2, 
"default_sectors_per_track"), &ul0, 0)) {
+            sprintf(attrpath, 
"/sys/firmware/edd/%s/default_sectors_per_track", node->name);
+            tmpattr = sysfs_open_attribute(attrpath); 
+            if(hd_attr_uint(tmpattr, &ul0, 0)) {
               ei->edd.sectors = ul0;
             }
+            sysfs_close_attribute(tmpattr);
 
-            if(hd_attr_uint(sysfs_get_directory_attribute(sf_dir_2, 
"legacy_max_cylinder"), &ul0, 0)) {
+            sprintf(attrpath, "/sys/firmware/edd/%s/legacy_max_cylinder", 
node->name);
+            tmpattr = sysfs_open_attribute(attrpath); 
+            if(hd_attr_uint(tmpattr, &ul0, 0)) {
               ei->legacy.cyls = ul0 + 1;
             }
+            sysfs_close_attribute(tmpattr);
 
-            if(hd_attr_uint(sysfs_get_directory_attribute(sf_dir_2, 
"legacy_max_head"), &ul0, 0)) {
+            sprintf(attrpath, "/sys/firmware/edd/%s/legacy_max_head", 
node->name);
+            tmpattr = sysfs_open_attribute(attrpath); 
+            if(hd_attr_uint(tmpattr, &ul0, 0)) {
               ei->legacy.heads = ul0 + 1;
             }
+            sysfs_close_attribute(tmpattr);
 
-            if(hd_attr_uint(sysfs_get_directory_attribute(sf_dir_2, 
"legacy_sectors_per_track"), &ul0, 0)) {
+            sprintf(attrpath, "/sys/firmware/edd/%s/legacy_sectors_per_track", 
node->name);
+            tmpattr = sysfs_open_attribute(attrpath); 
+            if(hd_attr_uint(tmpattr, &ul0, 0)) {
               ei->legacy.sectors = ul0;
             }
+            sysfs_close_attribute(tmpattr);
 
             if(ei->sectors && ei->edd.heads && ei->edd.sectors) {
               ei->edd.cyls = ei->sectors / (ei->edd.heads * ei->edd.sectors);
             }
 
-            sf_link = sysfs_get_directory_link(sf_dir_2, "pci_dev");
-            if(sf_link) {
-              hd_data->edd[u].sysfs_id = new_str(hd_sysfs_id(sf_link->target));
+            sprintf(attrpath, "/sys/firmware/edd/%s/legacy_sectors_per_track", 
node->name);
+            if(sysfs_get_link(attrpath, linkpath, SYSFS_PATH_MAX)) {
+              hd_data->edd[u].sysfs_id = new_str(hd_sysfs_id(linkpath));
               if((hd = hd_find_sysfs_id(hd_data, hd_data->edd[u].sysfs_id))) {
                 hd_data->edd[u].hd_idx = hd->idx;
               }
             }
 
-            sl = hd_attr_list(sysfs_get_directory_attribute(sf_dir_2, 
"extensions"));
+            sprintf(attrpath, "/sys/firmware/edd/%s/extensions", node->name);
+            tmpattr = sysfs_open_attribute(attrpath); 
+            sl = hd_attr_list(tmpattr);
             if(search_str_list(sl, "Fixed disk access")) 
hd_data->edd[u].ext_fixed_disk = 1;
             if(search_str_list(sl, "Device locking and ejecting")) 
hd_data->edd[u].ext_lock_eject = 1;
             if(search_str_list(sl, "Enhanced Disk Drive support")) 
hd_data->edd[u].ext_edd = 1;
             if(search_str_list(sl, "64-bit extensions")) 
hd_data->edd[u].ext_64bit = 1;
+            sysfs_close_attribute(tmpattr);
 
             ADD2LOG(
               "edd: 0x%02x\n  size: %"PRIu64"\n  chs default: %u/%u/%u\n  chs 
legacy: %u/%u/%u\n  caps: %s%s%s%s\n  attached: #%u %s\n",
@@ -146,11 +169,9 @@
             );
           }
         }
-      }
-    }
   }
 
-  sysfs_close_directory(sf_dir);
+  sysfs_close_list(sf_dir_list);
 
   if(!edd_cnt) return;
 
Only in hwinfo-13.0.patched/src/hd: edd.c.orig
Only in hwinfo-13.0.patched/src/hd: edd.o
Only in hwinfo-13.0.patched/src/hd: fb.o
Only in hwinfo-13.0.patched/src/hd: floppy.o
Only in hwinfo-13.0.patched/src/hd: hal.o
diff -ur hwinfo-13.0/src/hd/hd.c hwinfo-13.0.patched/src/hd/hd.c
--- hwinfo-13.0/src/hd/hd.c     2006-06-29 15:58:19.000000000 +0200
+++ hwinfo-13.0.patched/src/hd/hd.c     2006-07-08 23:47:31.000000000 +0200
@@ -5623,17 +5623,14 @@
 
 void hd_sysfs_driver_list(hd_data_t *hd_data)
 {
-  char *bus;
   hd_sysfsdrv_t **sfp, *sf;
   str_list_t *sl, *sl0;
   uint64_t id = 0;
 
-  struct sysfs_bus *sf_bus;
-  struct sysfs_driver *sf_drv;
+  struct sysfs_bus *sf_bus, *bus;
   struct sysfs_device *sf_dev;
 
   struct dlist *sf_subsys;
-  struct dlist *sf_drv_list;
   struct dlist *sf_dev_list;
 
 
@@ -5654,26 +5651,23 @@
 
   ADD2LOG("----- sysfs driver list (id 0x%016"PRIx64") -----\n", id);
 
-  sf_subsys = sysfs_open_subsystem_list("bus");
+  sf_subsys = sysfs_open_directory_list("/sys/bus");
 
-  if(sf_subsys) dlist_for_each_data(sf_subsys, bus, char) {
-    sf_bus = sysfs_open_bus(bus);
+  if(sf_subsys) dlist_for_each_data(sf_subsys, bus, struct sysfs_bus) {
+    sf_bus = sysfs_open_bus(bus->name);
 
     if(sf_bus) {
-      sf_drv_list = sysfs_get_bus_drivers(sf_bus);
-      if(sf_drv_list) dlist_for_each_data(sf_drv_list, sf_drv, struct 
sysfs_driver) {
-        sf_dev_list = sysfs_get_driver_devices(sf_drv);
-        if(sf_dev_list) dlist_for_each_data(sf_dev_list, sf_dev, struct 
sysfs_device) {
-          sf = *sfp = new_mem(sizeof **sfp);
-          sfp = &(*sfp)->next;
-          sf->driver = new_str(sf_drv->name);
-          sf->device = new_str(hd_sysfs_id(sf_dev->path));
-          ADD2LOG("%16s: %s\n", sf->driver, sf->device);
-        }
+      sf_dev_list = sysfs_get_bus_devices(sf_bus);
+      if(sf_dev_list) dlist_for_each_data(sf_dev_list, sf_dev, struct 
sysfs_device) {
+        sf = *sfp = new_mem(sizeof **sfp);
+        sfp = &(*sfp)->next;
+        sf->driver = new_str(sf_dev->driver_name);
+        sf->device = new_str(hd_sysfs_id(sf_dev->path));
+        ADD2LOG("%16s: %s\n", sf->driver, sf->device);
       }
-
-      sysfs_close_bus(sf_bus);
     }
+
+    sysfs_close_bus(sf_bus);
   }
 
   sysfs_close_list(sf_subsys);
Only in hwinfo-13.0.patched/src/hd: hd.c.orig
Only in hwinfo-13.0.patched/src/hd: hddb.o
Only in hwinfo-13.0.patched/src/hd: hd.o
Only in hwinfo-13.0.patched/src/hd: hdp.o
Only in hwinfo-13.0.patched/src/hd: input.o
Only in hwinfo-13.0.patched/src/hd: int.o
Only in hwinfo-13.0.patched/src/hd: isa.o
Only in hwinfo-13.0.patched/src/hd: isapnp.o
Only in hwinfo-13.0.patched/src/hd: isdn.o
Only in hwinfo-13.0.patched/src/hd: kbd.c.orig
Only in hwinfo-13.0.patched/src/hd: kbd.o
Only in hwinfo-13.0.patched/src/hd: klog.o
Only in hwinfo-13.0.patched/src/hd: manual.o
Only in hwinfo-13.0.patched/src/hd: memory.o
Only in hwinfo-13.0.patched/src/hd: misc.o
Only in hwinfo-13.0.patched/src/hd: modem.o
Only in hwinfo-13.0.patched/src/hd: monitor.o
Only in hwinfo-13.0.patched/src/hd: mouse.o
diff -ur hwinfo-13.0/src/hd/net.c hwinfo-13.0.patched/src/hd/net.c
--- hwinfo-13.0/src/hd/net.c    2006-06-29 15:58:19.000000000 +0200
+++ hwinfo-13.0.patched/src/hd/net.c    2006-07-08 23:57:28.000000000 +0200
@@ -60,6 +60,7 @@
   struct sysfs_class_device *sf_cdev;
   struct sysfs_device *sf_dev;
   struct sysfs_driver *sf_drv;
+  struct sysfs_bus *sf_bus;
   struct dlist *sf_cdev_list;
 
   if(!hd_probe_feature(hd_data, pr_net)) return;
@@ -106,8 +107,14 @@
     if(sf_dev) {
       ADD2LOG("    net device: path = %s\n", hd_sysfs_id(sf_dev->path));
     }
+    
+    if(sf_dev) { 
+      sf_bus = sysfs_open_bus(sf_dev->bus);
+      if(sf_bus) {
+        sf_drv = sysfs_get_bus_driver(sf_bus, sf_dev->driver_name);
+      }
+    }
 
-    sf_drv = sysfs_get_classdev_driver(sf_cdev);
     if(sf_drv) {
       ADD2LOG(
         "    net driver: name = %s, path = %s\n",
@@ -289,6 +296,8 @@
   }
 
   sysfs_close_class(sf_class);
+  sysfs_close_driver(sf_drv);
+
 
   if(hd_is_sgi_altix(hd_data)) add_xpnet(hd_data);
   if(hd_is_iseries(hd_data)) add_iseries(hd_data);
Only in hwinfo-13.0.patched/src/hd: net.c.orig
Only in hwinfo-13.0.patched/src/hd: net.o
Only in hwinfo-13.0.patched/src/hd: parallel.o
diff -ur hwinfo-13.0/src/hd/pci.c hwinfo-13.0.patched/src/hd/pci.c
--- hwinfo-13.0/src/hd/pci.c    2006-06-29 15:58:19.000000000 +0200
+++ hwinfo-13.0.patched/src/hd/pci.c    2006-07-08 23:47:31.000000000 +0200
@@ -578,6 +578,8 @@
   uint64_t u2;
   int ok;
 
+  if(!sysfs_read_attribute(attr)) return 0;
+
   if(!(s = hd_attr_str(attr))) return 0;
 
   u2 = strtoull(s, &s, base);
@@ -597,6 +599,8 @@
   static str_list_t *sl = NULL;
 
   free_str_list(sl);
+  
+  if(!sysfs_read_attribute(attr)) return 0;
 
   return sl = hd_split('\n', hd_attr_str(attr));
 }
@@ -607,6 +611,8 @@
  */
 char *hd_attr_str(struct sysfs_attribute *attr)
 {
+  if(!sysfs_read_attribute(attr)) return 0;
+  
   return attr ? attr->value : NULL;
 }
 
Only in hwinfo-13.0.patched/src/hd: pci.c.orig
Only in hwinfo-13.0.patched/src/hd: pci.o
Only in hwinfo-13.0.patched/src/hd: pcmcia.o
Only in hwinfo-13.0.patched/src/hd: pppoe.o
Only in hwinfo-13.0.patched/src/hd: prom.o
Only in hwinfo-13.0.patched/src/hd: s390.o
Only in hwinfo-13.0.patched/src/hd: sbus.o
Only in hwinfo-13.0.patched/src/hd: serial.o
Only in hwinfo-13.0.patched/src/hd: smbios.o
Only in hwinfo-13.0.patched/src/hd: sys.o
diff -ur hwinfo-13.0/src/hd/usb.c hwinfo-13.0.patched/src/hd/usb.c
--- hwinfo-13.0/src/hd/usb.c    2006-06-29 15:58:19.000000000 +0200
+++ hwinfo-13.0.patched/src/hd/usb.c    2006-07-08 23:53:47.000000000 +0200
@@ -565,33 +565,47 @@
 
 void get_input_devs(hd_data_t *hd_data)
 {
-  struct sysfs_link *sf_link;
-  struct sysfs_directory *sf_dir, *sf_subdir;
-  struct dlist *sf_list;
-
-  sf_dir = sysfs_open_directory("/sys/class/input");
+  struct sysfs_class_device *sf_dev;
+  struct sysfs_class *sf_class;
+  struct dlist *sf_dev_list;
+  
+  sf_class = sysfs_open_class("input");
+  if(sf_class) sf_dev_list = sysfs_get_class_devices(sf_class);
 
-  if(!sf_dir) {
+  if(!sf_dev_list) {
     ADD2LOG("sysfs: no such class: input\n");
     return;
   }
-
-  /*
-   * A bit tricky: if there are links, assume newer sysfs layout with compat
-   * symlinks; if not, assume old layout with directories.
-   */
-
-  sysfs_read_dir_links(sf_dir);
-  if(!sf_dir->links) sysfs_read_dir_subdirs(sf_dir);
-
-  if((sf_list = sf_dir->links)) dlist_for_each_data(sf_list, sf_link, struct 
sysfs_link) {
-    add_input_dev(hd_data, sf_link->target);
-  }
-  else if((sf_list = sf_dir->subdirs)) dlist_for_each_data(sf_list, sf_subdir, 
struct sysfs_directory) {
-    add_input_dev(hd_data, sf_subdir->path);
+  
+// FIXME: check if this is okay, inputX/mouseX might be duplicated
+  dlist_for_each_data(sf_dev_list, sf_dev, struct sysfs_class_device) {
+    add_input_dev(hd_data, sf_dev->path); 
   }
+  
+  sysfs_close_class(sf_class);
+
+//  sf_dir_list = sysfs_open_directory_list("/sys/class/input");
+//
+//  if(!sf_dir_list) {
+//    ADD2LOG("sysfs: no such class: input\n");
+//    return;
+//  }
+//
+//  /*
+//   * A bit tricky: if there are links, assume newer sysfs layout with compat
+//   * symlinks; if not, assume old layout with directories.
+//   */
+//
+//  sysfs_read_dir_links(sf_dir);
+//  if(!sf_dir->links) sysfs_read_dir_subdirs(sf_dir);
+//
+//  if((sf_list = sf_dir->links)) dlist_for_each_data(sf_list, sf_link, struct 
sysfs_link) {
+//    add_input_dev(hd_data, sf_link->target);
+//  }
+//  else if((sf_list = sf_dir->subdirs)) dlist_for_each_data(sf_list, 
sf_subdir, struct sysfs_directory) {
+//    add_input_dev(hd_data, sf_subdir->path);
+//  }
 
-  sysfs_close_directory(sf_dir);
 }
 
 
Only in hwinfo-13.0.patched/src/hd: usb.c.orig
Only in hwinfo-13.0.patched/src/hd: usb.o
Only in hwinfo-13.0.patched/src/hd: version.h
Only in hwinfo-13.0.patched/src/hd: veth.o
Only in hwinfo-13.0.patched/src/hd: wlan.o
Only in hwinfo-13.0.patched/src/ids: check_hd
Only in hwinfo-13.0.patched/src/ids: .depend
Only in hwinfo-13.0.patched/src/ids: hd.ids
Only in hwinfo-13.0.patched/src/ids: hd_ids.h
Only in hwinfo-13.0.patched/src/ids: hd_ids.o
Only in hwinfo-13.0.patched/src/ids: hd_ids_tiny.h
Only in hwinfo-13.0.patched/src/ids: hd.log
Only in hwinfo-13.0.patched/src/ids: hd_tiny.ids
Only in hwinfo-13.0.patched/src/ids: hd_tiny.log
Only in hwinfo-13.0.patched/src/int10: .depend
Only in hwinfo-13.0.patched/src/int10: emu_vm86.o
Only in hwinfo-13.0.patched/src/int10: i10_int.o
Only in hwinfo-13.0.patched/src/int10: i10_io.o
Only in hwinfo-13.0.patched/src/int10: i10_pci.o
Only in hwinfo-13.0.patched/src/int10: i10_v86.o
Only in hwinfo-13.0.patched/src/int10: i10_vbios.o
Only in hwinfo-13.0.patched/src/int10: int10.o
Only in hwinfo-13.0.patched/src/isdn/cdb: cdb_read.o
Only in hwinfo-13.0.patched/src/isdn/cdb: .depend
Only in hwinfo-13.0.patched/src/isdn/cdb: isdn_cdb
Only in hwinfo-13.0.patched/src/isdn/cdb: isdn_cdb.h
Only in hwinfo-13.0.patched/src/isdn/cdb: ISDN.CDB.hwdb
Only in hwinfo-13.0.patched/src/isdn/cdb: isdn_cdb.o
Only in hwinfo-13.0.patched/src/isdn/cdb: ISDN.CDB.txt
Only in hwinfo-13.0.patched/src/isdn/cdb: lex.yy.c
Only in hwinfo-13.0.patched/src/isdn/cdb: mk_isdnhwdb
Only in hwinfo-13.0.patched/src/isdn/cdb: mk_isdnhwdb.o
Only in hwinfo-13.0.patched/src/isdn: cdbisdn.o
Only in hwinfo-13.0.patched/src/isdn: .depend
Only in hwinfo-13.0.patched/src/isdn: isa_probe.o
Only in hwinfo-13.0.patched/src: .lib
Only in hwinfo-13.0.patched/src: libhd.a
Only in hwinfo-13.0.patched/src: libhd.so
Only in hwinfo-13.0.patched/src: libhd.so.13
Only in hwinfo-13.0.patched/src: libhd.so.13.0
Only in hwinfo-13.0.patched/src/x86emu: debug.o
Only in hwinfo-13.0.patched/src/x86emu: decode.o
Only in hwinfo-13.0.patched/src/x86emu: fpu.o
Only in hwinfo-13.0.patched/src/x86emu: ops2.o
Only in hwinfo-13.0.patched/src/x86emu: ops.o
Only in hwinfo-13.0.patched/src/x86emu: prim_ops.o
Only in hwinfo-13.0.patched/src/x86emu: sys.o

Reply via email to