X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev.c;h=3b701ac26fc913e1ef6b8676bca5baa50ef47179;hp=7078f089e2db0a4d46069eda299e7d2e006b7098;hb=b2a21a35476b4780ef1fc68c60216117ab66fa2b;hpb=5472beeea5884dfc8bc5afb0f963de3ea3232e66 diff --git a/udev.c b/udev.c index 7078f089e..3b701ac26 100644 --- a/udev.c +++ b/udev.c @@ -34,6 +34,7 @@ #include "udev.h" #include "udev_version.h" #include "udev_dbus.h" +#include "logging.h" #include "namedev.h" #include "udevdb.h" #include "libsysfs/libsysfs.h" @@ -82,9 +83,22 @@ static inline char *get_seqnum(void) return seqnum; } +/* callback for database dump */ +static int print_record(char *path, struct udevice *dev) +{ + printf("P: %s\n", path); + printf("N: %s\n", dev->name); + printf("S: %s\n", dev->symlink); + printf("O: %s\n", dev->owner); + printf("G: %s\n", dev->group); + printf("\n"); + return 0; +} + enum query_type { NONE, NAME, + PATH, SYMLINK, OWNER, GROUP @@ -92,7 +106,7 @@ enum query_type { static inline int udev_user(int argc, char **argv) { - static const char short_options[] = "p:q:rVh"; + static const char short_options[] = "dn:p:q:rVh"; int option; int retval = -EINVAL; struct udevice dev; @@ -100,6 +114,7 @@ static inline int udev_user(int argc, char **argv) enum query_type query = NONE; char result[NAME_SIZE] = ""; char path[NAME_SIZE] = ""; + char name[NAME_SIZE] = ""; /* get command line options */ while (1) { @@ -109,6 +124,11 @@ static inline int udev_user(int argc, char **argv) dbg("option '%c'", option); switch (option) { + case 'n': + dbg("udev name: %s\n", optarg); + strfieldcpy(name, optarg); + break; + case 'p': dbg("udev path: %s\n", optarg); strfieldcpy(path, optarg); @@ -137,6 +157,11 @@ static inline int udev_user(int argc, char **argv) break; } + if (strcmp(optarg, "path") == 0) { + query = PATH; + break; + } + printf("unknown query type\n"); return -EINVAL; @@ -144,6 +169,16 @@ static inline int udev_user(int argc, char **argv) root = 1; break; + case 'd': + retval = udevdb_open_ro(); + if (retval != 0) { + printf("unable to open udev database\n"); + return -EACCES; + } + retval = udevdb_call_foreach(print_record); + udevdb_exit(); + return retval; + case 'V': printf("udev, version %s\n", UDEV_VERSION); return 0; @@ -158,44 +193,63 @@ static inline int udev_user(int argc, char **argv) /* process options */ if (query != NONE) { - if (path[0] == '\0') { - printf("query needs device path specified\n"); - return -EINVAL; - } - retval = udevdb_open_ro(); if (retval != 0) { printf("unable to open udev database\n"); return -EACCES; } - retval = udevdb_get_dev(path, &dev); - if (retval == 0) { - switch(query) { - case NAME: - if (root) + + if (path[0] != '\0') { + retval = udevdb_get_dev(path, &dev); + if (retval != 0) { + printf("device not found in database\n"); + goto exit; + } + goto print; + } + + if (name[0] != '\0') { + retval = udevdb_get_dev_byname(name, path, &dev); + if (retval != 0) { + printf("device not found in database\n"); + goto exit; + } + goto print; + } + + printf("query needs device path(-p) or node name(-n) specified\n"); + goto exit; + +print: + switch(query) { + case NAME: + if (root) strfieldcpy(result, udev_root); - strncat(result, dev.name, sizeof(result)); - break; + strncat(result, dev.name, sizeof(result)); + break; - case SYMLINK: - strfieldcpy(result, dev.symlink); - break; + case SYMLINK: + strfieldcpy(result, dev.symlink); + break; - case GROUP: - strfieldcpy(result, dev.group); - break; + case GROUP: + strfieldcpy(result, dev.group); + break; - case OWNER: - strfieldcpy(result, dev.owner); - break; + case OWNER: + strfieldcpy(result, dev.owner); + break; - default: - break; - } - printf("%s\n", result); - } else { - printf("device not found in udev database\n"); + case PATH: + strfieldcpy(result, path); + break; + + default: + goto exit; } + printf("%s\n", result); + +exit: udevdb_exit(); return retval; } @@ -206,12 +260,20 @@ static inline int udev_user(int argc, char **argv) } help: - printf("Usage: [-qrVh]\n" - " -q query database for the specified value\n" - " -p device path used for query\n" - " -r print udev root\n" - " -V print udev version\n" - " -h print this help text\n" + printf("Usage: [-npqrdVh]\n" + " -q TYPE query database for the specified value:\n" + " 'name' name of device node\n" + " 'symlink' pointing to node\n" + " 'owner' of node\n" + " 'group' of node\n" + " 'path' sysfs device path\n" + " -p PATH sysfs device path used for query\n" + " -n NAME node name used for query\n" + "\n" + " -r print udev root\n" + " -d dump whole database\n" + " -V print udev version\n" + " -h print this help text\n" "\n"); return retval; } @@ -220,6 +282,8 @@ static char *subsystem_blacklist[] = { "net", "scsi_host", "scsi_device", + "usb_host", + "pci_bus", "", };