chiark / gitweb /
write_cd_rules: identity-based persistence
[elogind.git] / udevtest.c
index 078674a01d3b02d9f9da70a2959038767443e0c9..2854f7558ff3cd8a9c75b5dd2ccce38e10682376 100644 (file)
@@ -1,7 +1,6 @@
 /*
- * udevtest.c
- *
  * Copyright (C) 2003-2004 Greg Kroah-Hartman <greg@kroah.com>
+ * Copyright (C) 2004-2006 Kay Sievers <kay.sievers@vrfy.org>
  *
  *     This program is free software; you can redistribute it and/or modify it
  *     under the terms of the GNU General Public License as published by the
@@ -14,7 +13,7 @@
  * 
  *     You should have received a copy of the GNU General Public License along
  *     with this program; if not, write to the Free Software Foundation, Inc.,
- *     675 Mass Ave, Cambridge, MA 02139, USA.
+ *     51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  *
  */
 
@@ -50,51 +49,52 @@ void log_message (int priority, const char *format, ...)
 
 int main(int argc, char *argv[], char *envp[])
 {
-       struct udev_rules rules;
-       char *devpath;
-       char temp[PATH_SIZE];
+       struct udev_rules rules = {};
+       char *devpath = NULL;
        struct udevice *udev;
        struct sysfs_device *dev;
+       int i;
        int retval;
        int rc = 0;
 
        info("version %s", UDEV_VERSION);
-
-       /* initialize our configuration */
        udev_config_init();
        if (udev_log_priority < LOG_INFO)
                udev_log_priority = LOG_INFO;
-       sysfs_init();
 
-       if (argc != 2) {
-               info("Usage: udevtest <devpath>");
-               return 1;
-       }
+       for (i = 1 ; i < argc; i++) {
+               char *arg = argv[i];
 
-       /* remove sysfs_path if given */
-       if (strncmp(argv[1], sysfs_path, strlen(sysfs_path)) == 0)
-               devpath = &argv[1][strlen(sysfs_path)];
-       else
-               if (argv[1][0] != '/') {
-                       /* prepend '/' if missing */
-                       snprintf(temp, sizeof(temp), "/%s", argv[1]);
-                       temp[sizeof(temp)-1] = '\0';
-                       devpath = temp;
+               if (strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) {
+                       printf("Usage: udevtest [--help] <devpath>\n");
+                       goto exit;
                } else
-                       devpath = argv[1];
+                       devpath = arg;
+       }
 
+       if (devpath == NULL) {
+               fprintf(stderr, "devpath parameter missing\n");
+               rc = 1;
+               goto exit;
+       }
+
+       sysfs_init();
        udev_rules_init(&rules, 0);
 
+       /* remove /sys if given */
+       if (strncmp(devpath, sysfs_path, strlen(sysfs_path)) == 0)
+               devpath = &devpath[strlen(sysfs_path)];
+
        dev = sysfs_device_get(devpath);
        if (dev == NULL) {
-               info("unable to open '%s'", devpath);
+               fprintf(stderr, "unable to open device '%s'\n", devpath);
                rc = 2;
                goto exit;
        }
 
        udev = udev_device_init();
        if (udev == NULL) {
-               info("can't open device");
+               fprintf(stderr, "error initializing device\n");
                rc = 3;
                goto exit;
        }
@@ -111,6 +111,11 @@ int main(int argc, char *argv[], char *envp[])
        setenv("SUBSYSTEM", udev->dev->subsystem, 1);
        setenv("ACTION", "add", 1);
 
+       printf("This program is for debugging only, it does not create any node,\n"
+              "or run any program specified by a RUN key. It may show incorrect results,\n"
+              "if rules match against subsystem specfic kernel event variables.\n"
+              "\n");
+
        info("looking at device '%s' from subsystem '%s'", udev->dev->devpath, udev->dev->subsystem);
        retval = udev_device_event(&rules, udev);
        if (retval == 0 && !udev->ignore_device && udev_run) {