}
}
-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] = '/';
}
/* 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));
}
/* 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) {
int len;
int back;
+ dbg("open '%s'", dev->devpath);
+
+ /* look if we already know the parent */
if (dev->parent != NULL)
return dev->parent;
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;
goto device_link;
}
}
+ /* get parent and remember it */
dev->parent = sysfs_device_get(parent_devpath);
return dev->parent;
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;
}
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));
}
/* 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)
/* 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;