chiark / gitweb /
terminal: always call _enable/_disable on evdev devices
[elogind.git] / src / libsystemd-terminal / idev-evdev.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright (C) 2014 David Herrmann <dh.herrmann@gmail.com>
7
8   systemd is free software; you can redistribute it and/or modify it
9   under the terms of the GNU Lesser General Public License as published by
10   the Free Software Foundation; either version 2.1 of the License, or
11   (at your option) any later version.
12
13   systemd is distributed in the hope that it will be useful, but
14   WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser General Public License
19   along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <fcntl.h>
23 #include <inttypes.h>
24 #include <libevdev/libevdev.h>
25 #include <libudev.h>
26 #include <stdbool.h>
27 #include <stdlib.h>
28 #include <systemd/sd-bus.h>
29 #include <systemd/sd-event.h>
30 #include <unistd.h>
31 #include "bus-util.h"
32 #include "hashmap.h"
33 #include "idev.h"
34 #include "idev-internal.h"
35 #include "macro.h"
36 #include "udev-util.h"
37 #include "util.h"
38
39 typedef struct idev_evdev idev_evdev;
40 typedef struct unmanaged_evdev unmanaged_evdev;
41 typedef struct managed_evdev managed_evdev;
42
43 struct idev_evdev {
44         idev_element element;
45         struct libevdev *evdev;
46         int fd;
47         sd_event_source *fd_src;
48         sd_event_source *idle_src;
49
50         bool unsync : 1;                /* not in-sync with kernel */
51         bool resync : 1;                /* re-syncing with kernel */
52         bool running : 1;
53 };
54
55 struct unmanaged_evdev {
56         idev_evdev evdev;
57         char *devnode;
58 };
59
60 struct managed_evdev {
61         idev_evdev evdev;
62         dev_t devnum;
63
64         sd_bus_slot *slot_pause_device;
65         sd_bus_slot *slot_resume_device;
66         sd_bus_slot *slot_take_device;
67
68         bool requested : 1;             /* TakeDevice() was sent */
69         bool acquired : 1;              /* TakeDevice() was successful */
70 };
71
72 #define idev_evdev_from_element(_e) container_of((_e), idev_evdev, element)
73 #define unmanaged_evdev_from_element(_e) \
74         container_of(idev_evdev_from_element(_e), unmanaged_evdev, evdev)
75 #define managed_evdev_from_element(_e) \
76         container_of(idev_evdev_from_element(_e), managed_evdev, evdev)
77
78 #define IDEV_EVDEV_INIT(_vtable, _session) ((idev_evdev){ \
79                 .element = IDEV_ELEMENT_INIT((_vtable), (_session)), \
80                 .fd = -1, \
81         })
82
83 #define IDEV_EVDEV_NAME_MAX (8 + DECIMAL_STR_MAX(unsigned) * 2)
84
85 static const idev_element_vtable unmanaged_evdev_vtable;
86 static const idev_element_vtable managed_evdev_vtable;
87
88 static int idev_evdev_resume(idev_evdev *evdev, int dev_fd);
89 static void idev_evdev_pause(idev_evdev *evdev, bool release);
90
91 /*
92  * Virtual Evdev Element
93  * The virtual evdev element is the base class of all other evdev elements. It
94  * uses libevdev to access the kernel evdev API. It supports asynchronous
95  * access revocation, re-syncing if events got dropped and more.
96  * This element cannot be used by itself. There must be a wrapper around it
97  * which opens a file-descriptor and passes it to the virtual evdev element.
98  */
99
100 static void idev_evdev_name(char *out, dev_t devnum) {
101         /* @out must be at least of size IDEV_EVDEV_NAME_MAX */
102         sprintf(out, "evdev/%u:%u", major(devnum), minor(devnum));
103 }
104
105 static int idev_evdev_raise(idev_evdev *evdev, struct input_event *event) {
106         idev_data data = {
107                 .type = IDEV_DATA_EVDEV,
108                 .resync = evdev->resync,
109                 .evdev = {
110                         .event = *event,
111                 },
112         };
113
114         return idev_element_feed(&evdev->element, &data);
115 }
116
117 static void idev_evdev_hup(idev_evdev *evdev) {
118         /*
119          * On HUP, we close the current fd via idev_evdev_pause(). This drops
120          * the event-sources from the main-loop and effectively puts the
121          * element asleep. If the HUP is part of a hotplug-event, a following
122          * udev-notification will destroy the element. Otherwise, the HUP is
123          * either result of access-revokation or a serious error.
124          * For unmanaged devices, we should never receive HUP (except for
125          * unplug-events). But if we do, something went seriously wrong and we
126          * shouldn't try to be clever.
127          * Instead, we simply stay asleep and wait for the device to be
128          * disabled and then re-enabled (or closed and re-opened). This will
129          * re-open the device node and restart the device.
130          * For managed devices, a HUP usually means our device-access was
131          * revoked. In that case, we simply put the device asleep and wait for
132          * logind to notify us once the device is alive again. logind also
133          * passes us a new fd. Hence, we don't have to re-enable the device.
134          *
135          * Long story short: The only thing we have to do here, is close() the
136          * file-descriptor and remove it from the main-loop. Everything else is
137          * handled via additional events we receive.
138          */
139
140         idev_evdev_pause(evdev, true);
141 }
142
143 static int idev_evdev_io(idev_evdev *evdev) {
144         idev_element *e = &evdev->element;
145         struct input_event ev;
146         unsigned int flags;
147         int r, error = 0;
148
149         /*
150          * Read input-events via libevdev until the input-queue is drained. In
151          * case we're disabled, don't do anything. The input-queue might
152          * overflow, but we don't care as we have to resync after wake-up,
153          * anyway.
154          * TODO: libevdev should give us a hint how many events to read. We
155          * really want to avoid starvation, so we shouldn't read forever in
156          * case we cannot keep up with the kernel.
157          * TODO: Make sure libevdev always reports SYN_DROPPED to us, regardless
158          * whether any event was synced afterwards.
159          * TODO: Forward SYN_DROPPED to attached devices.
160          */
161
162         flags = LIBEVDEV_READ_FLAG_NORMAL;
163         while (e->enabled) {
164                 if (evdev->unsync) {
165                         /* immediately resync, even if in sync right now */
166                         evdev->unsync = false;
167                         evdev->resync = false;
168                         flags = LIBEVDEV_READ_FLAG_NORMAL;
169                         r = libevdev_next_event(evdev->evdev, flags | LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev);
170                         if (r < 0 && r != -EAGAIN) {
171                                 r = 0;
172                                 goto error;
173                         } else if (r != LIBEVDEV_READ_STATUS_SYNC) {
174                                 log_debug("idev-evdev: %s/%s: cannot force resync: %d",
175                                           e->session->name, e->name, r);
176                         }
177                 } else {
178                         r = libevdev_next_event(evdev->evdev, flags, &ev);
179                 }
180
181                 if (evdev->resync && r == -EAGAIN) {
182                         /* end of re-sync */
183                         evdev->resync = false;
184                         flags = LIBEVDEV_READ_FLAG_NORMAL;
185                 } else if (r == -EAGAIN) {
186                         /* no data available */
187                         break;
188                 } else if (r < 0) {
189                         /* read error */
190                         goto error;
191                 } else if (r == LIBEVDEV_READ_STATUS_SYNC) {
192                         if (evdev->resync) {
193                                 /* sync-event */
194                                 r = idev_evdev_raise(evdev, &ev);
195                                 if (r != 0) {
196                                         error = r;
197                                         break;
198                                 }
199                         } else {
200                                 /* start of sync */
201                                 evdev->resync = true;
202                                 flags = LIBEVDEV_READ_FLAG_SYNC;
203                         }
204                 } else {
205                         /* normal event */
206                         r = idev_evdev_raise(evdev, &ev);
207                         if (r != 0) {
208                                 error = r;
209                                 break;
210                         }
211                 }
212         }
213
214         if (error < 0)
215                 log_debug("idev-evdev: %s/%s: error on data event: %s",
216                           e->session->name, e->name, strerror(-error));
217         return error;
218
219 error:
220         idev_evdev_hup(evdev);
221         return 0; /* idev_evdev_hup() handles the error so discard it */
222 }
223
224 static int idev_evdev_event_fn(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
225         idev_evdev *evdev = userdata;
226
227         /* fetch data as long as EPOLLIN is signalled */
228         if (revents & EPOLLIN)
229                 return idev_evdev_io(evdev);
230
231         if (revents & (EPOLLHUP | EPOLLERR))
232                 idev_evdev_hup(evdev);
233
234         return 0;
235 }
236
237 static int idev_evdev_idle_fn(sd_event_source *s, void *userdata) {
238         idev_evdev *evdev = userdata;
239
240         /*
241          * The idle-event is raised whenever we have to re-sync the libevdev
242          * state from the kernel. We simply call into idev_evdev_io() which
243          * flushes the state and re-syncs it if @unsync is set.
244          * State has to be synced whenever our view of the kernel device is
245          * out of date. This is the case when we open the device, if the
246          * kernel's receive buffer overflows, or on other exceptional
247          * situations. Events during re-syncs must be forwarded to the upper
248          * layers so they can update their view of the device. However, such
249          * events must only be handled passively, as they might be out-of-order
250          * and/or re-ordered. Therefore, we mark them as 'sync' events.
251          */
252
253         if (!evdev->unsync)
254                 return 0;
255
256         return idev_evdev_io(evdev);
257 }
258
259 static void idev_evdev_destroy(idev_evdev *evdev) {
260         assert(evdev);
261         assert(evdev->fd < 0);
262
263         libevdev_free(evdev->evdev);
264         evdev->evdev = NULL;
265 }
266
267 static void idev_evdev_enable(idev_evdev *evdev) {
268         assert(evdev);
269         assert(evdev->fd_src);
270         assert(evdev->idle_src);
271
272         if (evdev->running)
273                 return;
274         if (evdev->fd < 0 || evdev->element.n_open < 1 || !evdev->element.enabled)
275                 return;
276
277         evdev->running = true;
278         sd_event_source_set_enabled(evdev->fd_src, SD_EVENT_ON);
279         sd_event_source_set_enabled(evdev->idle_src, SD_EVENT_ONESHOT);
280 }
281
282 static void idev_evdev_disable(idev_evdev *evdev) {
283         assert(evdev);
284         assert(evdev->fd_src);
285         assert(evdev->idle_src);
286
287         if (!evdev->running)
288                 return;
289
290         evdev->running = false;
291         sd_event_source_set_enabled(evdev->fd_src, SD_EVENT_OFF);
292         sd_event_source_set_enabled(evdev->idle_src, SD_EVENT_OFF);
293 }
294
295 static int idev_evdev_resume(idev_evdev *evdev, int dev_fd) {
296         idev_element *e = &evdev->element;
297         _cleanup_close_ int fd = dev_fd;
298         int r, flags;
299
300         if (fd < 0 || evdev->fd == fd) {
301                 fd = -1;
302                 idev_evdev_enable(evdev);
303                 return 0;
304         }
305
306         idev_evdev_pause(evdev, true);
307         log_debug("idev-evdev: %s/%s: resume", e->session->name, e->name);
308
309         r = fd_nonblock(fd, true);
310         if (r < 0)
311                 return r;
312
313         r = fd_cloexec(fd, true);
314         if (r < 0)
315                 return r;
316
317         flags = fcntl(fd, F_GETFL, 0);
318         if (flags < 0)
319                 return -errno;
320
321         flags &= O_ACCMODE;
322         if (flags == O_WRONLY)
323                 return -EACCES;
324
325         evdev->element.readable = true;
326         evdev->element.writable = !(flags & O_RDONLY);
327
328         /*
329          * TODO: We *MUST* re-sync the device so we get a delta of the changed
330          * state while we didn't read events from the device. This works just
331          * fine with libevdev_change_fd(), however, libevdev_new_from_fd() (or
332          * libevdev_set_fd()) don't pass us events for the initial device
333          * state. So even if we force a re-sync, we will not get the delta for
334          * the initial device state.
335          * We really need to fix libevdev to support that!
336          */
337         if (evdev->evdev)
338                 r = libevdev_change_fd(evdev->evdev, fd);
339         else
340                 r = libevdev_new_from_fd(fd, &evdev->evdev);
341
342         if (r < 0)
343                 return r;
344
345         r = sd_event_add_io(e->session->context->event,
346                             &evdev->fd_src,
347                             fd,
348                             EPOLLHUP | EPOLLERR | EPOLLIN,
349                             idev_evdev_event_fn,
350                             evdev);
351         if (r < 0)
352                 return r;
353
354         r = sd_event_add_defer(e->session->context->event,
355                                &evdev->idle_src,
356                                idev_evdev_idle_fn,
357                                evdev);
358         if (r < 0) {
359                 evdev->fd_src = sd_event_source_unref(evdev->fd_src);
360                 return r;
361         }
362
363         sd_event_source_set_enabled(evdev->fd_src, SD_EVENT_OFF);
364         sd_event_source_set_enabled(evdev->idle_src, SD_EVENT_OFF);
365
366         evdev->unsync = true;
367         evdev->fd = fd;
368         fd = -1;
369
370         idev_evdev_enable(evdev);
371         return 0;
372 }
373
374 static void idev_evdev_pause(idev_evdev *evdev, bool release) {
375         idev_element *e = &evdev->element;
376
377         if (evdev->fd < 0)
378                 return;
379
380         log_debug("idev-evdev: %s/%s: pause", e->session->name, e->name);
381
382         idev_evdev_disable(evdev);
383         if (release) {
384                 evdev->idle_src = sd_event_source_unref(evdev->idle_src);
385                 evdev->fd_src = sd_event_source_unref(evdev->fd_src);
386                 evdev->fd = safe_close(evdev->fd);
387         }
388 }
389
390 /*
391  * Unmanaged Evdev Element
392  * The unmanaged evdev element opens the evdev node for a given input device
393  * directly (/dev/input/eventX) and thus needs sufficient privileges. It opens
394  * the device only if we really require it and releases it as soon as we're
395  * disabled or closed.
396  * The unmanaged element can be used in all situations where you have direct
397  * access to input device nodes. Unlike managed evdev elements, it can be used
398  * outside of user sessions and in emergency situations where logind is not
399  * available.
400  */
401
402 static void unmanaged_evdev_resume(idev_element *e) {
403         unmanaged_evdev *eu = unmanaged_evdev_from_element(e);
404         int r, fd;
405
406         /*
407          * Unmanaged devices can be acquired on-demand. Therefore, don't
408          * acquire it unless someone opened the device *and* we're enabled.
409          */
410         if (e->n_open < 1 || !e->enabled)
411                 return;
412
413         fd = eu->evdev.fd;
414         if (fd < 0) {
415                 fd = open(eu->devnode, O_RDWR | O_CLOEXEC | O_NOCTTY | O_NONBLOCK);
416                 if (fd < 0) {
417                         if (errno != EACCES && errno != EPERM) {
418                                 log_debug("idev-evdev: %s/%s: cannot open node %s: %m",
419                                           e->session->name, e->name, eu->devnode);
420                                 return;
421                         }
422
423                         fd = open(eu->devnode, O_RDONLY | O_CLOEXEC | O_NOCTTY | O_NONBLOCK);
424                         if (fd < 0) {
425                                 log_debug("idev-evdev: %s/%s: cannot open node %s: %m",
426                                           e->session->name, e->name, eu->devnode);
427                                 return;
428                         }
429
430                         e->readable = true;
431                         e->writable = false;
432                 } else {
433                         e->readable = true;
434                         e->writable = true;
435                 }
436         }
437
438         r = idev_evdev_resume(&eu->evdev, fd);
439         if (r < 0)
440                 log_debug("idev-evdev: %s/%s: cannot resume: %s",
441                           e->session->name, e->name, strerror(-r));
442 }
443
444 static void unmanaged_evdev_pause(idev_element *e) {
445         unmanaged_evdev *eu = unmanaged_evdev_from_element(e);
446
447         /*
448          * Release the device if the device is disabled or there is no-one who
449          * opened it. This guarantees we stay only available if we're opened
450          * *and* enabled.
451          */
452
453         idev_evdev_pause(&eu->evdev, true);
454 }
455
456 static int unmanaged_evdev_new(idev_element **out, idev_session *s, struct udev_device *ud) {
457         _cleanup_(idev_element_freep) idev_element *e = NULL;
458         char name[IDEV_EVDEV_NAME_MAX];
459         unmanaged_evdev *eu;
460         const char *devnode;
461         dev_t devnum;
462         int r;
463
464         assert_return(s, -EINVAL);
465         assert_return(ud, -EINVAL);
466
467         devnode = udev_device_get_devnode(ud);
468         devnum = udev_device_get_devnum(ud);
469         if (!devnode || devnum == 0)
470                 return -ENODEV;
471
472         idev_evdev_name(name, devnum);
473
474         eu = new0(unmanaged_evdev, 1);
475         if (!eu)
476                 return -ENOMEM;
477
478         e = &eu->evdev.element;
479         eu->evdev = IDEV_EVDEV_INIT(&unmanaged_evdev_vtable, s);
480
481         eu->devnode = strdup(devnode);
482         if (!eu->devnode)
483                 return -ENOMEM;
484
485         r = idev_element_add(e, name);
486         if (r < 0)
487                 return r;
488
489         if (out)
490                 *out = e;
491         e = NULL;
492         return 0;
493 }
494
495 static void unmanaged_evdev_free(idev_element *e) {
496         unmanaged_evdev *eu = unmanaged_evdev_from_element(e);
497
498         idev_evdev_destroy(&eu->evdev);
499         free(eu->devnode);
500         free(eu);
501 }
502
503 static const idev_element_vtable unmanaged_evdev_vtable = {
504         .free                   = unmanaged_evdev_free,
505         .enable                 = unmanaged_evdev_resume,
506         .disable                = unmanaged_evdev_pause,
507         .open                   = unmanaged_evdev_resume,
508         .close                  = unmanaged_evdev_pause,
509 };
510
511 /*
512  * Managed Evdev Element
513  * The managed evdev element uses systemd-logind to acquire evdev devices. This
514  * means, we do not open the device node /dev/input/eventX directly. Instead,
515  * logind passes us a file-descriptor whenever our session is activated. Thus,
516  * we don't need access to the device node directly.
517  * Furthermore, whenever the session is put asleep, logind revokes the
518  * file-descriptor so we loose access to the device.
519  * Managed evdev elements should be preferred over unmanaged elements whenever
520  * you run inside a user session with exclusive device access.
521  */
522
523 static int managed_evdev_take_device_fn(sd_bus *bus,
524                                         sd_bus_message *reply,
525                                         void *userdata,
526                                         sd_bus_error *ret_error) {
527         managed_evdev *em = userdata;
528         idev_element *e = &em->evdev.element;
529         idev_session *s = e->session;
530         int r, paused, fd;
531
532         em->slot_take_device = sd_bus_slot_unref(em->slot_take_device);
533
534         if (sd_bus_message_is_method_error(reply, NULL)) {
535                 const sd_bus_error *error = sd_bus_message_get_error(reply);
536
537                 log_debug("idev-evdev: %s/%s: TakeDevice failed: %s: %s",
538                           s->name, e->name, error->name, error->message);
539                 return 0;
540         }
541
542         em->acquired = true;
543
544         r = sd_bus_message_read(reply, "hb", &fd, &paused);
545         if (r < 0) {
546                 log_debug("idev-evdev: %s/%s: erroneous TakeDevice reply", s->name, e->name);
547                 return 0;
548         }
549
550         /* If the device is paused, ignore it; we will get the next fd via
551          * ResumeDevice signals. */
552         if (paused)
553                 return 0;
554
555         fd = fcntl(fd, F_DUPFD_CLOEXEC, 3);
556         if (fd < 0) {
557                 log_debug("idev-evdev: %s/%s: cannot duplicate evdev fd: %m", s->name, e->name);
558                 return 0;
559         }
560
561         r = idev_evdev_resume(&em->evdev, fd);
562         if (r < 0)
563                 log_debug("idev-evdev: %s/%s: cannot resume: %s",
564                           s->name, e->name, strerror(-r));
565
566         return 0;
567 }
568
569 static void managed_evdev_resume(idev_element *e) {
570         _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
571         managed_evdev *em = managed_evdev_from_element(e);
572         idev_session *s = e->session;
573         idev_context *c = s->context;
574         int r;
575
576         /*
577          * Acquiring managed devices is heavy, so do it only once we're
578          * enabled *and* opened by someone.
579          */
580         if (e->n_open < 1 || !e->enabled)
581                 return;
582
583         /* bail out if already pending */
584         if (em->requested)
585                 return;
586
587         r = sd_bus_message_new_method_call(c->sysbus,
588                                            &m,
589                                            "org.freedesktop.login1",
590                                            s->path,
591                                            "org.freedesktop.login1.Session",
592                                            "TakeDevice");
593         if (r < 0)
594                 goto error;
595
596         r = sd_bus_message_append(m, "uu", major(em->devnum), minor(em->devnum));
597         if (r < 0)
598                 goto error;
599
600         r = sd_bus_call_async(c->sysbus,
601                               &em->slot_take_device,
602                               m,
603                               managed_evdev_take_device_fn,
604                               em,
605                               0);
606         if (r < 0)
607                 goto error;
608
609         em->requested = true;
610         return;
611
612 error:
613         log_debug("idev-evdev: %s/%s: cannot send TakeDevice request: %s",
614                   s->name, e->name, strerror(-r));
615 }
616
617 static void managed_evdev_pause(idev_element *e) {
618         _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
619         managed_evdev *em = managed_evdev_from_element(e);
620         idev_session *s = e->session;
621         idev_context *c = s->context;
622         int r;
623
624         /*
625          * Releasing managed devices is heavy. Once acquired, we get
626          * notifications for sleep/wake-up events, so there's no reason to
627          * release it if disabled but opened. However, if a device is closed,
628          * we release it immediately as we don't care for sleep/wake-up events
629          * then (even if we're actually enabled).
630          */
631
632         idev_evdev_pause(&em->evdev, false);
633
634         if (e->n_open > 0 || !em->requested)
635                 return;
636
637         /*
638          * If TakeDevice() is pending or was successful, make sure to
639          * release the device again. We don't care for return-values,
640          * so send it without waiting or callbacks.
641          * If a failed TakeDevice() is pending, but someone else took
642          * the device on the same bus-connection, we might incorrectly
643          * release their device. This is an unlikely race, though.
644          * Furthermore, you really shouldn't have two users of the
645          * controller-API on the same session, on the same devices, *AND* on
646          * the same bus-connection. So we don't care for that race..
647          */
648
649         idev_evdev_pause(&em->evdev, true);
650         em->requested = false;
651
652         if (!em->acquired && !em->slot_take_device)
653                 return;
654
655         em->slot_take_device = sd_bus_slot_unref(em->slot_take_device);
656         em->acquired = false;
657
658         r = sd_bus_message_new_method_call(c->sysbus,
659                                            &m,
660                                            "org.freedesktop.login1",
661                                            s->path,
662                                            "org.freedesktop.login1.Session",
663                                            "ReleaseDevice");
664         if (r >= 0) {
665                 r = sd_bus_message_append(m, "uu", major(em->devnum), minor(em->devnum));
666                 if (r >= 0)
667                         r = sd_bus_send(c->sysbus, m, NULL);
668         }
669
670         if (r < 0 && r != -ENOTCONN)
671                 log_debug("idev-evdev: %s/%s: cannot send ReleaseDevice: %s",
672                           s->name, e->name, strerror(-r));
673 }
674
675 static int managed_evdev_pause_device_fn(sd_bus *bus,
676                                          sd_bus_message *signal,
677                                          void *userdata,
678                                          sd_bus_error *ret_error) {
679         managed_evdev *em = userdata;
680         idev_element *e = &em->evdev.element;
681         idev_session *s = e->session;
682         idev_context *c = s->context;
683         uint32_t major, minor;
684         const char *mode;
685         int r;
686
687         /*
688          * We get PauseDevice() signals from logind whenever a device we
689          * requested was, or is about to be, paused. Arguments are major/minor
690          * number of the device and the mode of the operation.
691          * In case the event is not about our device, we ignore it. Otherwise,
692          * we treat it as asynchronous access-revocation (as if we got HUP on
693          * the device fd). Note that we might have already treated the HUP
694          * event via EPOLLHUP, whichever comes first.
695          *
696          * @mode can be one of the following:
697          *   "pause": The device is about to be paused. We must react
698          *            immediately and respond with PauseDeviceComplete(). Once
699          *            we replied, logind will pause the device. Note that
700          *            logind might apply any kind of timeout and force pause
701          *            the device if we don't respond in a timely manner. In
702          *            this case, we will receive a second PauseDevice event
703          *            with @mode set to "force" (or similar).
704          *   "force": The device was disabled forecfully by logind. Access is
705          *            already revoked. This is just an asynchronous
706          *            notification so we can put the device asleep (in case
707          *            we didn't already notice the access revocation).
708          *    "gone": This is like "force" but is sent if the device was
709          *            paused due to a device-removal event.
710          *
711          * We always handle PauseDevice signals as "force" as we properly
712          * support asynchronous access revocation, anyway. But in case logind
713          * sent mode "pause", we also call PauseDeviceComplete() to immediately
714          * acknowledge the request.
715          */
716
717         r = sd_bus_message_read(signal, "uus", &major, &minor, &mode);
718         if (r < 0) {
719                 log_debug("idev-evdev: %s/%s: erroneous PauseDevice signal",
720                           s->name, e->name);
721                 return 0;
722         }
723
724         /* not our device? */
725         if (makedev(major, minor) != em->devnum)
726                 return 0;
727
728         idev_evdev_pause(&em->evdev, true);
729
730         if (streq(mode, "pause")) {
731                 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
732
733                 /*
734                  * Sending PauseDeviceComplete() is racy if logind triggers the
735                  * timeout. That is, if we take too long and logind pauses the
736                  * device by sending a forced PauseDevice, our
737                  * PauseDeviceComplete call will be stray. That's fine, though.
738                  * logind ignores such stray calls. Only if logind also sent a
739                  * further PauseDevice() signal, it might match our call
740                  * incorrectly to the newer PauseDevice(). That's fine, too, as
741                  * we handle that event asynchronously, anyway. Therefore,
742                  * whatever happens, we're fine. Yay!
743                  */
744
745                 r = sd_bus_message_new_method_call(c->sysbus,
746                                                    &m,
747                                                    "org.freedesktop.login1",
748                                                    s->path,
749                                                    "org.freedesktop.login1.Session",
750                                                    "PauseDeviceComplete");
751                 if (r >= 0) {
752                         r = sd_bus_message_append(m, "uu", major, minor);
753                         if (r >= 0)
754                                 r = sd_bus_send(c->sysbus, m, NULL);
755                 }
756
757                 if (r < 0)
758                         log_debug("idev-evdev: %s/%s: cannot send PauseDeviceComplete: %s",
759                                   s->name, e->name, strerror(-r));
760         }
761
762         return 0;
763 }
764
765 static int managed_evdev_resume_device_fn(sd_bus *bus,
766                                           sd_bus_message *signal,
767                                           void *userdata,
768                                           sd_bus_error *ret_error) {
769         managed_evdev *em = userdata;
770         idev_element *e = &em->evdev.element;
771         idev_session *s = e->session;
772         uint32_t major, minor;
773         int r, fd;
774
775         /*
776          * We get ResumeDevice signals whenever logind resumed a previously
777          * paused device. The arguments contain the major/minor number of the
778          * related device and a new file-descriptor for the freshly opened
779          * device-node.
780          * If the signal is not about our device, we simply ignore it.
781          * Otherwise, we take the file-descriptor and immediately resume the
782          * device.
783          */
784
785         r = sd_bus_message_read(signal, "uuh", &major, &minor, &fd);
786         if (r < 0) {
787                 log_debug("idev-evdev: %s/%s: erroneous ResumeDevice signal",
788                           s->name, e->name);
789                 return 0;
790         }
791
792         /* not our device? */
793         if (makedev(major, minor) != em->devnum)
794                 return 0;
795
796         fd = fcntl(fd, F_DUPFD_CLOEXEC, 3);
797         if (fd < 0) {
798                 log_debug("idev-evdev: %s/%s: cannot duplicate evdev fd: %m",
799                           s->name, e->name);
800                 return 0;
801         }
802
803         r = idev_evdev_resume(&em->evdev, fd);
804         if (r < 0)
805                 log_debug("idev-evdev: %s/%s: cannot resume: %s",
806                           s->name, e->name, strerror(-r));
807
808         return 0;
809 }
810
811 static int managed_evdev_setup_bus(managed_evdev *em) {
812         idev_element *e = &em->evdev.element;
813         idev_session *s = e->session;
814         idev_context *c = s->context;
815         _cleanup_free_ char *match = NULL;
816         int r;
817
818         match = strjoin("type='signal',"
819                         "sender='org.freedesktop.login1',"
820                         "interface='org.freedesktop.login1.Session',"
821                         "member='PauseDevice',"
822                         "path='", s->path, "'",
823                         NULL);
824         if (!match)
825                 return -ENOMEM;
826
827         r = sd_bus_add_match(c->sysbus,
828                              &em->slot_pause_device,
829                              match,
830                              managed_evdev_pause_device_fn,
831                              em);
832         if (r < 0)
833                 return r;
834
835         free(match);
836         match = strjoin("type='signal',"
837                         "sender='org.freedesktop.login1',"
838                         "interface='org.freedesktop.login1.Session',"
839                         "member='ResumeDevice',"
840                         "path='", s->path, "'",
841                         NULL);
842         if (!match)
843                 return -ENOMEM;
844
845         r = sd_bus_add_match(c->sysbus,
846                              &em->slot_resume_device,
847                              match,
848                              managed_evdev_resume_device_fn,
849                              em);
850         if (r < 0)
851                 return r;
852
853         return 0;
854 }
855
856 static int managed_evdev_new(idev_element **out, idev_session *s, struct udev_device *ud) {
857         _cleanup_(idev_element_freep) idev_element *e = NULL;
858         char name[IDEV_EVDEV_NAME_MAX];
859         managed_evdev *em;
860         dev_t devnum;
861         int r;
862
863         assert_return(s, -EINVAL);
864         assert_return(s->managed, -EINVAL);
865         assert_return(s->context->sysbus, -EINVAL);
866         assert_return(ud, -EINVAL);
867
868         devnum = udev_device_get_devnum(ud);
869         if (devnum == 0)
870                 return -ENODEV;
871
872         idev_evdev_name(name, devnum);
873
874         em = new0(managed_evdev, 1);
875         if (!em)
876                 return -ENOMEM;
877
878         e = &em->evdev.element;
879         em->evdev = IDEV_EVDEV_INIT(&managed_evdev_vtable, s);
880         em->devnum = devnum;
881
882         r = managed_evdev_setup_bus(em);
883         if (r < 0)
884                 return r;
885
886         r = idev_element_add(e, name);
887         if (r < 0)
888                 return r;
889
890         if (out)
891                 *out = e;
892         e = NULL;
893         return 0;
894 }
895
896 static void managed_evdev_free(idev_element *e) {
897         managed_evdev *em = managed_evdev_from_element(e);
898
899         em->slot_resume_device = sd_bus_slot_unref(em->slot_resume_device);
900         em->slot_pause_device = sd_bus_slot_unref(em->slot_pause_device);
901         idev_evdev_destroy(&em->evdev);
902         free(em);
903 }
904
905 static const idev_element_vtable managed_evdev_vtable = {
906         .free                   = managed_evdev_free,
907         .enable                 = managed_evdev_resume,
908         .disable                = managed_evdev_pause,
909         .open                   = managed_evdev_resume,
910         .close                  = managed_evdev_pause,
911 };
912
913 /*
914  * Generic Constructor
915  * Instead of relying on the caller to choose between managed and unmanaged
916  * evdev devices, the idev_evdev_new() constructor does that for you (by
917  * looking at s->managed).
918  */
919
920 bool idev_is_evdev(idev_element *e) {
921         return e && (e->vtable == &unmanaged_evdev_vtable ||
922                      e->vtable == &managed_evdev_vtable);
923 }
924
925 idev_element *idev_find_evdev(idev_session *s, dev_t devnum) {
926         char name[IDEV_EVDEV_NAME_MAX];
927
928         assert_return(s, NULL);
929         assert_return(devnum != 0, NULL);
930
931         idev_evdev_name(name, devnum);
932         return idev_find_element(s, name);
933 }
934
935 int idev_evdev_new(idev_element **out, idev_session *s, struct udev_device *ud) {
936         assert_return(s, -EINVAL);
937         assert_return(ud, -EINVAL);
938
939         return s->managed ? managed_evdev_new(out, s, ud) : unmanaged_evdev_new(out, s, ud);
940 }