evdev.c 24.6 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10
/*
 * Event char devices, giving access to raw input device events.
 *
 * Copyright (c) 1999-2002 Vojtech Pavlik
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published by
 * the Free Software Foundation.
 */

J
Joe Perches 已提交
11 12
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

L
Linus Torvalds 已提交
13 14
#define EVDEV_MINOR_BASE	64
#define EVDEV_MINORS		32
15 16
#define EVDEV_MIN_BUFFER_SIZE	64U
#define EVDEV_BUF_PACKETS	8
L
Linus Torvalds 已提交
17 18

#include <linux/poll.h>
19
#include <linux/sched.h>
L
Linus Torvalds 已提交
20 21 22
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/init.h>
23
#include <linux/input/mt.h>
L
Linus Torvalds 已提交
24 25
#include <linux/major.h>
#include <linux/device.h>
26
#include "input-compat.h"
L
Linus Torvalds 已提交
27 28 29 30 31 32

struct evdev {
	int open;
	int minor;
	struct input_handle handle;
	wait_queue_head_t wait;
A
Arnd Bergmann 已提交
33
	struct evdev_client __rcu *grab;
34
	struct list_head client_list;
35 36
	spinlock_t client_lock; /* protects client_list */
	struct mutex mutex;
37
	struct device dev;
38
	bool exist;
L
Linus Torvalds 已提交
39 40
};

41
struct evdev_client {
42 43
	unsigned int head;
	unsigned int tail;
44
	unsigned int packet_head; /* [future] position of the first element of next packet */
45
	spinlock_t buffer_lock; /* protects access to buffer, head and tail */
L
Linus Torvalds 已提交
46 47 48
	struct fasync_struct *fasync;
	struct evdev *evdev;
	struct list_head node;
49
	int clkid;
50
	unsigned int bufsize;
51
	struct input_event buffer[];
L
Linus Torvalds 已提交
52 53 54
};

static struct evdev *evdev_table[EVDEV_MINORS];
55
static DEFINE_MUTEX(evdev_table_mutex);
L
Linus Torvalds 已提交
56

57 58
static void __pass_event(struct evdev_client *client,
			 const struct input_event *event)
59
{
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
	client->buffer[client->head++] = *event;
	client->head &= client->bufsize - 1;

	if (unlikely(client->head == client->tail)) {
		/*
		 * This effectively "drops" all unconsumed events, leaving
		 * EV_SYN/SYN_DROPPED plus the newest event in the queue.
		 */
		client->tail = (client->head - 2) & (client->bufsize - 1);

		client->buffer[client->tail].time = event->time;
		client->buffer[client->tail].type = EV_SYN;
		client->buffer[client->tail].code = SYN_DROPPED;
		client->buffer[client->tail].value = 0;

75 76
		client->packet_head = client->tail;
	}
77

78 79
	if (event->type == EV_SYN && event->code == SYN_REPORT) {
		client->packet_head = client->head;
80
		kill_fasync(&client->fasync, SIGIO, POLL_IN);
81
	}
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
}

static void evdev_pass_values(struct evdev_client *client,
			const struct input_value *vals, unsigned int count,
			ktime_t mono, ktime_t real)
{
	struct evdev *evdev = client->evdev;
	const struct input_value *v;
	struct input_event event;
	bool wakeup = false;

	event.time = ktime_to_timeval(client->clkid == CLOCK_MONOTONIC ?
				      mono : real);

	/* Interrupts are disabled, just acquire the lock. */
	spin_lock(&client->buffer_lock);

	for (v = vals; v != vals + count; v++) {
		event.type = v->type;
		event.code = v->code;
		event.value = v->value;
		__pass_event(client, &event);
		if (v->type == EV_SYN && v->code == SYN_REPORT)
			wakeup = true;
	}
107 108

	spin_unlock(&client->buffer_lock);
109 110 111

	if (wakeup)
		wake_up_interruptible(&evdev->wait);
112 113 114
}

/*
115
 * Pass incoming events to all connected clients.
116
 */
117 118
static void evdev_events(struct input_handle *handle,
			 const struct input_value *vals, unsigned int count)
L
Linus Torvalds 已提交
119 120
{
	struct evdev *evdev = handle->private;
121
	struct evdev_client *client;
122 123 124 125
	ktime_t time_mono, time_real;

	time_mono = ktime_get();
	time_real = ktime_sub(time_mono, ktime_get_monotonic_offset());
L
Linus Torvalds 已提交
126

D
Dmitry Torokhov 已提交
127 128
	rcu_read_lock();

129
	client = rcu_dereference(evdev->grab);
130

131
	if (client)
132
		evdev_pass_values(client, vals, count, time_mono, time_real);
133 134
	else
		list_for_each_entry_rcu(client, &evdev->client_list, node)
135 136
			evdev_pass_values(client, vals, count,
					  time_mono, time_real);
L
Linus Torvalds 已提交
137

D
Dmitry Torokhov 已提交
138
	rcu_read_unlock();
139
}
D
Dmitry Torokhov 已提交
140

