diff options
author | kay.sievers@vrfy.org <kay.sievers@vrfy.org> | 2004-12-16 16:05:01 +0100 |
---|---|---|
committer | Greg KH <gregkh@suse.de> | 2005-04-26 23:17:47 -0700 |
commit | 83c35223ed164b95f53633b97846d0963c7bcea9 (patch) | |
tree | 399c7693a3923ac99ead8e2584a9ec193905f45f | |
parent | 82ca88904d1c9bf17f4434f54e12754c00eddcbd (diff) |
[PATCH] update libsysfs to CVS version and fix segfaulting attribute reading
-rw-r--r-- | libsysfs/sysfs_class.c | 3 | ||||
-rw-r--r-- | libsysfs/sysfs_device.c | 32 |
2 files changed, 33 insertions, 2 deletions
diff --git a/libsysfs/sysfs_class.c b/libsysfs/sysfs_class.c index db59aef90f..a132bb64cb 100644 --- a/libsysfs/sysfs_class.c +++ b/libsysfs/sysfs_class.c @@ -640,6 +640,9 @@ struct sysfs_attribute *sysfs_get_classdev_attr return cur; } + if (clsdev->directory == NULL) + return NULL; + if (clsdev->directory->subdirs == NULL) if ((sysfs_read_dir_subdirs(clsdev->directory)) != 0 || clsdev->directory->subdirs == NULL) diff --git a/libsysfs/sysfs_device.c b/libsysfs/sysfs_device.c index f2f8d2d611..83c3adc080 100644 --- a/libsysfs/sysfs_device.c +++ b/libsysfs/sysfs_device.c @@ -24,7 +24,9 @@ #include "sysfs.h" /** - * get_dev_driver: fills in the dev->driver_name field + * get_dev_driver: fills in the dev->driver_name field, but searches by + * opening subsystem. Only to be used if no driver link exists in + * device directory. * * Returns 0 on SUCCESS and 1 on error */ @@ -73,6 +75,32 @@ static int get_dev_driver(struct sysfs_device *dev) } return 1; } + +/* + * get_device_driver_name: gets device's driver name, searches for driver + * link first before going the brute force route. + * @dev: device to retrieve driver + * returns 0 with success and 1 with error + */ +static int get_device_driver_name(struct sysfs_device *dev) +{ + char devpath[SYSFS_PATH_MAX], drvpath[SYSFS_PATH_MAX]; + + if (dev == NULL) { + errno = EINVAL; + return 1; + } + memset(devpath, 0, SYSFS_PATH_MAX); + memset(drvpath, 0, SYSFS_PATH_MAX); + safestrcpy(devpath, dev->path); + safestrcat(devpath, "/driver"); + + if ((sysfs_get_link(devpath, drvpath, SYSFS_PATH_MAX)) != 0) + return(get_dev_driver(dev)); + + return (sysfs_get_name_from_path(drvpath, dev->driver_name, + SYSFS_NAME_LEN)); +} /** * sysfs_get_device_bus: retrieves the bus name the device is on, checks path @@ -262,7 +290,7 @@ struct sysfs_device *sysfs_open_device_path(const char *path) if (sysfs_get_device_bus(dev) != 0) dprintf("Could not get device bus\n"); - if (get_dev_driver(dev) != 0) { + if (get_device_driver_name(dev) != 0) { dprintf("Could not get device %s's driver\n", dev->bus_id); safestrcpy(dev->driver_name, SYSFS_UNKNOWN); } |