- 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);
+ }
+ case SUBST_TEMP_NODE: {
+ dev_t devnum;
+ struct stat statbuf;
+ char filename[UTIL_PATH_SIZE];
+ const char *devtype;
+
+ if (event->tmp_node != NULL) {
+ l = util_strpcpy(&s, l, event->tmp_node);
+ dbg(event->udev, "tempnode: return earlier created one\n");
+ break;
+ }
+ devnum = udev_device_get_devnum(dev);
+ if (major(devnum) == 0)
+ break;
+ /* lookup kernel provided node */
+ if (udev_device_get_knodename(dev) != NULL) {
+ util_strscpyl(filename, sizeof(filename),
+ udev_get_dev_path(event->udev), "/", udev_device_get_knodename(dev), NULL);
+ if (stat(filename, &statbuf) == 0 && statbuf.st_rdev == devnum) {
+ l = util_strpcpy(&s, l, filename);
+ dbg(event->udev, "tempnode: return kernel node\n");
+ break;
+ }
+ }
+ /* lookup /dev/{char,block}/<maj>:<min> */
+ 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) {
+ l = util_strpcpy(&s, l, filename);
+ dbg(event->udev, "tempnode: return maj:min node\n");
+ break;