chiark / gitweb /
[PATCH] replace tdb database by simple lockless file database
[elogind.git] / udevinfo.c
index dc3f94fffe364deb241f8738f8d914d789c8f7cd..a90bbe11386494d66fd0b90f5a6256872447576b 100644 (file)
@@ -103,18 +103,11 @@ exit:
        return retval;
 }
 
-/* callback for database dump */
-static int print_record(char *path, struct udevice *dev)
+static int print_record(struct udevice *udev)
 {
-       printf("P: %s\n", path);
-       printf("N: %s\n", dev->name);
-       printf("M: %#o\n", dev->mode);
-       printf("S: %s\n", dev->symlink);
-       printf("O: %s\n", dev->owner);
-       printf("G: %s\n", dev->group);
-       printf("F: %s\n", dev->config_file);
-       printf("L: %i\n", dev->config_line);
-       printf("T: %li\n", dev->config_time);
+       printf("P: %s\n", udev->devpath);
+       printf("N: %s\n", udev->name);
+       printf("S: %s\n", udev->symlink);
        printf("\n");
        return 0;
 }
@@ -124,9 +117,6 @@ enum query_type {
        NAME,
        PATH,
        SYMLINK,
-       MODE,
-       OWNER,
-       GROUP,
        ALL
 };
 
@@ -138,6 +128,10 @@ static int print_device_chain(const char *path)
        struct sysfs_device *sysfs_dev;
        struct sysfs_device *sysfs_dev_parent;
        int retval = 0;
+       char type;
+
+       type = get_device_type(path, "");
+       dbg("device type is %c", type);
 
        /*  get the class dev */
        class_dev = sysfs_open_class_device_path(path);
@@ -146,22 +140,23 @@ static int print_device_chain(const char *path)
                return -1;
        }
 
-       /* read the 'dev' file for major/minor*/
-       attr = sysfs_get_classdev_attr(class_dev, "dev");
-       if (attr == NULL) {
-               printf("couldn't get the \"dev\" file\n");
-               retval = -1;
-               goto exit;
-       }
-
        printf("\nudevinfo 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"
               "\n");
-       printf("device '%s' has major:minor %s", class_dev->path, attr->value);
-       sysfs_close_attribute(attr);
+
+       if (type == 'b' || type =='c') {
+               /* read the 'dev' file for major/minor*/
+               attr = sysfs_get_classdev_attr(class_dev, "dev");
+               if (attr == NULL) {
+                       printf("couldn't get the \"dev\" file\n");
+                       retval = -1;
+                       goto exit;
+               }
+               printf("device '%s' has major:minor %s", class_dev->path, attr->value);
+       }
 
        /* open sysfs class device directory and print all attributes */
        printf("  looking at class device '%s':\n", class_dev->path);
@@ -173,11 +168,11 @@ static int print_device_chain(const char *path)
 
        /* get the device link (if parent exists look here) */
        class_dev_parent = sysfs_get_classdev_parent(class_dev);
-       if (class_dev_parent != NULL) {
-               //sysfs_close_class_device(class_dev);
-               class_dev = class_dev_parent;
-       }
-       sysfs_dev = sysfs_get_classdev_device(class_dev);
+       if (class_dev_parent != NULL) 
+               sysfs_dev = sysfs_get_classdev_device(class_dev_parent);
+       else 
+               sysfs_dev = sysfs_get_classdev_device(class_dev);
+       
        if (sysfs_dev != NULL)
                printf("follow the class device's \"device\"\n");
 
@@ -194,13 +189,11 @@ static int print_device_chain(const char *path)
                if (sysfs_dev_parent == NULL)
                        break;
 
-               //sysfs_close_device(sysfs_dev);
                sysfs_dev = sysfs_dev_parent;
        }
-       sysfs_close_device(sysfs_dev);
 
 exit:
-       //sysfs_close_class_device(class_dev);
+       sysfs_close_class_device(class_dev);
        return retval;
 }
 
@@ -209,7 +202,7 @@ static int process_options(void)
        static const char short_options[] = "adn:p:q:rVh";
        int option;
        int retval = 1;
-       struct udevice dev;
+       struct udevice udev;
        int root = 0;
        int attributes = 0;
        enum query_type query = NONE;
@@ -250,21 +243,6 @@ static int process_options(void)
                                break;
                        }
 
