libudev: make util_resolve_subsys_kernel() return negative errno
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 21 Nov 2018 08:27:38 +0000 (17:27 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 21 Nov 2018 08:31:16 +0000 (17:31 +0900)
This also replaces udev_device by sd_device in the function.

src/libudev/libudev-util.c
src/libudev/libudev-util.h
src/udev/udev-event.c
src/udev/udev-rules.c

index 0ad7031..f67ab40 100644 (file)
@@ -3,6 +3,8 @@
 #include <ctype.h>
 #include <errno.h>
 
+#include "sd-device.h"
+
 #include "device-nodes.h"
 #include "libudev-util.h"
 #include "string-util.h"
  */
 
 /* handle "[<SUBSYSTEM>/<KERNEL>]<attribute>" 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;
 }
 
index 8d6812b..32b626e 100644 (file)
@@ -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);
index cc7efbb..f69458e 100644 (file)
@@ -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 */
index c470338..4f3dffa 100644 (file)
@@ -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));