• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef LIBUDEV_H
17 #define LIBUDEV_H
18 
19 #pragma once
20 
21 #include <stdarg.h>
22 #include <sys/sysmacros.h>
23 #include <sys/types.h>
24 #include <sys/stat.h>
25 #include <stdbool.h>
26 
27 #ifdef __cplusplus
28 extern "C" {
29 #endif // __cplusplus
30 
31 /**
32  * udev - library context
33  *
34  * reads the udev config and system environment
35  * allows custom logging
36  */
37 struct udev;
38 struct udev *udev_ref(struct udev *udev);
39 struct udev *udev_unref(struct udev *udev);
40 struct udev *udev_new(void);
41 void udev_set_log_fn(struct udev *udev, void (*log_fn)(struct udev *udev, int priority, const char *file, int line,
42                                             const char *fn, const char *format, va_list args))
43     __attribute__((deprecated));
44 int udev_get_log_priority(struct udev *udev) __attribute__((deprecated));
45 void udev_set_log_priority(struct udev *udev, int priority) __attribute__((deprecated));
46 void *udev_get_userdata(struct udev *udev);
47 void udev_set_userdata(struct udev *udev, void *userdata);
48 
49 /**
50  * udev_list access to libudev generated lists
51  */
52 struct udev_list_entry;
53 struct udev_list_entry *udev_list_entry_get_next(struct udev_list_entry *list_entry);
54 struct udev_list_entry *udev_list_entry_get_by_name(struct udev_list_entry *list_entry, const char *name);
55 const char *udev_list_entry_get_name(struct udev_list_entry *list_entry);
56 const char *udev_list_entry_get_value(struct udev_list_entry *list_entry);
57 
58 /**
59  * udev_list_entry_foreach:
60  * @list_entry: entry to store the current position
61  * @first_entry: first entry to start with
62  *
63  * Helper to iterate over all entries of a list.
64  */
65 #define udev_list_entry_foreach(list_entry, first_entry) \
66     for (list_entry = first_entry; list_entry != NULL; list_entry = udev_list_entry_get_next(list_entry))
67 
68 /**
69  * udev_device access to sysfs/kernel devices
70  */
71 struct udev_device;
72 struct udev_device *udev_device_ref(struct udev_device *udev_device);
73 struct udev_device *udev_device_unref(struct udev_device *udev_device);
74 struct udev *udev_device_get_udev(struct udev_device *udev_device);
75 struct udev_device *udev_device_new_from_syspath(struct udev *udev, const char *syspath);
76 struct udev_device *udev_device_new_from_devnum(struct udev *udev, char type, dev_t devnum);
77 struct udev_device *udev_device_new_from_subsystem_sysname(
78     struct udev *udev, const char *subsystem, const char *sysname);
79 struct udev_device *udev_device_new_from_device_id(struct udev *udev, const char *id);
80 struct udev_device *udev_device_new_from_environment(struct udev *udev);
81 bool udev_device_property_add(char type, const char *devnode);
82 void udev_device_property_remove(const char *devnode);
83 void udev_device_record_devnode(const char *devnode);
84 
85 /**
86  * udev_device_get_parent_*() does not take a reference on the returned device, it is automatically unref'd with the
87  * parent
88  */
89 struct udev_device *udev_device_get_parent(struct udev_device *udev_device);
90 struct udev_device *udev_device_get_parent_with_subsystem_devtype(
91     struct udev_device *udev_device, const char *subsystem, const char *devtype);
92 
93 /* retrieve device properties */
94 int udev_device_read_db(struct udev_device *udev_device);
95 const char *udev_device_get_devpath(struct udev_device *udev_device);
96 const char *udev_device_get_subsystem(struct udev_device *udev_device);
97 const char *udev_device_get_devtype(struct udev_device *udev_device);
98 const char *udev_device_get_syspath(struct udev_device *udev_device);
99 const char *udev_device_get_sysname(struct udev_device *udev_device);
100 const char *udev_device_get_sysnum(struct udev_device *udev_device);
101 const char *udev_device_get_devnode(struct udev_device *udev_device);
102 int udev_device_get_is_initialized(struct udev_device *udev_device);
103 struct udev_list_entry *udev_device_get_devlinks_list_entry(struct udev_device *udev_device);
104 struct udev_list_entry *udev_device_get_properties_list_entry(struct udev_device *udev_device);
105 struct udev_list_entry *udev_device_get_tags_list_entry(struct udev_device *udev_device);
106 struct udev_list_entry *udev_device_get_sysattr_list_entry(struct udev_device *udev_device);
107 const char *udev_device_get_property_value(struct udev_device *udev_device, const char *key);
108 const char *udev_device_get_driver(struct udev_device *udev_device);
109 dev_t udev_device_get_devnum(struct udev_device *udev_device);
110 const char *udev_device_get_action(struct udev_device *udev_device);
111 unsigned long long int udev_device_get_seqnum(struct udev_device *udev_device);
112 unsigned long long int udev_device_get_usec_since_initialized(struct udev_device *udev_device);
113 const char *udev_device_get_sysattr_value(struct udev_device *udev_device, const char *sysattr);
114 int udev_device_set_sysattr_value(struct udev_device *udev_device, const char *sysattr, char *value);
115 int udev_device_has_tag(struct udev_device *udev_device, const char *tag);
116 
117 /**
118  * udev_monitor access to kernel uevents and udev events
119  */
120 struct udev_monitor;
121 struct udev_monitor *udev_monitor_ref(struct udev_monitor *udev_monitor);
122 struct udev_monitor *udev_monitor_unref(struct udev_monitor *udev_monitor);
123 struct udev *udev_monitor_get_udev(struct udev_monitor *udev_monitor);
124 /* kernel and udev generated events over netlink */
125 struct udev_monitor *udev_monitor_new_from_netlink(struct udev *udev, const char *name);
126 /* bind socket */
127 int udev_monitor_enable_receiving(struct udev_monitor *udev_monitor);
128 int udev_monitor_set_receive_buffer_size(struct udev_monitor *udev_monitor, int size);
129 int udev_monitor_get_fd(struct udev_monitor *udev_monitor);
130 struct udev_device *udev_monitor_receive_device(struct udev_monitor *udev_monitor);
131 /* in-kernel socket filters to select messages that get delivered to a listener */
132 int udev_monitor_filter_add_match_subsystem_devtype(
133     struct udev_monitor *udev_monitor, const char *subsystem, const char *devtype);
134 int udev_monitor_filter_add_match_tag(struct udev_monitor *udev_monitor, const char *tag);
135 int udev_monitor_filter_update(struct udev_monitor *udev_monitor);
136 int udev_monitor_filter_remove(struct udev_monitor *udev_monitor);
137 
138 /**
139  * udev_enumerate search sysfs for specific devices and provide a sorted list
140  */
141 struct udev_enumerate;
142 struct udev_enumerate *udev_enumerate_ref(struct udev_enumerate *udev_enumerate);
143 struct udev_enumerate *udev_enumerate_unref(struct udev_enumerate *udev_enumerate);
144 struct udev *udev_enumerate_get_udev(struct udev_enumerate *udev_enumerate);
145 struct udev_enumerate *udev_enumerate_new(struct udev *udev);
146 /* device properties filter */
147 int udev_enumerate_add_match_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem);
148 int udev_enumerate_add_nomatch_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem);
149 int udev_enumerate_add_match_sysattr(struct udev_enumerate *udev_enumerate, const char *sysattr, const char *value);
150 int udev_enumerate_add_nomatch_sysattr(struct udev_enumerate *udev_enumerate, const char *sysattr, const char *value);
151 int udev_enumerate_add_match_property(struct udev_enumerate *udev_enumerate, const char *property, const char *value);
152 int udev_enumerate_add_match_sysname(struct udev_enumerate *udev_enumerate, const char *sysname);
153 int udev_enumerate_add_match_tag(struct udev_enumerate *udev_enumerate, const char *tag);
154 int udev_enumerate_add_match_parent(struct udev_enumerate *udev_enumerate, struct udev_device *parent);
155 int udev_enumerate_add_match_is_initialized(struct udev_enumerate *udev_enumerate);
156 int udev_enumerate_add_syspath(struct udev_enumerate *udev_enumerate, const char *syspath);
157 /* run enumeration with active filters */
158 int udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate);
159 int udev_enumerate_scan_subsystems(struct udev_enumerate *udev_enumerate);
160 /* return device list */
161 struct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enumerate *udev_enumerate);
162 
163 /**
164  * udev_queue access to the currently running udev events
165  */
166 struct udev_queue;
167 struct udev_queue *udev_queue_ref(struct udev_queue *udev_queue);
168 struct udev_queue *udev_queue_unref(struct udev_queue *udev_queue);
169 struct udev *udev_queue_get_udev(struct udev_queue *udev_queue);
170 struct udev_queue *udev_queue_new(struct udev *udev);
171 unsigned long long int udev_queue_get_kernel_seqnum(struct udev_queue *udev_queue) __attribute__((deprecated));
172 unsigned long long int udev_queue_get_udev_seqnum(struct udev_queue *udev_queue) __attribute__((deprecated));
173 int udev_queue_get_udev_is_active(struct udev_queue *udev_queue);
174 int udev_queue_get_queue_is_empty(struct udev_queue *udev_queue);
175 int udev_queue_get_seqnum_is_finished(struct udev_queue *udev_queue, unsigned long long int seqnum)
176     __attribute__((deprecated));
177 int udev_queue_get_seqnum_sequence_is_finished(struct udev_queue *udev_queue, unsigned long long int start,
178     unsigned long long int end) __attribute__((deprecated));
179 int udev_queue_get_fd(struct udev_queue *udev_queue);
180 int udev_queue_flush(struct udev_queue *udev_queue);
181 struct udev_list_entry *udev_queue_get_queued_list_entry(struct udev_queue *udev_queue) __attribute__((deprecated));
182 
183 /**
184  * udev_hwdb access to the static hardware properties database
185  */
186 struct udev_hwdb;
187 struct udev_hwdb *udev_hwdb_new(struct udev *udev);
188 struct udev_hwdb *udev_hwdb_ref(struct udev_hwdb *hwdb);
189 struct udev_hwdb *udev_hwdb_unref(struct udev_hwdb *hwdb);
190 struct udev_list_entry *udev_hwdb_get_properties_list_entry(
191     struct udev_hwdb *hwdb, const char *modalias, unsigned int flags);
192 
193 /**
194  * udev_util udev specific utilities
195  */
196 int udev_util_encode_string(const char *str, char *str_enc, size_t len);
197 
198 #ifdef __cplusplus
199 } /* extern "C" */
200 #endif // __cplusplus
201 #endif // LIBUDEV_H