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