X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udevinfo.c;h=52c49b824f364fc7b6b63936790bf726893da89c;hb=eff4a6736937fb9d55c09c598d0d232d38c5b06a;hp=0551eb2e3287ae1cf2efbe6c4d8d29687f805611;hpb=92be0b870032fdbd5634bf75742d47a7a2276f24;p=elogind.git diff --git a/udevinfo.c b/udevinfo.c index 0551eb2e3..52c49b824 100644 --- a/udevinfo.c +++ b/udevinfo.c @@ -150,16 +150,7 @@ static void print_record(struct udevice *udev) printf("E: %s\n", name_loop->name); } -static void export_name_devpath(struct udevice *udev) { - printf("%s=%s/%s\n", udev->dev->devpath, udev_root, udev->name); -} - -static void export_record(struct udevice *udev) { - print_record(udev); - printf("\n"); -} - -static void export_db(void fnct(struct udevice *udev)) { +static void export_db(void) { LIST_HEAD(name_list); struct name_entry *name_loop; @@ -167,16 +158,52 @@ static void export_db(void fnct(struct udevice *udev)) { list_for_each_entry(name_loop, &name_list, node) { struct udevice *udev_db; - udev_db = udev_device_init(); + udev_db = udev_device_init(NULL); if (udev_db == NULL) continue; if (udev_db_get_device(udev_db, name_loop->name) == 0) - fnct(udev_db); + print_record(udev_db); + printf("\n"); udev_device_cleanup(udev_db); } name_list_cleanup(&name_list); } +static int lookup_device_by_name(struct udevice *udev, const char *name) +{ + LIST_HEAD(name_list); + struct name_entry *device; + int rc = -1; + + if (udev_db_get_devices_by_name(name, &name_list) <= 0) + goto out; + + /* select the device that matches the dev_t of name */ + list_for_each_entry(device, &name_list, node) { + char filename[PATH_SIZE]; + struct stat statbuf; + + udev_device_init(udev); + if (udev_db_get_device(udev, device->name) != 0) + continue; + info("found db entry '%s'", device->name); + + strlcpy(filename, udev_root, sizeof(filename)); + strlcat(filename, "/", sizeof(filename)); + strlcat(filename, name, sizeof(filename)); + if (stat(filename, &statbuf) != 0) + continue; + if (statbuf.st_rdev == udev->devt) { + info("found '%s', dev_t matches", udev->name); + rc = 0; + break; + } + } +out: + name_list_cleanup(&name_list); + return rc; +} + int main(int argc, char *argv[], char *envp[]) { int option; @@ -190,7 +217,7 @@ int main(int argc, char *argv[], char *envp[]) { "attribute-walk", 0, NULL, 'a' }, { "export-db", 0, NULL, 'e' }, { "root", 0, NULL, 'r' }, - { "version", 0, NULL, 'V' }, + { "version", 0, NULL, 1 }, /* -V outputs braindead format */ { "help", 0, NULL, 'h' }, {} }; @@ -220,7 +247,7 @@ int main(int argc, char *argv[], char *envp[]) udev_config_init(); sysfs_init(); - udev = udev_device_init(); + udev = udev_device_init(NULL); if (udev == NULL) { rc = 1; goto exit; @@ -228,7 +255,7 @@ int main(int argc, char *argv[], char *envp[]) /* get command line options */ while (1) { - option = getopt_long(argc, argv, "aden:p:q:rVh", options, NULL); + option = getopt_long(argc, argv, "aen:p:q:rVh", options, NULL); if (option == -1) break; @@ -284,11 +311,11 @@ int main(int argc, char *argv[], char *envp[]) case 'a': action = ACTION_ATTRIBUTE_WALK; break; - case 'd': - export_db(export_name_devpath); - goto exit; case 'e': - export_db(export_record); + export_db(); + goto exit; + case 1: + printf("%s\n", UDEV_VERSION); goto exit; case 'V': printf("udevinfo, version %s\n", UDEV_VERSION); @@ -308,7 +335,6 @@ int main(int argc, char *argv[], char *envp[]) " --root prepend to query result or print udev_root\n" " --attribute-walk print all SYSFS_attributes along the device chain\n" " --export-db export the content of the udev database\n" - " --version print udev version\n" " --help print this text\n" "\n"); goto exit; @@ -328,14 +354,11 @@ int main(int argc, char *argv[], char *envp[]) goto exit; } } else if (name[0] != '\0') { - char devpath[PATH_SIZE]; - - if (udev_db_lookup_name(name, devpath, sizeof(devpath)) != 0) { + if (lookup_device_by_name(udev, name) != 0) { fprintf(stderr, "node name not found\n"); rc = 4; goto exit; } - udev_db_get_device(udev, devpath); } else { fprintf(stderr, "query needs --path or node --name specified\n"); rc = 4; @@ -383,14 +406,12 @@ int main(int argc, char *argv[], char *envp[]) goto exit; } } else if (name[0] != '\0') { - char devpath[PATH_SIZE]; - - if (udev_db_lookup_name(name, devpath, sizeof(devpath)) != 0) { + if (lookup_device_by_name(udev, name) != 0) { fprintf(stderr, "node name not found\n"); rc = 4; goto exit; } - if (print_device_chain(devpath) != 0) { + if (print_device_chain(udev->dev->devpath) != 0) { fprintf(stderr, "device not found\n"); rc = 4; goto exit;