tty3270_set_timer(struct tty3270 *tp, int expires)
{
if (expires == 0) {
- if (del_timer(&tp->timer))
+ if (timer_pending(&tp->timer)) {
raw3270_put_view(&tp->view);
+ del_timer(&tp->timer);
+ }
return;
}
- if (mod_timer(&tp->timer, jiffies + expires))
- return;
+ if (timer_pending(&tp->timer)) {
+ if (mod_timer(&tp->timer, jiffies + expires))
+ return;
+ }
raw3270_get_view(&tp->view);
tp->timer.function = (void (*)(unsigned long)) tty3270_update;
tp->timer.data = (unsigned long) tp;
* String write routine for 3270 ttys
*/
static int
-tty3270_write(struct tty_struct * tty,
+tty3270_write(struct tty_struct * tty, int from_user,
const unsigned char *buf, int count)
{
struct tty3270 *tp;
+ int length, ret;
tp = tty->driver_data;
if (!tp)
tty3270_do_write(tp, tp->char_buf, tp->char_count);
tp->char_count = 0;
}
- tty3270_do_write(tp, buf, count);
- return count;
+ if (!from_user) {
+ tty3270_do_write(tp, buf, count);
+ return count;
+ }
+ ret = 0;
+ while (count > 0) {
+ length = count < TTY3270_CHAR_BUF_SIZE ?
+ count : TTY3270_CHAR_BUF_SIZE;
+ length -= copy_from_user(tp->char_buf, buf, length);
+ if (length == 0) {
+ if (!ret)
+ ret = -EFAULT;
+ break;
+ }
+ tty3270_do_write(tp, tp->char_buf, count);
+ buf += length;
+ count -= length;
+ ret += length;
+ }
+ return ret;
}
/*