141 142 143 144 145 146 147 148 149
/*
 * Pass incoming event to all connected clients.
 */
static void evdev_event(struct input_handle *handle,
			unsigned int type, unsigned int code, int value)
{
	struct input_value vals[] = { { type, code, value } };

	evdev_events(handle, vals, 1);
L
Linus Torvalds 已提交
150 151 152 153
}

static int evdev_fasync(int fd, struct file *file, int on)
{
154
	struct evdev_client *client = file->private_data;
155

156
	return fasync_helper(fd, file, on, &client->fasync);
L
Linus Torvalds 已提交
157 158
}

159
static int evdev_flush(struct file *file, fl_owner_t id)
L
Linus Torvalds 已提交
160
{
161 162
	struct evdev_client *client = file->private_data;
	struct evdev *evdev = client->evdev;
163 164 165 166 167
	int retval;

	retval = mutex_lock_interruptible(&evdev->mutex);
	if (retval)
		return retval;
168

169
	if (!evdev->exist)
170 171 172
		retval = -ENODEV;
	else
		retval = input_flush_device(&evdev->handle, file);
173

174 175
	mutex_unlock(&evdev->mutex);
	return retval;
L
Linus Torvalds 已提交
176 177
}

178
static void evdev_free(struct device *dev)
L
Linus Torvalds 已提交
179
{
180 181
	struct evdev *evdev = container_of(dev, struct evdev, dev);

182
	input_put_device(evdev->handle.dev);
L
Linus Torvalds 已提交
183 184 185
	kfree(evdev);
}

186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
/*
 * Grabs an event device (along with underlying input device).
 * This function is called with evdev->mutex taken.
 */
static int evdev_grab(struct evdev *evdev, struct evdev_client *client)
{
	int error;

	if (evdev->grab)
		return -EBUSY;

	error = input_grab_device(&evdev->handle);
	if (error)
		return error;

	rcu_assign_pointer(evdev->grab, client);

	return 0;
}

static int evdev_ungrab(struct evdev *evdev, struct evdev_client *client)
{
208 209 210 211
	struct evdev_client *grab = rcu_dereference_protected(evdev->grab,
					lockdep_is_held(&evdev->mutex));

	if (grab != client)
212 213 214
		return  -EINVAL;

	rcu_assign_pointer(evdev->grab, NULL);
D
Dmitry Torokhov 已提交
215
	synchronize_rcu();
216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
	input_release_device(&evdev->handle);

	return 0;
}

static void evdev_attach_client(struct evdev *evdev,
				struct evdev_client *client)
{
	spin_lock(&evdev->client_lock);
	list_add_tail_rcu(&client->node, &evdev->client_list);
	spin_unlock(&evdev->client_lock);
}

static void evdev_detach_client(struct evdev *evdev,
				struct evdev_client *client)
{
	spin_lock(&evdev->client_lock);
	list_del_rcu(&client->node);
	spin_unlock(&evdev->client_lock);
D
Dmitry Torokhov 已提交
235
	synchronize_rcu();
236 237 238 239 240 241 242 243 244 245 246 247
}

static int evdev_open_device(struct evdev *evdev)
{
	int retval;

	retval = mutex_lock_interruptible(&evdev->mutex);
	if (retval)
		return retval;

	if (!evdev->exist)
		retval = -ENODEV;
248
	else if (!evdev->open++) {
249
		retval = input_open_device(&evdev->handle);
250 251 252
		if (retval)
			evdev->open--;
	}
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283

	mutex_unlock(&evdev->mutex);
	return retval;
}

static void evdev_close_device(struct evdev *evdev)
{
	mutex_lock(&evdev->mutex);

	if (evdev->exist && !--evdev->open)
		input_close_device(&evdev->handle);

	mutex_unlock(&evdev->mutex);
}

/*
 * Wake up users waiting for IO so they can disconnect from
 * dead device.
 */
static void evdev_hangup(struct evdev *evdev)
{
	struct evdev_client *client;

	spin_lock(&evdev->client_lock);
	list_for_each_entry(client, &evdev->client_list, node)
		kill_fasync(&client->fasync, SIGIO, POLL_HUP);
	spin_unlock(&evdev->client_lock);

	wake_up_interruptible(&evdev->wait);
}

284
static int evdev_release(struct inode *inode, struct file *file)
L
Linus Torvalds 已提交
285
{
286 287
	struct evdev_client *client = file->private_data;
	struct evdev *evdev = client->evdev;
L
Linus Torvalds 已提交
288

289
	mutex_lock(&evdev->mutex);
290
	evdev_ungrab(evdev, client);
291
	mutex_unlock(&evdev->mutex);
L
Linus Torvalds 已提交
292

293
	evdev_detach_client(evdev, client);
294
	kfree(client);
L
Linus Torvalds 已提交
295

296
	evdev_close_device(evdev);
297
	put_device(&evdev->dev);
L
Linus Torvalds 已提交
298 299 300 301

	return 0;
}

