1c0abf9e6Sopenharmony_ci// SPDX-License-Identifier: MIT 2c0abf9e6Sopenharmony_ci/* 3c0abf9e6Sopenharmony_ci * Copyright © 2013 Red Hat, Inc. 4c0abf9e6Sopenharmony_ci */ 5c0abf9e6Sopenharmony_ci 6c0abf9e6Sopenharmony_ci#include "config.h" 7c0abf9e6Sopenharmony_ci#include <check.h> 8c0abf9e6Sopenharmony_ci#include <errno.h> 9c0abf9e6Sopenharmony_ci#include <fcntl.h> 10c0abf9e6Sopenharmony_ci#include <stdio.h> 11c0abf9e6Sopenharmony_ci 12c0abf9e6Sopenharmony_ci#include "test-common.h" 13c0abf9e6Sopenharmony_ci 14c0abf9e6Sopenharmony_civoid test_logfunc_abort_on_error(enum libevdev_log_priority priority, 15c0abf9e6Sopenharmony_ci void *data, 16c0abf9e6Sopenharmony_ci const char *file, int line, 17c0abf9e6Sopenharmony_ci const char *func, 18c0abf9e6Sopenharmony_ci const char *format, va_list args) 19c0abf9e6Sopenharmony_ci{ 20c0abf9e6Sopenharmony_ci vprintf(format, args); 21c0abf9e6Sopenharmony_ci ck_abort(); 22c0abf9e6Sopenharmony_ci} 23c0abf9e6Sopenharmony_ci 24c0abf9e6Sopenharmony_civoid test_logfunc_ignore_error(enum libevdev_log_priority priority, 25c0abf9e6Sopenharmony_ci void *data, 26c0abf9e6Sopenharmony_ci const char *file, int line, 27c0abf9e6Sopenharmony_ci const char *func, 28c0abf9e6Sopenharmony_ci const char *format, va_list args) 29c0abf9e6Sopenharmony_ci{ 30c0abf9e6Sopenharmony_ci} 31c0abf9e6Sopenharmony_ci 32c0abf9e6Sopenharmony_civoid test_create_device(struct uinput_device **uidev_return, 33c0abf9e6Sopenharmony_ci struct libevdev **dev_return, 34c0abf9e6Sopenharmony_ci ...) 35c0abf9e6Sopenharmony_ci{ 36c0abf9e6Sopenharmony_ci int rc, fd; 37c0abf9e6Sopenharmony_ci struct uinput_device *uidev; 38c0abf9e6Sopenharmony_ci struct libevdev *dev; 39c0abf9e6Sopenharmony_ci va_list args; 40c0abf9e6Sopenharmony_ci 41c0abf9e6Sopenharmony_ci va_start(args, dev_return); 42c0abf9e6Sopenharmony_ci 43c0abf9e6Sopenharmony_ci rc = uinput_device_new_with_events_v(&uidev, TEST_DEVICE_NAME, DEFAULT_IDS, args); 44c0abf9e6Sopenharmony_ci va_end(args); 45c0abf9e6Sopenharmony_ci 46c0abf9e6Sopenharmony_ci ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc)); 47c0abf9e6Sopenharmony_ci 48c0abf9e6Sopenharmony_ci fd = uinput_device_get_fd(uidev); 49c0abf9e6Sopenharmony_ci 50c0abf9e6Sopenharmony_ci rc = libevdev_new_from_fd(fd, &dev); 51c0abf9e6Sopenharmony_ci ck_assert_msg(rc == 0, "Failed to init device device: %s", strerror(-rc)); 52c0abf9e6Sopenharmony_ci rc = fcntl(fd, F_SETFL, O_NONBLOCK); 53c0abf9e6Sopenharmony_ci ck_assert_msg(rc == 0, "fcntl failed: %s", strerror(errno)); 54c0abf9e6Sopenharmony_ci 55c0abf9e6Sopenharmony_ci *uidev_return = uidev; 56c0abf9e6Sopenharmony_ci *dev_return = dev; 57c0abf9e6Sopenharmony_ci} 58c0abf9e6Sopenharmony_ci 59c0abf9e6Sopenharmony_civoid test_create_abs_device(struct uinput_device **uidev_return, 60c0abf9e6Sopenharmony_ci struct libevdev **dev_return, 61c0abf9e6Sopenharmony_ci int nabs, 62c0abf9e6Sopenharmony_ci const struct input_absinfo *abs, 63c0abf9e6Sopenharmony_ci ...) 64c0abf9e6Sopenharmony_ci{ 65c0abf9e6Sopenharmony_ci int rc, fd; 66c0abf9e6Sopenharmony_ci struct uinput_device *uidev; 67c0abf9e6Sopenharmony_ci struct libevdev *dev; 68c0abf9e6Sopenharmony_ci va_list args; 69c0abf9e6Sopenharmony_ci 70c0abf9e6Sopenharmony_ci uidev = uinput_device_new(TEST_DEVICE_NAME); 71c0abf9e6Sopenharmony_ci ck_assert(uidev != NULL); 72c0abf9e6Sopenharmony_ci 73c0abf9e6Sopenharmony_ci va_start(args, abs); 74c0abf9e6Sopenharmony_ci rc = uinput_device_set_event_bits_v(uidev, args); 75c0abf9e6Sopenharmony_ci ck_assert_msg(rc == 0, "Failed to set uinput bits"); 76c0abf9e6Sopenharmony_ci va_end(args); 77c0abf9e6Sopenharmony_ci 78c0abf9e6Sopenharmony_ci while (--nabs >= 0) { 79c0abf9e6Sopenharmony_ci int code; 80c0abf9e6Sopenharmony_ci struct input_absinfo a; 81c0abf9e6Sopenharmony_ci 82c0abf9e6Sopenharmony_ci code = abs[nabs].value; 83c0abf9e6Sopenharmony_ci a = abs[nabs]; 84c0abf9e6Sopenharmony_ci a.value = 0; 85c0abf9e6Sopenharmony_ci 86c0abf9e6Sopenharmony_ci rc = uinput_device_set_abs_bit(uidev, code, &a); 87c0abf9e6Sopenharmony_ci ck_assert_msg(rc == 0, "for abs field %d\n", nabs); 88c0abf9e6Sopenharmony_ci } 89c0abf9e6Sopenharmony_ci 90c0abf9e6Sopenharmony_ci rc = uinput_device_create(uidev); 91c0abf9e6Sopenharmony_ci ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc)); 92c0abf9e6Sopenharmony_ci 93c0abf9e6Sopenharmony_ci fd = uinput_device_get_fd(uidev); 94c0abf9e6Sopenharmony_ci 95c0abf9e6Sopenharmony_ci rc = libevdev_new_from_fd(fd, &dev); 96c0abf9e6Sopenharmony_ci ck_assert_msg(rc == 0, "Failed to init device device: %s", strerror(-rc)); 97c0abf9e6Sopenharmony_ci rc = fcntl(fd, F_SETFL, O_NONBLOCK); 98c0abf9e6Sopenharmony_ci ck_assert_msg(rc == 0, "fcntl failed: %s", strerror(errno)); 99c0abf9e6Sopenharmony_ci 100c0abf9e6Sopenharmony_ci *uidev_return = uidev; 101c0abf9e6Sopenharmony_ci *dev_return = dev; 102c0abf9e6Sopenharmony_ci} 103