From: Yu Watanabe Date: Wed, 21 Nov 2018 08:27:38 +0000 (+0900) Subject: libudev: make util_resolve_subsys_kernel() return negative errno X-Git-Tag: v240~257^2~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3839535a53aef404bbca5eb381de71b2a00245a0;p=platform%2Fupstream%2Fsystemd.git libudev: make util_resolve_subsys_kernel() return negative errno This also replaces udev_device by sd_device in the function. --- diff --git a/src/libudev/libudev-util.c b/src/libudev/libudev-util.c index 0ad7031..f67ab40 100644 --- a/src/libudev/libudev-util.c +++ b/src/libudev/libudev-util.c @@ -3,6 +3,8 @@ #include #include +#include "sd-device.h" + #include "device-nodes.h" #include "libudev-util.h" #include "string-util.h" @@ -17,16 +19,14 @@ */ /* handle "[/]" format */ -int util_resolve_subsys_kernel(const char *string, - char *result, size_t maxsize, int read_value) { - char temp[UTIL_PATH_SIZE]; - char *subsys; - char *sysname; - struct udev_device *dev; - char *attr; +int util_resolve_subsys_kernel(const char *string, char *result, size_t maxsize, bool read_value) { + char temp[UTIL_PATH_SIZE], *subsys, *sysname, *attr; + _cleanup_(sd_device_unrefp) sd_device *dev = NULL; + const char *val; + int r; if (string[0] != '[') - return -1; + return -EINVAL; strscpy(temp, sizeof(temp), string); @@ -34,13 +34,13 @@ int util_resolve_subsys_kernel(const char *string, sysname = strchr(subsys, '/'); if (!sysname) - return -1; + return -EINVAL; sysname[0] = '\0'; sysname = &sysname[1]; attr = strchr(sysname, ']'); if (!attr) - return -1; + return -EINVAL; attr[0] = '\0'; attr = &attr[1]; if (attr[0] == '/') @@ -49,32 +49,29 @@ int util_resolve_subsys_kernel(const char *string, attr = NULL; if (read_value && !attr) - return -1; + return -EINVAL; - dev = udev_device_new_from_subsystem_sysname(NULL, subsys, sysname); - if (!dev) - return -1; + r = sd_device_new_from_subsystem_sysname(&dev, subsys, sysname); + if (r < 0) + return r; if (read_value) { - const char *val; - - val = udev_device_get_sysattr_value(dev, attr); - if (val) - strscpy(result, maxsize, val); - else + r = sd_device_get_sysattr_value(dev, attr, &val); + if (r < 0 && r != -ENOENT) + return r; + if (r == -ENOENT) result[0] = '\0'; + else + strscpy(result, maxsize, val); log_debug("value '[%s/%s]%s' is '%s'", subsys, sysname, attr, result); } else { - size_t l; - char *s; - - s = result; - l = strpcpyl(&s, maxsize, udev_device_get_syspath(dev), NULL); - if (attr) - strpcpyl(&s, l, "/", attr, NULL); - log_debug("path '[%s/%s]%s' is '%s'", subsys, sysname, attr, result); + r = sd_device_get_syspath(dev, &val); + if (r < 0) + return r; + + strscpyl(result, maxsize, val, attr ? "/" : NULL, attr ?: NULL, NULL); + log_debug("path '[%s/%s]%s' is '%s'", subsys, sysname, strempty(attr), result); } - udev_device_unref(dev); return 0; } diff --git a/src/libudev/libudev-util.h b/src/libudev/libudev-util.h index 8d6812b..32b626e 100644 --- a/src/libudev/libudev-util.h +++ b/src/libudev/libudev-util.h @@ -13,7 +13,7 @@ size_t util_path_encode(const char *src, char *dest, size_t size); size_t util_replace_whitespace(const char *str, char *to, size_t len); size_t util_replace_chars(char *str, const char *white); -int util_resolve_subsys_kernel(const char *string, char *result, size_t maxsize, int read_value); +int util_resolve_subsys_kernel(const char *string, char *result, size_t maxsize, bool read_value); /* Cleanup functions */ DEFINE_TRIVIAL_CLEANUP_FUNC(struct udev*, udev_unref); diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c index cc7efbb..f69458e 100644 --- a/src/udev/udev-event.c +++ b/src/udev/udev-event.c @@ -234,7 +234,7 @@ static ssize_t subst_format_var(struct udev_event *event, return -EINVAL; /* try to read the value specified by "[dmi/id]product_name" */ - if (util_resolve_subsys_kernel(attr, vbuf, sizeof(vbuf), 1) == 0) + if (util_resolve_subsys_kernel(attr, vbuf, sizeof(vbuf), true) == 0) val = vbuf; /* try to read the attribute the device */ diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c index c470338..4f3dffa 100644 --- a/src/udev/udev-rules.c +++ b/src/udev/udev-rules.c @@ -1688,7 +1688,7 @@ static int match_attr(struct udev_rules *rules, sd_device *dev, struct udev_even return -1; break; case SB_SUBSYS: - if (util_resolve_subsys_kernel(name, vbuf, sizeof(vbuf), 1) != 0) + if (util_resolve_subsys_kernel(name, vbuf, sizeof(vbuf), true) != 0) return -1; value = vbuf; break; @@ -1931,7 +1931,7 @@ int udev_rules_apply_to_event( int match; udev_event_apply_format(event, rules_str(rules, cur->key.value_off), filename, sizeof(filename), false); - if (util_resolve_subsys_kernel(filename, filename, sizeof(filename), 0) != 0) { + if (util_resolve_subsys_kernel(filename, filename, sizeof(filename), false) != 0) { if (filename[0] != '/') { char tmp[UTIL_PATH_SIZE]; @@ -2374,7 +2374,7 @@ int udev_rules_apply_to_event( const char *key_name; key_name = rules_str(rules, cur->key.attr_off); - if (util_resolve_subsys_kernel(key_name, attr, sizeof(attr), 0) != 0 && + if (util_resolve_subsys_kernel(key_name, attr, sizeof(attr), false) != 0 && sd_device_get_syspath(dev, &val) >= 0) strscpyl(attr, sizeof(attr), val, "/", key_name, NULL); attr_subst_subdir(attr, sizeof(attr));