302 303
static unsigned int evdev_compute_buffer_size(struct input_dev *dev)
{
304 305 306 307 308
	unsigned int n_events =
		max(dev->hint_events_per_packet * EVDEV_BUF_PACKETS,
		    EVDEV_MIN_BUFFER_SIZE);

	return roundup_pow_of_two(n_events);
309 310
}

311
static int evdev_open(struct inode *inode, struct file *file)
L
Linus Torvalds 已提交
312
{
313
	struct evdev *evdev;
314
	struct evdev_client *client;
L
Linus Torvalds 已提交
315
	int i = iminor(inode) - EVDEV_MINOR_BASE;
316
	unsigned int bufsize;
317
	int error;
L
Linus Torvalds 已提交
318

319
	if (i >= EVDEV_MINORS)
L
Linus Torvalds 已提交
320 321
		return -ENODEV;

322 323 324
	error = mutex_lock_interruptible(&evdev_table_mutex);
	if (error)
		return error;
325
	evdev = evdev_table[i];
326 327 328
	if (evdev)
		get_device(&evdev->dev);
	mutex_unlock(&evdev_table_mutex);
329

330
	if (!evdev)
L
Linus Torvalds 已提交
331 332
		return -ENODEV;

333 334 335 336 337
	bufsize = evdev_compute_buffer_size(evdev->handle.dev);

	client = kzalloc(sizeof(struct evdev_client) +
				bufsize * sizeof(struct input_event),
			 GFP_KERNEL);
338 339 340 341
	if (!client) {
		error = -ENOMEM;
		goto err_put_evdev;
	}
L
Linus Torvalds 已提交
342

343
	client->bufsize = bufsize;
344
	spin_lock_init(&client->buffer_lock);
345
	client->evdev = evdev;
346
	evdev_attach_client(evdev, client);
L
Linus Torvalds 已提交
347

348 349 350
	error = evdev_open_device(evdev);
	if (error)
		goto err_free_client;
L
Linus Torvalds 已提交
351

352
	file->private_data = client;
353 354
	nonseekable_open(inode, file);

L
Linus Torvalds 已提交
355
	return 0;
356 357

 err_free_client:
358
	evdev_detach_client(evdev, client);
359 360 361 362
	kfree(client);
 err_put_evdev:
	put_device(&evdev->dev);
	return error;
L
Linus Torvalds 已提交
363 364
}

365 366
static ssize_t evdev_write(struct file *file, const char __user *buffer,
			   size_t count, loff_t *ppos)
367
{
368 369
	struct evdev_client *client = file->private_data;
	struct evdev *evdev = client->evdev;
370
	struct input_event event;
371
	int retval = 0;
372

373
	if (count != 0 && count < input_event_size())
374 375
		return -EINVAL;

376 377 378 379 380 381 382 383
	retval = mutex_lock_interruptible(&evdev->mutex);
	if (retval)
		return retval;

	if (!evdev->exist) {
		retval = -ENODEV;
		goto out;
	}
384

385 386
	while (retval + input_event_size() <= count) {

387
		if (input_event_from_user(buffer + retval, &event)) {
388 389 390
			retval = -EFAULT;
			goto out;
		}
391
		retval += input_event_size();
392 393 394

		input_inject_event(&evdev->handle,
				   event.type, event.code, event.value);
395
	}
396

397 398
 out:
	mutex_unlock(&evdev->mutex);
399 400 401
	return retval;
}

402 403 404 405 406 407 408
static int evdev_fetch_next_event(struct evdev_client *client,
				  struct input_event *event)
{
	int have_event;

	spin_lock_irq(&client->buffer_lock);

409
	have_event = client->packet_head != client->tail;
410 411
	if (have_event) {
		*event = client->buffer[client->tail++];
412
		client->tail &= client->bufsize - 1;
413 414 415 416 417 418 419 420 421
	}

	spin_unlock_irq(&client->buffer_lock);

	return have_event;
}

static ssize_t evdev_read(struct file *file, char __user *buffer,
			  size_t count, loff_t *ppos)
