diff options
author | kay.sievers@vrfy.org <kay.sievers@vrfy.org> | 2004-03-01 23:47:59 -0800 |
---|---|---|
committer | Greg KH <gregkh@suse.de> | 2005-04-26 21:35:06 -0700 |
commit | 8ea84a8a781c22f67def088eb9df581590393cda (patch) | |
tree | 7d7dcda87c878677e83c2f7532822ab831af1d5c | |
parent | 97853b4f40708d2fdcde3da7e78138c683d9d66b (diff) |
[PATCH] udevinfo symlink reverse query
Thanks to Olaf Hering <olh@suse.de> 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 :)
-rw-r--r-- | udevdb.c | 21 | ||||
-rw-r--r-- | udevinfo.8 | 4 | ||||
-rw-r--r-- | udevinfo.c | 16 |
3 files changed, 35 insertions, 6 deletions
@@ -27,6 +27,7 @@ #define _KLIBC_HAS_ARCH_SIG_ATOMIC_T #include <stdlib.h> #include <stdio.h> +#include <string.h> #include <fcntl.h> #include <string.h> #include <sys/stat.h> @@ -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 ad16ce6aed..528fa4ad95 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 defed2ee31..01c2a2a8ae 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" |