From 8ea84a8a781c22f67def088eb9df581590393cda Mon Sep 17 00:00:00 2001 From: "kay.sievers@vrfy.org" Date: Mon, 1 Mar 2004 23:47:59 -0800 Subject: [PATCH 1/1] [PATCH] udevinfo symlink reverse query Thanks to Olaf Hering for this patch. It's possible now to feed the -n option of udevinfo with a symlink. I've also added a 'all' attribute, but no more text, it's all in the included man page :) --- udevdb.c | 21 +++++++++++++++++++-- udevinfo.8 | 4 ++-- udevinfo.c | 16 ++++++++++++++-- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/udevdb.c b/udevdb.c index a1f79a7c6..95bc06ce6 100644 --- a/udevdb.c +++ b/udevdb.c @@ -27,6 +27,7 @@ #define _KLIBC_HAS_ARCH_SIG_ATOMIC_T #include #include +#include #include #include #include @@ -178,13 +179,29 @@ static int find_found; static int find_device_by_name(char *path, struct udevice *dev) { + int l, i, j; if (strncmp(dev->name, find_name, sizeof(dev->name)) == 0) { - memcpy(find_dev, dev, sizeof(*find_dev)); - strfieldcpy(find_path, path); + memcpy(find_dev, dev, sizeof(struct udevice)); + strnfieldcpy(find_path, path, NAME_SIZE); find_found = 1; /* stop search */ return 1; } + /* look for matching symlink*/ + l = strlen(dev->symlink); + if (!l) + return 0; + i = j = 0; + do { + j = strcspn(&dev->symlink[i], " "); + if (j && strncmp(&dev->symlink[i], find_name, j) == 0) { + memcpy(find_dev, dev, sizeof(struct udevice)); + strnfieldcpy(find_path, path, NAME_SIZE); + find_found = 1; + return 1; + } + i = i + j + 1; + } while (i < l); return 0; } diff --git a/udevinfo.8 b/udevinfo.8 index ad16ce6ae..528fa4ad9 100644 --- a/udevinfo.8 +++ b/udevinfo.8 @@ -28,13 +28,13 @@ Query the database for specified value of a created device node. .RB Needs " \-p " or " \-n " specified. .br Valid types are: -.BR name ", " symlink ", " mode " ," owner " , " group " or " path. +.BR name ", " symlink ", " mode " ," owner " , " group " , " path " or " all. .TP .BI \-p " sysfs_path" Specify the sysfs path of the device to query. .TP .BI \-n " name" -Specify the name of the node for the device to query. +Specify the name of the node or the symlink for the device to query. .TP .B \-a Print all diff --git a/udevinfo.c b/udevinfo.c index defed2ee3..01c2a2a8a 100644 --- a/udevinfo.c +++ b/udevinfo.c @@ -122,7 +122,8 @@ enum query_type { SYMLINK, MODE, OWNER, - GROUP + GROUP, + ALL }; static int print_device_chain(const char *path) @@ -258,6 +259,11 @@ static int process_options(void) break; } + if (strcmp(optarg, "all") == 0) { + query = ALL; + break; + } + printf("unknown query type\n"); exit(1); @@ -366,6 +372,10 @@ print: strfieldcpy(result, path); break; + case ALL: + print_record(path, &dev); + goto exit; + default: goto exit; } @@ -406,8 +416,10 @@ help: " 'owner' of node\n" " 'group' of node\n" " 'path' sysfs device path\n" + " 'all' all values\n" + "\n" " -p PATH sysfs device path used for query or chain\n" - " -n NAME node name used for query\n" + " -n NAME node/symlink name used for query\n" "\n" " -r print udev root\n" " -a print all SYSFS_attributes along the device chain\n" -- 2.30.2