L
Linus Torvalds 已提交
422
{
423 424
	struct evdev_client *client = file->private_data;
	struct evdev *evdev = client->evdev;
425
	struct input_event event;
426 427
	size_t read = 0;
	int error;
L
Linus Torvalds 已提交
428

429
	if (count != 0 && count < input_event_size())
L
Linus Torvalds 已提交
430 431
		return -EINVAL;

432 433 434
	for (;;) {
		if (!evdev->exist)
			return -ENODEV;
L
Linus Torvalds 已提交
435

436 437 438 439 440 441 442 443 444 445
		if (client->packet_head == client->tail &&
		    (file->f_flags & O_NONBLOCK))
			return -EAGAIN;

		/*
		 * count == 0 is special - no IO is done but we check
		 * for error conditions (see above).
		 */
		if (count == 0)
			break;
L
Linus Torvalds 已提交
446

447 448
		while (read + input_event_size() <= count &&
		       evdev_fetch_next_event(client, &event)) {
449

450 451
			if (input_event_to_user(buffer + read, &event))
				return -EFAULT;
452

453 454
			read += input_event_size();
		}
L
Linus Torvalds 已提交
455

456 457
		if (read)
			break;
458

459 460 461 462 463 464 465 466 467 468
		if (!(file->f_flags & O_NONBLOCK)) {
			error = wait_event_interruptible(evdev->wait,
					client->packet_head != client->tail ||
					!evdev->exist);
			if (error)
				return error;
		}
	}

	return read;
L
Linus Torvalds 已提交
469 470 471 472 473
}

/* No kernel lock - fine */
static unsigned int evdev_poll(struct file *file, poll_table *wait)
{
474 475
	struct evdev_client *client = file->private_data;
	struct evdev *evdev = client->evdev;
476
	unsigned int mask;
477

478
	poll_wait(file, &evdev->wait, wait);
479 480

	mask = evdev->exist ? POLLOUT | POLLWRNORM : POLLHUP | POLLERR;
481
	if (client->packet_head != client->tail)
482 483 484
		mask |= POLLIN | POLLRDNORM;

	return mask;
L
Linus Torvalds 已提交
485 486
}

487 488 489
#ifdef CONFIG_COMPAT

#define BITS_PER_LONG_COMPAT (sizeof(compat_long_t) * 8)
490
#define BITS_TO_LONGS_COMPAT(x) ((((x) - 1) / BITS_PER_LONG_COMPAT) + 1)
491 492 493 494 495 496 497 498

#ifdef __BIG_ENDIAN
static int bits_to_user(unsigned long *bits, unsigned int maxbit,
			unsigned int maxlen, void __user *p, int compat)
{
	int len, i;

	if (compat) {
499
		len = BITS_TO_LONGS_COMPAT(maxbit) * sizeof(compat_long_t);
500
		if (len > maxlen)
501 502 503 504 505 506 507 508 509
			len = maxlen;

		for (i = 0; i < len / sizeof(compat_long_t); i++)
			if (copy_to_user((compat_long_t __user *) p + i,
					 (compat_long_t *) bits +
						i + 1 - ((i % 2) << 1),
					 sizeof(compat_long_t)))
				return -EFAULT;
	} else {
510
		len = BITS_TO_LONGS(maxbit) * sizeof(long);
511 512 513 514 515 516 517 518 519 520 521 522 523 524
		if (len > maxlen)
			len = maxlen;

		if (copy_to_user(p, bits, len))
			return -EFAULT;
	}

	return len;
}
#else
static int bits_to_user(unsigned long *bits, unsigned int maxbit,
			unsigned int maxlen, void __user *p, int compat)
{
	int len = compat ?
525 526
			BITS_TO_LONGS_COMPAT(maxbit) * sizeof(compat_long_t) :
			BITS_TO_LONGS(maxbit) * sizeof(long);
527 528 529 530 531 532 533 534 535 536 537 538 539

	if (len > maxlen)
		len = maxlen;

	return copy_to_user(p, bits, len) ? -EFAULT : len;
}
#endif /* __BIG_ENDIAN */

#else

static int bits_to_user(unsigned long *bits, unsigned int maxbit,
			unsigned int maxlen, void __user *p, int compat)
{
540
	int len = BITS_TO_LONGS(maxbit) * sizeof(long);
541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563

	if (len > maxlen)
		len = maxlen;

	return copy_to_user(p, bits, len) ? -EFAULT : len;
}

#endif /* CONFIG_COMPAT */

static int str_to_user(const char *str, unsigned int maxlen, void __user *p)
{
	int len;

	if (!str)
		return -ENOENT;

	len = strlen(str) + 1;
	if (len > maxlen)
		len = maxlen;

	return copy_to_user(p, str, len) ? -EFAULT : len;
}

564
#define OLD_KEY_MAX	0x1ff
565 566 567
static int handle_eviocgbit(struct input_dev *dev,
			    unsigned int type, unsigned int size,
			    void __user *p, int compat_mode)
