chiark / gitweb /
[PATCH] udevinfo symlink reverse query
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>
Tue, 2 Mar 2004 07:47:59 +0000 (23:47 -0800)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 04:35:06 +0000 (21:35 -0700)
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 :)

udevdb.c
udevinfo.8
udevinfo.c

index a1f79a7..95bc06c 100644 (file)
--- a/udevdb.c
+++ b/udevdb.c
@@ -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;
 }
 
index ad16ce6..528fa4a 100644 (file)
@@ -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
index defed2e..01c2a2a 100644 (file)
@@ -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"