+ if (b->fd >= 0) {
+ close(b->fd);
+ b->fd = -1;
+ }
+
+ p = strappenda("/dev/input/", b->name);
+
+ b->fd = open(p, O_RDWR|O_CLOEXEC|O_NOCTTY|O_NONBLOCK);
+ if (b->fd < 0)
+ return log_warning_errno(errno, "Failed to open %s: %m", b->name);
+
+ if (ioctl(b->fd, EVIOCGNAME(sizeof(name)), name) < 0) {
+ log_error_errno(errno, "Failed to get input name: %m");
+ r = -errno;
+ goto fail;
+ }
+
+ r = sd_event_add_io(b->manager->event, &b->io_event_source, b->fd, EPOLLIN, button_dispatch, b);
+ if (r < 0) {
+ log_error_errno(r, "Failed to add button event: %m");
+ goto fail;
+ }
+
+ log_info("Watching system buttons on /dev/input/%s (%s)", b->name, name);
+
+ return 0;
+
+fail:
+ close(b->fd);
+ b->fd = -1;
+ return r;
+}
+
+int button_check_switches(Button *b) {
+ uint8_t switches[SW_MAX/8+1] = {};
+ assert(b);
+
+ if (b->fd < 0)
+ return -EINVAL;