-
- return 0;
-}
-
-static int managed_evdev_resume_device_fn(sd_bus *bus,
- sd_bus_message *signal,
- void *userdata,
- sd_bus_error *ret_error) {
- managed_evdev *em = userdata;
- idev_element *e = &em->evdev.element;
- idev_session *s = e->session;
- uint32_t major, minor;
- int r, fd;
-
- /*
- * We get ResumeDevice signals whenever logind resumed a previously
- * paused device. The arguments contain the major/minor number of the
- * related device and a new file-descriptor for the freshly opened
- * device-node.
- * If the signal is not about our device, we simply ignore it.
- * Otherwise, we take the file-descriptor and immediately resume the
- * device.
- */
-
- r = sd_bus_message_read(signal, "uuh", &major, &minor, &fd);
- if (r < 0) {
- log_debug("idev-evdev: %s/%s: erroneous ResumeDevice signal",
- s->name, e->name);
- return 0;
- }
-
- /* not our device? */
- if (makedev(major, minor) != em->devnum)
- return 0;
-
- fd = fcntl(fd, F_DUPFD_CLOEXEC, 3);
- if (fd < 0) {
- log_debug("idev-evdev: %s/%s: cannot duplicate evdev fd: %m",
- s->name, e->name);
- return 0;
- }
-
- r = idev_evdev_resume(&em->evdev, fd);
- if (r < 0)
- log_debug("idev-evdev: %s/%s: cannot resume: %s",
- s->name, e->name, strerror(-r));
-
- return 0;
-}
-
-static int managed_evdev_setup_bus(managed_evdev *em) {
- idev_element *e = &em->evdev.element;
- idev_session *s = e->session;
- idev_context *c = s->context;
- _cleanup_free_ char *match = NULL;
- int r;
-
- 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(c->sysbus,
- &em->slot_pause_device,
- match,
- managed_evdev_pause_device_fn,
- em);
- if (r < 0)
- return r;
-
- free(match);
- 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(c->sysbus,
- &em->slot_resume_device,
- match,
- managed_evdev_resume_device_fn,
- em);
- if (r < 0)
- return r;
-
- return 0;