- udev_list_init(&dev_list);
- count = name_index_get_devices(udev, slink, &dev_list);
- if (count > 1)
- info(udev, "found %i devices with name '%s'\n", count, slink);
-
- /* if we don't have a reference, delete it */
- if (count <= 0) {
- info(udev, "no reference left, remove '%s'\n", slink);
- if (!test) {
- unlink(slink);
- util_delete_path(udev, slink);
- }
- goto out;
- }
-
- /* find the device with the highest priority */
- target[0] = '\0';
- udev_list_entry_foreach(dev_entry, udev_list_get_entry(&dev_list)) {
- const char *syspath;
- struct udev_device *dev_db;
- const char *devnode;
-
- syspath = udev_list_entry_get_name(dev_entry);
- dbg(udev, "found '%s' for '%s'\n", syspath, slink);
-
- /* did we find ourself? we win, if we have the same priority */
- if (strcmp(udev_device_get_syspath(dev), syspath) == 0) {
- dbg(udev, "compare (our own) priority of '%s' %i >= %i\n",
- udev_device_get_devpath(dev), udev_device_get_devlink_priority(dev), priority);
- if (strcmp(udev_device_get_devnode(dev), slink) == 0) {
- info(udev, "'%s' is our device node, database inconsistent, skip link update\n",
- udev_device_get_devnode(dev));
- } else if (target[0] == '\0' || udev_device_get_devlink_priority(dev) >= priority) {
- priority = udev_device_get_devlink_priority(dev);
- util_strlcpy(target, udev_device_get_devnode(dev), sizeof(target));
- }
- continue;
- }
+ util_path_encode(&slink[strlen(udev_get_dev_path(udev))+1], name_enc, sizeof(name_enc));
+ snprintf(dirname, sizeof(dirname), "%s/.udev/links/%s", udev_get_dev_path(udev), name_enc);
+ snprintf(filename, sizeof(filename), "%s/%c%u:%u", dirname,
+ strcmp(udev_device_get_subsystem(dev), "block") == 0 ? 'b' : 'c',
+ major(udev_device_get_devnum(dev)), minor(udev_device_get_devnum(dev)));