2 * 32bit compatibility wrappers for the input subsystem.
4 * Very heavily based on evdev.c - Copyright (c) 1999-2002 Vojtech Pavlik
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published by
8 * the Free Software Foundation.
11 #include <linux/export.h>
12 #include <asm/uaccess.h>
13 #include "input-compat.h"
17 int input_event_from_user(const char __user
*buffer
,
18 struct input_event
*event
)
20 if (INPUT_COMPAT_TEST
&& !COMPAT_USE_64BIT_TIME
) {
21 struct input_event_compat compat_event
;
23 if (copy_from_user(&compat_event
, buffer
,
24 sizeof(struct input_event_compat
)))
27 event
->time
.tv_sec
= compat_event
.time
.tv_sec
;
28 event
->time
.tv_usec
= compat_event
.time
.tv_usec
;
29 event
->type
= compat_event
.type
;
30 event
->code
= compat_event
.code
;
31 event
->value
= compat_event
.value
;
34 if (copy_from_user(event
, buffer
, sizeof(struct input_event
)))
41 int input_event_to_user(char __user
*buffer
,
42 const struct input_event
*event
)
44 if (INPUT_COMPAT_TEST
&& !COMPAT_USE_64BIT_TIME
) {
45 struct input_event_compat compat_event
;
47 compat_event
.time
.tv_sec
= event
->time
.tv_sec
;
48 compat_event
.time
.tv_usec
= event
->time
.tv_usec
;
49 compat_event
.type
= event
->type
;
50 compat_event
.code
= event
->code
;
51 compat_event
.value
= event
->value
;
53 if (copy_to_user(buffer
, &compat_event
,
54 sizeof(struct input_event_compat
)))
58 if (copy_to_user(buffer
, event
, sizeof(struct input_event
)))
65 int input_ff_effect_from_user(const char __user
*buffer
, size_t size
,
66 struct ff_effect
*effect
)
68 if (INPUT_COMPAT_TEST
) {
69 struct ff_effect_compat
*compat_effect
;
71 if (size
!= sizeof(struct ff_effect_compat
))
75 * It so happens that the pointer which needs to be changed
76 * is the last field in the structure, so we can retrieve the
77 * whole thing and replace just the pointer.
79 compat_effect
= (struct ff_effect_compat
*)effect
;
81 if (copy_from_user(compat_effect
, buffer
,
82 sizeof(struct ff_effect_compat
)))
85 if (compat_effect
->type
== FF_PERIODIC
&&
86 compat_effect
->u
.periodic
.waveform
== FF_CUSTOM
)
87 effect
->u
.periodic
.custom_data
=
88 compat_ptr(compat_effect
->u
.periodic
.custom_data
);
90 if (size
!= sizeof(struct ff_effect
))
93 if (copy_from_user(effect
, buffer
, sizeof(struct ff_effect
)))
102 int input_event_from_user(const char __user
*buffer
,
103 struct input_event
*event
)
105 if (copy_from_user(event
, buffer
, sizeof(struct input_event
)))
111 int input_event_to_user(char __user
*buffer
,
112 const struct input_event
*event
)
114 if (copy_to_user(buffer
, event
, sizeof(struct input_event
)))
120 int input_ff_effect_from_user(const char __user
*buffer
, size_t size
,
121 struct ff_effect
*effect
)
123 if (size
!= sizeof(struct ff_effect
))
126 if (copy_from_user(effect
, buffer
, sizeof(struct ff_effect
)))
132 #endif /* CONFIG_COMPAT */
134 EXPORT_SYMBOL_GPL(input_event_from_user
);
135 EXPORT_SYMBOL_GPL(input_event_to_user
);
136 EXPORT_SYMBOL_GPL(input_ff_effect_from_user
);