chiark / gitweb /
[PATCH] make udev user callable to query the database
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>
Wed, 31 Dec 2003 06:31:37 +0000 (22:31 -0800)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 04:13:12 +0000 (21:13 -0700)
Here is a slightly better version that prints the usage if a unknown option is given:
  kay@pim:~/src/udev.kay$ ./udev -x
  ./udev: invalid option -- x
  Usage: [-qrVh]
    -q arg     query database
    -r         print udev root
    -V         print udev version
    -h         print this help text

> Here is a patch that makes it possible to call udev with options on the command line.
> Valid options are for now:
>
> -V for the udev version:
>     kay@pim:~/src/udev.kay$ ./udev -V
>     udev, version 011_bk
>
> -r for the udev root:
>     kay@pim:~/src/udev.kay$ ./udev -r
>     /udev/
>
> -q to query the database with the sysfs path for the name of the node:
>     kay@pim:~/src/udev.kay$ ./udev -q /class/video4linux/video0
>     test/video/webcam0

udev.c
udevdb.c
udevdb.h

diff --git a/udev.c b/udev.c
index 17eade2..1797e08 100644 (file)
--- a/udev.c
+++ b/udev.c
@@ -29,6 +29,7 @@
 #include <errno.h>
 #include <ctype.h>
 #include <signal.h>
+#include <stdarg.h>
 
 #include "udev.h"
 #include "udev_version.h"
@@ -81,23 +82,70 @@ static inline char *get_seqnum(void)
        return seqnum;
 }
 
-int main(int argc, char **argv, char **envp)
+static inline int udev_user(int argc, char **argv)
 {
-       char *action;
-       char *devpath;
-       char *subsystem;
+       static const char short_options[] = "q:rVh";
+       int option;
        int retval = -EINVAL;
+       struct udevice dev;
 
-       main_argv = argv;
-       main_envp = envp;
+       while (1) {
+               option = getopt(argc, argv, short_options);
+               if (option == -1)
+                       break;
 
-       dbg("version %s", UDEV_VERSION);
+               dbg("option '%c'", option);
+               switch (option) {
+               case 'q':
+                       dbg("udev query: %s\n", optarg);
+                       retval = udevdb_open_ro();
+                       if (retval != 0) {
+                               printf("unable to open udev database\n");
+                               return -1;
+                       }
+                       retval = udevdb_get_dev(optarg, &dev);
+                       if (retval == 0) {
+                               printf("%s\n", dev.name);
+                       } else {
+                               printf("device not found in udev database\n");
+                       }
+                       udevdb_exit();
+                       return retval;
 
-       if (argc != 2) {
-               dbg ("unknown number of arguments");
-               goto exit;
+               case 'r':
+                       printf("%s\n", udev_root);
+                       return 0;
+
+               case 'V':
+                       printf("udev, version %s\n", UDEV_VERSION);
+                       return 0;
+
+               case 'h':
+                       retval = 0;
+               case '?':
+               default:
+                       goto help;
+               }
        }
 
+help:
+       printf("Usage: [-qrVh]\n"
+              "  -q arg     query database \n"
+              "  -r         print udev root\n"
+              "  -V         print udev version\n"
+              "  -h         print this help text\n"
+              "\n");
+
+       return retval;
+}
+
+static inline int udev_hotplug(int argc, char **argv)
+{
+       char *action;
+       char *devpath;
+       char *subsystem;
+       int retval = -EINVAL;
+
        subsystem = argv[1];
 
        devpath = get_devpath();
@@ -126,9 +174,6 @@ int main(int argc, char **argv, char **envp)
                goto exit;
        }
 
-       /* initialize our configuration */
-       udev_init_config();
-
        /* connect to the system message bus */
        sysbus_connect();
 
@@ -166,3 +211,27 @@ exit_sysbus:
 exit:
        return retval;
 }
+
+int main(int argc, char **argv, char **envp)
+{
+       main_argv = argv;
+       main_envp = envp;
+       int retval;
+
+       dbg("version %s", UDEV_VERSION);
+
+       /* initialize our configuration */
+       udev_init_config();
+
+       if (argc == 2 && argv[1][0] != '-') {
+               dbg("called by hotplug");
+               retval = udev_hotplug(argc, argv);
+       } else {
+               dbg("called by user");
+               retval = udev_user(argc, argv);
+       }
+
+       return retval;
+}
+
+
index bbbedda..0f9de66 100644 (file)
--- a/udevdb.c
+++ b/udevdb.c
@@ -128,3 +128,16 @@ int udevdb_init(int init_flag)
        }
        return 0;
 }
+
+/**
+ * udevdb_init: open database for reading
+ */
+int udevdb_open_ro(void)
+{
+       udevdb = tdb_open(udev_db_filename, 0, 0, O_RDONLY, 0);
+       if (udevdb == NULL) {
+               dbg("unable to open database at '%s'", udev_db_filename);
+               return -EINVAL;
+       }
+       return 0;
+}
index d6c58ae..f36a9ca 100644 (file)
--- a/udevdb.h
+++ b/udevdb.h
@@ -11,6 +11,7 @@
 /* function prototypes */
 extern void udevdb_exit(void);
 extern int udevdb_init(int init_flag);
+extern int udevdb_open_ro(void);
 
 extern int udevdb_add_dev(const char *path, const struct udevice *dev);
 extern int udevdb_get_dev(const char *path, struct udevice *dev);