]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/libudev/libudev-hwdb.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
7 #include "alloc-util.h"
9 #include "libudev-list-internal.h"
12 * SECTION:libudev-hwdb
13 * @short_description: retrieve properties from the hardware database
15 * Libudev hardware database interface.
21 * Opaque object representing the hardware database.
26 struct udev_list
*properties_list
;
31 * @udev: udev library context (unused)
33 * Create a hardware database context to query properties for devices.
35 * Returns: a hwdb context.
37 _public_
struct udev_hwdb
*udev_hwdb_new(struct udev
*udev
) {
38 _cleanup_(udev_list_freep
) struct udev_list
*list
= NULL
;
39 _cleanup_(sd_hwdb_unrefp
) sd_hwdb
*hwdb_internal
= NULL
;
40 struct udev_hwdb
*hwdb
;
43 r
= sd_hwdb_new(&hwdb_internal
);
45 return_with_errno(NULL
, r
);
47 list
= udev_list_new(true);
49 return_with_errno(NULL
, ENOMEM
);
51 hwdb
= new(struct udev_hwdb
, 1);
53 return_with_errno(NULL
, ENOMEM
);
55 *hwdb
= (struct udev_hwdb
) {
57 .hwdb
= TAKE_PTR(hwdb_internal
),
58 .properties_list
= TAKE_PTR(list
),
64 static struct udev_hwdb
*udev_hwdb_free(struct udev_hwdb
*hwdb
) {
67 sd_hwdb_unref(hwdb
->hwdb
);
68 udev_list_free(hwdb
->properties_list
);
76 * Take a reference of a hwdb context.
78 * Returns: the passed enumeration context
85 * Drop a reference of a hwdb context. If the refcount reaches zero,
86 * all resources of the hwdb context will be released.
90 DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC(struct udev_hwdb
, udev_hwdb
, udev_hwdb_free
);
93 * udev_hwdb_get_properties_list_entry:
95 * @modalias: modalias string
98 * Lookup a matching device in the hardware database. The lookup key is a
99 * modalias string, whose formats are defined for the Linux kernel modules.
100 * Examples are: pci:v00008086d00001C2D*, usb:v04F2pB221*. The first entry
101 * of a list of retrieved properties is returned.
103 * Returns: a udev_list_entry.
105 _public_
struct udev_list_entry
*udev_hwdb_get_properties_list_entry(struct udev_hwdb
*hwdb
, const char *modalias
, unsigned flags
) {
106 const char *key
, *value
;
107 struct udev_list_entry
*e
;
109 assert_return_errno(hwdb
, NULL
, EINVAL
);
110 assert_return_errno(modalias
, NULL
, EINVAL
);
112 udev_list_cleanup(hwdb
->properties_list
);
114 SD_HWDB_FOREACH_PROPERTY(hwdb
->hwdb
, modalias
, key
, value
)
115 if (!udev_list_entry_add(hwdb
->properties_list
, key
, value
))
116 return_with_errno(NULL
, ENOMEM
);
118 e
= udev_list_get_entry(hwdb
->properties_list
);
120 return_with_errno(NULL
, ENODATA
);