diff options
Diffstat (limited to 'src/udev/udev-builtin-hwdb.c')
-rw-r--r-- | src/udev/udev-builtin-hwdb.c | 89 |
1 files changed, 51 insertions, 38 deletions
diff --git a/src/udev/udev-builtin-hwdb.c b/src/udev/udev-builtin-hwdb.c index 396384f6c8..ccad98e892 100644 --- a/src/udev/udev-builtin-hwdb.c +++ b/src/udev/udev-builtin-hwdb.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ +#include <errno.h> #include <fnmatch.h> #include <getopt.h> #include <stdio.h> @@ -8,20 +9,20 @@ #include "sd-hwdb.h" #include "alloc-util.h" +#include "device-util.h" #include "hwdb-util.h" #include "parse-util.h" #include "string-util.h" -#include "udev-util.h" -#include "udev.h" +#include "udev-builtin.h" static sd_hwdb *hwdb; -int udev_builtin_hwdb_lookup(struct udev_device *dev, +int udev_builtin_hwdb_lookup(sd_device *dev, const char *prefix, const char *modalias, const char *filter, bool test) { _cleanup_free_ char *lookup = NULL; const char *key, *value; - int n = 0; + int n = 0, r; if (!hwdb) return -ENOENT; @@ -37,22 +38,21 @@ int udev_builtin_hwdb_lookup(struct udev_device *dev, if (filter && fnmatch(filter, key, FNM_NOESCAPE) != 0) continue; - if (udev_builtin_add_property(dev, test, key, value) < 0) - return -ENOMEM; + r = udev_builtin_add_property(dev, test, key, value); + if (r < 0) + return r; n++; } return n; } -static const char *modalias_usb(struct udev_device *dev, char *s, size_t size) { +static const char *modalias_usb(sd_device *dev, char *s, size_t size) { const char *v, *p; uint16_t vn, pn; - v = udev_device_get_sysattr_value(dev, "idVendor"); - if (!v) + if (sd_device_get_sysattr_value(dev, "idVendor", &v) < 0) return NULL; - p = udev_device_get_sysattr_value(dev, "idProduct"); - if (!p) + if (sd_device_get_sysattr_value(dev, "idProduct", &p) < 0) return NULL; if (safe_atoux16(v, &vn) < 0) return NULL; @@ -62,10 +62,10 @@ static const char *modalias_usb(struct udev_device *dev, char *s, size_t size) { return s; } -static int udev_builtin_hwdb_search(struct udev_device *dev, struct udev_device *srcdev, +static int udev_builtin_hwdb_search(sd_device *dev, sd_device *srcdev, const char *subsystem, const char *prefix, const char *filter, bool test) { - struct udev_device *d; + sd_device *d; char s[16]; bool last = false; int r = 0; @@ -75,21 +75,21 @@ static int udev_builtin_hwdb_search(struct udev_device *dev, struct udev_device if (!srcdev) srcdev = dev; - for (d = srcdev; d && !last; d = udev_device_get_parent(d)) { - const char *dsubsys; - const char *modalias = NULL; + for (d = srcdev; d; ) { + const char *dsubsys, *devtype, *modalias = NULL; - dsubsys = udev_device_get_subsystem(d); - if (!dsubsys) - continue; + if (sd_device_get_subsystem(d, &dsubsys) < 0) + goto next; /* look only at devices of a specific subsystem */ if (subsystem && !streq(dsubsys, subsystem)) - continue; + goto next; - modalias = udev_device_get_property_value(d, "MODALIAS"); + (void) sd_device_get_property_value(d, "MODALIAS", &modalias); - if (streq(dsubsys, "usb") && streq_ptr(udev_device_get_devtype(d), "usb_device")) { + if (streq(dsubsys, "usb") && + sd_device_get_devtype(d, &devtype) >= 0 && + streq(devtype, "usb_device")) { /* if the usb_device does not have a modalias, compose one */ if (!modalias) modalias = modalias_usb(d, s, sizeof(s)); @@ -99,17 +99,23 @@ static int udev_builtin_hwdb_search(struct udev_device *dev, struct udev_device } if (!modalias) - continue; + goto next; r = udev_builtin_hwdb_lookup(dev, prefix, modalias, filter, test); if (r > 0) break; + + if (last) + break; +next: + if (sd_device_get_parent(d, &d) < 0) + break; } return r; } -static int builtin_hwdb(struct udev_device *dev, int argc, char *argv[], bool test) { +static int builtin_hwdb(sd_device *dev, int argc, char *argv[], bool test) { static const struct option options[] = { { "filter", required_argument, NULL, 'f' }, { "device", required_argument, NULL, 'd' }, @@ -121,10 +127,11 @@ static int builtin_hwdb(struct udev_device *dev, int argc, char *argv[], bool te const char *device = NULL; const char *subsystem = NULL; const char *prefix = NULL; - _cleanup_(udev_device_unrefp) struct udev_device *srcdev = NULL; + _cleanup_(sd_device_unrefp) sd_device *srcdev = NULL; + int r; if (!hwdb) - return EXIT_FAILURE; + return -EINVAL; for (;;) { int option; @@ -154,25 +161,31 @@ static int builtin_hwdb(struct udev_device *dev, int argc, char *argv[], bool te /* query a specific key given as argument */ if (argv[optind]) { - if (udev_builtin_hwdb_lookup(dev, prefix, argv[optind], filter, test) > 0) - return EXIT_SUCCESS; - return EXIT_FAILURE; + r = udev_builtin_hwdb_lookup(dev, prefix, argv[optind], filter, test); + if (r < 0) + return log_device_debug_errno(dev, r, "Failed to lookup hwdb: %m"); + if (r == 0) + return log_device_debug_errno(dev, ENOENT, "No entry found from hwdb: %m"); + return r; } /* read data from another device than the device we will store the data */ if (device) { - srcdev = udev_device_new_from_device_id(udev_device_get_udev(dev), device); - if (!srcdev) - return EXIT_FAILURE; + r = sd_device_new_from_device_id(&srcdev, device); + if (r < 0) + return log_device_debug_errno(dev, r, "Failed to create sd_device object '%s': %m", device); } - if (udev_builtin_hwdb_search(dev, srcdev, subsystem, prefix, filter, test) > 0) - return EXIT_SUCCESS; - return EXIT_FAILURE; + r = udev_builtin_hwdb_search(dev, srcdev, subsystem, prefix, filter, test); + if (r < 0) + return log_device_debug_errno(dev, r, "Failed to lookup hwdb: %m"); + if (r == 0) + return log_device_debug_errno(dev, ENOENT, "No entry found from hwdb: %m"); + return r; } /* called at udev startup and reload */ -static int builtin_hwdb_init(struct udev *udev) { +static int builtin_hwdb_init(void) { int r; if (hwdb) @@ -186,12 +199,12 @@ static int builtin_hwdb_init(struct udev *udev) { } /* called on udev shutdown and reload request */ -static void builtin_hwdb_exit(struct udev *udev) { +static void builtin_hwdb_exit(void) { hwdb = sd_hwdb_unref(hwdb); } /* called every couple of seconds during event activity; 'true' if config has changed */ -static bool builtin_hwdb_validate(struct udev *udev) { +static bool builtin_hwdb_validate(void) { return hwdb_validate(hwdb); } |