From e7e194a088e984972d6a18c7f7a36a1e8f1f58e6 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Sat, 29 Mar 2008 16:12:41 +0100 Subject: [PATCH] udevadm: info - resolve devpath if symlink is given --- udev_db.c | 2 +- udevinfo.c | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/udev_db.c b/udev_db.c index 29aa0316..518ace9a 100644 --- a/udev_db.c +++ b/udev_db.c @@ -37,7 +37,7 @@ static size_t devpath_to_db_path(const char *devpath, char *filename, size_t len { size_t start; - /* add location of db files */ + /* translate to location of db file */ strlcpy(filename, udev_root, len); start = strlcat(filename, "/"DB_DIR"/", len); strlcat(filename, devpath, len); diff --git a/udevinfo.c b/udevinfo.c index 948aaccc..85899cfd 100644 --- a/udevinfo.c +++ b/udevinfo.c @@ -281,6 +281,7 @@ int udevinfo(int argc, char *argv[], char *envp[]) strlcpy(name, &optarg[strlen(udev_root)+1], sizeof(name)); else strlcpy(name, optarg, sizeof(name)); + remove_trailing_chars(name, '/'); dbg("name: %s", name); break; case 'p': @@ -289,6 +290,27 @@ int udevinfo(int argc, char *argv[], char *envp[]) strlcpy(path, &optarg[strlen(sysfs_path)], sizeof(path)); else strlcpy(path, optarg, sizeof(path)); + remove_trailing_chars(path, '/'); + + /* possibly resolve to real devpath */ + if (sysfs_resolve_link(path, sizeof(path)) != 0) { + char temp[PATH_SIZE]; + char *pos; + + /* also check if the parent is a link */ + strlcpy(temp, path, sizeof(temp)); + pos = strrchr(temp, '/'); + if (pos != 0) { + char tail[PATH_SIZE]; + + strlcpy(tail, pos, sizeof(tail)); + pos[0] = '\0'; + if (sysfs_resolve_link(temp, sizeof(temp)) == 0) { + strlcpy(path, temp, sizeof(path)); + strlcat(path, tail, sizeof(path)); + } + } + } dbg("path: %s", path); break; case 'q': -- 2.39.5