summaryrefslogtreecommitdiff
path: root/src/libudev
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2018-11-21 17:27:38 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2018-11-21 17:31:16 +0900
commit3839535a53aef404bbca5eb381de71b2a00245a0 (patch)
tree02bc0e0e6215f2d1b337cc14e806c6c8bbf195c9 /src/libudev
parentc0c591544aacea052c405b0e4065823682640290 (diff)
downloadsystemd-3839535a53aef404bbca5eb381de71b2a00245a0.tar.gz
libudev: make util_resolve_subsys_kernel() return negative errno
This also replaces udev_device by sd_device in the function.
Diffstat (limited to 'src/libudev')
-rw-r--r--src/libudev/libudev-util.c55
-rw-r--r--src/libudev/libudev-util.h2
2 files changed, 27 insertions, 30 deletions
diff --git a/src/libudev/libudev-util.c b/src/libudev/libudev-util.c
index 0ad70319de..f67ab40354 100644
--- a/src/libudev/libudev-util.c
+++ b/src/libudev/libudev-util.c
@@ -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"
@@ -17,16 +19,14 @@
*/
/* 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;
}
diff --git a/src/libudev/libudev-util.h b/src/libudev/libudev-util.h
index 8d6812b8a8..32b626ebc9 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);