1 /*
2 * Copyright (c) 2022 Sean Young <sean@mess.org>
3 *
4 * SPDX-License-Identifier: LGPL-2.1-or-later
5 */
6
7 #include "defs.h"
8 #include <linux/lirc.h>
9 #include "xlat/lirc_features.h"
10 #include "xlat/lirc_modes.h"
11
12 int
13 lirc_ioctl(struct tcb *const tcp, const unsigned int code,
14 const kernel_ulong_t arg)
15 {
16 unsigned int value;
17
18 switch (code) {
19 case LIRC_GET_FEATURES:
20 case LIRC_GET_SEND_MODE:
21 case LIRC_GET_REC_MODE:
22 case LIRC_GET_REC_RESOLUTION:
23 case LIRC_GET_MIN_TIMEOUT:
24 case LIRC_GET_MAX_TIMEOUT:
25 case LIRC_GET_LENGTH:
26 case LIRC_SET_SEND_MODE:
27 case LIRC_SET_REC_MODE:
28 case LIRC_SET_SEND_CARRIER:
29 case LIRC_SET_REC_CARRIER:
30 case LIRC_SET_SEND_DUTY_CYCLE:
31 case LIRC_SET_TRANSMITTER_MASK:
32 case LIRC_SET_REC_TIMEOUT:
33 case LIRC_SET_REC_TIMEOUT_REPORTS:
34 case LIRC_SET_MEASURE_CARRIER_MODE:
35 case LIRC_SET_REC_CARRIER_RANGE:
36 case LIRC_SET_WIDEBAND_RECEIVER:
37 case LIRC_GET_REC_TIMEOUT:
38 break;
39 default:
40 return RVAL_DECODED;
41 }
42
43 if (entering(tcp)) {
44 tprint_arg_next();
45 if (_IOC_DIR(code) == _IOC_READ)
46 return 0;
47 }
48
49 if (umove_or_printaddr(tcp, arg, &value))
50 return RVAL_IOCTL_DECODED;
51
52 tprint_indirect_begin();
53
54 switch (code) {
55 case LIRC_GET_FEATURES:
56 printflags(lirc_features, value, "LIRC_CAN_???");
57 break;
58 case LIRC_GET_SEND_MODE:
59 case LIRC_GET_REC_MODE:
60 case LIRC_SET_SEND_MODE:
61 case LIRC_SET_REC_MODE:
62 printxval(lirc_modes, value, "LIRC_MODE_???");
63 break;
64 case LIRC_SET_TRANSMITTER_MASK:
65 PRINT_VAL_X(value);
66 break;
67 default:
68 PRINT_VAL_U(value);
69 break;
70 }
71
72 tprint_indirect_end();
73
74 return RVAL_IOCTL_DECODED;
75 }