X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udevinfo.c;h=1a10f9ad073c80f2b58c74717edc70702c0c7da0;hb=2362eea6019e07a2e79e67ebe626bfacf40ff40f;hp=f8d0b6125af7680df269f10b07ec7bcec899e82f;hpb=1aa1e24848903d11780db1ade355be73ad61a937;p=elogind.git diff --git a/udevinfo.c b/udevinfo.c index f8d0b6125..1a10f9ad0 100644 --- a/udevinfo.c +++ b/udevinfo.c @@ -91,11 +91,11 @@ static int print_device_chain(const char *devpath) struct sysfs_device *dev; printf("\n" - "udevinfo starts with the device the node belongs to and then walks up the\n" - "device chain, to print for every device found, all possibly useful attributes\n" - "in the udev key format.\n" - "Only attributes within one device section may be used together in one rule,\n" - "to match the device for which the node will be created.\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" + "found, all possible attributes in the udev rules key format.\n" + "A rule to match, can be composed by the attributes of the device\n" + "and the attributes from one single parent device.\n" "\n"); dev = sysfs_device_get(devpath); @@ -105,6 +105,7 @@ static int print_device_chain(const char *devpath) printf(" looking at device '%s':\n", dev->devpath); printf(" KERNEL==\"%s\"\n", dev->kernel_name); printf(" SUBSYSTEM==\"%s\"\n", dev->subsystem); + printf(" DRIVER==\"%s\"\n", dev->driver); print_all_attributes(dev->devpath); /* walk up the chain of devices */ @@ -112,7 +113,7 @@ static int print_device_chain(const char *devpath) dev = sysfs_device_get_parent(dev); if (dev == NULL) break; - printf(" looking at device '%s':\n", dev->devpath); + printf(" looking at parent device '%s':\n", dev->devpath); printf(" ID==\"%s\"\n", dev->kernel_name); printf(" BUS==\"%s\"\n", dev->subsystem); printf(" DRIVER==\"%s\"\n", dev->driver); @@ -208,9 +209,7 @@ int main(int argc, char *argv[], char *envp[]) char path[PATH_SIZE] = ""; char name[PATH_SIZE] = ""; - char temp[PATH_SIZE]; struct name_entry *name_loop; - char *pos; int rc = 0; logging_init("udevinfo"); @@ -233,16 +232,20 @@ int main(int argc, char *argv[], char *envp[]) dbg("option '%c'", option); switch (option) { case 'n': - dbg("udev name: %s\n", optarg); - strlcpy(name, optarg, sizeof(name)); + /* remove /dev if given */ + if (strncmp(optarg, udev_root, strlen(udev_root)) == 0) + strlcpy(name, &optarg[strlen(udev_root)+1], sizeof(name)); + else + strlcpy(name, optarg, sizeof(name)); + dbg("name: %s\n", name); break; case 'p': - dbg("udev path: %s\n", optarg); - /* remove sysfs mountpoint if not given */ + /* remove /sys if given */ if (strncmp(optarg, sysfs_path, strlen(sysfs_path)) == 0) strlcpy(path, &optarg[strlen(sysfs_path)], sizeof(path)); else strlcpy(path, optarg, sizeof(path)); + dbg("path: %s\n", path); break; case 'q': dbg("udev query: %s\n", optarg); @@ -298,40 +301,19 @@ int main(int argc, char *argv[], char *envp[]) /* run action */ switch (action) { case ACTION_QUERY: - /* need devpath or node/symlink name for query */ + /* needs devpath or node/symlink name for query */ if (path[0] != '\0') { - /* remove sysfs_path if given */ - if (strncmp(path, sysfs_path, strlen(sysfs_path)) == 0) { - pos = path + strlen(sysfs_path); - } else { - if (path[0] != '/') { - /* prepend '/' if missing */ - strcpy(temp, "/"); - strlcpy(temp, path, sizeof(temp)); - pos = temp; - } else { - pos = path; - } - } - if (udev_db_get_device(udev, pos) != 0) { - fprintf(stderr, "no record for '%s' in database\n", pos); + if (udev_db_get_device(udev, path) != 0) { + fprintf(stderr, "no record for '%s' in database\n", path); rc = 3; goto exit; } } else if (name[0] != '\0') { char devpath[PATH_SIZE]; - int len; - /* remove udev_root if given */ - len = strlen(udev_root); - if (strncmp(name, udev_root, len) == 0) { - pos = &name[len+1]; - } else - pos = name; - - if (udev_db_lookup_name(pos, devpath, sizeof(devpath)) != 0) { - fprintf(stderr, "no record for '%s' in database\n", pos); - rc = 3; + if (udev_db_lookup_name(name, devpath, sizeof(devpath)) != 0) { + fprintf(stderr, "node name not found\n"); + rc = 4; goto exit; } udev_db_get_device(udev, devpath); @@ -375,12 +357,22 @@ int main(int argc, char *argv[], char *envp[]) } break; case ACTION_ATTRIBUTE_WALK: - if (path[0] == '\0') { - fprintf(stderr, "attribute walk on device chain needs path(-p) specified\n"); - rc = 4; - goto exit; - } else + if (path[0] != '\0') { print_device_chain(path); + } else if (name[0] != '\0') { + char devpath[PATH_SIZE]; + + if (udev_db_lookup_name(name, devpath, sizeof(devpath)) != 0) { + fprintf(stderr, "node name not found\n"); + rc = 4; + goto exit; + } + print_device_chain(devpath); + } else { + fprintf(stderr, "attribute walk needs device path(-p) or node name(-n) specified\n"); + rc = 5; + goto exit; + } break; case ACTION_ROOT: printf("%s\n", udev_root);