/*
- * Copyright (C) 2004-2008 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2004-2009 Kay Sievers <kay.sievers@vrfy.org>
*
* 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
#include <dirent.h>
#include <errno.h>
#include <getopt.h>
+#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
if (dir != NULL) {
for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
struct stat statbuf;
- char filename[UTIL_PATH_SIZE];
const char *value;
size_t len;
if (strcmp(dent->d_name, "dev") == 0)
continue;
- util_strlcpy(filename, udev_device_get_syspath(device), sizeof(filename));
- util_strlcat(filename, "/", sizeof(filename));
- util_strlcat(filename, dent->d_name, sizeof(filename));
- if (lstat(filename, &statbuf) != 0)
+ if (fstatat(dirfd(dir), dent->d_name, &statbuf, AT_SYMLINK_NOFOLLOW) != 0)
continue;
if (S_ISLNK(statbuf.st_mode))
continue;
value = udev_device_get_sysattr_value(device, dent->d_name);
if (value == NULL)
continue;
- dbg(udev, "attr '%s'='%s'(%zi)\n", dent->d_name, value, len);
+ dbg(udev, "attr '%s'='%s'\n", dent->d_name, value);
/* skip nonprintable attributes */
len = strlen(value);
if (i != 0)
printf("L: %i\n", i);
- i = udev_device_get_num_fake_partitions(device);
- if (i != 0)
- printf("A:%u\n", i);
-
- i = udev_device_get_ignore_remove(device);
- if (i != 0)
- printf("R:%u\n", i);
+ i = udev_device_get_watch_handle(device);
+ if (i >= 0)
+ printf("W: %u\n", i);
udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_entry(device)) {
len = strlen(udev_get_dev_path(udev_device_get_udev(device)));
device = udev_device_new_from_syspath(udev, udev_list_entry_get_name(list_entry));
if (device != NULL) {
- if (udev_device_get_devnode(device) != NULL)
- print_record(device);
+ print_record(device);
udev_device_unref(device);
}
}
QUERY_NAME,
QUERY_PATH,
QUERY_SYMLINK,
- QUERY_ENV,
+ QUERY_PROPERTY,
QUERY_ALL,
} query = QUERY_NONE;
goto exit;
}
/* remove /dev if given */
- if (strncmp(optarg, udev_get_dev_path(udev), strlen(udev_get_dev_path(udev))) != 0) {
- util_strlcpy(name, udev_get_dev_path(udev), sizeof(name));
- util_strlcat(name, "/", sizeof(name));
- util_strlcat(name, optarg, sizeof(name));
- } else {
- util_strlcpy(name, optarg, sizeof(name));
- }
+ if (strncmp(optarg, udev_get_dev_path(udev), strlen(udev_get_dev_path(udev))) != 0)
+ util_strscpyl(name, sizeof(name), udev_get_dev_path(udev), "/", optarg, NULL);
+ else
+ util_strscpy(name, sizeof(name), optarg);
util_remove_trailing_chars(name, '/');
if (stat(name, &statbuf) < 0) {
fprintf(stderr, "device node not found\n");
goto exit;
}
/* add sys dir if needed */
- if (strncmp(optarg, udev_get_sys_path(udev), strlen(udev_get_sys_path(udev))) != 0) {
- util_strlcpy(path, udev_get_sys_path(udev), sizeof(path));
- util_strlcat(path, optarg, sizeof(path));
- } else {
- util_strlcpy(path, optarg, sizeof(path));
- }
+ if (strncmp(optarg, udev_get_sys_path(udev), strlen(udev_get_sys_path(udev))) != 0)
+ util_strscpyl(path, sizeof(path), udev_get_sys_path(udev), optarg, NULL);
+ else
+ util_strscpy(path, sizeof(path), optarg);
util_remove_trailing_chars(path, '/');
device = udev_device_new_from_syspath(udev, path);
if (device == NULL) {
break;
case 'q':
action = ACTION_QUERY;
- if (strcmp(optarg, "name") == 0) {
+ if (strcmp(optarg, "property") == 0 || strcmp(optarg, "env") == 0) {
+ query = QUERY_PROPERTY;
+ } else if (strcmp(optarg, "name") == 0) {
query = QUERY_NAME;
- break;
- }
- if (strcmp(optarg, "symlink") == 0) {
+ } else if (strcmp(optarg, "symlink") == 0) {
query = QUERY_SYMLINK;
- break;
- }
- if (strcmp(optarg, "path") == 0) {
+ } else if (strcmp(optarg, "path") == 0) {
query = QUERY_PATH;
- break;
- }
- if (strcmp(optarg, "env") == 0) {
- query = QUERY_ENV;
- break;
- }
- if (strcmp(optarg, "all") == 0) {
+ } else if (strcmp(optarg, "all") == 0) {
query = QUERY_ALL;
- break;
+ } else {
+ fprintf(stderr, "unknown query type\n");
+ rc = 3;
+ goto exit;
}
- fprintf(stderr, "unknown query type\n");
- rc = 3;
- goto exit;
+ break;
case 'r':
if (action == ACTION_NONE)
action = ACTION_ROOT;
break;
case 'd':
action = ACTION_DEVICE_ID_FILE;
- util_strlcpy(name, optarg, sizeof(name));
+ util_strscpy(name, sizeof(name), optarg);
break;
case 'a':
action = ACTION_ATTRIBUTE_WALK;
" name name of device node\n"
" symlink pointing to node\n"
" path sys device path\n"
- " env the device related imported environment\n"
+ " property the device properties\n"
" all all values\n"
" --path=<syspath> sys device path used for query or attribute walk\n"
" --name=<name> node or symlink name used for query or attribute walk\n"
" of parent devices\n"
" --device-id-of-file=<file> print major:minor of device containing this file\n"
" --export-db export the content of the udev database\n"
- " --help print this text\n"
- "\n");
+ " --help\n\n");
goto exit;
default:
goto exit;
}
switch(query) {
- case QUERY_NAME:
+ case QUERY_NAME: {
+ const char *node = udev_device_get_devnode(device);
+
+ if (node == NULL) {
+ fprintf(stderr, "no device node found\n");
+ rc = 5;
+ goto exit;
+ }
+
if (root) {
printf("%s\n", udev_device_get_devnode(device));
} else {
- size_t len;
- const char *node;
-
- len = strlen(udev_get_dev_path(udev));
- node = udev_device_get_devnode(device);
- if (node == NULL) {
- fprintf(stderr, "no device node found\n");
- rc = 5;
- goto exit;
- }
- printf("%s\n", &udev_device_get_devnode(device)[len+1]);
+ size_t len = strlen(udev_get_dev_path(udev));
+
+ printf("%s\n", &udev_device_get_devnode(device)[len+1]);
}
break;
+ }
case QUERY_SYMLINK:
list_entry = udev_device_get_devlinks_list_entry(device);
while (list_entry != NULL) {
case QUERY_PATH:
printf("%s\n", udev_device_get_devpath(device));
goto exit;
- case QUERY_ENV:
+ case QUERY_PROPERTY:
list_entry = udev_device_get_properties_list_entry(device);
while (list_entry != NULL) {
printf("%s=%s\n", udev_list_entry_get_name(list_entry), udev_list_entry_get_value(list_entry));