#include <unistd.h>
#include <dirent.h>
#include <errno.h>
+#include <getopt.h>
+#include <sys/stat.h>
+#include <sys/types.h>
#include "udev.h"
dir = opendir(path);
if (dir != NULL) {
for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
+ struct stat statbuf;
+ char filename[PATH_SIZE];
char *attr_value;
char value[NAME_SIZE];
size_t len;
+ if (dent->d_name[0] == '.')
+ continue;
+
+ strlcpy(filename, path, sizeof(filename));
+ strlcat(filename, "/", sizeof(filename));
+ strlcat(filename, dent->d_name, sizeof(filename));
+ if (lstat(filename, &statbuf) != 0)
+ continue;
+ if (S_ISLNK(statbuf.st_mode))
+ continue;
+
attr_value = sysfs_attr_get_value(devpath, dent->d_name);
if (attr_value == NULL)
continue;
{
struct sysfs_device *dev;
+ dev = sysfs_device_get(devpath);
+ if (dev == NULL)
+ return -1;
+
printf("\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"
"and the attributes from one single parent device.\n"
"\n");
- dev = sysfs_device_get(devpath);
- if (dev == NULL)
- return -1;
-
printf(" looking at device '%s':\n", dev->devpath);
printf(" KERNEL==\"%s\"\n", dev->kernel);
printf(" SUBSYSTEM==\"%s\"\n", dev->subsystem);
break;
printf(" looking at parent device '%s':\n", dev->devpath);
printf(" KERNELS==\"%s\"\n", dev->kernel);
- printf(" SUBSYTEMS==\"%s\"\n", dev->subsystem);
+ printf(" SUBSYSTEMS==\"%s\"\n", dev->subsystem);
printf(" DRIVERS==\"%s\"\n", dev->driver);
print_all_attributes(dev->devpath, "ATTRS");
struct udevice *udev;
int root = 0;
+ static const struct option options[] = {
+ { "name", 1, NULL, 'n' },
+ { "path", 1, NULL, 'p' },
+ { "query", 1, NULL, 'q' },
+ { "attribute-walk", 0, NULL, 'a' },
+ { "export-db", 0, NULL, 'e' },
+ { "root", 0, NULL, 'r' },
+ { "version", 0, NULL, 'V' },
+ { "help", 0, NULL, 'h' },
+ {}
+ };
+
enum action_type {
ACTION_NONE,
ACTION_QUERY,
}
/* get command line options */
- opterr = 0;
while (1) {
- option = getopt(argc, argv, ":aden:p:q:rVh");
+ option = getopt_long(argc, argv, "aden:p:q:rVh", options, NULL);
if (option == -1)
break;
printf("udevinfo, version %s\n", UDEV_VERSION);
goto exit;
case 'h':
- printf("Usage: udevinfo [-anpqrVh]\n"
- " -q TYPE query database for the specified value:\n"
- " 'name' name of device node\n"
- " 'symlink' pointing to node\n"
- " 'path' sysfs device path\n"
- " 'env' the device related imported environment\n"
- " 'all' all values\n"
+ printf("Usage: udevinfo OPTIONS\n"
+ " --query=<type> query database for the specified value:\n"
+ " name name of device node\n"
+ " symlink pointing to node\n"
+ " path sysfs device path\n"
+ " env the device related imported environment\n"
+ " all all values\n"
"\n"
- " -p PATH sysfs device path used for query or chain\n"
- " -n NAME node/symlink name used for query\n"
+ " --path=<devpath> sysfs device path used for query or chain\n"
+ " --name=<name> node or symlink name used for query\n"
"\n"
- " -r prepend to query result or print udev_root\n"
- " -a print all SYSFS_attributes along the device chain\n"
- " -e export the content of the udev database\n"
- " -V print udev version\n"
- " -h print this help text\n"
+ " --root prepend to query result or print udev_root\n"
+ " --attribute-walk print all SYSFS_attributes along the device chain\n"
+ " --export-db export the content of the udev database\n"
+ " --version print udev version\n"
+ " --help print this text\n"
"\n");
goto exit;
- case ':':
- fprintf(stderr, "missing argument for '%c'\n", optopt);
- goto exit;
- case '?':
default:
- fprintf(stderr, "unrecognized option '%c'\n", optopt);
goto exit;
}
}
}
udev_db_get_device(udev, devpath);
} else {
- fprintf(stderr, "query needs device path(-p) or node name(-n) specified\n");
+ fprintf(stderr, "query needs --path or node --name specified\n");
rc = 4;
goto exit;
}
break;
case ACTION_ATTRIBUTE_WALK:
if (path[0] != '\0') {
- print_device_chain(path);
+ if (print_device_chain(path) != 0) {
+ fprintf(stderr, "device not found\n");
+ rc = 4;
+ goto exit;
+ }
} else if (name[0] != '\0') {
char devpath[PATH_SIZE];
rc = 4;
goto exit;
}
- print_device_chain(devpath);
+ if (print_device_chain(devpath) != 0) {
+ fprintf(stderr, "device not found\n");
+ rc = 4;
+ goto exit;
+ }
} else {
- fprintf(stderr, "attribute walk needs device path(-p) or node name(-n) specified\n");
+ fprintf(stderr, "attribute walk needs --path or node --name specified\n");
rc = 5;
goto exit;
}