out:
return attr && attr->value && strlen(attr->value) ? attr->value : NULL;
}
-
-int sysfs_lookup_devpath_by_subsys_id(char *devpath_full, size_t len,
- const char *subsystem, const char *id)
-{
- size_t sysfs_len;
- char path_full[PATH_SIZE];
- char *path;
- struct stat statbuf;
-
- sysfs_len = strlcpy(path_full, sysfs_path, sizeof(path_full));
- path = &path_full[sysfs_len];
-
- if (strcmp(subsystem, "subsystem") == 0) {
- strlcpy(path, "/subsystem/", sizeof(path_full) - sysfs_len);
- strlcat(path, id, sizeof(path_full) - sysfs_len);
- if (stat(path_full, &statbuf) == 0)
- goto found;
-
- strlcpy(path, "/bus/", sizeof(path_full) - sysfs_len);
- strlcat(path, id, sizeof(path_full) - sysfs_len);
- if (stat(path_full, &statbuf) == 0)
- goto found;
- goto out;
-
- strlcpy(path, "/class/", sizeof(path_full) - sysfs_len);
- strlcat(path, id, sizeof(path_full) - sysfs_len);
- if (stat(path_full, &statbuf) == 0)
- goto found;
- }
-
- if (strcmp(subsystem, "module") == 0) {
- strlcpy(path, "/module/", sizeof(path_full) - sysfs_len);
- strlcat(path, id, sizeof(path_full) - sysfs_len);
- if (stat(path_full, &statbuf) == 0)
- goto found;
- goto out;
- }
-
- if (strcmp(subsystem, "drivers") == 0) {
- char subsys[NAME_SIZE];
- char *driver;
-
- strlcpy(subsys, id, sizeof(subsys));
- driver = strchr(subsys, ':');
- if (driver != NULL) {
- driver[0] = '\0';
- driver = &driver[1];
- strlcpy(path, "/subsystem/", sizeof(path_full) - sysfs_len);
- strlcat(path, subsys, sizeof(path_full) - sysfs_len);
- strlcat(path, "/drivers/", sizeof(path_full) - sysfs_len);
- strlcat(path, driver, sizeof(path_full) - sysfs_len);
- if (stat(path_full, &statbuf) == 0)
- goto found;
-
- strlcpy(path, "/bus/", sizeof(path_full) - sysfs_len);
- strlcat(path, subsys, sizeof(path_full) - sysfs_len);
- strlcat(path, "/drivers/", sizeof(path_full) - sysfs_len);
- strlcat(path, driver, sizeof(path_full) - sysfs_len);
- if (stat(path_full, &statbuf) == 0)
- goto found;
- }
- goto out;
- }
-
- strlcpy(path, "/subsystem/", sizeof(path_full) - sysfs_len);
- strlcat(path, subsystem, sizeof(path_full) - sysfs_len);
- strlcat(path, "/devices/", sizeof(path_full) - sysfs_len);
- strlcat(path, id, sizeof(path_full) - sysfs_len);
- if (stat(path_full, &statbuf) == 0)
- goto found;
-
- strlcpy(path, "/bus/", sizeof(path_full) - sysfs_len);
- strlcat(path, subsystem, sizeof(path_full) - sysfs_len);
- strlcat(path, "/devices/", sizeof(path_full) - sysfs_len);
- strlcat(path, id, sizeof(path_full) - sysfs_len);
- if (stat(path_full, &statbuf) == 0)
- goto found;
-
- strlcpy(path, "/class/", sizeof(path_full) - sysfs_len);
- strlcat(path, subsystem, sizeof(path_full) - sysfs_len);
- strlcat(path, "/", sizeof(path_full) - sysfs_len);
- strlcat(path, id, sizeof(path_full) - sysfs_len);
- if (stat(path_full, &statbuf) == 0)
- goto found;
-out:
- return 0;
-found:
- if (S_ISLNK(statbuf.st_mode))
- sysfs_resolve_link(path, sizeof(path_full) - sysfs_len);
- strlcpy(devpath_full, path, len);
- return 1;
-}