X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udevinfo.c;h=cda229244d9b59aadaea86d55fca32d098271016;hp=3f47add87cd6f7197ec2d81dc5603bbf56564d3a;hb=d419e96238f295996f5b8fc1743ab4835f62fcc2;hpb=88caa9da18841561c604c5a237cb776375eee035 diff --git a/udevinfo.c b/udevinfo.c index 3f47add87..cda229244 100644 --- a/udevinfo.c +++ b/udevinfo.c @@ -93,7 +93,7 @@ static void print_all_attributes(const char *devpath, const char *key) continue; } - replace_untrusted_chars(value); + replace_chars(value, ALLOWED_CHARS_INPUT); printf(" %s{%s}==\"%s\"\n", key, dent->d_name, value); } } @@ -146,20 +146,17 @@ static void print_record(struct udevice *udev) printf("N: %s\n", udev->name); list_for_each_entry(name_loop, &udev->symlink_list, node) printf("S: %s\n", name_loop->name); + if (udev->link_priority != 0) + printf("L: %i\n", udev->link_priority); + if (udev->partitions != 0) + printf("A:%u\n", udev->partitions); + if (udev->ignore_remove) + printf("R:%u\n", udev->ignore_remove); list_for_each_entry(name_loop, &udev->env_list, node) 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 +164,58 @@ 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); + int count; + struct name_entry *device; + int rc = -1; + + count = udev_db_get_devices_by_name(name, &name_list); + if (count <= 0) + goto out; + + info("found %i devices for '%s'", count, name); + + /* select the device that seems to match */ + 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); + + /* make sure, we don't get a link of a differnt device */ + strlcpy(filename, udev_root, sizeof(filename)); + strlcat(filename, "/", sizeof(filename)); + strlcat(filename, name, sizeof(filename)); + if (stat(filename, &statbuf) != 0) + continue; + if (major(udev->devt) > 0 && udev->devt != statbuf.st_rdev) { + info("skip '%s', dev_t doesn't match", udev->name); + continue; + } + rc = 0; + break; + } +out: + name_list_cleanup(&name_list); + return rc; +} + int main(int argc, char *argv[], char *envp[]) { int option; @@ -220,7 +259,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 +267,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 +323,8 @@ 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); @@ -330,14 +366,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; @@ -385,14 +418,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;