]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/udev/udev-builtin-hwdb.c
Merge pull request #11827 from keszybz/pkgconfig-variables
[thirdparty/systemd.git] / src / udev / udev-builtin-hwdb.c
index ca7f7c2304cc240956cd1774bd3320f1005040e3..225e0265a4a3d83933196cae624624a9d892f7ce 100644 (file)
@@ -1,23 +1,6 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
-/***
-  This file is part of systemd.
-
-  Copyright 2012 Kay Sievers <kay@vrfy.org>
-
-  systemd is free software; you can redistribute it and/or modify it
-  under the terms of the GNU Lesser General Public License as published by
-  the Free Software Foundation; either version 2.1 of the License, or
-  (at your option) any later version.
-
-  systemd is distributed in the hope that it will be useful, but
-  WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  Lesser General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public License
-  along with systemd; If not, see <http://www.gnu.org/licenses/>.
-***/
 
+#include <errno.h>
 #include <fnmatch.h>
 #include <getopt.h>
 #include <stdio.h>
 #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;
@@ -54,37 +38,34 @@ 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;
-        int vn, pn;
+        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;
-        vn = strtol(v, NULL, 16);
-        if (vn <= 0)
+        if (safe_atoux16(v, &vn) < 0)
                 return NULL;
-        pn = strtol(p, NULL, 16);
-        if (pn <= 0)
+        if (safe_atoux16(p, &pn) < 0)
                 return NULL;
         snprintf(s, size, "usb:v%04Xp%04X*", vn, pn);
         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;
@@ -94,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));
@@ -118,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' },
@@ -140,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_unref_ 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;
@@ -173,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, SYNTHETIC_ERRNO(ENODATA), "No entry found from hwdb.");
+                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, SYNTHETIC_ERRNO(ENODATA), "No entry found from hwdb.");
+        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)
@@ -205,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);
 }