{
struct udev_monitor *udev_monitor;
- udev_monitor = calloc(1, sizeof(struct udev_monitor));
+ udev_monitor = new0(struct udev_monitor, 1);
if (udev_monitor == NULL)
return NULL;
udev_monitor->refcount = 1;
/* we consider udev running when /dev is on devtmpfs */
static bool udev_has_devtmpfs(struct udev *udev) {
- struct file_handle *h;
- int mount_id;
+
+ union file_handle_union h = {
+ .handle.handle_bytes = MAX_HANDLE_SZ
+ };
+
_cleanup_fclose_ FILE *f = NULL;
char line[LINE_MAX], *e;
+ int mount_id;
int r;
- h = alloca(MAX_HANDLE_SZ);
- h->handle_bytes = MAX_HANDLE_SZ;
- r = name_to_handle_at(AT_FDCWD, "/dev", h, &mount_id, 0);
- if (r < 0)
+ r = name_to_handle_at(AT_FDCWD, "/dev", &h.handle, &mount_id, 0);
+ if (r < 0) {
+ if (errno != EOPNOTSUPP)
+ udev_err(udev, "name_to_handle_at on /dev: %m\n");
return false;
-
+ }
f = fopen("/proc/self/mountinfo", "re");
if (!f)
return false;
}
-/* we consider udev running when we have running udev service */
-static bool udev_has_service(struct udev *udev) {
- struct udev_queue *queue;
- bool active;
-
- queue = udev_queue_new(udev);
- if (!queue)
- return false;
-
- active = udev_queue_get_udev_is_active(queue);
- udev_queue_unref(queue);
-
- return active;
-}
-
struct udev_monitor *udev_monitor_new_from_netlink_fd(struct udev *udev, const char *name, int fd)
{
struct udev_monitor *udev_monitor;
* We do not set a netlink multicast group here, so the socket
* will not receive any messages.
*/
- if (!udev_has_service(udev) && !udev_has_devtmpfs(udev)) {
+ if (access("/run/udev/control", F_OK) < 0 && !udev_has_devtmpfs(udev)) {
udev_dbg(udev, "the udev service seems not to be active, disable the monitor\n");
group = UDEV_MONITOR_NONE;
} else