You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
998 B
53 lines
998 B
/* |
|
* Copyright 2023 Google LLC |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
*/ |
|
|
|
#include <errno.h> |
|
#include <fcntl.h> |
|
#include <linux/input.h> |
|
#include <nsi_tracing.h> |
|
#include <string.h> |
|
#include <unistd.h> |
|
|
|
#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; |
|
}
|
|
|