continue;
}
- replace_untrusted_chars(value);
+ replace_chars(value, ALLOWED_CHARS_INPUT);
printf(" %s{%s}==\"%s\"\n", key, dent->d_name, value);
}
}
{
struct sysfs_device *dev;
+ dev = sysfs_device_get(devpath);
+ if (dev == NULL)
+ return -1;
+
printf("\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"
"and the attributes from one single parent device.\n"
"\n");
- dev = sysfs_device_get(devpath);
- if (dev == NULL)
- return -1;
-
printf(" looking at device '%s':\n", dev->devpath);
printf(" KERNEL==\"%s\"\n", dev->kernel);
printf(" SUBSYSTEM==\"%s\"\n", dev->subsystem);
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;
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;
{ "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' },
{}
};
udev_config_init();
sysfs_init();
- udev = udev_device_init();
+ udev = udev_device_init(NULL);
if (udev == NULL) {
rc = 1;
goto exit;
}
- /* 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;
strlcpy(name, &optarg[strlen(udev_root)+1], sizeof(name));
else
strlcpy(name, optarg, sizeof(name));
- dbg("name: %s\n", name);
+ dbg("name: %s", name);
break;
case 'p':
/* remove /sys if given */
strlcpy(path, &optarg[strlen(sysfs_path)], sizeof(path));
else
strlcpy(path, optarg, sizeof(path));
- dbg("path: %s\n", path);
+ dbg("path: %s", path);
break;
case 'q':
- dbg("udev query: %s\n", optarg);
action = ACTION_QUERY;
if (strcmp(optarg, "name") == 0) {
query = QUERY_NAME;
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);
" --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"
- " --verision print udev version\n"
" --help print this text\n"
"\n");
goto exit;
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;
break;
case ACTION_ATTRIBUTE_WALK:
if (path[0] != '\0') {
- print_device_chain(path);
+ if (print_device_chain(path) != 0) {
+ fprintf(stderr, "no valid sysfs device found\n");
+ rc = 4;
+ 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;
}
- print_device_chain(devpath);
+ if (print_device_chain(udev->dev->devpath) != 0) {
+ fprintf(stderr, "no valid sysfs device found\n");
+ rc = 4;
+ goto exit;
+ }
} else {
fprintf(stderr, "attribute walk needs --path or node --name specified\n");
rc = 5;