diff options
author | Lennart Poettering <lennart@poettering.net> | 2011-06-28 23:03:56 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2011-06-28 23:03:56 +0200 |
commit | a0a0c7f18c5d4f157f471b6b2824b8e0653491ab (patch) | |
tree | baa4a2f8a7219eee2b29e4c10145c845fba38d93 /src | |
parent | 88bb8d215aa0f5576eb3f9c77c30cdc4b17783fe (diff) |
logind: retrigger devices when we reassign them
Diffstat (limited to 'src')
-rw-r--r-- | src/logind-dbus.c | 37 | ||||
-rw-r--r-- | src/logind.h | 7 |
2 files changed, 44 insertions, 0 deletions
diff --git a/src/logind-dbus.c b/src/logind-dbus.c index 57ee2ee28d..5997fb5d7a 100644 --- a/src/logind-dbus.c +++ b/src/logind-dbus.c @@ -557,6 +557,8 @@ static int attach_device(Manager *m, const char *seat, const char *sysfs) { char *rule = NULL, *file = NULL; const char *id_for_seat; int r; + struct udev_enumerate *e; + struct udev_list_entry *first, *item; assert(m); assert(seat); @@ -589,6 +591,38 @@ static int attach_device(Manager *m, const char *seat, const char *sysfs) { mkdir_p("/etc/udev/rules.d", 0755); r = write_one_line_file(file, rule); + if (r < 0) + goto finish; + + e = udev_enumerate_new(m->udev); + if (!e) { + r = -ENOMEM; + goto finish; + } + + if (udev_enumerate_scan_devices(e) < 0) { + r = -EIO; + goto finish; + } + + first = udev_enumerate_get_list_entry(e); + udev_list_entry_foreach(item, first) { + char *t; + const char *p; + + p = udev_list_entry_get_name(item); + if (!startswith(p, sysfs)) + continue; + + t = strappend(p, "/uevent"); + if (!t) { + r = -ENOMEM; + goto finish; + } + + write_one_line_file(t, "change"); + free(t); + } finish: free(rule); @@ -597,6 +631,9 @@ finish: if (d) udev_device_unref(d); + if (e) + udev_enumerate_unref(e); + return r; } diff --git a/src/logind.h b/src/logind.h index 8702d1aed2..309541415d 100644 --- a/src/logind.h +++ b/src/logind.h @@ -39,6 +39,13 @@ * add configuration file * D-Bus method: AttachDevices(seat, devices[]); * use named pipes to detect when a session dies + * verify access to SetIdleHint + * drop redundant udev_device_get_is_initialized() use as soon as libudev is fixed + * properly escape/remove : and . from seat names in udev rules + * use device_has_tag() as soon as it is available + * trigger based on libudev if available + * enumerate recursively with libudev when triggering + * make sure IMPORT{parent}="ID_SEAT" works between usb hub and sound card * * non-local X11 server * reboot/shutdown halt management |