summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2011-06-28 23:03:56 +0200
committerLennart Poettering <lennart@poettering.net>2011-06-28 23:03:56 +0200
commita0a0c7f18c5d4f157f471b6b2824b8e0653491ab (patch)
treebaa4a2f8a7219eee2b29e4c10145c845fba38d93
parent88bb8d215aa0f5576eb3f9c77c30cdc4b17783fe (diff)
logind: retrigger devices when we reassign them
-rw-r--r--src/logind-dbus.c37
-rw-r--r--src/logind.h7
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