logind: replace udev_device by sd_device

This commit is contained in:
Yu Watanabe
2018-08-23 04:57:39 +09:00
parent 4366e598ae
commit 4f209af7da
8 changed files with 179 additions and 220 deletions
+14 -27
View File
@@ -3,8 +3,11 @@
#include <errno.h>
#include <string.h>
#include "sd-device.h"
#include "acl-util.h"
#include "alloc-util.h"
#include "device-enumerator-private.h"
#include "dirent-util.h"
#include "escape.h"
#include "fd-util.h"
@@ -12,7 +15,6 @@
#include "logind-acl.h"
#include "set.h"
#include "string-util.h"
#include "udev-util.h"
#include "util.h"
static int flush_acl(acl_t acl) {
@@ -157,30 +159,27 @@ finish:
return r;
}
int devnode_acl_all(struct udev *udev,
const char *seat,
int devnode_acl_all(const char *seat,
bool flush,
bool del, uid_t old_uid,
bool add, uid_t new_uid) {
_cleanup_(udev_enumerate_unrefp) struct udev_enumerate *e = NULL;
struct udev_list_entry *item = NULL, *first = NULL;
_cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL;
_cleanup_set_free_free_ Set *nodes = NULL;
_cleanup_closedir_ DIR *dir = NULL;
struct dirent *dent;
sd_device *d;
Iterator i;
char *n;
int r;
assert(udev);
nodes = set_new(&path_hash_ops);
if (!nodes)
return -ENOMEM;
e = udev_enumerate_new(udev);
if (!e)
return -ENOMEM;
r = sd_device_enumerator_new(&e);
if (r < 0)
return r;
if (isempty(seat))
seat = "seat0";
@@ -190,37 +189,25 @@ int devnode_acl_all(struct udev *udev,
* could add the seat name as second match tag, but this would
* be hardly optimizable in libudev, and hence checking the
* second tag manually in our loop is a good solution. */
r = udev_enumerate_add_match_tag(e, "uaccess");
r = sd_device_enumerator_add_match_tag(e, "uaccess");
if (r < 0)
return r;
r = udev_enumerate_add_match_is_initialized(e);
r = device_enumerator_scan_devices(e);
if (r < 0)
return r;
r = udev_enumerate_scan_devices(e);
if (r < 0)
return r;
first = udev_enumerate_get_list_entry(e);
udev_list_entry_foreach(item, first) {
_cleanup_(udev_device_unrefp) struct udev_device *d = NULL;
FOREACH_DEVICE_AND_SUBSYSTEM(e, d) {
const char *node, *sn;
d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item));
if (!d)
return -ENOMEM;
sn = udev_device_get_property_value(d, "ID_SEAT");
if (isempty(sn))
if (sd_device_get_property_value(d, "ID_SEAT", &sn) < 0 || isempty(sn))
sn = "seat0";
if (!streq(seat, sn))
continue;
node = udev_device_get_devnode(d);
/* In case people mistag devices with nodes, we need to ignore this */
if (!node)
if (sd_device_get_devname(d, &node) < 0)
continue;
n = strdup(node);
+2 -6
View File
@@ -4,8 +4,6 @@
#include <stdbool.h>
#include <sys/types.h>
#include "libudev.h"
#if HAVE_ACL
int devnode_acl(const char *path,
@@ -13,8 +11,7 @@ int devnode_acl(const char *path,
bool del, uid_t old_uid,
bool add, uid_t new_uid);
int devnode_acl_all(struct udev *udev,
const char *seat,
int devnode_acl_all(const char *seat,
bool flush,
bool del, uid_t old_uid,
bool add, uid_t new_uid);
@@ -27,8 +24,7 @@ static inline int devnode_acl(const char *path,
return 0;
}
static inline int devnode_acl_all(struct udev *udev,
const char *seat,
static inline int devnode_acl_all(const char *seat,
bool flush,
bool del, uid_t old_uid,
bool add, uid_t new_uid) {
+55 -48
View File
@@ -6,18 +6,20 @@
#include <sys/types.h>
#include <linux/vt.h>
#include "sd-device.h"
#include "alloc-util.h"
#include "bus-error.h"
#include "bus-util.h"
#include "cgroup-util.h"
#include "conf-parser.h"
#include "device-enumerator-private.h"
#include "fd-util.h"
#include "logind.h"
#include "parse-util.h"
#include "process-util.h"
#include "strv.h"
#include "terminal-util.h"
#include "udev-util.h"
#include "user-util.h"
void manager_reset_config(Manager *m) {
@@ -215,15 +217,22 @@ int manager_add_button(Manager *m, const char *name, Button **_button) {
return 0;
}
int manager_process_seat_device(Manager *m, struct udev_device *d) {
int manager_process_seat_device(Manager *m, sd_device *d) {
const char *action = NULL;
Device *device;
int r;
assert(m);
if (streq_ptr(udev_device_get_action(d), "remove")) {
(void) sd_device_get_property_value(d, "ACTION", &action);
if (streq_ptr(action, "remove")) {
const char *syspath;
device = hashmap_get(m->devices, udev_device_get_syspath(d));
r = sd_device_get_syspath(d, &syspath);
if (r < 0)
return 0;
device = hashmap_get(m->devices, syspath);
if (!device)
return 0;
@@ -231,12 +240,11 @@ int manager_process_seat_device(Manager *m, struct udev_device *d) {
device_free(device);
} else {
const char *sn;
Seat *seat = NULL;
const char *sn, *syspath;
bool master;
Seat *seat;
sn = udev_device_get_property_value(d, "ID_SEAT");
if (isempty(sn))
if (sd_device_get_property_value(d, "ID_SEAT", &sn) < 0 || isempty(sn))
sn = "seat0";
if (!seat_name_is_valid(sn)) {
@@ -245,13 +253,17 @@ int manager_process_seat_device(Manager *m, struct udev_device *d) {
}
seat = hashmap_get(m->seats, sn);
master = udev_device_has_tag(d, "master-of-seat");
master = sd_device_has_tag(d, "master-of-seat") > 0;
/* Ignore non-master devices for unknown seats */
if (!master && !seat)
return 0;
r = manager_add_device(m, udev_device_get_syspath(d), master, &device);
r = sd_device_get_syspath(d, &syspath);
if (r < 0)
return r;
r = manager_add_device(m, syspath, master, &device);
if (r < 0)
return r;
@@ -272,30 +284,34 @@ int manager_process_seat_device(Manager *m, struct udev_device *d) {
return 0;
}
int manager_process_button_device(Manager *m, struct udev_device *d) {
int manager_process_button_device(Manager *m, sd_device *d) {
const char *action = NULL, *sysname;
Button *b;
int r;
assert(m);
if (streq_ptr(udev_device_get_action(d), "remove")) {
r = sd_device_get_sysname(d, &sysname);
if (r < 0)
return r;
b = hashmap_get(m->buttons, udev_device_get_sysname(d));
(void) sd_device_get_property_value(d, "ACTION", &action);
if (streq_ptr(action, "remove")) {
b = hashmap_get(m->buttons, sysname);
if (!b)
return 0;
button_free(b);
} else {
const char *sn;
const char *sn = NULL;
r = manager_add_button(m, udev_device_get_sysname(d), &b);
r = manager_add_button(m, sysname, &b);
if (r < 0)
return r;
sn = udev_device_get_property_value(d, "ID_SEAT");
if (isempty(sn))
if (sd_device_get_property_value(d, "ID_SEAT", &sn) < 0 || isempty(sn))
sn = "seat0";
button_set_seat(b, sn);
@@ -539,46 +555,41 @@ static bool manager_is_docked(Manager *m) {
}
static int manager_count_external_displays(Manager *m) {
_cleanup_(udev_enumerate_unrefp) struct udev_enumerate *e = NULL;
struct udev_list_entry *item = NULL, *first = NULL;
int r;
int n = 0;
_cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL;
sd_device *d;
int r, n = 0;
e = udev_enumerate_new(m->udev);
if (!e)
return -ENOMEM;
r = udev_enumerate_add_match_subsystem(e, "drm");
r = sd_device_enumerator_new(&e);
if (r < 0)
return r;
r = udev_enumerate_scan_devices(e);
r = sd_device_enumerator_allow_uninitialized(e);
if (r < 0)
return r;
first = udev_enumerate_get_list_entry(e);
udev_list_entry_foreach(item, first) {
_cleanup_(udev_device_unrefp) struct udev_device *d = NULL;
struct udev_device *p;
const char *status, *enabled, *dash, *nn, *i;
r = sd_device_enumerator_add_match_subsystem(e, "drm", true);
if (r < 0)
return r;
r = device_enumerator_scan_devices(e);
if (r < 0)
return r;
FOREACH_DEVICE_AND_SUBSYSTEM(e, d) {
sd_device *p;
const char *status, *enabled, *dash, *nn, *i, *subsys;
bool external = false;
d = udev_device_new_from_syspath(m->udev, udev_list_entry_get_name(item));
if (!d)
return -ENOMEM;
p = udev_device_get_parent(d);
if (!p)
if (sd_device_get_parent(d, &p) < 0)
continue;
/* If the parent shares the same subsystem as the
* device we are looking at then it is a connector,
* which is what we are interested in. */
if (!streq_ptr(udev_device_get_subsystem(p), "drm"))
if (sd_device_get_subsystem(p, &subsys) < 0 || !streq(subsys, "drm"))
continue;
nn = udev_device_get_sysname(d);
if (!nn)
if (sd_device_get_sysname(d, &nn) < 0)
continue;
/* Ignore internal displays: the type is encoded in
@@ -605,16 +616,12 @@ static int manager_count_external_displays(Manager *m) {
continue;
/* Ignore ports that are not enabled */
enabled = udev_device_get_sysattr_value(d, "enabled");
if (!enabled)
continue;
if (!streq_ptr(enabled, "enabled"))
if (sd_device_get_sysattr_value(d, "enabled", &enabled) < 0 || !streq(enabled, "enabled"))
continue;
/* We count any connector which is not explicitly
* "disconnected" as connected. */
status = udev_device_get_sysattr_value(d, "status");
if (!streq_ptr(status, "disconnected"))
if (sd_device_get_sysattr_value(d, "status", &status) < 0 || !streq(status, "disconnected"))
n++;
}
+25 -21
View File
@@ -5,6 +5,7 @@
#include <string.h>
#include <unistd.h>
#include "sd-device.h"
#include "sd-messages.h"
#include "alloc-util.h"
@@ -13,6 +14,7 @@
#include "bus-error.h"
#include "bus-unit-util.h"
#include "bus-util.h"
#include "device-enumerator-private.h"
#include "dirent-util.h"
#include "efivars.h"
#include "escape.h"
@@ -30,7 +32,6 @@
#include "special.h"
#include "strv.h"
#include "terminal-util.h"
#include "udev-util.h"
#include "unit-name.h"
#include "user-util.h"
#include "utmp-wtmp.h"
@@ -1189,33 +1190,37 @@ static int method_set_user_linger(sd_bus_message *message, void *userdata, sd_bu
return sd_bus_reply_method_return(message, NULL);
}
static int trigger_device(Manager *m, struct udev_device *d) {
_cleanup_(udev_enumerate_unrefp) struct udev_enumerate *e = NULL;
struct udev_list_entry *first, *item;
static int trigger_device(Manager *m, sd_device *d) {
_cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL;
int r;
assert(m);
e = udev_enumerate_new(m->udev);
if (!e)
return -ENOMEM;
r = sd_device_enumerator_new(&e);
if (r < 0)
return r;
r = sd_device_enumerator_allow_uninitialized(e);
if (r < 0)
return r;
if (d) {
r = udev_enumerate_add_match_parent(e, d);
r = sd_device_enumerator_add_match_parent(e, d);
if (r < 0)
return r;
}
r = udev_enumerate_scan_devices(e);
r = device_enumerator_scan_devices(e);
if (r < 0)
return r;
first = udev_enumerate_get_list_entry(e);
udev_list_entry_foreach(item, first) {
FOREACH_DEVICE_AND_SUBSYSTEM(e, d) {
_cleanup_free_ char *t = NULL;
const char *p;
p = udev_list_entry_get_name(item);
r = sd_device_get_syspath(d, &p);
if (r < 0)
return r;
t = strappend(p, "/uevent");
if (!t)
@@ -1228,7 +1233,7 @@ static int trigger_device(Manager *m, struct udev_device *d) {
}
static int attach_device(Manager *m, const char *seat, const char *sysfs) {
_cleanup_(udev_device_unrefp) struct udev_device *d = NULL;
_cleanup_(sd_device_unrefp) sd_device *d = NULL;
_cleanup_free_ char *rule = NULL, *file = NULL;
const char *id_for_seat;
int r;
@@ -1237,15 +1242,14 @@ static int attach_device(Manager *m, const char *seat, const char *sysfs) {
assert(seat);
assert(sysfs);
d = udev_device_new_from_syspath(m->udev, sysfs);
if (!d)
r = sd_device_new_from_syspath(&d, sysfs);
if (r < 0)
return r;
if (sd_device_has_tag(d, "seat") <= 0)
return -ENODEV;
if (!udev_device_has_tag(d, "seat"))
return -ENODEV;
id_for_seat = udev_device_get_property_value(d, "ID_FOR_SEAT");
if (!id_for_seat)
if (sd_device_get_property_value(d, "ID_FOR_SEAT", &id_for_seat) < 0)
return -ENODEV;
if (asprintf(&file, "/etc/udev/rules.d/72-seat-%s.rules", id_for_seat) < 0)
@@ -1254,7 +1258,7 @@ static int attach_device(Manager *m, const char *seat, const char *sysfs) {
if (asprintf(&rule, "TAG==\"seat\", ENV{ID_FOR_SEAT}==\"%s\", ENV{ID_SEAT}=\"%s\"", id_for_seat, seat) < 0)
return -ENOMEM;
mkdir_p_label("/etc/udev/rules.d", 0755);
(void) mkdir_p_label("/etc/udev/rules.d", 0755);
r = write_string_file_atomic_label(file, rule);
if (r < 0)
return r;
+1 -2
View File
@@ -203,8 +203,7 @@ int seat_apply_acls(Seat *s, Session *old_active) {
assert(s);
r = devnode_acl_all(s->manager->udev,
s->id,
r = devnode_acl_all(s->id,
false,
!!old_active, old_active ? old_active->user->uid : 0,
!!s->active, s->active ? s->active->user->uid : 0);
+34 -48
View File
@@ -6,7 +6,7 @@
#include <sys/ioctl.h>
#include <sys/types.h>
#include "libudev.h"
#include "sd-device.h"
#include "alloc-util.h"
#include "bus-util.h"
@@ -247,13 +247,13 @@ static void session_device_stop(SessionDevice *sd) {
sd->active = false;
}
static DeviceType detect_device_type(struct udev_device *dev) {
static DeviceType detect_device_type(sd_device *dev) {
const char *sysname, *subsystem;
DeviceType type;
DeviceType type = DEVICE_TYPE_UNKNOWN;
sysname = udev_device_get_sysname(dev);
subsystem = udev_device_get_subsystem(dev);
type = DEVICE_TYPE_UNKNOWN;
if (sd_device_get_sysname(dev, &sysname) < 0 ||
sd_device_get_subsystem(dev, &subsystem) < 0)
return type;
if (streq_ptr(subsystem, "drm")) {
if (startswith(sysname, "card"))
@@ -267,42 +267,37 @@ static DeviceType detect_device_type(struct udev_device *dev) {
}
static int session_device_verify(SessionDevice *sd) {
struct udev_device *dev, *p = NULL;
const char *sp, *node;
_cleanup_(sd_device_unrefp) sd_device *p = NULL;
sd_device *dev;
const char *sp = NULL, *node;
int r;
dev = udev_device_new_from_devnum(sd->session->manager->udev, 'c', sd->dev);
if (!dev)
if (sd_device_new_from_devnum(&p, 'c', sd->dev) < 0)
return -ENODEV;
sp = udev_device_get_syspath(dev);
node = udev_device_get_devnode(dev);
if (!node) {
r = -EINVAL;
goto err_dev;
}
dev = p;
(void) sd_device_get_syspath(dev, &sp);
if (sd_device_get_devname(dev, &node) < 0)
return -EINVAL;
/* detect device type so we can find the correct sysfs parent */
sd->type = detect_device_type(dev);
if (sd->type == DEVICE_TYPE_UNKNOWN) {
r = -ENODEV;
goto err_dev;
} else if (sd->type == DEVICE_TYPE_EVDEV) {
if (sd->type == DEVICE_TYPE_UNKNOWN)
return -ENODEV;
else if (sd->type == DEVICE_TYPE_EVDEV) {
/* for evdev devices we need the parent node as device */
p = dev;
dev = udev_device_get_parent_with_subsystem_devtype(p, "input", NULL);
if (!dev) {
r = -ENODEV;
goto err_dev;
}
sp = udev_device_get_syspath(dev);
} else if (sd->type != DEVICE_TYPE_DRM) {
if (sd_device_get_parent_with_subsystem_devtype(p, "input", NULL, &dev) < 0)
return -ENODEV;
if (sd_device_get_syspath(dev, &sp) < 0)
return -ENODEV;
} else if (sd->type != DEVICE_TYPE_DRM)
/* Prevent opening unsupported devices. Especially devices of
* subsystem "input" must be opened via the evdev node as
* we require EVIOCREVOKE. */
r = -ENODEV;
goto err_dev;
}
return -ENODEV;
/* search for an existing seat device and return it if available */
sd->device = hashmap_get(sd->session->manager->devices, sp);
@@ -312,31 +307,22 @@ static int session_device_verify(SessionDevice *sd) {
* logind-manager handle the new device. */
r = manager_process_seat_device(sd->session->manager, dev);
if (r < 0)
goto err_dev;
return r;
/* if it's still not available, then the device is invalid */
sd->device = hashmap_get(sd->session->manager->devices, sp);
if (!sd->device) {
r = -ENODEV;
goto err_dev;
}
if (!sd->device)
return -ENODEV;
}
if (sd->device->seat != sd->session->seat) {
r = -EPERM;
goto err_dev;
}
if (sd->device->seat != sd->session->seat)
return -EPERM;
sd->node = strdup(node);
if (!sd->node) {
r = -ENOMEM;
goto err_dev;
}
if (!sd->node)
return -ENOMEM;
r = 0;
err_dev:
udev_device_unref(p ? : dev);
return r;
return 0;
}
int session_device_new(Session *s, dev_t dev, bool open_device, SessionDevice **out) {
+45 -65
View File
@@ -5,25 +5,26 @@
#include <string.h>
#include <unistd.h>
#include "libudev.h"
#include "sd-daemon.h"
#include "sd-device.h"
#include "alloc-util.h"
#include "bus-error.h"
#include "bus-util.h"
#include "cgroup-util.h"
#include "def.h"
#include "device-enumerator-private.h"
#include "dirent-util.h"
#include "fd-util.h"
#include "format-util.h"
#include "fs-util.h"
#include "libudev-private.h"
#include "logind.h"
#include "parse-util.h"
#include "process-util.h"
#include "selinux-util.h"
#include "signal-util.h"
#include "strv.h"
#include "udev-util.h"
static Manager* manager_unref(Manager *m);
DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_unref);
@@ -56,10 +57,6 @@ static int manager_new(Manager **ret) {
if (!m->devices || !m->seats || !m->sessions || !m->users || !m->inhibitors || !m->buttons || !m->user_units || !m->session_units)
return -ENOMEM;
m->udev = udev_new();
if (!m->udev)
return -errno;
r = sd_event_default(&m->event);
if (r < 0)
return r;
@@ -139,8 +136,6 @@ static Manager* manager_unref(Manager *m) {
udev_monitor_unref(m->udev_vcsa_monitor);
udev_monitor_unref(m->udev_button_monitor);
udev_unref(m->udev);
if (m->unlink_nologin)
(void) unlink_or_warn("/run/nologin");
@@ -163,8 +158,8 @@ static Manager* manager_unref(Manager *m) {
}
static int manager_enumerate_devices(Manager *m) {
struct udev_list_entry *item = NULL, *first = NULL;
_cleanup_(udev_enumerate_unrefp) struct udev_enumerate *e = NULL;
_cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL;
sd_device *d;
int r;
assert(m);
@@ -172,31 +167,21 @@ static int manager_enumerate_devices(Manager *m) {
/* Loads devices from udev and creates seats for them as
* necessary */
e = udev_enumerate_new(m->udev);
if (!e)
return -ENOMEM;
r = udev_enumerate_add_match_tag(e, "master-of-seat");
r = sd_device_enumerator_new(&e);
if (r < 0)
return r;
r = udev_enumerate_add_match_is_initialized(e);
r = sd_device_enumerator_add_match_tag(e, "master-of-seat");
if (r < 0)
return r;
r = udev_enumerate_scan_devices(e);
r = device_enumerator_scan_devices(e);
if (r < 0)
return r;
first = udev_enumerate_get_list_entry(e);
udev_list_entry_foreach(item, first) {
_cleanup_(udev_device_unrefp) struct udev_device *d = NULL;
FOREACH_DEVICE_AND_SUBSYSTEM(e, d) {
int k;
d = udev_device_new_from_syspath(m->udev, udev_list_entry_get_name(item));
if (!d)
return -ENOMEM;
k = manager_process_seat_device(m, d);
if (k < 0)
r = k;
@@ -206,8 +191,8 @@ static int manager_enumerate_devices(Manager *m) {
}
static int manager_enumerate_buttons(Manager *m) {
_cleanup_(udev_enumerate_unrefp) struct udev_enumerate *e = NULL;
struct udev_list_entry *item = NULL, *first = NULL;
_cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL;
sd_device *d;
int r;
assert(m);
@@ -217,35 +202,25 @@ static int manager_enumerate_buttons(Manager *m) {
if (manager_all_buttons_ignored(m))
return 0;
e = udev_enumerate_new(m->udev);
if (!e)
return -ENOMEM;
r = udev_enumerate_add_match_subsystem(e, "input");
r = sd_device_enumerator_new(&e);
if (r < 0)
return r;
r = udev_enumerate_add_match_tag(e, "power-switch");
r = sd_device_enumerator_add_match_subsystem(e, "input", true);
if (r < 0)
return r;
r = udev_enumerate_add_match_is_initialized(e);
r = sd_device_enumerator_add_match_tag(e, "power-switch");
if (r < 0)
return r;
r = udev_enumerate_scan_devices(e);
r = device_enumerator_scan_devices(e);
if (r < 0)
return r;
first = udev_enumerate_get_list_entry(e);
udev_list_entry_foreach(item, first) {
_cleanup_(udev_device_unrefp) struct udev_device *d = NULL;
FOREACH_DEVICE_AND_SUBSYSTEM(e, d) {
int k;
d = udev_device_new_from_syspath(m->udev, udev_list_entry_get_name(item));
if (!d)
return -ENOMEM;
k = manager_process_button_device(m, d);
if (k < 0)
r = k;
@@ -566,64 +541,69 @@ static int manager_enumerate_inhibitors(Manager *m) {
}
static int manager_dispatch_seat_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
_cleanup_(udev_device_unrefp) struct udev_device *d = NULL;
_cleanup_(sd_device_unrefp) sd_device *d = NULL;
Manager *m = userdata;
int r;
assert(m);
d = udev_monitor_receive_device(m->udev_seat_monitor);
if (!d)
return -ENOMEM;
r = udev_monitor_receive_sd_device(m->udev_seat_monitor, &d);
if (r < 0)
return r;
manager_process_seat_device(m, d);
return 0;
}
static int manager_dispatch_device_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
_cleanup_(udev_device_unrefp) struct udev_device *d = NULL;
_cleanup_(sd_device_unrefp) sd_device *d = NULL;
Manager *m = userdata;
int r;
assert(m);
d = udev_monitor_receive_device(m->udev_device_monitor);
if (!d)
return -ENOMEM;
r = udev_monitor_receive_sd_device(m->udev_device_monitor, &d);
if (r < 0)
return r;
manager_process_seat_device(m, d);
return 0;
}
static int manager_dispatch_vcsa_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
_cleanup_(udev_device_unrefp) struct udev_device *d = NULL;
_cleanup_(sd_device_unrefp) sd_device *d = NULL;
Manager *m = userdata;
const char *name;
const char *name, *action;
int r;
assert(m);
d = udev_monitor_receive_device(m->udev_vcsa_monitor);
if (!d)
return -ENOMEM;
name = udev_device_get_sysname(d);
r = udev_monitor_receive_sd_device(m->udev_vcsa_monitor, &d);
if (r < 0)
return r;
/* Whenever a VCSA device is removed try to reallocate our
* VTs, to make sure our auto VTs never go away. */
if (name && startswith(name, "vcsa") && streq_ptr(udev_device_get_action(d), "remove"))
if (sd_device_get_sysname(d, &name) >= 0 &&
startswith(name, "vcsa") &&
sd_device_get_property_value(d, "ACTION", &action) >= 0 &&
streq_ptr(action, "remove"))
seat_preallocate_vts(m->seat0);
return 0;
}
static int manager_dispatch_button_udev(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
_cleanup_(udev_device_unrefp) struct udev_device *d = NULL;
_cleanup_(sd_device_unrefp) sd_device *d = NULL;
Manager *m = userdata;
int r;
assert(m);
d = udev_monitor_receive_device(m->udev_button_monitor);
if (!d)
return -ENOMEM;
r = udev_monitor_receive_sd_device(m->udev_button_monitor, &d);
if (r < 0)
return r;
manager_process_button_device(m, d);
return 0;
@@ -869,7 +849,7 @@ static int manager_connect_udev(Manager *m) {
assert(!m->udev_vcsa_monitor);
assert(!m->udev_button_monitor);
m->udev_seat_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
m->udev_seat_monitor = udev_monitor_new_from_netlink(NULL, "udev");
if (!m->udev_seat_monitor)
return -ENOMEM;
@@ -885,7 +865,7 @@ static int manager_connect_udev(Manager *m) {
if (r < 0)
return r;
m->udev_device_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
m->udev_device_monitor = udev_monitor_new_from_netlink(NULL, "udev");
if (!m->udev_device_monitor)
return -ENOMEM;
@@ -911,7 +891,7 @@ static int manager_connect_udev(Manager *m) {
/* Don't watch keys if nobody cares */
if (!manager_all_buttons_ignored(m)) {
m->udev_button_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
m->udev_button_monitor = udev_monitor_new_from_netlink(NULL, "udev");
if (!m->udev_button_monitor)
return -ENOMEM;
@@ -935,7 +915,7 @@ static int manager_connect_udev(Manager *m) {
/* Don't bother watching VCSA devices, if nobody cares */
if (m->n_autovts > 0 && m->console_active_fd >= 0) {
m->udev_vcsa_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
m->udev_vcsa_monitor = udev_monitor_new_from_netlink(NULL, "udev");
if (!m->udev_vcsa_monitor)
return -ENOMEM;
+3 -3
View File
@@ -5,6 +5,7 @@
#include "libudev.h"
#include "sd-bus.h"
#include "sd-device.h"
#include "sd-event.h"
#include "conf-parser.h"
@@ -34,7 +35,6 @@ struct Manager {
LIST_HEAD(Session, session_gc_queue);
LIST_HEAD(User, user_gc_queue);
struct udev *udev;
struct udev_monitor *udev_seat_monitor, *udev_device_monitor, *udev_vcsa_monitor, *udev_button_monitor;
sd_event_source *console_active_event_source;
@@ -133,8 +133,8 @@ int manager_add_user_by_name(Manager *m, const char *name, User **_user);
int manager_add_user_by_uid(Manager *m, uid_t uid, User **_user);
int manager_add_inhibitor(Manager *m, const char* id, Inhibitor **_inhibitor);
int manager_process_seat_device(Manager *m, struct udev_device *d);
int manager_process_button_device(Manager *m, struct udev_device *d);
int manager_process_seat_device(Manager *m, sd_device *d);
int manager_process_button_device(Manager *m, sd_device *d);
int manager_spawn_autovt(Manager *m, unsigned int vtnr);