X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udevinfo.c;h=69e5335b7cef9d26d099c72c8bf45adadac0c483;hp=b2d22e984e44caa3a5d5e0d0bcdf5f22479de02a;hb=e2bd03ff63789e0ffcc1955f15d9927f3ce87465;hpb=599e17a3e6678eecfd12874cbd35698591df068d diff --git a/udevinfo.c b/udevinfo.c index b2d22e984..69e5335b7 100644 --- a/udevinfo.c +++ b/udevinfo.c @@ -3,7 +3,6 @@ * * Copyright (C) 2004 Kay Sievers * - * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation version 2 of the License. @@ -28,7 +27,7 @@ #include #include "libsysfs/sysfs/libsysfs.h" -#include "libsysfs/dlist.h" +#include "udev_libc_wrapper.h" #include "udev.h" #include "udev_utils.h" #include "udev_version.h" @@ -36,15 +35,16 @@ #include "logging.h" -#define SYSFS_VALUE_SIZE 256 - -#ifdef LOG -void log_message (int level, const char *format, ...) +#ifdef USE_LOG +void log_message (int priority, const char *format, ...) { va_list args; + if (priority > udev_log_priority) + return; + va_start(args, format); - vsyslog(level, format, args); + vsyslog(priority, format, args); va_end(args); } #endif @@ -52,31 +52,30 @@ void log_message (int level, const char *format, ...) static void print_all_attributes(struct dlist *attr_list) { struct sysfs_attribute *attr; - char value[SYSFS_VALUE_SIZE]; - int len; + char value[VALUE_SIZE]; + size_t len; dlist_for_each_data(attr_list, attr, struct sysfs_attribute) { - if (attr->value != NULL) { - strfieldcpy(value, attr->value); - len = strlen(value); - if (len == 0) - continue; - - /* remove trailing newline */ - if (value[len-1] == '\n') { - value[len-1] = '\0'; - len--; - } + if (attr->value == NULL) + continue; + len = strlcpy(value, attr->value, sizeof(value)); + if (len >= sizeof(value)) { + dbg("attribute value of '%s' too long, skip", attr->name); + continue; + } - /* skip nonprintable values */ - while (len) { - if (isprint(value[len-1]) == 0) - break; - len--; - } - if (len == 0) - printf(" SYSFS{%s}=\"%s\"\n", attr->name, value); + /* remove trailing newlines */ + while (len && value[len-1] == '\n') + value[--len] = '\0'; + /* skip nonprintable attributes */ + while (len && isprint(value[len-1])) + len--; + if (len) { + dbg("attribute value of '%s' non-printable, skip", attr->name); + continue; } + replace_untrusted_chars(value); + printf(" SYSFS{%s}==\"%s\"\n", attr->name, value); } printf("\n"); } @@ -107,14 +106,13 @@ static int print_device_chain(const char *path) struct sysfs_class_device *class_dev_parent; struct sysfs_attribute *attr; struct sysfs_device *sysfs_dev; - struct sysfs_device *sysfs_dev_parent; struct dlist *attr_list; int retval = 0; /* get the class dev */ class_dev = sysfs_open_class_device_path(path); if (class_dev == NULL) { - printf("couldn't get the class device\n"); + fprintf(stderr, "couldn't get the class device\n"); return -1; } @@ -132,11 +130,11 @@ static int print_device_chain(const char *path) /* open sysfs class device directory and print all attributes */ printf(" looking at class device '%s':\n", class_dev->path); - printf(" SUBSYSTEM=\"%s\"\n", class_dev->classname); + printf(" SUBSYSTEM==\"%s\"\n", class_dev->classname); attr_list = sysfs_get_classdev_attributes(class_dev); if (attr_list == NULL) { - printf("couldn't open class device directory\n"); + fprintf(stderr, "couldn't open class device directory\n"); retval = -1; goto exit; } @@ -144,36 +142,30 @@ 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) + 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"); + printf("follow the \"device\"-link to the physical device:\n"); /* look the device chain upwards */ while (sysfs_dev != NULL) { - attr_list = sysfs_get_device_attributes(sysfs_dev); - if (attr_list == NULL) { - printf("couldn't open device directory\n"); - retval = -1; - goto exit; - } - printf(" looking at the device chain at '%s':\n", sysfs_dev->path); - printf(" BUS=\"%s\"\n", sysfs_dev->bus); - printf(" ID=\"%s\"\n", sysfs_dev->bus_id); - printf(" DRIVER=\"%s\"\n", sysfs_dev->driver_name); + printf(" BUS==\"%s\"\n", sysfs_dev->bus); + printf(" ID==\"%s\"\n", sysfs_dev->bus_id); + printf(" DRIVER==\"%s\"\n", sysfs_dev->driver_name); - /* open sysfs device directory and print all attributes */ - print_all_attributes(attr_list); + attr_list = sysfs_get_device_attributes(sysfs_dev); + if (attr_list != NULL) + print_all_attributes(attr_list); + else + printf("\n"); - sysfs_dev_parent = sysfs_get_device_parent(sysfs_dev); - if (sysfs_dev_parent == NULL) + sysfs_dev = sysfs_get_device_parent(sysfs_dev); + if (sysfs_dev == NULL) break; - - sysfs_dev = sysfs_dev_parent; } exit: @@ -182,7 +174,7 @@ exit: } static int print_dump(const char *devpath, const char *name) { - printf("%s:%s/%s\n", devpath, udev_root, name); + printf("%s=%s/%s\n", devpath, udev_root, name); return 0; } @@ -194,9 +186,9 @@ int main(int argc, char *argv[], char *envp[]) int root = 0; int attributes = 0; enum query_type query = NONE; - char path[NAME_SIZE] = ""; - char name[NAME_SIZE] = ""; - char temp[NAME_SIZE]; + char path[PATH_SIZE] = ""; + char name[PATH_SIZE] = ""; + char temp[PATH_SIZE]; struct name_entry *name_loop; char *pos; int retval = 0; @@ -204,7 +196,7 @@ int main(int argc, char *argv[], char *envp[]) logging_init("udevinfo"); udev_init_config(); - udev_init_device(&udev, NULL, NULL); + udev_init_device(&udev, NULL, NULL, NULL); /* get command line options */ while (1) { @@ -216,12 +208,12 @@ int main(int argc, char *argv[], char *envp[]) switch (option) { case 'n': dbg("udev name: %s\n", optarg); - strfieldcpy(name, optarg); + strlcpy(name, optarg, sizeof(name)); break; case 'p': dbg("udev path: %s\n", optarg); - strfieldcpy(path, optarg); + strlcpy(path, optarg, sizeof(path)); break; case 'q': @@ -247,7 +239,7 @@ int main(int argc, char *argv[], char *envp[]) break; } - printf("unknown query type\n"); + fprintf(stderr, "unknown query type\n"); retval = 1; goto exit; @@ -285,7 +277,7 @@ int main(int argc, char *argv[], char *envp[]) if (path[0] != '/') { /* prepend '/' if missing */ strcpy(temp, "/"); - strfieldcat(temp, path); + strlcpy(temp, path, sizeof(temp)); pos = temp; } else { pos = path; @@ -293,14 +285,14 @@ int main(int argc, char *argv[], char *envp[]) } retval = udev_db_get_device(&udev, pos); if (retval != 0) { - printf("device not found in database\n"); + fprintf(stderr, "device not found in database\n"); goto exit; } goto print; } if (name[0] != '\0') { - char devpath[NAME_SIZE]; + char devpath[PATH_SIZE]; int len; /* remove udev_root if given */ @@ -310,16 +302,16 @@ int main(int argc, char *argv[], char *envp[]) } else pos = name; - retval = udev_db_search_name(devpath, DEVPATH_SIZE, pos); + retval = udev_db_search_name(devpath, sizeof(devpath), pos); if (retval != 0) { - printf("device not found in database\n"); + fprintf(stderr, "device not found in database\n"); goto exit; } udev_db_get_device(&udev, devpath); goto print; } - printf("query needs device path(-p) or node name(-n) specified\n"); + fprintf(stderr, "query needs device path(-p) or node name(-n) specified\n"); retval = 3; goto exit; @@ -355,15 +347,15 @@ print: if (attributes) { if (path[0] == '\0') { - printf("attribute walk on device chain needs path(-p) specified\n"); + fprintf(stderr, "attribute walk on device chain needs path(-p) specified\n"); retval = 4; goto exit; } else { if (strncmp(path, sysfs_path, strlen(sysfs_path)) != 0) { /* prepend sysfs mountpoint if not given */ - strfieldcpy(temp, path); - strfieldcpy(path, sysfs_path); - strfieldcat(path, temp); + snprintf(temp, sizeof(temp), "%s%s", sysfs_path, path); + temp[sizeof(temp)-1] = '\0'; + strlcpy(path, temp, sizeof(temp)); } print_device_chain(path); goto exit; @@ -376,7 +368,7 @@ print: } help: - printf("Usage: udevinfo [-anpqrVh]\n" + fprintf(stderr, "Usage: udevinfo [-anpqrVh]\n" " -q TYPE query database for the specified value:\n" " 'name' name of device node\n" " 'symlink' pointing to node\n"