+static int session_resume_device_fn(sd_bus *bus,
+ sd_bus_message *signal,
+ void *userdata,
+ sd_bus_error *ret_error) {
+ idev_session *s = userdata;
+ idev_element *e;
+ uint32_t major, minor;
+ int r, fd;
+
+ r = sd_bus_message_read(signal, "uuh", &major, &minor, &fd);
+ if (r < 0) {
+ log_debug("idev: %s: erroneous ResumeDevice signal", s->name);
+ return 0;
+ }
+
+ e = idev_find_evdev(s, makedev(major, minor));
+ if (!e)
+ return 0;
+
+ element_resume(e, fd);
+ return 0;
+}
+
+static int session_pause_device_fn(sd_bus *bus,
+ sd_bus_message *signal,
+ void *userdata,
+ sd_bus_error *ret_error) {
+ idev_session *s = userdata;
+ idev_element *e;
+ uint32_t major, minor;
+ const char *mode;
+ int r;
+
+ r = sd_bus_message_read(signal, "uus", &major, &minor, &mode);
+ if (r < 0) {
+ log_debug("idev: %s: erroneous PauseDevice signal", s->name);
+ return 0;
+ }
+
+ e = idev_find_evdev(s, makedev(major, minor));
+ if (!e)
+ return 0;
+
+ element_pause(e, mode);
+ return 0;
+}
+
+static int session_setup_bus(idev_session *s) {
+ _cleanup_free_ char *match = NULL;
+ int r;
+
+ if (!s->managed)
+ return 0;
+
+ match = strjoin("type='signal',"
+ "sender='org.freedesktop.login1',"
+ "interface='org.freedesktop.login1.Session',"
+ "member='ResumeDevice',"
+ "path='", s->path, "'",
+ NULL);
+ if (!match)
+ return -ENOMEM;
+
+ r = sd_bus_add_match(s->context->sysbus,
+ &s->slot_resume_device,
+ match,
+ session_resume_device_fn,
+ s);
+ if (r < 0)
+ return r;
+
+ free(match);
+ match = strjoin("type='signal',"
+ "sender='org.freedesktop.login1',"
+ "interface='org.freedesktop.login1.Session',"
+ "member='PauseDevice',"
+ "path='", s->path, "'",
+ NULL);
+ if (!match)
+ return -ENOMEM;
+
+ r = sd_bus_add_match(s->context->sysbus,
+ &s->slot_pause_device,
+ match,
+ session_pause_device_fn,
+ s);
+ if (r < 0)
+ return r;
+
+ return 0;
+}
+