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