1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 * This file defines a wrapper around libudev so we can avoid
7 * linking directly to it and use dlopen instead.
10 #ifndef HAL_LINUX_UDEV_H_
11 #define HAL_LINUX_UDEV_H_
15 #include "mozilla/ArrayUtils.h"
21 struct udev_enumerate
;
22 struct udev_list_entry
;
27 udev_lib() : lib(nullptr),
29 // Be careful about ABI compat! 0 -> 1 didn't change any
30 // symbols this code relies on, per:
31 // https://lists.fedoraproject.org/pipermail/devel/2012-June/168227.html
32 const char* lib_names
[] = {"libudev.so.0", "libudev.so.1"};
33 // Check whether a library is already loaded so we don't load two
35 for (unsigned i
= 0; i
< ArrayLength(lib_names
); i
++) {
36 lib
= dlopen(lib_names
[i
], RTLD_NOLOAD
| RTLD_LAZY
| RTLD_GLOBAL
);
41 // If nothing loads the first time through, it means no version of libudev
42 // was already loaded.
44 for (unsigned i
= 0; i
< ArrayLength(lib_names
); i
++) {
45 lib
= dlopen(lib_names
[i
], RTLD_LAZY
| RTLD_GLOBAL
);
51 if (lib
&& LoadSymbols()) {
74 s = (typeof(s))dlsym(lib, #s); \
75 if (!s) return false; \
80 DLSYM(udev_device_unref
);
81 DLSYM(udev_device_new_from_syspath
);
82 DLSYM(udev_device_get_devnode
);
83 DLSYM(udev_device_get_parent_with_subsystem_devtype
);
84 DLSYM(udev_device_get_property_value
);
85 DLSYM(udev_device_get_action
);
86 DLSYM(udev_device_get_sysattr_value
);
87 DLSYM(udev_enumerate_new
);
88 DLSYM(udev_enumerate_unref
);
89 DLSYM(udev_enumerate_add_match_subsystem
);
90 DLSYM(udev_enumerate_scan_devices
);
91 DLSYM(udev_enumerate_get_list_entry
);
92 DLSYM(udev_list_entry_get_next
);
93 DLSYM(udev_list_entry_get_name
);
94 DLSYM(udev_monitor_new_from_netlink
);
95 DLSYM(udev_monitor_filter_add_match_subsystem_devtype
);
96 DLSYM(udev_monitor_enable_receiving
);
97 DLSYM(udev_monitor_get_fd
);
98 DLSYM(udev_monitor_receive_device
);
99 DLSYM(udev_monitor_unref
);
109 // Function pointers returned from dlsym.
110 struct udev
* (*udev_new
)(void);
111 void (*udev_unref
)(struct udev
*);
113 void (*udev_device_unref
)(struct udev_device
*);
114 struct udev_device
* (*udev_device_new_from_syspath
)(struct udev
*,
116 const char* (*udev_device_get_devnode
)(struct udev_device
*);
117 struct udev_device
* (*udev_device_get_parent_with_subsystem_devtype
)
118 (struct udev_device
*, const char*, const char*);
119 const char* (*udev_device_get_property_value
)(struct udev_device
*,
121 const char* (*udev_device_get_action
)(struct udev_device
*);
122 const char* (*udev_device_get_sysattr_value
)(struct udev_device
*,
125 struct udev_enumerate
* (*udev_enumerate_new
)(struct udev
*);
126 void (*udev_enumerate_unref
)(struct udev_enumerate
*);
127 int (*udev_enumerate_add_match_subsystem
)(struct udev_enumerate
*,
129 int (*udev_enumerate_scan_devices
)(struct udev_enumerate
*);
130 struct udev_list_entry
* (*udev_enumerate_get_list_entry
)
131 (struct udev_enumerate
*);
133 struct udev_list_entry
* (*udev_list_entry_get_next
)(struct udev_list_entry
*);
134 const char* (*udev_list_entry_get_name
)(struct udev_list_entry
*);
136 struct udev_monitor
* (*udev_monitor_new_from_netlink
)(struct udev
*,
138 int (*udev_monitor_filter_add_match_subsystem_devtype
)
139 (struct udev_monitor
*, const char*, const char*);
140 int (*udev_monitor_enable_receiving
)(struct udev_monitor
*);
141 int (*udev_monitor_get_fd
)(struct udev_monitor
*);
142 struct udev_device
* (*udev_monitor_receive_device
)(struct udev_monitor
*);
143 void (*udev_monitor_unref
)(struct udev_monitor
*);
146 } // namespace mozilla
148 #endif // HAL_LINUX_UDEV_H_