X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=libudev%2Flibudev-device.c;h=71fc775242e81ccad7f3cc930bd772f0649adbe0;hb=9bdcffd738f9170bda7a962affcf5d42381748e0;hp=22d8349275d1fcaef57a3cd47becd716279993b2;hpb=2ffc9cc1917b1bb6fe86881a94a47dce9aa15168;p=elogind.git diff --git a/libudev/libudev-device.c b/libudev/libudev-device.c index 22d834927..71fc77524 100644 --- a/libudev/libudev-device.c +++ b/libudev/libudev-device.c @@ -123,7 +123,7 @@ int udev_device_read_db(struct udev_device *udev_device) next = &next[1]; } util_strscpyl(devlink, sizeof(devlink), udev_get_dev_path(udev_device->udev), "/", lnk, NULL); - udev_device_add_devlink(udev_device, devlink); + udev_device_add_devlink(udev_device, devlink, 0); } info(udev_device->udev, "device %p filled with db symlink data '%s'\n", udev_device, udev_device->devnode); return 0; @@ -150,7 +150,7 @@ int udev_device_read_db(struct udev_device *udev_device) break; case 'S': util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev_device->udev), "/", val, NULL); - udev_device_add_devlink(udev_device, filename); + udev_device_add_devlink(udev_device, filename, 0); break; case 'L': udev_device_set_devlink_priority(udev_device, atoi(val)); @@ -303,25 +303,7 @@ struct udev_device *udev_device_new_from_syspath(struct udev *udev, const char * util_strscpy(path, sizeof(path), syspath); util_resolve_sys_link(udev, path, sizeof(path)); - /* try to resolve the silly block layout if needed */ - if (strncmp(&path[len], "/block/", 7) == 0) { - char block[UTIL_PATH_SIZE]; - char part[UTIL_PATH_SIZE]; - - util_strscpy(block, sizeof(block), path); - pos = strrchr(block, '/'); - if (pos == NULL) - return NULL; - util_strscpy(part, sizeof(part), pos); - pos[0] = '\0'; - if (util_resolve_sys_link(udev, block, sizeof(block)) == 0) - util_strscpyl(path, sizeof(path), block, part, NULL); - } - - /* path exists in sys */ - if (strncmp(&syspath[len], "/devices/", 9) == 0 || - strncmp(&syspath[len], "/class/", 7) == 0 || - strncmp(&syspath[len], "/block/", 7) == 0) { + if (strncmp(&syspath[len], "/devices/", 9) == 0) { char file[UTIL_PATH_SIZE]; /* all "devices" require a "uevent" file */ @@ -369,9 +351,6 @@ struct udev_device *udev_device_new_from_devnum(struct udev *udev, char type, de { char path[UTIL_PATH_SIZE]; const char *type_str; - struct udev_enumerate *udev_enumerate; - struct udev_list_entry *list_entry; - struct udev_device *device = NULL; if (type == 'b') type_str = "block"; @@ -380,40 +359,10 @@ struct udev_device *udev_device_new_from_devnum(struct udev *udev, char type, de else return NULL; - /* /sys/dev/{block,char}/: link */ - snprintf(path, sizeof(path), "%s/dev/%s/%u:%u", udev_get_sys_path(udev), - type_str, major(devnum), minor(devnum)); - if (util_resolve_sys_link(udev, path, sizeof(path)) == 0) - return udev_device_new_from_syspath(udev, path); - - udev_enumerate = udev_enumerate_new(udev); - if (udev_enumerate == NULL) - return NULL; - - /* fallback to search sys devices for the major/minor */ - if (type == 'b') - udev_enumerate_add_match_subsystem(udev_enumerate, "block"); - else if (type == 'c') - udev_enumerate_add_nomatch_subsystem(udev_enumerate, "block"); - udev_enumerate_scan_devices(udev_enumerate); - udev_list_entry_foreach(list_entry, udev_enumerate_get_list_entry(udev_enumerate)) { - struct udev_device *device_loop; - - device_loop = udev_device_new_from_syspath(udev, udev_list_entry_get_name(list_entry)); - if (device_loop != NULL) { - if (udev_device_get_devnum(device_loop) == devnum) { - if (type == 'b' && strcmp(udev_device_get_subsystem(device_loop), "block") != 0) - continue; - if (type == 'c' && strcmp(udev_device_get_subsystem(device_loop), "block") == 0) - continue; - device = device_loop; - break; - } - udev_device_unref(device_loop); - } - } - udev_enumerate_unref(udev_enumerate); - return device; + /* use /sys/dev/{block,char}/: link */ + snprintf(path, sizeof(path), "%s/dev/%s/%u:%u", + udev_get_sys_path(udev), type_str, major(devnum), minor(devnum)); + return udev_device_new_from_syspath(udev, path); } /** @@ -508,20 +457,9 @@ static struct udev_device *device_new_from_parent(struct udev_device *udev_devic char path[UTIL_PATH_SIZE]; const char *subdir; - /* follow "device" link in deprecated sys layout */ - if (strncmp(udev_device->devpath, "/class/", 7) == 0 || - strncmp(udev_device->devpath, "/block/", 7) == 0) { - util_strscpyl(path, sizeof(path), udev_device->syspath, "/device", NULL); - if (util_resolve_sys_link(udev_device->udev, path, sizeof(path)) == 0) { - udev_device_parent = udev_device_new_from_syspath(udev_device->udev, path); - if (udev_device_parent != NULL) - return udev_device_parent; - } - } - util_strscpy(path, sizeof(path), udev_device->syspath); subdir = &path[strlen(udev_get_sys_path(udev_device->udev))+1]; - while (1) { + for (;;) { char *pos; pos = strrchr(subdir, '/'); @@ -577,6 +515,9 @@ struct udev_device *udev_device_get_parent(struct udev_device *udev_device) * value, and fill in information from the sys device and the udev * database entry. * + * If devtype is #NULL, only subsystem is checked, and any devtype will + * match. + * * The returned the device is not referenced. It is attached to the * child device, and will be cleaned up when the child device * is cleaned up. @@ -1118,11 +1059,16 @@ int udev_device_set_devnode(struct udev_device *udev_device, const char *devnode return 0; } -int udev_device_add_devlink(struct udev_device *udev_device, const char *devlink) +int udev_device_add_devlink(struct udev_device *udev_device, const char *devlink, int unique) { + struct udev_list_entry *list_entry; + udev_device->devlinks_uptodate = 0; - if (udev_list_entry_add(udev_device->udev, &udev_device->devlinks_list, devlink, NULL, 1, 0) == NULL) + list_entry = udev_list_entry_add(udev_device->udev, &udev_device->devlinks_list, devlink, NULL, 1, 0); + if (list_entry == NULL) return -ENOMEM; + if (unique) + udev_list_entry_set_flag(list_entry, 1); return 0; }