in panel.c [1024:1047]
static ssize_t keypad_read(struct file *file,
char __user *buf, size_t count, loff_t *ppos)
{
unsigned i = *ppos;
char __user *tmp = buf;
if (keypad_buflen == 0) {
if (file->f_flags & O_NONBLOCK)
return -EAGAIN;
if (wait_event_interruptible(keypad_read_wait,
keypad_buflen != 0))
return -EINTR;
}
for (; count-- > 0 && (keypad_buflen > 0);
++i, ++tmp, --keypad_buflen) {
put_user(keypad_buffer[keypad_start], tmp);
keypad_start = (keypad_start + 1) % KEYPAD_BUFFER;
}
*ppos = i;
return tmp - buf;
}