/* * Copyright 2023 Google LLC * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #include #include #include #include "linux_evdev_bottom.h" int linux_evdev_read(int fd, uint16_t *type, uint16_t *code, int32_t *value) { struct input_event ev; int ret; ret = read(fd, &ev, sizeof(ev)); if (ret < 0) { if (errno == EAGAIN || errno == EINTR) { return NATIVE_LINUX_EVDEV_NO_DATA; } nsi_print_warning("Read error: %s", strerror(errno)); return -EIO; } else if (ret < sizeof(ev)) { nsi_print_warning("Unexpected read size: %d, expecting %d", ret, sizeof(ev)); return -EIO; } *type = ev.type; *code = ev.code; *value = ev.value; return 0; } int linux_evdev_open(const char *path) { int fd; fd = open(path, O_RDONLY | O_NONBLOCK); if (fd < 0) { nsi_print_error_and_exit( "Failed to open the evdev device %s: %s\n", path, strerror(errno)); } return fd; }