From: Vojtech P. <vo...@us...> - 2002-01-02 11:59:59
|
Update of /cvsroot/linuxconsole/ruby/linux/drivers/input In directory usw-pr-cvs1:/tmp/cvs-serv11780/drivers/input Modified Files: evdev.c Log Message: Bunch of new ioctls implemented. Index: evdev.c =================================================================== RCS file: /cvsroot/linuxconsole/ruby/linux/drivers/input/evdev.c,v retrieving revision 1.41 retrieving revision 1.42 diff -u -d -r1.41 -r1.42 --- evdev.c 2001/12/26 21:08:33 1.41 +++ evdev.c 2002/01/02 11:59:56 1.42 @@ -230,7 +230,7 @@ struct evdev_list *list = file->private_data; struct evdev *evdev = list->evdev; struct input_dev *dev = evdev->handle.dev; - int retval; + int retval, t, u; switch (cmd) { @@ -243,7 +243,41 @@ if ((retval = put_user(dev->idproduct, ((short *) arg) + 2))) return retval; if ((retval = put_user(dev->idversion, ((short *) arg) + 3))) return retval; return 0; + + case EVIOCGREP: + if ((retval = put_user(dev->rep[0], ((int *) arg) + 0))) return retval; + if ((retval = put_user(dev->rep[1], ((int *) arg) + 1))) return retval; + return 0; + case EVIOCSREP: + if ((retval = get_user(dev->rep[0], ((int *) arg) + 0))) return retval; + if ((retval = get_user(dev->rep[1], ((int *) arg) + 1))) return retval; + return 0; + + case EVIOCGKEYCODE: + if ((retval = get_user(t, ((int *) arg) + 0))) return retval; + if (t < 0 || t > dev->keycodemax) return -EINVAL; + switch (dev->keycodesize) { + case 1: u = *(u8*)(dev->keycode + t); break; + case 2: u = *(u16*)(dev->keycode + t * 2); break; + case 4: u = *(u32*)(dev->keycode + t * 4); break; + default: return -EINVAL; + } + if ((retval = put_user(u, ((int *) arg) + 1))) return retval; + return 0; + + case EVIOCSKEYCODE: + if ((retval = get_user(t, ((int *) arg) + 0))) return retval; + if (t < 0 || t > dev->keycodemax) return -EINVAL; + if ((retval = get_user(u, ((int *) arg) + 1))) return retval; + switch (dev->keycodesize) { + case 1: *(u8*)(dev->keycode + t) = u; break; + case 2: *(u16*)(dev->keycode + t * 2) = u; break; + case 4: *(u32*)(dev->keycode + t * 4) = u; break; + default: return -EINVAL; + } + return 0; + case EVIOCSFF: if (dev->upload_effect) { struct ff_effect effect; @@ -291,20 +325,53 @@ default: return -EINVAL; } len = NBITS(len) * sizeof(long); - if (len > _IOC_SIZE(cmd)) { - printk(KERN_WARNING "evdev.c: Truncating bitfield length from %d to %d\n", - len, _IOC_SIZE(cmd)); - len = _IOC_SIZE(cmd); - } + if (len > _IOC_SIZE(cmd)) len = _IOC_SIZE(cmd); return copy_to_user((char *) arg, bits, len) ? -EFAULT : len; } + if (_IOC_NR(cmd) == _IOC_NR(EVIOCGKEY(0))) { + int len; + len = NBITS(KEY_MAX) * sizeof(long); + if (len > _IOC_SIZE(cmd)) len = _IOC_SIZE(cmd); + return copy_to_user((char *) arg, dev->key, len) ? -EFAULT : len; + } + + if (_IOC_NR(cmd) == _IOC_NR(EVIOCGLED(0))) { + int len; + len = NBITS(LED_MAX) * sizeof(long); + if (len > _IOC_SIZE(cmd)) len = _IOC_SIZE(cmd); + return copy_to_user((char *) arg, dev->led, len) ? -EFAULT : len; + } + + if (_IOC_NR(cmd) == _IOC_NR(EVIOCGSND(0))) { + int len; + len = NBITS(SND_MAX) * sizeof(long); + if (len > _IOC_SIZE(cmd)) len = _IOC_SIZE(cmd); + return copy_to_user((char *) arg, dev->snd, len) ? -EFAULT : len; + } + if (_IOC_NR(cmd) == _IOC_NR(EVIOCGNAME(0))) { int len; - if (!dev->name) return 0; + if (!dev->name) return -ENOENT; len = strlen(dev->name) + 1; if (len > _IOC_SIZE(cmd)) len = _IOC_SIZE(cmd); return copy_to_user((char *) arg, dev->name, len) ? -EFAULT : len; + } + + if (_IOC_NR(cmd) == _IOC_NR(EVIOCGPHYS(0))) { + int len; + if (!dev->phys) return -ENOENT; + len = strlen(dev->phys) + 1; + if (len > _IOC_SIZE(cmd)) len = _IOC_SIZE(cmd); + return copy_to_user((char *) arg, dev->phys, len) ? -EFAULT : len; + } + + if (_IOC_NR(cmd) == _IOC_NR(EVIOCGUNIQ(0))) { + int len; + if (!dev->uniq) return -ENOENT; + len = strlen(dev->uniq) + 1; + if (len > _IOC_SIZE(cmd)) len = _IOC_SIZE(cmd); + return copy_to_user((char *) arg, dev->uniq, len) ? -EFAULT : len; } if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCGABS(0))) { |