chiark / gitweb /
selinux: init once in the daemon, not in every event process
[elogind.git] / udevinfo.c
index f8d0b6125af7680df269f10b07ec7bcec899e82f..1a10f9ad073c80f2b58c74717edc70702c0c7da0 100644 (file)
@@ -91,11 +91,11 @@ static int print_device_chain(const char *devpath)
        struct sysfs_device *dev;
 
        printf("\n"
-              "udevinfo starts with the device the node belongs to and then walks up the\n"
-              "device chain, to print for every device found, all possibly useful attributes\n"
-              "in the udev key format.\n"
-              "Only attributes within one device section may be used together in one rule,\n"
-              "to match the device for which the node will be created.\n"
+              "Udevinfo starts with the device specified by the devpath and then\n"
+              "walks up the chain of parent devices. It prints for every device\n"
+              "found, all possible attributes in the udev rules key format.\n"
+              "A rule to match, can be composed by the attributes of the device\n"
+              "and the attributes from one single parent device.\n"
               "\n");
 
        dev = sysfs_device_get(devpath);
@@ -105,6 +105,7 @@ static int print_device_chain(const char *devpath)
        printf("  looking at device '%s':\n", dev->devpath);
        printf("    KERNEL==\"%s\"\n", dev->kernel_name);
        printf("    SUBSYSTEM==\"%s\"\n", dev->subsystem);
+       printf("    DRIVER==\"%s\"\n", dev->driver);
        print_all_attributes(dev->devpath);
 
        /* walk up the chain of devices */
@@ -112,7 +113,7 @@ static int print_device_chain(const char *devpath)
                dev = sysfs_device_get_parent(dev);
                if (dev == NULL)
                        break;
-               printf("  looking at device '%s':\n", dev->devpath);
+               printf("  looking at parent device '%s':\n", dev->devpath);
                printf("    ID==\"%s\"\n", dev->kernel_name);
                printf("    BUS==\"%s\"\n", dev->subsystem);
                printf("    DRIVER==\"%s\"\n", dev->driver);
@@ -208,9 +209,7 @@ int main(int argc, char *argv[], char *envp[])
 
        char path[PATH_SIZE] = "";
        char name[PATH_SIZE] = "";
-       char temp[PATH_SIZE];
        struct name_entry *name_loop;
-       char *pos;
        int rc = 0;
 
        logging_init("udevinfo");
@@ -233,16 +232,20 @@ int main(int argc, char *argv[], char *envp[])
                dbg("option '%c'", option);
                switch (option) {
                case 'n':
-                       dbg("udev name: %s\n", optarg);
-                       strlcpy(name, optarg, sizeof(name));
+                       /* remove /dev if given */
+                       if (strncmp(optarg, udev_root, strlen(udev_root)) == 0)
+                               strlcpy(name, &optarg[strlen(udev_root)+1], sizeof(name));
+                       else
+                               strlcpy(name, optarg, sizeof(name));
+                       dbg("name: %s\n", name);
                        break;
                case 'p':
-                       dbg("udev path: %s\n", optarg);
-                       /* remove sysfs mountpoint if not given */
+                       /* remove /sys if given */
                        if (strncmp(optarg, sysfs_path, strlen(sysfs_path)) == 0)
                                strlcpy(path, &optarg[strlen(sysfs_path)], sizeof(path));
                        else
                                strlcpy(path, optarg, sizeof(path));
+                       dbg("path: %s\n", path);
                        break;
                case 'q':
                        dbg("udev query: %s\n", optarg);
@@ -298,40 +301,19 @@ int main(int argc, char *argv[], char *envp[])
        /* run action */
        switch (action) {
        case ACTION_QUERY:
-               /* need devpath or node/symlink name for query */
+               /* needs devpath or node/symlink name for query */
                if (path[0] != '\0') {
-                       /* remove sysfs_path if given */
-                       if (strncmp(path, sysfs_path, strlen(sysfs_path)) == 0) {
-                               pos = path + strlen(sysfs_path);
-                       } else {
-                               if (path[0] != '/') {
-                                       /* prepend '/' if missing */
-                                       strcpy(temp, "/");
-                                       strlcpy(temp, path, sizeof(temp));
-                                       pos = temp;
-                               } else {
-                                       pos = path;
-                               }
-                       }
-                       if (udev_db_get_device(udev, pos) != 0) {
-                               fprintf(stderr, "no record for '%s' in database\n", pos);
+                       if (udev_db_get_device(udev, path) != 0) {
+                               fprintf(stderr, "no record for '%s' in database\n", path);
                                rc = 3;
                                goto exit;
                        }
                } else if (name[0] != '\0') {
                        char devpath[PATH_SIZE];
-                       int len;
 
-                       /* remove udev_root if given */
-                       len = strlen(udev_root);
-                       if (strncmp(name, udev_root, len) == 0) {
-                               pos = &name[len+1];
-                       } else
-                               pos = name;
-
-                       if (udev_db_lookup_name(pos, devpath, sizeof(devpath)) != 0) {
-                               fprintf(stderr, "no record for '%s' in database\n", pos);
-                               rc = 3;
+                       if (udev_db_lookup_name(name, devpath, sizeof(devpath)) != 0) {
+                               fprintf(stderr, "node name not found\n");
+                               rc = 4;
                                goto exit;
                        }
                        udev_db_get_device(udev, devpath);
@@ -375,12 +357,22 @@ int main(int argc, char *argv[], char *envp[])
                }
                break;
        case ACTION_ATTRIBUTE_WALK:
-               if (path[0] == '\0') {
-                       fprintf(stderr, "attribute walk on device chain needs path(-p) specified\n");
-                       rc = 4;
-                       goto exit;
-               } else
+               if (path[0] != '\0') {
                        print_device_chain(path);
+               } else if (name[0] != '\0') {
+                       char devpath[PATH_SIZE];
+
+                       if (udev_db_lookup_name(name, devpath, sizeof(devpath)) != 0) {
+                               fprintf(stderr, "node name not found\n");
+                               rc = 4;
+                               goto exit;
+                       }
+                       print_device_chain(devpath);
+               } else {
+                       fprintf(stderr, "attribute walk needs device path(-p) or node name(-n) specified\n");
+                       rc = 5;
+                       goto exit;
+               }
                break;
        case ACTION_ROOT:
                printf("%s\n", udev_root);