X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev_sysfs.c;h=c1926966896849c827916402f72312c17e02c190;hp=b579c17caab8a8318ad82a25d37d499c7114981d;hb=27b77df44daebbd7597c572343105c16de099233;hpb=34f55103c5d451d247fc3b57579a6b3c1de0d58d diff --git a/udev_sysfs.c b/udev_sysfs.c index b579c17ca..c19269668 100644 --- a/udev_sysfs.c +++ b/udev_sysfs.c @@ -1,7 +1,5 @@ /* - * udev_sysfs.c - sysfs access - * - * Copyright (C) 2005 Kay Sievers + * Copyright (C) 2005-2006 Kay Sievers * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -14,7 +12,7 @@ * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., - * 675 Mass Ave, Cambridge, MA 02139, USA. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ @@ -79,24 +77,27 @@ void sysfs_cleanup(void) } } -void sysfs_device_set_values(struct sysfs_device *dev, const char *devpath, const char *subsystem) +void sysfs_device_set_values(struct sysfs_device *dev, const char *devpath, + const char *subsystem, const char *driver) { char *pos; strlcpy(dev->devpath, devpath, sizeof(dev->devpath)); if (subsystem != NULL) strlcpy(dev->subsystem, subsystem, sizeof(dev->subsystem)); + if (driver != NULL) + strlcpy(dev->driver, driver, sizeof(dev->driver)); /* set kernel name */ pos = strrchr(dev->devpath, '/'); if (pos == NULL) return; - strlcpy(dev->kernel_name, &pos[1], sizeof(dev->kernel_name)); - dbg("kernel_name='%s'", dev->kernel_name); + strlcpy(dev->kernel, &pos[1], sizeof(dev->kernel)); + dbg("kernel='%s'", dev->kernel); /* some devices have '!' in their name, change that to '/' */ - pos = dev->kernel_name; + pos = dev->kernel; while (pos[0] != '\0') { if (pos[0] == '!') pos[0] = '/'; @@ -104,7 +105,7 @@ void sysfs_device_set_values(struct sysfs_device *dev, const char *devpath, cons } /* get kernel number */ - pos = &dev->kernel_name[strlen(dev->kernel_name)]; + pos = &dev->kernel[strlen(dev->kernel)]; while (isdigit(pos[-1])) pos--; strlcpy(dev->kernel_number, pos, sizeof(dev->kernel_number)); @@ -175,13 +176,13 @@ struct sysfs_device *sysfs_device_get(const char *devpath) } /* it is a new device */ - dbg("'%s'", devpath_real); + dbg("new uncached device '%s'", devpath_real); dev = malloc(sizeof(struct sysfs_device)); if (dev == NULL) return NULL; memset(dev, 0x00, sizeof(struct sysfs_device)); - sysfs_device_set_values(dev, devpath_real, NULL); + sysfs_device_set_values(dev, devpath_real, NULL, NULL); /* get subsystem */ if (strncmp(dev->devpath, "/class/", 7) == 0) { @@ -253,6 +254,9 @@ struct sysfs_device *sysfs_device_get_parent(struct sysfs_device *dev) int len; int back; + dbg("open '%s'", dev->devpath); + + /* look if we already know the parent */ if (dev->parent != NULL) return dev->parent; @@ -271,7 +275,7 @@ struct sysfs_device *sysfs_device_get_parent(struct sysfs_device *dev) return NULL; pos[0] = '\0'; - /* are we at the top level */ + /* are we at the top level of /devices */ if (strcmp(parent_devpath, "/devices") == 0) { dbg("/devices top level"); return NULL; @@ -289,6 +293,7 @@ struct sysfs_device *sysfs_device_get_parent(struct sysfs_device *dev) goto device_link; } } + /* get parent and remember it */ dev->parent = sysfs_device_get(parent_devpath); return dev->parent; @@ -316,6 +321,7 @@ device_link: strlcat(parent_devpath, "/", sizeof(parent_devpath)); strlcat(parent_devpath, &device_link_target[back * 3], sizeof(parent_devpath)); + /* get parent and remember it */ dev->parent = sysfs_device_get(parent_devpath); return dev->parent; } @@ -344,6 +350,7 @@ char *sysfs_attr_get_value(const char *devpath, const char *attr_name) ssize_t size; size_t sysfs_len; + dbg("open '%s'/'%s'", devpath, attr_name); sysfs_len = strlcpy(path_full, sysfs_path, sizeof(path_full)); path = &path_full[sysfs_len]; strlcat(path_full, devpath, sizeof(path_full)); @@ -359,18 +366,21 @@ char *sysfs_attr_get_value(const char *devpath, const char *attr_name) } /* store attribute in cache (also negatives are kept in cache) */ + dbg("new uncached attribute '%s'", path_full); attr = malloc(sizeof(struct sysfs_attr)); if (attr == NULL) return NULL; memset(attr, 0x00, sizeof(struct sysfs_attr)); strlcpy(attr->path, path, sizeof(attr->path)); - dbg("add to cache '%s' '%s'", attr->path, attr->value); + dbg("add to cache '%s'", path_full); list_add(&attr->node, &attr_list); /* read attribute value */ fd = open(path_full, O_RDONLY); - if (fd < 0) + if (fd < 0) { + dbg("attribute '%s' does not exist", path_full); goto out; + } size = read(fd, value, sizeof(value)); close(fd); if (size < 0) @@ -381,6 +391,7 @@ char *sysfs_attr_get_value(const char *devpath, const char *attr_name) /* got a valid value, store and return it */ value[size] = '\0'; remove_trailing_chars(value, '\n'); + dbg("cache '%s' with value '%s'", path_full, value); strlcpy(attr->value_local, value, sizeof(attr->value_local)); attr->value = attr->value_local;