-                       if (strcmp(optarg, "mode") == 0) {
-                               query = MODE;
-                               break;
-                       }
-
-                       if (strcmp(optarg, "owner") == 0) {
-                               query = OWNER;
-                               break;
-                       }
-
-                       if (strcmp(optarg, "group") == 0) {
-                               query = GROUP;
-                               break;
-                       }
-
                        if (strcmp(optarg, "path") == 0) {
                                query = PATH;
                                break;
@@ -286,16 +264,6 @@ static int process_options(void)
                        attributes = 1;
                        break;
 
-               case 'd':
-                       retval = udevdb_open_ro();
-                       if (retval != 0) {
-                               printf("unable to open udev database\n");
-                               exit(2);
-                       }
-                       udevdb_call_foreach(print_record);
-                       udevdb_exit();
-                       exit(0);
-
                case 'V':
                        printf("udevinfo, version %s\n", UDEV_VERSION);
                        exit(0);
@@ -310,12 +278,6 @@ static int process_options(void)
 
        /* process options */
        if (query != NONE) {
-               retval = udevdb_open_ro();
-               if (retval != 0) {
-                       printf("unable to open udev database\n");
-                       return -EACCES;
-               }
-
                if (path[0] != '\0') {
                        /* remove sysfs_path if given */
                        if (strncmp(path, sysfs_path, strlen(sysfs_path)) == 0) {
@@ -330,7 +292,9 @@ static int process_options(void)
                                        pos = path;
                                }
                        }
-                       retval = udevdb_get_dev(pos, &dev);
+                       memset(&udev, 0x00, sizeof(struct udevice));
+                       strfieldcpy(udev.devpath, pos);
+                       retval = udevdb_get_dev(&udev);
                        if (retval != 0) {
                                printf("device not found in database\n");
                                goto exit;
@@ -340,15 +304,21 @@ static int process_options(void)
 
                if (name[0] != '\0') {
                        /* remove udev_root if given */
-                       if (strncmp(name, udev_root, strlen(udev_root)) == 0) {
-                               pos = name + strlen(udev_root);
+                       int len = strlen(udev_root);
+
+                       if (strncmp(name, udev_root, len) == 0) {
+                               pos = &name[len+1];
                        } else
                                pos = name;
-                       retval = udevdb_get_dev_byname(pos, path, &dev);
+
+                       memset(&udev, 0x00, sizeof(struct udevice));
+                       strfieldcpy(udev.name, pos);
+                       retval = udevdb_get_dev_byname(&udev, pos);
                        if (retval != 0) {
                                printf("device not found in database\n");
                                goto exit;
                        }
+
                        goto print;
                }
 
@@ -358,25 +328,16 @@ static int process_options(void)
 print:
                switch(query) {
                case NAME:
-                       if (root)
-                               strfieldcpy(result, udev_root);
-                       strfieldcat(result, dev.name);
+                       if (root) {
+                               snprintf(result, NAME_SIZE-1, "%s/%s", udev_root, udev.name);
+                               result[NAME_SIZE-1] = '\0';
+                       } else {
+                               strfieldcpy(result, udev.name);
+                       }
                        break;
 
                case SYMLINK:
-                       strfieldcpy(result, dev.symlink);
-                       break;
-
-               case MODE:
-                       sprintf(result, "%#o", dev.mode);
-                       break;
-
-               case GROUP:
-                       strfieldcpy(result, dev.group);
-                       break;
-
-               case OWNER:
-                       strfieldcpy(result, dev.owner);
+                       strfieldcpy(result, udev.symlink);
                        break;
 
                case PATH:
@@ -384,7 +345,7 @@ print:
                        break;
 
                case ALL:
-                       print_record(path, &dev);
+                       print_record(&udev);
                        goto exit;
 
                default:
@@ -393,7 +354,6 @@ print:
                printf("%s\n", result);
 
 exit:
-               udevdb_exit();
                return retval;
        }
 
@@ -423,9 +383,6 @@ help:
               "  -q TYPE  query database for the specified value:\n"
               "             'name'    name of device node\n"
               "             'symlink' pointing to node\n"
-              "             'mode'    permissions of node\n"
-              "             'owner'   of node\n"
-              "             'group'   of node\n"
               "             'path'    sysfs device path\n"
               "             'all'     all values\n"
               "\n"
@@ -434,7 +391,6 @@ help:
               "\n"
               "  -r       print udev root\n"
               "  -a       print all SYSFS_attributes along the device chain\n"
-              "  -d       dump whole database\n"
               "  -V       print udev version\n"
               "  -h       print this help text\n"
               "\n");
@@ -443,18 +399,18 @@ help:
 
 int main(int argc, char *argv[], char *envp[])
 {
-       int retval;
+       int rc = 0;
 
        main_argv = argv;
        main_argc = argc;
 
-       init_logging("udevinfo");
+       logging_init("udevinfo");
 
        /* initialize our configuration */
        udev_init_config();
 
-       retval = process_options();
-       if (retval != 0)
-               exit(1);
-       exit(0);
+       rc = process_options();
+
+       logging_close();
+       exit(rc);
 }