X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=libudev%2Flibudev-device.c;h=b841745991effca0a32ac69ee7b1d70c36129d3f;hb=3c4b1738a9d591d7ddce361ea184b76b253c4e87;hp=dffeed0b79bc95f5fbfa190cbd46205264cc2139;hpb=3c1898863fbf9c94cfb0258ae380b67b44c4b466;p=elogind.git diff --git a/libudev/libudev-device.c b/libudev/libudev-device.c index dffeed0b7..b84174599 100644 --- a/libudev/libudev-device.c +++ b/libudev/libudev-device.c @@ -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); } /** @@ -1140,7 +1089,7 @@ struct udev_list_entry *udev_device_add_property(struct udev_device *udev_device struct udev_list_entry *udev_device_add_property_from_string(struct udev_device *udev_device, const char *property) { - char name[UTIL_PATH_SIZE]; + char name[UTIL_LINE_SIZE]; char *val; util_strscpy(name, sizeof(name), property); @@ -1217,7 +1166,9 @@ static int update_envp_monitor_buf(struct udev_device *udev_device) l = util_strpcpyl(&s, l, key, "=", udev_list_entry_get_value(list_entry), NULL); if (l == 0) return -EINVAL; + /* advance past the trailing '\0' that util_strpcpyl() guarantees */ s++; + l--; } udev_device->envp[i] = NULL; udev_device->monitor_buf_len = s - udev_device->monitor_buf;