568
{
569
	static unsigned long keymax_warn_time;
570 571 572
	unsigned long *bits;
	int len;

573
	switch (type) {
574 575 576 577 578 579 580 581 582 583 584 585

	case      0: bits = dev->evbit;  len = EV_MAX;  break;
	case EV_KEY: bits = dev->keybit; len = KEY_MAX; break;
	case EV_REL: bits = dev->relbit; len = REL_MAX; break;
	case EV_ABS: bits = dev->absbit; len = ABS_MAX; break;
	case EV_MSC: bits = dev->mscbit; len = MSC_MAX; break;
	case EV_LED: bits = dev->ledbit; len = LED_MAX; break;
	case EV_SND: bits = dev->sndbit; len = SND_MAX; break;
	case EV_FF:  bits = dev->ffbit;  len = FF_MAX;  break;
	case EV_SW:  bits = dev->swbit;  len = SW_MAX;  break;
	default: return -EINVAL;
	}
586 587 588 589 590 591

	/*
	 * Work around bugs in userspace programs that like to do
	 * EVIOCGBIT(EV_KEY, KEY_MAX) and not realize that 'len'
	 * should be in bytes, not in bits.
	 */
592
	if (type == EV_KEY && size == OLD_KEY_MAX) {
593 594
		len = OLD_KEY_MAX;
		if (printk_timed_ratelimit(&keymax_warn_time, 10 * 1000))
J
Joe Perches 已提交
595 596 597 598 599
			pr_warning("(EVIOCGBIT): Suspicious buffer size %u, "
				   "limiting output to %zu bytes. See "
				   "http://userweb.kernel.org/~dtor/eviocgbit-bug.html\n",
				   OLD_KEY_MAX,
				   BITS_TO_LONGS(OLD_KEY_MAX) * sizeof(long));
600 601
	}

602
	return bits_to_user(bits, len, size, p, compat_mode);
603
}
604
#undef OLD_KEY_MAX
605

606
static int evdev_handle_get_keycode(struct input_dev *dev, void __user *p)
607
{
608 609 610 611 612
	struct input_keymap_entry ke = {
		.len	= sizeof(unsigned int),
		.flags	= 0,
	};
	int __user *ip = (int __user *)p;
613 614
	int error;

615 616 617
	/* legacy case */
	if (copy_from_user(ke.scancode, p, sizeof(unsigned int)))
		return -EFAULT;
618

619 620 621
	error = input_get_keycode(dev, &ke);
	if (error)
		return error;
622

623 624
	if (put_user(ke.keycode, ip + 1))
		return -EFAULT;
625

626 627
	return 0;
}
628

629 630 631 632
static int evdev_handle_get_keycode_v2(struct input_dev *dev, void __user *p)
{
	struct input_keymap_entry ke;
	int error;
633

634 635
	if (copy_from_user(&ke, p, sizeof(ke)))
		return -EFAULT;
636

637 638 639
	error = input_get_keycode(dev, &ke);
	if (error)
		return error;
640

641 642
	if (copy_to_user(p, &ke, sizeof(ke)))
		return -EFAULT;
643 644 645 646

	return 0;
}

647
static int evdev_handle_set_keycode(struct input_dev *dev, void __user *p)
648
{
649 650 651 652 653
	struct input_keymap_entry ke = {
		.len	= sizeof(unsigned int),
		.flags	= 0,
	};
	int __user *ip = (int __user *)p;
654

655 656
	if (copy_from_user(ke.scancode, p, sizeof(unsigned int)))
		return -EFAULT;
657

658 659
	if (get_user(ke.keycode, ip + 1))
		return -EFAULT;
660

661 662
	return input_set_keycode(dev, &ke);
}
663

664 665 666
static int evdev_handle_set_keycode_v2(struct input_dev *dev, void __user *p)
{
	struct input_keymap_entry ke;
667

668 669
	if (copy_from_user(&ke, p, sizeof(ke)))
		return -EFAULT;
670

671 672
	if (ke.len > sizeof(ke.scancode))
		return -EINVAL;
673 674 675 676

	return input_set_keycode(dev, &ke);
}

677 678 679 680
static int evdev_handle_mt_request(struct input_dev *dev,
				   unsigned int size,
				   int __user *ip)
{
H
Henrik Rydberg 已提交
681
	const struct input_mt *mt = dev->mt;
682 683 684 685 686 687
	unsigned int code;
	int max_slots;
	int i;

	if (get_user(code, &ip[0]))
		return -EFAULT;
H
Henrik Rydberg 已提交
688
	if (!mt || !input_is_mt_value(code))
689 690 691
		return -EINVAL;

	max_slots = (size - sizeof(__u32)) / sizeof(__s32);
H
Henrik Rydberg 已提交
692 693 694
	for (i = 0; i < mt->num_slots && i < max_slots; i++) {
		int value = input_mt_get_value(&mt->slots[i], code);
		if (put_user(value, &ip[1 + i]))
695
			return -EFAULT;
H
Henrik Rydberg 已提交
696
	}
697 698 699 700

	return 0;
}

701 702
static long evdev_do_ioctl(struct file *file, unsigned int cmd,
			   void __user *p, int compat_mode)
