mirror of
https://github.com/Dasharo/systemd.git
synced 2026-03-06 15:02:31 -08:00
libudev: make util_resolve_subsys_kernel() return negative errno
This also replaces udev_device by sd_device in the function.
This commit is contained in:
@@ -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;
|
||||
r = sd_device_get_syspath(dev, &val);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
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);
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user