summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@suse.de>2006-09-03 04:44:33 +0200
committerKay Sievers <kay.sievers@suse.de>2006-09-03 04:44:33 +0200
commit051445e078ab1a6d0cbbc1bd7f1a6fbd80e8bed1 (patch)
treec48ad168a0cfb3c048deb1b6a4a1fde8d0ee71f8
parent11f1bb5ab42571fae5cc607d42b8d918c9e170ab (diff)
udevd: use files instead of symlinks for /dev/.udev/queue,failed
-rw-r--r--TODO4
-rw-r--r--udevd.c9
-rw-r--r--udevtrigger.c28
3 files changed, 18 insertions, 23 deletions
diff --git a/TODO b/TODO
index a08cb84f7b..8667b87e91 100644
--- a/TODO
+++ b/TODO
@@ -4,10 +4,6 @@ These things would be nice to have:
any of the links at that time
These things will change in future udev versions:
- o use zero sized files instead of symlinks in /dev/.udev/{queue,failed}
- (broken tools search /dev for files and get lost following to /sys
- and stat() sysfs files million times)
-
o make DRIVER== to match only the event device
(DRIVERS must be used, we currently translate it to DRIVERS and print
a warning if DRIVER is used)
diff --git a/udevd.c b/udevd.c
index 0702f5e2cb..a21d2ab77d 100644
--- a/udevd.c
+++ b/udevd.c
@@ -155,9 +155,9 @@ static void export_event_state(struct udevd_uevent_msg *msg, enum event_state st
{
char filename[PATH_SIZE];
char filename_failed[PATH_SIZE];
- char target[PATH_SIZE];
size_t start, end, i;
struct udevd_uevent_msg *loop_msg;
+ int fd;
/* add location of queue files */
strlcpy(filename, udev_root, sizeof(filename));
@@ -189,11 +189,10 @@ static void export_event_state(struct udevd_uevent_msg *msg, enum event_state st
case EVENT_QUEUED:
unlink(filename_failed);
delete_path(filename_failed);
-
- strlcpy(target, sysfs_path, sizeof(target));
- strlcat(target, msg->devpath, sizeof(target));
create_path(filename);
- symlink(target, filename);
+ fd = open(filename, O_WRONLY|O_TRUNC|O_CREAT, 0644);
+ if (fd > 0)
+ close(fd);
return;
case EVENT_FINISHED:
case EVENT_FAILED:
diff --git a/udevtrigger.c b/udevtrigger.c
index 571bcadfc5..64a2ebdd72 100644
--- a/udevtrigger.c
+++ b/udevtrigger.c
@@ -433,30 +433,30 @@ static void scan_failed(void)
struct dirent *dent;
strlcpy(base, udev_root, sizeof(base));
- strlcat(base, "/", sizeof(base));
- strlcat(base, EVENT_FAILED_DIR, sizeof(base));
+ strlcat(base, "/" EVENT_FAILED_DIR, sizeof(base));
dir = opendir(base);
if (dir != NULL) {
for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
- char linkname[PATH_SIZE];
- char target[PATH_SIZE];
- int len;
+ char device[PATH_SIZE];
+ size_t start, end, i;
if (dent->d_name[0] == '.')
continue;
- strlcpy(linkname, base, sizeof(linkname));
- strlcat(linkname, "/", sizeof(linkname));
- strlcat(linkname, dent->d_name, sizeof(linkname));
+ strlcpy(device, sysfs_path, sizeof(device));
+ start = strlcat(device, "/", sizeof(device));
+ end = strlcat(device, dent->d_name, sizeof(device));
+ if (end > sizeof(device))
+ end = sizeof(device);
- len = readlink(linkname, target, sizeof(target));
- if (len <= 0)
- continue;
- target[len] = '\0';
+ /* replace PATH_TO_NAME_CHAR with '/' */
+ for (i = start; i < end; i++)
+ if (device[i] == PATH_TO_NAME_CHAR)
+ device[i] = '/';
- if (is_device(target))
- device_list_insert(target);
+ if (is_device(device))
+ device_list_insert(device);
else
continue;
}