L
Linus Torvalds 已提交
703
{
704 705
	struct evdev_client *client = file->private_data;
	struct evdev *evdev = client->evdev;
L
Linus Torvalds 已提交
706 707
	struct input_dev *dev = evdev->handle.dev;
	struct input_absinfo abs;
708
	struct ff_effect effect;
709
	int __user *ip = (int __user *)p;
710
	unsigned int i, t, u, v;
711
	unsigned int size;
712
	int error;
L
Linus Torvalds 已提交
713

714
	/* First we check for fixed-length commands */
L
Linus Torvalds 已提交
715 716
	switch (cmd) {

717 718
	case EVIOCGVERSION:
		return put_user(EV_VERSION, ip);
L
Linus Torvalds 已提交
719

720 721 722 723
	case EVIOCGID:
		if (copy_to_user(p, &dev->id, sizeof(struct input_id)))
			return -EFAULT;
		return 0;
724

725 726 727 728 729 730 731 732
	case EVIOCGREP:
		if (!test_bit(EV_REP, dev->evbit))
			return -ENOSYS;
		if (put_user(dev->rep[REP_DELAY], ip))
			return -EFAULT;
		if (put_user(dev->rep[REP_PERIOD], ip + 1))
			return -EFAULT;
		return 0;
733

734 735 736 737 738 739 740
	case EVIOCSREP:
		if (!test_bit(EV_REP, dev->evbit))
			return -ENOSYS;
		if (get_user(u, ip))
			return -EFAULT;
		if (get_user(v, ip + 1))
			return -EFAULT;
741

742 743
		input_inject_event(&evdev->handle, EV_REP, REP_DELAY, u);
		input_inject_event(&evdev->handle, EV_REP, REP_PERIOD, v);
744

745
		return 0;
L
Linus Torvalds 已提交
746

747 748
	case EVIOCRMFF:
		return input_ff_erase(dev, (int)(unsigned long) p, file);
L
Linus Torvalds 已提交
749

750 751 752 753 754 755 756 757 758 759 760 761
	case EVIOCGEFFECTS:
		i = test_bit(EV_FF, dev->evbit) ?
				dev->ff->max_effects : 0;
		if (put_user(i, ip))
			return -EFAULT;
		return 0;

	case EVIOCGRAB:
		if (p)
			return evdev_grab(evdev, client);
		else
			return evdev_ungrab(evdev, client);
762

763 764 765 766 767 768 769 770
	case EVIOCSCLOCKID:
		if (copy_from_user(&i, p, sizeof(unsigned int)))
			return -EFAULT;
		if (i != CLOCK_MONOTONIC && i != CLOCK_REALTIME)
			return -EINVAL;
		client->clkid = i;
		return 0;

771 772 773 774 775 776 777 778 779 780 781
	case EVIOCGKEYCODE:
		return evdev_handle_get_keycode(dev, p);

	case EVIOCSKEYCODE:
		return evdev_handle_set_keycode(dev, p);

	case EVIOCGKEYCODE_V2:
		return evdev_handle_get_keycode_v2(dev, p);

	case EVIOCSKEYCODE_V2:
		return evdev_handle_set_keycode_v2(dev, p);
782
	}
L
Linus Torvalds 已提交
783

784
	size = _IOC_SIZE(cmd);
L
Linus Torvalds 已提交
785

786 787 788
	/* Now check variable-length commands */
#define EVIOC_MASK_SIZE(nr)	((nr) & ~(_IOC_SIZEMASK << _IOC_SIZESHIFT))
	switch (EVIOC_MASK_SIZE(cmd)) {
789

790 791 792 793
	case EVIOCGPROP(0):
		return bits_to_user(dev->propbit, INPUT_PROP_MAX,
				    size, p, compat_mode);

794 795 796
	case EVIOCGMTSLOTS(0):
		return evdev_handle_mt_request(dev, size, ip);

797 798
	case EVIOCGKEY(0):
		return bits_to_user(dev->key, KEY_MAX, size, p, compat_mode);
L
Linus Torvalds 已提交
799

800 801
	case EVIOCGLED(0):
		return bits_to_user(dev->led, LED_MAX, size, p, compat_mode);
L
Linus Torvalds 已提交
802

803 804
	case EVIOCGSND(0):
		return bits_to_user(dev->snd, SND_MAX, size, p, compat_mode);
L
Linus Torvalds 已提交
805

806 807
	case EVIOCGSW(0):
		return bits_to_user(dev->sw, SW_MAX, size, p, compat_mode);
808

809 810
	case EVIOCGNAME(0):
		return str_to_user(dev->name, size, p);
L
Linus Torvalds 已提交
811

812 813
	case EVIOCGPHYS(0):
		return str_to_user(dev->phys, size, p);
L
Linus Torvalds 已提交
814

815 816
	case EVIOCGUNIQ(0):
		return str_to_user(dev->uniq, size, p);
L
Linus Torvalds 已提交
817

818 819 820
	case EVIOC_MASK_SIZE(EVIOCSFF):
		if (input_ff_effect_from_user(p, size, &effect))
			return -EFAULT;
L
Linus Torvalds 已提交
821

822
		error = input_ff_upload(dev, &effect, file);
L
Linus Torvalds 已提交
823

824 825
		if (put_user(effect.id, &(((struct ff_effect __user *)p)->id)))
			return -EFAULT;
826

827 828
		return error;
	}
L
Linus Torvalds 已提交
829

830 831 832
	/* Multi-number variable-length handlers */
	if (_IOC_TYPE(cmd) != 'E')
		return -EINVAL;
L
Linus Torvalds 已提交
833

834
	if (_IOC_DIR(cmd) == _IOC_READ) {
835

836 837 838 839
		if ((_IOC_NR(cmd) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0)))
			return handle_eviocgbit(dev,
						_IOC_NR(cmd) & EV_MAX, size,
						p, compat_mode);
L
Linus Torvalds 已提交
840

841
		if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCGABS(0))) {
842

843 844 845
			if (!dev->absinfo)
				return -EINVAL;

846 847
			t = _IOC_NR(cmd) & ABS_MAX;
			abs = dev->absinfo[t];
848

849 850 851
			if (copy_to_user(p, &abs, min_t(size_t,
					size, sizeof(struct input_absinfo))))
				return -EFAULT;
852

853 854 855
			return 0;
		}
	}
