summaryrefslogtreecommitdiff
path: root/udevinfo.c
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@vrfy.org>2007-03-17 10:08:25 +0100
committerKay Sievers <kay.sievers@vrfy.org>2007-03-17 10:08:25 +0100
commit31de3a2ba18ffa011f5054016ccc4a500cbe0cc3 (patch)
treef945058d7aad9cbe45fba6e496c73d948255e729 /udevinfo.c
parentd7fdcd61927e9439ad7079bb0967e0b6edac7646 (diff)
read list of devices from index, make index private to database
Diffstat (limited to 'udevinfo.c')
-rw-r--r--udevinfo.c50
1 files changed, 40 insertions, 10 deletions
diff --git a/udevinfo.c b/udevinfo.c
index 3f47add87c..e892b1092e 100644
--- a/udevinfo.c
+++ b/udevinfo.c
@@ -167,7 +167,7 @@ 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)
@@ -177,6 +177,41 @@ static void export_db(void fnct(struct udevice *udev)) {
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;
@@ -220,7 +255,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;
@@ -330,14 +365,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 +417,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;