summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO1
-rw-r--r--udev/udev-event.c42
2 files changed, 34 insertions, 9 deletions
diff --git a/TODO b/TODO
index fd9b2be563..b4a967c258 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,3 @@
- o use node for tmpnode, if it already exists
o add DVB variables to kernel, and drop shell script rule
o DEVTYPE for disks is set by the kernel, they will be removed from
the default rules
diff --git a/udev/udev-event.c b/udev/udev-event.c
index b41dcd070e..a41d4edb41 100644
--- a/udev/udev-event.c
+++ b/udev/udev-event.c
@@ -332,15 +332,41 @@ found:
}
break;
case SUBST_TEMP_NODE:
- if (event->tmp_node[0] == '\0' && major(udev_device_get_devnum(dev)) > 0) {
- dbg(event->udev, "create temporary device node for callout\n");
- snprintf(event->tmp_node, sizeof(event->tmp_node), "%s/.tmp-%u-%u",
- udev_get_dev_path(event->udev),
- major(udev_device_get_devnum(dev)), minor(udev_device_get_devnum(dev)));
- udev_node_mknod(dev, event->tmp_node, makedev(0,0), 0600, 0, 0);
+ {
+ dev_t devnum;
+ struct stat statbuf;
+ char filename[UTIL_PATH_SIZE];
+ const char *devtype;
+
+ if (event->tmp_node[0] != '\0') {
+ util_strlcat(string, event->tmp_node, maxsize);
+ dbg(event->udev, "return existing temporary node\n");
+ break;
+ }
+ devnum = udev_device_get_devnum(dev);
+ if (major(udev_device_get_devnum(dev) == 0))
+ break;
+ if (strcmp(udev_device_get_subsystem(dev), "block") == 0)
+ devtype = "block";
+ else
+ devtype = "char";
+ snprintf(filename, sizeof(filename), "%s/%s/%u:%u",
+ udev_get_dev_path(event->udev), devtype,
+ major(udev_device_get_devnum(dev)),
+ minor(udev_device_get_devnum(dev)));
+ if (stat(filename, &statbuf) == 0 && statbuf.st_rdev == devnum) {
+ util_strlcat(string, filename, maxsize);
+ dbg(event->udev, "return existing temporary node\n");
+ break;
+ }
+ dbg(event->udev, "create temporary node\n");
+ snprintf(event->tmp_node, sizeof(event->tmp_node), "%s/.tmp-%s-%u:%u",
+ udev_get_dev_path(event->udev), devtype,
+ major(udev_device_get_devnum(dev)),
+ minor(udev_device_get_devnum(dev)));
+ udev_node_mknod(dev, event->tmp_node, makedev(0, 0), 0600, 0, 0);
+ util_strlcat(string, event->tmp_node, maxsize);
}
- util_strlcat(string, event->tmp_node, maxsize);
- dbg(event->udev, "substitute temporary device node name '%s'\n", event->tmp_node);
break;
case SUBST_NAME:
if (event->name != NULL) {