856

857
	if (_IOC_DIR(cmd) == _IOC_WRITE) {
858

859
		if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCSABS(0))) {
L
Linus Torvalds 已提交
860

861 862 863
			if (!dev->absinfo)
				return -EINVAL;

864
			t = _IOC_NR(cmd) & ABS_MAX;
865

866 867 868
			if (copy_from_user(&abs, p, min_t(size_t,
					size, sizeof(struct input_absinfo))))
				return -EFAULT;
L
Linus Torvalds 已提交
869

870 871
			if (size < sizeof(struct input_absinfo))
				abs.resolution = 0;
872

873 874 875
			/* We can't change number of reserved MT slots */
			if (t == ABS_MT_SLOT)
				return -EINVAL;
H
Henrik Rydberg 已提交
876

877 878 879 880 881 882 883 884
			/*
			 * Take event lock to ensure that we are not
			 * changing device parameters in the middle
			 * of event.
			 */
			spin_lock_irq(&dev->event_lock);
			dev->absinfo[t] = abs;
			spin_unlock_irq(&dev->event_lock);
885

886
			return 0;
887
		}
L
Linus Torvalds 已提交
888
	}
889

L
Linus Torvalds 已提交
890 891 892
	return -EINVAL;
}

893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915
static long evdev_ioctl_handler(struct file *file, unsigned int cmd,
				void __user *p, int compat_mode)
{
	struct evdev_client *client = file->private_data;
	struct evdev *evdev = client->evdev;
	int retval;

	retval = mutex_lock_interruptible(&evdev->mutex);
	if (retval)
		return retval;

	if (!evdev->exist) {
		retval = -ENODEV;
		goto out;
	}

	retval = evdev_do_ioctl(file, cmd, p, compat_mode);

 out:
	mutex_unlock(&evdev->mutex);
	return retval;
}

916 917 918 919
static long evdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
	return evdev_ioctl_handler(file, cmd, (void __user *)arg, 0);
}
920

921
#ifdef CONFIG_COMPAT
922 923
static long evdev_ioctl_compat(struct file *file,
				unsigned int cmd, unsigned long arg)
924
{
925
	return evdev_ioctl_handler(file, cmd, compat_ptr(arg), 1);
L
Linus Torvalds 已提交
926
}
927
#endif
L
Linus Torvalds 已提交
928

D
Dmitry Torokhov 已提交
929
static const struct file_operations evdev_fops = {
930 931 932 933 934 935 936
	.owner		= THIS_MODULE,
	.read		= evdev_read,
	.write		= evdev_write,
	.poll		= evdev_poll,
	.open		= evdev_open,
	.release	= evdev_release,
	.unlocked_ioctl	= evdev_ioctl,
937
#ifdef CONFIG_COMPAT
938
	.compat_ioctl	= evdev_ioctl_compat,
939
#endif
940
	.fasync		= evdev_fasync,
941 942
	.flush		= evdev_flush,
	.llseek		= no_llseek,
L
Linus Torvalds 已提交
943 944
};

945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972
static int evdev_install_chrdev(struct evdev *evdev)
{
	/*
	 * No need to do any locking here as calls to connect and
	 * disconnect are serialized by the input core
	 */
	evdev_table[evdev->minor] = evdev;
	return 0;
}

static void evdev_remove_chrdev(struct evdev *evdev)
{
	/*
	 * Lock evdev table to prevent race with evdev_open()
	 */
	mutex_lock(&evdev_table_mutex);
	evdev_table[evdev->minor] = NULL;
	mutex_unlock(&evdev_table_mutex);
}

/*
 * Mark device non-existent. This disables writes, ioctls and
 * prevents new users from opening the device. Already posted
 * blocking reads will stay, however new ones will fail.
 */
static void evdev_mark_dead(struct evdev *evdev)
{
	mutex_lock(&evdev->mutex);
973
	evdev->exist = false;
974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995
	mutex_unlock(&evdev->mutex);
}

