]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/libudev/libudev-hwdb.c
Merge pull request #1668 from ssahani/net1
[thirdparty/systemd.git] / src / libudev / libudev-hwdb.c
1 /***
2 This file is part of systemd.
3
4 Copyright Tom Gundersen <teg@jklm.no>
5
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
10
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
18 ***/
19
20 #include "sd-hwdb.h"
21
22 #include "hwdb-util.h"
23 #include "libudev-private.h"
24
25 /**
26 * SECTION:libudev-hwdb
27 * @short_description: retrieve properties from the hardware database
28 *
29 * Libudev hardware database interface.
30 */
31
32 /**
33 * udev_hwdb:
34 *
35 * Opaque object representing the hardware database.
36 */
37 struct udev_hwdb {
38 struct udev *udev;
39 int refcount;
40
41 sd_hwdb *hwdb;
42
43 struct udev_list properties_list;
44 };
45
46 /**
47 * udev_hwdb_new:
48 * @udev: udev library context
49 *
50 * Create a hardware database context to query properties for devices.
51 *
52 * Returns: a hwdb context.
53 **/
54 _public_ struct udev_hwdb *udev_hwdb_new(struct udev *udev) {
55 _cleanup_hwdb_unref_ sd_hwdb *hwdb_internal = NULL;
56 struct udev_hwdb *hwdb;
57 int r;
58
59 assert_return(udev, NULL);
60
61 r = sd_hwdb_new(&hwdb_internal);
62 if (r < 0)
63 return NULL;
64
65 hwdb = new0(struct udev_hwdb, 1);
66 if (!hwdb)
67 return NULL;
68
69 hwdb->refcount = 1;
70 hwdb->hwdb = hwdb_internal;
71 hwdb_internal = NULL;
72
73 udev_list_init(udev, &hwdb->properties_list, true);
74
75 return hwdb;
76 }
77
78 /**
79 * udev_hwdb_ref:
80 * @hwdb: context
81 *
82 * Take a reference of a hwdb context.
83 *
84 * Returns: the passed enumeration context
85 **/
86 _public_ struct udev_hwdb *udev_hwdb_ref(struct udev_hwdb *hwdb) {
87 if (!hwdb)
88 return NULL;
89 hwdb->refcount++;
90 return hwdb;
91 }
92
93 /**
94 * udev_hwdb_unref:
95 * @hwdb: context
96 *
97 * Drop a reference of a hwdb context. If the refcount reaches zero,
98 * all resources of the hwdb context will be released.
99 *
100 * Returns: #NULL
101 **/
102 _public_ struct udev_hwdb *udev_hwdb_unref(struct udev_hwdb *hwdb) {
103 if (!hwdb)
104 return NULL;
105 hwdb->refcount--;
106 if (hwdb->refcount > 0)
107 return NULL;
108 sd_hwdb_unref(hwdb->hwdb);
109 udev_list_cleanup(&hwdb->properties_list);
110 free(hwdb);
111 return NULL;
112 }
113
114 /**
115 * udev_hwdb_get_properties_list_entry:
116 * @hwdb: context
117 * @modalias: modalias string
118 * @flags: (unused)
119 *
120 * Lookup a matching device in the hardware database. The lookup key is a
121 * modalias string, whose formats are defined for the Linux kernel modules.
122 * Examples are: pci:v00008086d00001C2D*, usb:v04F2pB221*. The first entry
123 * of a list of retrieved properties is returned.
124 *
125 * Returns: a udev_list_entry.
126 */
127 _public_ struct udev_list_entry *udev_hwdb_get_properties_list_entry(struct udev_hwdb *hwdb, const char *modalias, unsigned int flags) {
128 const char *key, *value;
129
130 if (!hwdb || !modalias) {
131 errno = EINVAL;
132 return NULL;
133 }
134
135 udev_list_cleanup(&hwdb->properties_list);
136
137 SD_HWDB_FOREACH_PROPERTY(hwdb->hwdb, modalias, key, value) {
138 if (udev_list_entry_add(&hwdb->properties_list, key, value) == NULL) {
139 errno = ENOMEM;
140 return NULL;
141 }
142 }
143
144 return udev_list_get_entry(&hwdb->properties_list);
145 }