summaryrefslogtreecommitdiff
path: root/udevinfo.c
diff options
context:
space:
mode:
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>2004-11-06 14:28:01 +0100
committerGreg KH <gregkh@suse.de>2005-04-26 22:16:40 -0700
commit2b41e68a08548ce44b4d145900dab2bb04cd34f7 (patch)
treef2e96c9f150775e3673891d38a5af23d4246c826 /udevinfo.c
parent482b0ecd8fcc2651c003c6f1ae9a2d3301ecf34a (diff)
[PATCH] replace tdb database by simple lockless file database
This makes the udev operation completely lockless by storing a file for every node in /dev/.udevdb/* This solved the problem with deadlocking concurrent udev processes waiting for each other to release the file lock under heavy load.
Diffstat (limited to 'udevinfo.c')
-rw-r--r--udevinfo.c98
1 files changed, 25 insertions, 73 deletions
diff --git a/udevinfo.c b/udevinfo.c
index af2346c8f5..a90bbe1138 100644
--- a/udevinfo.c
+++ b/udevinfo.c
@@ -103,19 +103,11 @@ exit:
return retval;
}
-/* callback for database dump */
-static int print_record(const char *path, struct udevice *dev)
+static int print_record(struct udevice *udev)
{
- 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("P: %s\n", udev->devpath);
+ printf("N: %s\n", udev->name);
+ printf("S: %s\n", udev->symlink);
printf("\n");
return 0;
}
@@ -125,9 +117,6 @@ enum query_type {
NAME,
PATH,
SYMLINK,
- MODE,
- OWNER,
- GROUP,
ALL
};
@@ -213,7 +202,7 @@ static int process_options(void)
static const char short_options[] = "adn:p:q:rVh";
int option;
int retval = 1;
- struct udevice dev;
+ struct udevice udev;
int root = 0;
int attributes = 0;
enum query_type query = NONE;
@@ -254,21 +243,6 @@ static int process_options(void)
break;
}
- if (strcmp(optarg, "mode") == 0) {
- query = MODE;
- break;
- }
-
- if (strcmp(optarg, "owner") == 0) {
- query = OWNER;
- break;
- }
-
- if (strcmp(optarg, "group") == 0) {
- query = GROUP;
- break;
- }
-
if (strcmp(optarg, "path") == 0) {
query = PATH;
break;
@@ -290,16 +264,6 @@ static int process_options(void)
attributes = 1;
break;
- case 'd':
- retval = udevdb_open_ro();
- if (retval != 0) {
- printf("unable to open udev database\n");
- exit(2);
- }
- udevdb_call_foreach(print_record);
- udevdb_exit();
- exit(0);
-
case 'V':
printf("udevinfo, version %s\n", UDEV_VERSION);
exit(0);
@@ -314,12 +278,6 @@ static int process_options(void)
/* process options */
if (query != NONE) {
- retval = udevdb_open_ro();
- if (retval != 0) {
- printf("unable to open udev database\n");
- return -EACCES;
- }
-
if (path[0] != '\0') {
/* remove sysfs_path if given */
if (strncmp(path, sysfs_path, strlen(sysfs_path)) == 0) {
@@ -334,7 +292,9 @@ static int process_options(void)
pos = path;
}
}
- retval = udevdb_get_dev(pos, &dev);
+ memset(&udev, 0x00, sizeof(struct udevice));
+ strfieldcpy(udev.devpath, pos);
+ retval = udevdb_get_dev(&udev);
if (retval != 0) {
printf("device not found in database\n");
goto exit;
@@ -344,15 +304,21 @@ static int process_options(void)
if (name[0] != '\0') {
/* remove udev_root if given */
- if (strncmp(name, udev_root, strlen(udev_root)) == 0) {
- pos = name + strlen(udev_root);
+ int len = strlen(udev_root);
+
+ if (strncmp(name, udev_root, len) == 0) {
+ pos = &name[len+1];
} else
pos = name;
- retval = udevdb_get_dev_byname(pos, path, &dev);
+
+ memset(&udev, 0x00, sizeof(struct udevice));
+ strfieldcpy(udev.name, pos);
+ retval = udevdb_get_dev_byname(&udev, pos);
if (retval != 0) {
printf("device not found in database\n");
goto exit;
}
+
goto print;
}
@@ -362,25 +328,16 @@ static int process_options(void)
print:
switch(query) {
case NAME:
- if (root)
- strfieldcpy(result, udev_root);
- strfieldcat(result, dev.name);
+ if (root) {
+ snprintf(result, NAME_SIZE-1, "%s/%s", udev_root, udev.name);
+ result[NAME_SIZE-1] = '\0';
+ } else {
+ strfieldcpy(result, udev.name);
+ }
break;
case SYMLINK:
- strfieldcpy(result, dev.symlink);
- break;
-
- case MODE:
- sprintf(result, "%#o", dev.mode);
- break;
-
- case GROUP:
- strfieldcpy(result, dev.group);
- break;
-
- case OWNER:
- strfieldcpy(result, dev.owner);
+ strfieldcpy(result, udev.symlink);
break;
case PATH:
@@ -388,7 +345,7 @@ print:
break;
case ALL:
- print_record(path, &dev);
+ print_record(&udev);
goto exit;
default:
@@ -397,7 +354,6 @@ print:
printf("%s\n", result);
exit:
- udevdb_exit();
return retval;
}
@@ -427,9 +383,6 @@ help:
" -q TYPE query database for the specified value:\n"
" 'name' name of device node\n"
" 'symlink' pointing to node\n"
- " 'mode' permissions of node\n"
- " 'owner' of node\n"
- " 'group' of node\n"
" 'path' sysfs device path\n"
" 'all' all values\n"
"\n"
@@ -438,7 +391,6 @@ help:
"\n"
" -r print udev root\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"
"\n");