static void evdev_cleanup(struct evdev *evdev)
{
	struct input_handle *handle = &evdev->handle;

	evdev_mark_dead(evdev);
	evdev_hangup(evdev);
	evdev_remove_chrdev(evdev);

	/* evdev is marked dead so no one else accesses evdev->open */
	if (evdev->open) {
		input_flush_device(handle, NULL);
		input_close_device(handle);
	}
}

/*
 * Create new evdev device. Note that input core serializes calls
 * to connect and disconnect so we don't need to lock evdev_table here.
 */
996 997
static int evdev_connect(struct input_handler *handler, struct input_dev *dev,
			 const struct input_device_id *id)
L
Linus Torvalds 已提交
998 999 1000
{
	struct evdev *evdev;
	int minor;
1001
	int error;
L
Linus Torvalds 已提交
1002

1003 1004 1005 1006
	for (minor = 0; minor < EVDEV_MINORS; minor++)
		if (!evdev_table[minor])
			break;

L
Linus Torvalds 已提交
1007
	if (minor == EVDEV_MINORS) {
J
Joe Perches 已提交
1008
		pr_err("no more free evdev devices\n");
1009
		return -ENFILE;
L
Linus Torvalds 已提交
1010 1011
	}

1012 1013 1014
	evdev = kzalloc(sizeof(struct evdev), GFP_KERNEL);
	if (!evdev)
		return -ENOMEM;
L
Linus Torvalds 已提交
1015

1016
	INIT_LIST_HEAD(&evdev->client_list);
1017 1018
	spin_lock_init(&evdev->client_lock);
	mutex_init(&evdev->mutex);
L
Linus Torvalds 已提交
1019 1020
	init_waitqueue_head(&evdev->wait);

1021
	dev_set_name(&evdev->dev, "event%d", minor);
1022
	evdev->exist = true;
L
Linus Torvalds 已提交
1023
	evdev->minor = minor;
1024

1025
	evdev->handle.dev = input_get_device(dev);
1026
	evdev->handle.name = dev_name(&evdev->dev);
L
Linus Torvalds 已提交
1027 1028 1029
	evdev->handle.handler = handler;
	evdev->handle.private = evdev;

1030
	evdev->dev.devt = MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + minor);
1031 1032 1033 1034
	evdev->dev.class = &input_class;
	evdev->dev.parent = &dev->dev;
	evdev->dev.release = evdev_free;
	device_initialize(&evdev->dev);
1035

1036
	error = input_register_handle(&evdev->handle);
1037
	if (error)
1038
		goto err_free_evdev;
1039

1040 1041 1042 1043 1044
	error = evdev_install_chrdev(evdev);
	if (error)
		goto err_unregister_handle;

	error = device_add(&evdev->dev);
1045
	if (error)
1046
		goto err_cleanup_evdev;
L
Linus Torvalds 已提交
1047

1048
	return 0;
L
Linus Torvalds 已提交
1049

1050 1051 1052 1053
 err_cleanup_evdev:
	evdev_cleanup(evdev);
 err_unregister_handle:
	input_unregister_handle(&evdev->handle);
1054
 err_free_evdev:
1055
	put_device(&evdev->dev);
1056
	return error;
L
Linus Torvalds 已提交
1057 1058 1059 1060 1061 1062
}

static void evdev_disconnect(struct input_handle *handle)
{
	struct evdev *evdev = handle->private;

1063
	device_del(&evdev->dev);
1064 1065
	evdev_cleanup(evdev);
	input_unregister_handle(handle);
1066
	put_device(&evdev->dev);
L
Linus Torvalds 已提交
1067 1068
}

D
Dmitry Torokhov 已提交
1069
static const struct input_device_id evdev_ids[] = {
L
Linus Torvalds 已提交
1070 1071 1072 1073 1074 1075 1076
	{ .driver_info = 1 },	/* Matches all devices */
	{ },			/* Terminating zero entry */
};

MODULE_DEVICE_TABLE(input, evdev_ids);

static struct input_handler evdev_handler = {
1077
	.event		= evdev_event,
1078
	.events		= evdev_events,
1079 1080 1081 1082 1083 1084
	.connect	= evdev_connect,
	.disconnect	= evdev_disconnect,
	.fops		= &evdev_fops,
	.minor		= EVDEV_MINOR_BASE,
	.name		= "evdev",
	.id_table	= evdev_ids,
L
Linus Torvalds 已提交
1085 1086 1087 1088
};

static int __init evdev_init(void)
{
1089
	return input_register_handler(&evdev_handler);
L
Linus Torvalds 已提交
1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102
}

static void __exit evdev_exit(void)
{
	input_unregister_handler(&evdev_handler);
}

module_init(evdev_init);
module_exit(evdev_exit);

MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
MODULE_DESCRIPTION("Input driver event char devices");
MODULE_LICENSE("GPL");