From: Kay Sievers Date: Wed, 22 Oct 2008 23:13:52 +0000 (+0200) Subject: do not create temporary node ($tempnode) if node already exists X-Git-Tag: 174~1397 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=5a05e120af1fa09d08f564e847ef48d50efa1156 do not create temporary node ($tempnode) if node already exists --- diff --git a/TODO b/TODO index fd9b2be56..b4a967c25 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 b41dcd070..a41d4edb4 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) {