X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udevinfo.c;h=8329fe7d06dd51681583b7af937f2c07c30121dd;hp=aa9d20a7736a7cb19b67133a551658a204bbe236;hb=42e4b6819ff91725fc101e1169e30ed27a7da3ca;hpb=ac4dc8746501ae3b9c859e5714f508d90cbe41a7 diff --git a/udevinfo.c b/udevinfo.c index aa9d20a77..8329fe7d0 100644 --- a/udevinfo.c +++ b/udevinfo.c @@ -27,11 +27,13 @@ #include #include +#include "libsysfs/sysfs/libsysfs.h" +#include "libsysfs/dlist.h" #include "udev.h" +#include "udev_lib.h" #include "udev_version.h" #include "logging.h" #include "udevdb.h" -#include "libsysfs/libsysfs.h" # define SYSFS_VALUE_MAX 200 @@ -39,6 +41,18 @@ char **main_argv; int main_argc; +#ifdef LOG +unsigned char logname[LOGNAME_SIZE]; +void log_message (int level, const char *format, ...) +{ + va_list args; + + va_start(args, format); + vsyslog(level, format, args); + va_end(args); +} +#endif + static int print_all_attributes(const char *path) { struct dlist *attributes; @@ -60,7 +74,7 @@ static int print_all_attributes(const char *path) dlist_for_each_data(attributes, attr, struct sysfs_attribute) { if (attr->value != NULL) { - strncpy(value, attr->value, SYSFS_VALUE_MAX); + strfieldcpy(value, attr->value); len = strlen(value); if (len == 0) continue; @@ -78,7 +92,7 @@ static int print_all_attributes(const char *path) len--; } if (len == 0) - printf(" SYSFS_%s=\"%s\"\n", attr->name, value); + printf(" SYSFS{%s}=\"%s\"\n", attr->name, value); } } printf("\n"); @@ -94,10 +108,14 @@ static int print_record(char *path, struct udevice *dev) { printf("P: %s\n", path); printf("N: %s\n", dev->name); + printf("T: %c\n", dev->type); printf("M: %#o\n", dev->mode); printf("S: %s\n", dev->symlink); printf("O: %s\n", dev->owner); printf("G: %s\n", dev->group); + printf("F: %s\n", dev->config_file); + printf("L: %i\n", dev->config_line); + printf("U: %li\n", dev->config_uptime); printf("\n"); return 0; } @@ -109,7 +127,8 @@ enum query_type { SYMLINK, MODE, OWNER, - GROUP + GROUP, + ALL }; static int print_device_chain(const char *path) @@ -120,6 +139,10 @@ static int print_device_chain(const char *path) struct sysfs_device *sysfs_dev; struct sysfs_device *sysfs_dev_parent; int retval = 0; + char type; + + type = get_device_type(path, ""); + dbg("device type is %c", type); /* get the class dev */ class_dev = sysfs_open_class_device_path(path); @@ -128,15 +151,23 @@ static int print_device_chain(const char *path) return -1; } - /* read the 'dev' file for major/minor*/ - attr = sysfs_get_classdev_attr(class_dev, "dev"); - if (attr == NULL) { - printf("couldn't get the \"dev\" file\n"); - retval = -1; - goto exit; + printf("\nudevinfo 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" + "\n"); + + if (type == 'b' || type =='c') { + /* read the 'dev' file for major/minor*/ + attr = sysfs_get_classdev_attr(class_dev, "dev"); + if (attr == NULL) { + printf("couldn't get the \"dev\" file\n"); + retval = -1; + goto exit; + } + printf("device '%s' has major:minor %s", class_dev->path, attr->value); } - printf("\ndevice '%s' has major:minor %s", class_dev->path, attr->value); - sysfs_close_attribute(attr); /* open sysfs class device directory and print all attributes */ printf(" looking at class device '%s':\n", class_dev->path); @@ -148,11 +179,11 @@ static int print_device_chain(const char *path) /* get the device link (if parent exists look here) */ class_dev_parent = sysfs_get_classdev_parent(class_dev); - if (class_dev_parent != NULL) { - //sysfs_close_class_device(class_dev); - class_dev = class_dev_parent; - } - sysfs_dev = sysfs_get_classdev_device(class_dev); + if (class_dev_parent != NULL) + sysfs_dev = sysfs_get_classdev_device(class_dev_parent); + else + sysfs_dev = sysfs_get_classdev_device(class_dev); + if (sysfs_dev != NULL) printf("follow the class device's \"device\"\n"); @@ -169,13 +200,11 @@ static int print_device_chain(const char *path) if (sysfs_dev_parent == NULL) break; - //sysfs_close_device(sysfs_dev); sysfs_dev = sysfs_dev_parent; } - sysfs_close_device(sysfs_dev); exit: - //sysfs_close_class_device(class_dev); + sysfs_close_class_device(class_dev); return retval; } @@ -245,6 +274,11 @@ static int process_options(void) break; } + if (strcmp(optarg, "all") == 0) { + query = ALL; + break; + } + printf("unknown query type\n"); exit(1); @@ -293,8 +327,8 @@ static int process_options(void) } else { if (path[0] != '/') { /* prepend '/' if missing */ - strcat(temp, "/"); - strncat(temp, path, sizeof(path)); + strfieldcat(temp, "/"); + strfieldcat(temp, path); pos = temp; } else { pos = path; @@ -330,7 +364,7 @@ print: case NAME: if (root) strfieldcpy(result, udev_root); - strncat(result, dev.name, sizeof(result)); + strfieldcat(result, dev.name); break; case SYMLINK: @@ -353,6 +387,10 @@ print: strfieldcpy(result, path); break; + case ALL: + print_record(path, &dev); + goto exit; + default: goto exit; } @@ -372,7 +410,7 @@ exit: /* prepend sysfs mountpoint if not given */ strfieldcpy(temp, path); strfieldcpy(path, sysfs_path); - strncat(path, temp, sizeof(path)); + strfieldcat(path, temp); } print_device_chain(path); return 0; @@ -393,11 +431,13 @@ help: " 'owner' of node\n" " 'group' of node\n" " 'path' sysfs device path\n" + " 'all' all values\n" + "\n" " -p PATH sysfs device path used for query or chain\n" - " -n NAME node name used for query\n" + " -n NAME node/symlink name used for query\n" "\n" " -r print udev root\n" - " -a print all attributes along the chain of the device\n" + " -a print all SYSFS_attributes along the device chain\n" " -d dump whole database\n" " -V print udev version\n" " -h print this help text\n" @@ -412,6 +452,8 @@ int main(int argc, char *argv[], char *envp[]) main_argv = argv; main_argc = argc; + init_logging("udevinfo"); + /* initialize our configuration */ udev_init_config();