From 8753fadf2a6ecead372e71b8bf9336cf29f9c958 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Mon, 15 Sep 2008 17:12:47 -0700 Subject: [PATCH] libudev: switch API from devpath to syspath --- TODO | 2 +- udev/lib/exported_symbols | 2 +- udev/lib/libudev-device.c | 59 +++++++++++++++++++----------------- udev/lib/libudev-enumerate.c | 36 +++++++++++----------- udev/lib/libudev-monitor.c | 8 ++++- udev/lib/libudev-private.h | 9 +++--- udev/lib/libudev-util.c | 32 +++++++++---------- udev/lib/libudev.h | 4 +-- udev/lib/test-libudev.c | 35 ++++++++++++--------- udev/udevadm-info.c | 20 +++++++----- 10 files changed, 112 insertions(+), 95 deletions(-) diff --git a/TODO b/TODO index 18f75b5f..74f6936c 100644 --- a/TODO +++ b/TODO @@ -11,5 +11,5 @@ These things will change in future udev versions: o symlink names to udevadm will no longer be resolved to old command names before next release: - o switch libudev API to syspath instead of devpath + o replace list.h with gpl or later version o udev_* prefix for private methods (ctrl_*)? diff --git a/udev/lib/exported_symbols b/udev/lib/exported_symbols index aa3854d2..ab12ff57 100644 --- a/udev/lib/exported_symbols +++ b/udev/lib/exported_symbols @@ -7,7 +7,7 @@ udev_get_log_priority udev_set_log_priority udev_get_sys_path udev_get_dev_path -udev_device_new_from_devpath +udev_device_new_from_syspath udev_device_get_parent udev_device_ref udev_device_unref diff --git a/udev/lib/libudev-device.c b/udev/lib/libudev-device.c index 918398b7..782d6625 100644 --- a/udev/lib/libudev-device.c +++ b/udev/lib/libudev-device.c @@ -56,14 +56,14 @@ struct udev_device { struct list_head attr_list; }; -static size_t devpath_to_db_path(struct udev *udev, const char *devpath, char *filename, size_t len) +static size_t syspath_to_db_path(struct udev_device *udev_device, char *filename, size_t len) { size_t start; /* translate to location of db file */ - util_strlcpy(filename, udev_get_dev_path(udev), len); + util_strlcpy(filename, udev_get_dev_path(udev_device->udev), len); start = util_strlcat(filename, "/.udev/db/", len); - util_strlcat(filename, devpath, len); + util_strlcat(filename, udev_device->devpath, len); return util_path_encode(&filename[start], len - start); } @@ -75,7 +75,7 @@ static int device_read_db(struct udev_device *udev_device) FILE *f; int rc = 0; - devpath_to_db_path(udev_device->udev, udev_device->devpath, filename, sizeof(filename)); + syspath_to_db_path(udev_device, filename, sizeof(filename)); if (lstat(filename, &stats) != 0) { info(udev_device->udev, "no db file to read %s: %s\n", filename, strerror(errno)); @@ -172,20 +172,20 @@ struct udev_device *device_init(struct udev *udev) } /** - * udev_device_new_from_devpath: + * udev_device_new_from_syspath: * @udev: udev library context - * @devpath: sys device path + * @syspath: sys device path including sys directory * - * Create new udev device, and fill in information from the sysfs - * device and the udev database entry. The devpath must not contain - * the sysfs mount path, and must contain a leading '/'. + * Create new udev device, and fill in information from the sys + * device and the udev database entry. The sypath is the absolute + * path to the device, including the sys mount point. * * The initial refcount is 1, and needs to be decremented to * release the ressources of the udev device. * * Returns: a new udev device, or #NULL, if it does not exist **/ -struct udev_device *udev_device_new_from_devpath(struct udev *udev, const char *devpath) +struct udev_device *udev_device_new_from_syspath(struct udev *udev, const char *syspath) { char path[UTIL_PATH_SIZE]; struct stat statbuf; @@ -193,14 +193,13 @@ struct udev_device *udev_device_new_from_devpath(struct udev *udev, const char * if (udev == NULL) return NULL; - if (devpath == NULL) + if (syspath == NULL) return NULL; - util_strlcpy(path, udev_get_sys_path(udev), sizeof(path)); - util_strlcat(path, devpath, sizeof(path)); + util_strlcpy(path, syspath, sizeof(path)); util_strlcat(path, "/uevent", sizeof(path)); if (stat(path, &statbuf) != 0) { - info(udev, "not a device :%s\n", devpath); + info(udev, "not a device :%s\n", syspath); return NULL; } @@ -209,9 +208,9 @@ struct udev_device *udev_device_new_from_devpath(struct udev *udev, const char * return NULL; /* resolve possible symlink to real path */ - util_strlcpy(path, devpath, sizeof(path)); + util_strlcpy(path, syspath, sizeof(path)); util_resolve_sys_link(udev, path, sizeof(path)); - device_set_devpath(udev_device, path); + device_set_syspath(udev_device, path); info(udev, "device %p has devpath '%s'\n", udev_device, udev_device_get_devpath(udev_device)); if (device_read_db(udev_device) >= 0) @@ -228,23 +227,23 @@ static struct udev_device *device_new_from_parent(struct udev_device *udev_devic if (udev_device == NULL) return NULL; - util_strlcpy(path, udev_device_get_devpath(udev_device), sizeof(path)); + util_strlcpy(path, udev_device->syspath, sizeof(path)); while (1) { pos = strrchr(path, '/'); if (pos == path || pos == NULL) break; pos[0] = '\0'; - udev_device_parent = udev_device_new_from_devpath(udev_device->udev, path); + udev_device_parent = udev_device_new_from_syspath(udev_device->udev, path); if (udev_device_parent != NULL) return udev_device_parent; } - /* follow "device" link in deprecated sysfs /sys/class/ layout */ + /* follow "device" link in deprecated sys /sys/class/ layout */ if (strncmp(udev_device->devpath, "/class/", 7) == 0) { - util_strlcpy(path, udev_device->devpath, sizeof(path)); + util_strlcpy(path, udev_device->syspath, sizeof(path)); util_strlcat(path, "/device", sizeof(path)); if (util_resolve_sys_link(udev_device->udev, path, sizeof(path)) == 0) { - udev_device_parent = udev_device_new_from_devpath(udev_device->udev, path); + udev_device_parent = udev_device_new_from_syspath(udev_device->udev, path); if (udev_device_parent != NULL) return udev_device_parent; } @@ -398,7 +397,7 @@ const char *udev_device_get_subsystem(struct udev_device *udev_device) return udev_device->subsystem; /* read "subsytem" link */ - if (util_get_sys_subsystem(udev_device->udev, udev_device->devpath, subsystem, sizeof(subsystem)) == 0) { + if (util_get_sys_subsystem(udev_device->udev, udev_device->syspath, subsystem, sizeof(subsystem)) == 0) { udev_device->subsystem = strdup(subsystem); return udev_device->subsystem; } @@ -490,7 +489,7 @@ const char *udev_device_get_driver(struct udev_device *udev_device) return NULL; if (udev_device->driver != NULL) return udev_device->driver; - if (util_get_sys_driver(udev_device->udev, udev_device->devpath, driver, sizeof(driver)) < 2) + if (util_get_sys_driver(udev_device->udev, udev_device->syspath, driver, sizeof(driver)) < 2) return NULL; udev_device->driver = strdup(driver); return udev_device->driver; @@ -592,14 +591,18 @@ const char *udev_device_get_attr_value(struct udev_device *udev_device, const ch out: return val; } -int device_set_devpath(struct udev_device *udev_device, const char *devpath) +int device_set_syspath(struct udev_device *udev_device, const char *syspath) { - if (asprintf(&udev_device->syspath, "%s%s", udev_get_sys_path(udev_device->udev), devpath) < 0) + const char *pos; + + udev_device->syspath = strdup(syspath); + if (udev_device->syspath == NULL) return -ENOMEM; udev_device->devpath = &udev_device->syspath[strlen(udev_get_sys_path(udev_device->udev))]; - udev_device->sysname = strrchr(udev_device->syspath, '/'); - if (udev_device->sysname != NULL) - udev_device->sysname = &udev_device->sysname[1]; + pos = strrchr(udev_device->syspath, '/'); + if (pos == NULL) + return -EINVAL; + udev_device->sysname = &pos[1]; return 0; } diff --git a/udev/lib/libudev-enumerate.c b/udev/lib/libudev-enumerate.c index 95a40765..458be586 100644 --- a/udev/lib/libudev-enumerate.c +++ b/udev/lib/libudev-enumerate.c @@ -38,9 +38,8 @@ static int devices_scan_subsystem(struct udev *udev, char path[UTIL_PATH_SIZE]; DIR *dir; struct dirent *dent; - size_t len; - len = util_strlcpy(path, udev_get_sys_path(udev), sizeof(path)); + util_strlcpy(path, udev_get_sys_path(udev), sizeof(path)); util_strlcat(path, basedir, sizeof(path)); util_strlcat(path, "/", sizeof(path)); util_strlcat(path, subsystem, sizeof(path)); @@ -50,15 +49,15 @@ static int devices_scan_subsystem(struct udev *udev, if (dir == NULL) return -1; for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { - char devpath[UTIL_PATH_SIZE]; + char syspath[UTIL_PATH_SIZE]; if (dent->d_name[0] == '.') continue; - util_strlcpy(devpath, &path[len], sizeof(devpath)); - util_strlcat(devpath, "/", sizeof(devpath)); - util_strlcat(devpath, dent->d_name, sizeof(devpath)); - util_resolve_sys_link(udev, devpath, sizeof(devpath)); - util_name_list_add(udev, device_list, devpath, NULL, 1); + util_strlcpy(syspath, path, sizeof(syspath)); + util_strlcat(syspath, "/", sizeof(syspath)); + util_strlcat(syspath, dent->d_name, sizeof(syspath)); + util_resolve_sys_link(udev, syspath, sizeof(syspath)); + util_name_list_add(udev, device_list, syspath, NULL, 1); } closedir(dir); return 0; @@ -89,27 +88,30 @@ static int devices_scan_subsystems(struct udev *udev, return 0; } -static int devices_delay(struct udev *udev, const char *devpath) +static int devices_delay(struct udev *udev, const char *syspath) { static const char *delay_device_list[] = { "/block/md", "/block/dm-", NULL }; + size_t len; int i; + len = strlen(udev_get_sys_path(udev)); + for (i = 0; delay_device_list[i] != NULL; i++) { - if (strstr(devpath, delay_device_list[i]) != NULL) { - info(udev, "delaying: %s\n", devpath); + if (strstr(&syspath[len], delay_device_list[i]) != NULL) { + info(udev, "delaying: %s\n", syspath); return 1; } } return 0; } -static int devices_call(struct udev *udev, const char *devpath, +static int devices_call(struct udev *udev, const char *syspath, int (*cb)(struct udev *udev, - const char *devpath, const char *subsystem, const char *name, + const char *syspath, const char *subsystem, const char *name, void *data), void *data, int *cb_rc) @@ -117,14 +119,14 @@ static int devices_call(struct udev *udev, const char *devpath, char subsystem[UTIL_PATH_SIZE]; const char *name; - name = strrchr(devpath, '/'); + name = strrchr(syspath, '/'); if (name == NULL) return -1; name++; - if (util_get_sys_subsystem(udev, devpath, subsystem, sizeof(subsystem)) < 2) + if (util_get_sys_subsystem(udev, syspath, subsystem, sizeof(subsystem)) < 2) return -1; - *cb_rc = cb(udev, devpath, subsystem, name, data); + *cb_rc = cb(udev, syspath, subsystem, name, data); return 0; } @@ -143,7 +145,7 @@ static int devices_call(struct udev *udev, const char *devpath, **/ int udev_enumerate_devices(struct udev *udev, const char *subsystem, int (*cb)(struct udev *udev, - const char *devpath, const char *subsystem, const char *name, void *data), + const char *syspath, const char *subsystem, const char *name, void *data), void *data) { char base[UTIL_PATH_SIZE]; diff --git a/udev/lib/libudev-monitor.c b/udev/lib/libudev-monitor.c index 8e9cf2d0..f61ddb0b 100644 --- a/udev/lib/libudev-monitor.c +++ b/udev/lib/libudev-monitor.c @@ -302,7 +302,11 @@ struct udev_device *udev_monitor_receive_device(struct udev_monitor *udev_monito bufpos += keylen + 1; if (strncmp(key, "DEVPATH=", 8) == 0) { - device_set_devpath(udev_device, &key[8]); + char path[UTIL_PATH_SIZE]; + + util_strlcpy(path, udev_get_sys_path(udev_monitor->udev), sizeof(path)); + util_strlcat(path, &key[8], sizeof(path)); + device_set_syspath(udev_device, path); } else if (strncmp(key, "SUBSYSTEM=", 10) == 0) { device_set_subsystem(udev_device, &key[10]); } else if (strncmp(key, "DEVNAME=", 8) == 0) { @@ -336,6 +340,8 @@ struct udev_device *udev_monitor_receive_device(struct udev_monitor *udev_monito } else if (strncmp(key, "TIMEOUT=", 8) == 0) { device_set_timeout(udev_device, strtoull(&key[8], NULL, 10)); } + if (strncmp(key, "PHYSDEV", 7) == 0) + continue; device_add_property_from_string(udev_device, key); } device_set_devnum(udev_device, makedev(maj, min)); diff --git a/udev/lib/libudev-private.h b/udev/lib/libudev-private.h index f28bd9ac..1756be5f 100644 --- a/udev/lib/libudev-private.h +++ b/udev/lib/libudev-private.h @@ -55,7 +55,7 @@ extern const char *udev_get_rules_path(struct udev *udev); extern int udev_get_run(struct udev *udev); /* libudev-device */ -extern int device_set_devpath(struct udev_device *udev_device, const char *devpath); +extern int device_set_syspath(struct udev_device *udev_device, const char *syspath); extern int device_set_subsystem(struct udev_device *udev_device, const char *subsystem); extern int device_set_devname(struct udev_device *udev_device, const char *devname); extern int device_add_devlink(struct udev_device *udev_device, const char *devlink); @@ -114,9 +114,9 @@ struct util_name_entry { char *value; int *i; }; -extern ssize_t util_get_sys_subsystem(struct udev *udev, const char *devpath, char *subsystem, size_t size); -extern ssize_t util_get_sys_driver(struct udev *udev, const char *devpath, char *driver, size_t size); -extern int util_resolve_sys_link(struct udev *udev, char *devpath, size_t size); +extern ssize_t util_get_sys_subsystem(struct udev *udev, const char *syspath, char *subsystem, size_t size); +extern ssize_t util_get_sys_driver(struct udev *udev, const char *syspath, char *driver, size_t size); +extern int util_resolve_sys_link(struct udev *udev, char *syspath, size_t size); extern struct util_name_entry *util_name_list_add(struct udev *udev, struct list_head *name_list, const char *name, const char *value, int sort); extern void util_name_list_cleanup(struct udev *udev, struct list_head *name_list); @@ -127,5 +127,4 @@ extern void util_remove_trailing_chars(char *path, char c); extern size_t util_strlcpy(char *dst, const char *src, size_t size); extern size_t util_strlcat(char *dst, const char *src, size_t size); extern int util_replace_chars(char *str, const char *white); -extern char *util_sysattr_get_value(struct udev *udev, const char *devpath, const char *attr_name); #endif diff --git a/udev/lib/libudev-util.c b/udev/lib/libudev-util.c index 50eacdd3..7053a2f8 100644 --- a/udev/lib/libudev-util.c +++ b/udev/lib/libudev-util.c @@ -33,14 +33,13 @@ #include "libudev.h" #include "libudev-private.h" -static ssize_t get_sys_link(struct udev *udev, const char *slink, const char *devpath, char *subsystem, size_t size) +static ssize_t get_sys_link(struct udev *udev, const char *slink, const char *syspath, char *subsystem, size_t size) { char path[UTIL_PATH_SIZE]; ssize_t len; const char *pos; - util_strlcpy(path, udev_get_sys_path(udev), sizeof(path)); - util_strlcat(path, devpath, sizeof(path)); + util_strlcpy(path, syspath, sizeof(path)); util_strlcat(path, "/", sizeof(path)); util_strlcat(path, slink, sizeof(path)); len = readlink(path, path, sizeof(path)); @@ -54,46 +53,43 @@ static ssize_t get_sys_link(struct udev *udev, const char *slink, const char *de return util_strlcpy(subsystem, pos, size); } -ssize_t util_get_sys_subsystem(struct udev *udev, const char *devpath, char *subsystem, size_t size) +ssize_t util_get_sys_subsystem(struct udev *udev, const char *syspath, char *subsystem, size_t size) { - return get_sys_link(udev, "subsystem", devpath, subsystem, size); + return get_sys_link(udev, "subsystem", syspath, subsystem, size); } -ssize_t util_get_sys_driver(struct udev *udev, const char *devpath, char *driver, size_t size) +ssize_t util_get_sys_driver(struct udev *udev, const char *syspath, char *driver, size_t size) { - return get_sys_link(udev, "driver", devpath, driver, size); + return get_sys_link(udev, "driver", syspath, driver, size); } -int util_resolve_sys_link(struct udev *udev, char *devpath, size_t size) +int util_resolve_sys_link(struct udev *udev, char *syspath, size_t size) { - char link_path[UTIL_PATH_SIZE]; char link_target[UTIL_PATH_SIZE]; int len; int i; int back; - util_strlcpy(link_path, udev_get_sys_path(udev), sizeof(link_path)); - util_strlcat(link_path, devpath, sizeof(link_path)); - len = readlink(link_path, link_target, sizeof(link_target)); + len = readlink(syspath, link_target, sizeof(link_target)); if (len <= 0) return -1; link_target[len] = '\0'; - dbg(udev, "path link '%s' points to '%s'\n", devpath, link_target); + dbg(udev, "path link '%s' points to '%s'\n", syspath, link_target); for (back = 0; strncmp(&link_target[back * 3], "../", 3) == 0; back++) ; - dbg(udev, "base '%s', tail '%s', back %i\n", devpath, &link_target[back * 3], back); + dbg(udev, "base '%s', tail '%s', back %i\n", syspath, &link_target[back * 3], back); for (i = 0; i <= back; i++) { - char *pos = strrchr(devpath, '/'); + char *pos = strrchr(syspath, '/'); if (pos == NULL) return -1; pos[0] = '\0'; } - dbg(udev, "after moving back '%s'\n", devpath); - util_strlcat(devpath, "/", size); - util_strlcat(devpath, &link_target[back * 3], size); + dbg(udev, "after moving back '%s'\n", syspath); + util_strlcat(syspath, "/", size); + util_strlcat(syspath, &link_target[back * 3], size); return 0; } diff --git a/udev/lib/libudev.h b/udev/lib/libudev.h index 05f23e17..6996b47f 100644 --- a/udev/lib/libudev.h +++ b/udev/lib/libudev.h @@ -45,7 +45,7 @@ extern void udev_selinux_setfscreatecon(struct udev *udev, const char *file, uns extern void udev_selinux_lsetfilecon(struct udev *udev, const char *file, unsigned int mode); struct udev_device; -extern struct udev_device *udev_device_new_from_devpath(struct udev *udev, const char *devpath); +extern struct udev_device *udev_device_new_from_syspath(struct udev *udev, const char *syspath); extern struct udev_device *udev_device_get_parent(struct udev_device *udev_device); extern struct udev_device *udev_device_ref(struct udev_device *udev_device); extern void udev_device_unref(struct udev_device *udev_device); @@ -71,7 +71,7 @@ extern const char *udev_device_get_attr_value(struct udev_device *udev_device, c extern int udev_enumerate_devices(struct udev *udev, const char *subsystem, int (*cb)(struct udev *udev, - const char *devpath, const char *subsystem, const char *name, void *data), + const char *syspath, const char *subsystem, const char *name, void *data), void *data); struct udev_monitor; diff --git a/udev/lib/test-libudev.c b/udev/lib/test-libudev.c index b3011762..4dcc80a1 100644 --- a/udev/lib/test-libudev.c +++ b/udev/lib/test-libudev.c @@ -56,14 +56,14 @@ static void print_device(struct udev_device *device) int count; printf("*** device: %p ***\n", device); + str = udev_device_get_syspath(device); + printf("syspath: '%s'\n", str); str = udev_device_get_devpath(device); printf("devpath: '%s'\n", str); str = udev_device_get_subsystem(device); printf("subsystem: '%s'\n", str); str = udev_device_get_driver(device); printf("driver: '%s'\n", str); - str = udev_device_get_syspath(device); - printf("syspath: '%s'\n", str); str = udev_device_get_devname(device); printf("devname: '%s'\n", str); count = udev_device_get_devlinks(device, print_devlinks_cb, NULL); @@ -73,12 +73,12 @@ static void print_device(struct udev_device *device) printf("\n"); } -static int test_device(struct udev *udev, const char *devpath) +static int test_device(struct udev *udev, const char *syspath) { struct udev_device *device; - printf("looking at device: %s\n", devpath); - device = udev_device_new_from_devpath(udev, devpath); + printf("looking at device: %s\n", syspath); + device = udev_device_new_from_syspath(udev, syspath); if (device == NULL) { printf("no device\n"); return -1; @@ -88,13 +88,13 @@ static int test_device(struct udev *udev, const char *devpath) return 0; } -static int test_device_parents(struct udev *udev, const char *devpath) +static int test_device_parents(struct udev *udev, const char *syspath) { struct udev_device *device; struct udev_device *device_parent; - printf("looking at device: %s\n", devpath); - device = udev_device_new_from_devpath(udev, devpath); + printf("looking at device: %s\n", syspath); + device = udev_device_new_from_syspath(udev, syspath); if (device == NULL) return -1; @@ -185,7 +185,7 @@ int main(int argc, char *argv[], char *envp[]) { struct udev *udev = NULL; static const struct option options[] = { - { "devpath", 1, NULL, 'p' }, + { "syspath", 1, NULL, 'p' }, { "subsystem", 1, NULL, 's' }, { "socket", 1, NULL, 'S' }, { "debug", 0, NULL, 'd' }, @@ -193,9 +193,10 @@ int main(int argc, char *argv[], char *envp[]) { "version", 0, NULL, 'V' }, {} }; - const char *devpath = "/devices/virtual/mem/null"; + const char *syspath = "/devices/virtual/mem/null"; const char *subsystem = NULL; const char *socket = "@/org/kernel/udev/monitor"; + char path[1024]; const char *str; udev = udev_new(); @@ -216,7 +217,7 @@ int main(int argc, char *argv[], char *envp[]) switch (option) { case 'p': - devpath = optarg; + syspath = optarg; break; case 's': subsystem = optarg; @@ -229,7 +230,7 @@ int main(int argc, char *argv[], char *envp[]) udev_set_log_priority(udev, LOG_INFO); break; case 'h': - printf("--debug --devpath= --subsystem= --socket= --help\n"); + printf("--debug --syspath= --subsystem= --socket= --help\n"); goto out; case 'V': printf("%s\n", VERSION); @@ -244,8 +245,14 @@ int main(int argc, char *argv[], char *envp[]) str = udev_get_dev_path(udev); printf("dev_path: '%s'\n", str); - test_device(udev, devpath); - test_device_parents(udev, devpath); + /* add sys path if needed */ + if (strncmp(syspath, udev_get_sys_path(udev), strlen(udev_get_sys_path(udev))) != 0) { + snprintf(path, sizeof(path), "%s%s", udev_get_sys_path(udev), syspath); + syspath = path; + } + + test_device(udev, syspath); + test_device_parents(udev, syspath); test_enumerate(udev, subsystem); test_monitor(udev, socket); out: diff --git a/udev/udevadm-info.c b/udev/udevadm-info.c index a2858e5d..9ce83aab 100644 --- a/udev/udevadm-info.c +++ b/udev/udevadm-info.c @@ -166,12 +166,12 @@ static void print_record(struct udev_device *device) } static int export_all_cb(struct udev *udev, - const char *devpath, const char *subsystem, const char *name, + const char *syspath, const char *subsystem, const char *name, void *data) { struct udev_device *device; - device = udev_device_new_from_devpath(udev, devpath); + device = udev_device_new_from_syspath(udev, syspath); if (device == NULL) return 0; if (udev_device_get_devname(device) != NULL) @@ -215,7 +215,9 @@ static struct udev_device *lookup_device_by_name(struct udev *udev, const char * info(udev, "skip '%s', dev_t doesn't match\n", udevice_loop->name); goto next; } - udev_device = udev_device_new_from_devpath(udev, udevice_loop->dev->devpath); + util_strlcpy(filename, udev_get_sys_path(udev), sizeof(filename)); + util_strlcat(filename, udevice_loop->dev->devpath, sizeof(filename)); + udev_device = udev_device_new_from_syspath(udev, filename); udev_device_cleanup(udevice_loop); break; next: @@ -348,13 +350,15 @@ int udevadm_info(struct udev *udev, int argc, char *argv[]) rc = 2; goto exit; } - /* remove /sys if given */ - if (strncmp(optarg, udev_get_sys_path(udev), strlen(udev_get_sys_path(udev))) == 0) - util_strlcpy(path, &optarg[strlen(udev_get_sys_path(udev))], sizeof(path)); - else + /* add /sys if needed */ + if (strncmp(optarg, udev_get_sys_path(udev), strlen(udev_get_sys_path(udev))) != 0) { + util_strlcpy(path, udev_get_sys_path(udev), sizeof(path)); + util_strlcat(path, optarg, sizeof(path)); + } else { util_strlcpy(path, optarg, sizeof(path)); + } util_remove_trailing_chars(path, '/'); - device = udev_device_new_from_devpath(udev, path); + device = udev_device_new_from_syspath(udev, path); break; case 'q': action = ACTION_QUERY; -- 2.39.5