X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev.c;h=b872f42494e68070e34452e6221dca619fb5e650;hp=116acf538976a070aadaff0ed30187e9dd506747;hb=e996d97835c8d0728a9d4880e9e1f8f285cadf4b;hpb=f1db055ab2e349ce22254562faaece66d6a4a873 diff --git a/udev.c b/udev.c index 116acf538..b872f4249 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,13 +83,36 @@ static inline char *get_seqnum(void) return seqnum; } +static void 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"); +} + +enum query_type { + NONE, + NAME, + SYMLINK, + OWNER, + GROUP +}; + static inline int udev_user(int argc, char **argv) { - static const char short_options[] = "q:rVh"; + static const char short_options[] = "dp:q:rVh"; int option; int retval = -EINVAL; struct udevice dev; + int root = 0; + enum query_type query = NONE; + char result[NAME_SIZE] = ""; + char path[NAME_SIZE] = ""; + /* get command line options */ while (1) { option = getopt(argc, argv, short_options); if (option == -1) @@ -96,26 +120,51 @@ static inline int udev_user(int argc, char **argv) dbg("option '%c'", option); switch (option) { + case 'p': + dbg("udev path: %s\n", optarg); + strfieldcpy(path, optarg); + break; + case 'q': dbg("udev query: %s\n", optarg); + + if (strcmp(optarg, "name") == 0) { + query = NAME; + break; + } + + if (strcmp(optarg, "symlink") == 0) { + query = SYMLINK; + break; + } + + if (strcmp(optarg, "owner") == 0) { + query = OWNER; + break; + } + + if (strcmp(optarg, "group") == 0) { + query = GROUP; + break; + } + + printf("unknown query type\n"); + return -EINVAL; + + case 'r': + root = 1; + break; + + case 'd': retval = udevdb_open_ro(); if (retval != 0) { printf("unable to open udev database\n"); - return -1; - } - retval = udevdb_get_dev(optarg, &dev); - if (retval == 0) { - printf("%s\n", dev.name); - } else { - printf("device not found in udev database\n"); + return -EACCES; } + retval = udevdb_dump(print_record); udevdb_exit(); return retval; - case 'r': - printf("%s\n", udev_root); - return 0; - case 'V': printf("udev, version %s\n", UDEV_VERSION); return 0; @@ -128,14 +177,68 @@ 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) + strfieldcpy(result, udev_root); + strncat(result, dev.name, sizeof(result)); + break; + + case SYMLINK: + strfieldcpy(result, dev.symlink); + break; + + case GROUP: + strfieldcpy(result, dev.group); + break; + + case OWNER: + strfieldcpy(result, dev.owner); + break; + + default: + break; + } + printf("%s\n", result); + } else { + printf("device not found in udev database\n"); + } + udevdb_exit(); + return retval; + } + + if (root) { + printf("%s\n", udev_root); + return 0; + } + help: - printf("Usage: [-qrVh]\n" - " -q query database for the name of the created node\n" - " -r print udev root\n" - " -V print udev version\n" - " -h print this help text\n" + printf("Usage: [-pqrdVh]\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" + " -p PATH sysfs device path used for query\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; } @@ -143,6 +246,8 @@ static char *subsystem_blacklist[] = { "net", "scsi_host", "scsi_device", + "usb_host", + "pci_bus", "", }; @@ -229,9 +334,9 @@ exit: int main(int argc, char **argv, char **envp) { + int retval; main_argv = argv; main_envp = envp; - int retval; dbg("version %s", UDEV_VERSION);