n_tty: Factor throttle/unthrottle into helper functions
[deliverable/linux.git] / drivers / tty / n_tty.c
CommitLineData
1da177e4
LT
1/*
2 * n_tty.c --- implements the N_TTY line discipline.
4edf1827 3 *
1da177e4
LT
4 * This code used to be in tty_io.c, but things are getting hairy
5 * enough that it made sense to split things off. (The N_TTY
6 * processing has changed so much that it's hardly recognizable,
7 * anyway...)
8 *
9 * Note that the open routine for N_TTY is guaranteed never to return
10 * an error. This is because Linux will fall back to setting a line
4edf1827 11 * to N_TTY if it can not switch to any other line discipline.
1da177e4
LT
12 *
13 * Written by Theodore Ts'o, Copyright 1994.
4edf1827 14 *
1da177e4
LT
15 * This file also contains code originally written by Linus Torvalds,
16 * Copyright 1991, 1992, 1993, and by Julian Cowley, Copyright 1994.
4edf1827 17 *
1da177e4
LT
18 * This file may be redistributed under the terms of the GNU General Public
19 * License.
20 *
21 * Reduced memory usage for older ARM systems - Russell King.
22 *
4edf1827 23 * 2000/01/20 Fixed SMP locking on put_tty_queue using bits of
1da177e4
LT
24 * the patch by Andrew J. Kroll <ag784@freenet.buffalo.edu>
25 * who actually finally proved there really was a race.
26 *
27 * 2002/03/18 Implemented n_tty_wakeup to send SIGIO POLL_OUTs to
28 * waiting writing processes-Sapan Bhatia <sapan@corewars.org>.
11a96d18 29 * Also fixed a bug in BLOCKING mode where n_tty_write returns
1da177e4
LT
30 * EAGAIN
31 */
32
33#include <linux/types.h>
34#include <linux/major.h>
35#include <linux/errno.h>
36#include <linux/signal.h>
37#include <linux/fcntl.h>
38#include <linux/sched.h>
39#include <linux/interrupt.h>
40#include <linux/tty.h>
41#include <linux/timer.h>
42#include <linux/ctype.h>
43#include <linux/mm.h>
44#include <linux/string.h>
45#include <linux/slab.h>
46#include <linux/poll.h>
47#include <linux/bitops.h>
522ed776
MT
48#include <linux/audit.h>
49#include <linux/file.h>
300a6204 50#include <linux/uaccess.h>
572b9adb 51#include <linux/module.h>
593fb1ae 52#include <linux/ratelimit.h>
1da177e4 53
1da177e4
LT
54
55/* number of characters left in xmit buffer before select has we have room */
56#define WAKEUP_CHARS 256
57
58/*
59 * This defines the low- and high-watermarks for throttling and
60 * unthrottling the TTY driver. These watermarks are used for
61 * controlling the space in the read buffer.
62 */
63#define TTY_THRESHOLD_THROTTLE 128 /* now based on remaining room */
bbd20759 64#define TTY_THRESHOLD_UNTHROTTLE 128
1da177e4 65
a88a69c9
JP
66/*
67 * Special byte codes used in the echo buffer to represent operations
68 * or special handling of characters. Bytes in the echo buffer that
69 * are not part of such special blocks are treated as normal character
70 * codes.
71 */
72#define ECHO_OP_START 0xff
73#define ECHO_OP_MOVE_BACK_COL 0x80
74#define ECHO_OP_SET_CANON_COL 0x81
75#define ECHO_OP_ERASE_TAB 0x82
76
32f13521
PH
77#undef N_TTY_TRACE
78#ifdef N_TTY_TRACE
79# define n_tty_trace(f, args...) trace_printk(f, ##args)
80#else
81# define n_tty_trace(f, args...)
82#endif
83
70ece7a7 84struct n_tty_data {
fb7aa03d
PH
85 /* producer-published */
86 size_t read_head;
87 size_t canon_head;
88 DECLARE_BITMAP(process_char_map, 256);
89
90 /* private to n_tty_receive_overrun (single-threaded) */
53c5ee2c
JS
91 unsigned long overrun_time;
92 int num_overrun;
93
24a89d1c
PH
94 /* non-atomic */
95 bool no_room;
96
fb7aa03d 97 /* must hold exclusive termios_rwsem to reset these */
53c5ee2c
JS
98 unsigned char lnext:1, erasing:1, raw:1, real_raw:1, icanon:1;
99 unsigned char echo_overrun:1;
3fe780b3 100
fb7aa03d
PH
101 /* shared by producer and consumer */
102 char *read_buf;
3fe780b3 103 DECLARE_BITMAP(read_flags, N_TTY_BUF_SIZE);
ba2e68ac 104
f6c8dbe6 105 int minimum_to_wake;
ba2e68ac 106
fb7aa03d
PH
107 /* consumer-published */
108 size_t read_tail;
109
110 /* protected by echo_lock */
ba2e68ac
JS
111 unsigned char *echo_buf;
112 unsigned int echo_pos;
113 unsigned int echo_cnt;
114
fb7aa03d
PH
115 /* protected by output lock */
116 unsigned int column;
ba2e68ac 117 unsigned int canon_column;
bddc7152
JS
118
119 struct mutex atomic_read_lock;
120 struct mutex output_lock;
121 struct mutex echo_lock;
70ece7a7
JS
122};
123
ce74117a
PH
124static inline size_t read_cnt(struct n_tty_data *ldata)
125{
a2f73be8 126 return ldata->read_head - ldata->read_tail;
ce74117a
PH
127}
128
bc5a5e3f
PH
129static inline unsigned char read_buf(struct n_tty_data *ldata, size_t i)
130{
131 return ldata->read_buf[i & (N_TTY_BUF_SIZE - 1)];
132}
133
134static inline unsigned char *read_buf_addr(struct n_tty_data *ldata, size_t i)
135{
136 return &ldata->read_buf[i & (N_TTY_BUF_SIZE - 1)];
137}
138
522ed776
MT
139static inline int tty_put_user(struct tty_struct *tty, unsigned char x,
140 unsigned char __user *ptr)
141{
53c5ee2c
JS
142 struct n_tty_data *ldata = tty->disc_data;
143
144 tty_audit_add_data(tty, &x, 1, ldata->icanon);
522ed776
MT
145 return put_user(x, ptr);
146}
147
24a89d1c 148static int receive_room(struct tty_struct *tty)
55db4c64 149{
53c5ee2c 150 struct n_tty_data *ldata = tty->disc_data;
090abf7b 151 int left;
55db4c64 152
090abf7b
JA
153 if (I_PARMRK(tty)) {
154 /* Multiply read_cnt by 3, since each byte might take up to
155 * three times as many spaces when PARMRK is set (depending on
156 * its flags, e.g. parity error). */
ce74117a 157 left = N_TTY_BUF_SIZE - read_cnt(ldata) * 3 - 1;
090abf7b 158 } else
ce74117a 159 left = N_TTY_BUF_SIZE - read_cnt(ldata) - 1;
090abf7b 160
55db4c64
LT
161 /*
162 * If we are doing input canonicalization, and there are no
163 * pending newlines, let characters through without limit, so
164 * that erase characters will be handled. Other excess
165 * characters will be beeped.
166 */
167 if (left <= 0)
a73d3d69 168 left = ldata->icanon && ldata->canon_head == ldata->read_tail;
55db4c64 169
24a89d1c 170 return left;
7879a9f9
PH
171}
172
24a89d1c
PH
173/**
174 * n_tty_set_room - receive space
175 * @tty: terminal
176 *
177 * Re-schedules the flip buffer work if space just became available.
178 *
6d76bd26
PH
179 * Caller holds exclusive termios_rwsem
180 * or
181 * n_tty_read()/consumer path:
182 * holds non-exclusive termios_rwsem
24a89d1c
PH
183 */
184
7879a9f9
PH
185static void n_tty_set_room(struct tty_struct *tty)
186{
24a89d1c
PH
187 struct n_tty_data *ldata = tty->disc_data;
188
55db4c64 189 /* Did this open up the receive buffer? We may need to flip */
24a89d1c
PH
190 if (unlikely(ldata->no_room) && receive_room(tty)) {
191 ldata->no_room = 0;
192
ecbbfd44 193 WARN_RATELIMIT(tty->port->itty == NULL,
cadf7486 194 "scheduling with invalid itty\n");
21622939
PH
195 /* see if ldisc has been killed - if so, this means that
196 * even though the ldisc has been halted and ->buf.work
197 * cancelled, ->buf.work is about to be rescheduled
198 */
199 WARN_RATELIMIT(test_bit(TTY_LDISC_HALTED, &tty->flags),
200 "scheduling buffer work for halted ldisc\n");
ecbbfd44
JS
201 schedule_work(&tty->port->buf.work);
202 }
55db4c64
LT
203}
204
9a4aec2d
PH
205static ssize_t chars_in_buffer(struct tty_struct *tty)
206{
207 struct n_tty_data *ldata = tty->disc_data;
208 ssize_t n = 0;
209
210 if (!ldata->icanon)
211 n = read_cnt(ldata);
212 else
213 n = ldata->canon_head - ldata->read_tail;
214 return n;
215}
216
6367ca72
PH
217static inline void n_tty_check_throttle(struct tty_struct *tty)
218{
219 /*
220 * Check the remaining room for the input canonicalization
221 * mode. We don't want to throttle the driver if we're in
222 * canonical mode and don't have a newline yet!
223 */
224 while (1) {
225 int throttled;
226 tty_set_flow_change(tty, TTY_THROTTLE_SAFE);
227 if (receive_room(tty) >= TTY_THRESHOLD_THROTTLE)
228 break;
229 throttled = tty_throttle_safe(tty);
230 if (!throttled)
231 break;
232 }
233 __tty_set_flow_change(tty, 0);
234}
235
236static inline void n_tty_check_unthrottle(struct tty_struct *tty)
237{
238 /* If there is enough space in the read buffer now, let the
239 * low-level driver know. We use chars_in_buffer() to
240 * check the buffer, as it now knows about canonical mode.
241 * Otherwise, if the driver is throttled and the line is
242 * longer than TTY_THRESHOLD_UNTHROTTLE in canonical mode,
243 * we won't get any more characters.
244 */
245
246 while (1) {
247 int unthrottled;
248 tty_set_flow_change(tty, TTY_UNTHROTTLE_SAFE);
249 if (chars_in_buffer(tty) > TTY_THRESHOLD_UNTHROTTLE)
250 break;
251 if (!tty->count)
252 break;
253 n_tty_set_room(tty);
254 unthrottled = tty_unthrottle_safe(tty);
255 if (!unthrottled)
256 break;
257 }
258 __tty_set_flow_change(tty, 0);
259}
260
17b82060
AC
261/**
262 * put_tty_queue - add character to tty
263 * @c: character
57c94121 264 * @ldata: n_tty data
17b82060 265 *
6d76bd26
PH
266 * Add a character to the tty read_buf queue.
267 *
268 * n_tty_receive_buf()/producer path:
269 * caller holds non-exclusive termios_rwsem
270 * modifies read_head
271 *
272 * read_head is only considered 'published' if canonical mode is
273 * not active.
17b82060
AC
274 */
275
57c94121 276static void put_tty_queue(unsigned char c, struct n_tty_data *ldata)
1da177e4 277{
6d76bd26
PH
278 if (read_cnt(ldata) < N_TTY_BUF_SIZE) {
279 *read_buf_addr(ldata, ldata->read_head) = c;
280 ldata->read_head++;
281 }
1da177e4
LT
282}
283
1da177e4
LT
284/**
285 * reset_buffer_flags - reset buffer state
286 * @tty: terminal to reset
287 *
25518c68
PH
288 * Reset the read buffer counters and clear the flags.
289 * Called from n_tty_open() and n_tty_flush_buffer().
17b82060 290 *
6d76bd26
PH
291 * Locking: caller holds exclusive termios_rwsem
292 * (or locking is not required)
1da177e4 293 */
a88a69c9 294
b66f4fa5 295static void reset_buffer_flags(struct n_tty_data *ldata)
1da177e4 296{
a73d3d69 297 ldata->read_head = ldata->canon_head = ldata->read_tail = 0;
a88a69c9 298
bddc7152 299 mutex_lock(&ldata->echo_lock);
ba2e68ac 300 ldata->echo_pos = ldata->echo_cnt = ldata->echo_overrun = 0;
bddc7152 301 mutex_unlock(&ldata->echo_lock);
a88a69c9 302
a73d3d69 303 ldata->erasing = 0;
3fe780b3 304 bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
1da177e4
LT
305}
306
a30737ab
PH
307static void n_tty_packet_mode_flush(struct tty_struct *tty)
308{
309 unsigned long flags;
310
311 spin_lock_irqsave(&tty->ctrl_lock, flags);
312 if (tty->link->packet) {
313 tty->ctrl_status |= TIOCPKT_FLUSHREAD;
314 wake_up_interruptible(&tty->link->read_wait);
315 }
316 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
317}
318
1da177e4
LT
319/**
320 * n_tty_flush_buffer - clean input queue
321 * @tty: terminal device
322 *
25518c68
PH
323 * Flush the input buffer. Called when the tty layer wants the
324 * buffer flushed (eg at hangup) or when the N_TTY line discipline
325 * internally has to clean the pending queue (for example some signals).
1da177e4 326 *
6d76bd26
PH
327 * Holds termios_rwsem to exclude producer/consumer while
328 * buffer indices are reset.
329 *
330 * Locking: ctrl_lock, exclusive termios_rwsem
1da177e4 331 */
4edf1827
AC
332
333static void n_tty_flush_buffer(struct tty_struct *tty)
1da177e4 334{
6d76bd26 335 down_write(&tty->termios_rwsem);
b66f4fa5
PH
336 reset_buffer_flags(tty->disc_data);
337 n_tty_set_room(tty);
4edf1827 338
a30737ab
PH
339 if (tty->link)
340 n_tty_packet_mode_flush(tty);
6d76bd26 341 up_write(&tty->termios_rwsem);
1da177e4
LT
342}
343
6d76bd26
PH
344/**
345 * n_tty_chars_in_buffer - report available bytes
346 * @tty: tty device
347 *
348 * Report the number of characters buffered to be delivered to user
349 * at this instant in time.
350 *
351 * Locking: exclusive termios_rwsem
352 */
353
a19d0c6a
PH
354static ssize_t n_tty_chars_in_buffer(struct tty_struct *tty)
355{
6d76bd26
PH
356 ssize_t n;
357
47534084 358 WARN_ONCE(1, "%s is deprecated and scheduled for removal.", __func__);
6d76bd26
PH
359
360 down_write(&tty->termios_rwsem);
361 n = chars_in_buffer(tty);
362 up_write(&tty->termios_rwsem);
363 return n;
a19d0c6a
PH
364}
365
1da177e4
LT
366/**
367 * is_utf8_continuation - utf8 multibyte check
368 * @c: byte to check
369 *
370 * Returns true if the utf8 character 'c' is a multibyte continuation
371 * character. We use this to correctly compute the on screen size
372 * of the character when printing
373 */
4edf1827 374
1da177e4
LT
375static inline int is_utf8_continuation(unsigned char c)
376{
377 return (c & 0xc0) == 0x80;
378}
379
380/**
381 * is_continuation - multibyte check
382 * @c: byte to check
383 *
384 * Returns true if the utf8 character 'c' is a multibyte continuation
385 * character and the terminal is in unicode mode.
386 */
4edf1827 387
1da177e4
LT
388static inline int is_continuation(unsigned char c, struct tty_struct *tty)
389{
390 return I_IUTF8(tty) && is_utf8_continuation(c);
391}
392
393/**
a88a69c9 394 * do_output_char - output one character
1da177e4
LT
395 * @c: character (or partial unicode symbol)
396 * @tty: terminal device
a88a69c9 397 * @space: space available in tty driver write buffer
1da177e4 398 *
a88a69c9
JP
399 * This is a helper function that handles one output character
400 * (including special characters like TAB, CR, LF, etc.),
ee5aa7b8
JP
401 * doing OPOST processing and putting the results in the
402 * tty driver's write buffer.
a88a69c9
JP
403 *
404 * Note that Linux currently ignores TABDLY, CRDLY, VTDLY, FFDLY
405 * and NLDLY. They simply aren't relevant in the world today.
406 * If you ever need them, add them here.
1da177e4 407 *
a88a69c9
JP
408 * Returns the number of bytes of buffer space used or -1 if
409 * no space left.
410 *
411 * Locking: should be called under the output_lock to protect
412 * the column state and space left in the buffer
1da177e4 413 */
4edf1827 414
a88a69c9 415static int do_output_char(unsigned char c, struct tty_struct *tty, int space)
1da177e4 416{
53c5ee2c 417 struct n_tty_data *ldata = tty->disc_data;
a88a69c9 418 int spaces;
1da177e4 419
1da177e4
LT
420 if (!space)
421 return -1;
300a6204 422
a88a69c9
JP
423 switch (c) {
424 case '\n':
425 if (O_ONLRET(tty))
53c5ee2c 426 ldata->column = 0;
a88a69c9
JP
427 if (O_ONLCR(tty)) {
428 if (space < 2)
429 return -1;
ba2e68ac 430 ldata->canon_column = ldata->column = 0;
37f81fa1 431 tty->ops->write(tty, "\r\n", 2);
a88a69c9
JP
432 return 2;
433 }
ba2e68ac 434 ldata->canon_column = ldata->column;
a88a69c9
JP
435 break;
436 case '\r':
53c5ee2c 437 if (O_ONOCR(tty) && ldata->column == 0)
a88a69c9
JP
438 return 0;
439 if (O_OCRNL(tty)) {
440 c = '\n';
441 if (O_ONLRET(tty))
ba2e68ac 442 ldata->canon_column = ldata->column = 0;
1da177e4 443 break;
a88a69c9 444 }
ba2e68ac 445 ldata->canon_column = ldata->column = 0;
a88a69c9
JP
446 break;
447 case '\t':
53c5ee2c 448 spaces = 8 - (ldata->column & 7);
a88a69c9
JP
449 if (O_TABDLY(tty) == XTABS) {
450 if (space < spaces)
451 return -1;
53c5ee2c 452 ldata->column += spaces;
a88a69c9
JP
453 tty->ops->write(tty, " ", spaces);
454 return spaces;
1da177e4 455 }
53c5ee2c 456 ldata->column += spaces;
a88a69c9
JP
457 break;
458 case '\b':
53c5ee2c
JS
459 if (ldata->column > 0)
460 ldata->column--;
a88a69c9
JP
461 break;
462 default:
a59c0d6f
JP
463 if (!iscntrl(c)) {
464 if (O_OLCUC(tty))
465 c = toupper(c);
466 if (!is_continuation(c, tty))
53c5ee2c 467 ldata->column++;
a59c0d6f 468 }
a88a69c9 469 break;
1da177e4 470 }
a88a69c9 471
f34d7a5b 472 tty_put_char(tty, c);
a88a69c9
JP
473 return 1;
474}
475
476/**
477 * process_output - output post processor
478 * @c: character (or partial unicode symbol)
479 * @tty: terminal device
480 *
ee5aa7b8
JP
481 * Output one character with OPOST processing.
482 * Returns -1 when the output device is full and the character
483 * must be retried.
a88a69c9
JP
484 *
485 * Locking: output_lock to protect column state and space left
486 * (also, this is called from n_tty_write under the
487 * tty layer write lock)
488 */
489
490static int process_output(unsigned char c, struct tty_struct *tty)
491{
bddc7152 492 struct n_tty_data *ldata = tty->disc_data;
a88a69c9
JP
493 int space, retval;
494
bddc7152 495 mutex_lock(&ldata->output_lock);
a88a69c9
JP
496
497 space = tty_write_room(tty);
498 retval = do_output_char(c, tty, space);
499
bddc7152 500 mutex_unlock(&ldata->output_lock);
a88a69c9
JP
501 if (retval < 0)
502 return -1;
503 else
504 return 0;
1da177e4
LT
505}
506
507/**
a88a69c9 508 * process_output_block - block post processor
1da177e4 509 * @tty: terminal device
ee5aa7b8
JP
510 * @buf: character buffer
511 * @nr: number of bytes to output
512 *
513 * Output a block of characters with OPOST processing.
514 * Returns the number of characters output.
1da177e4
LT
515 *
516 * This path is used to speed up block console writes, among other
517 * things when processing blocks of output data. It handles only
518 * the simple cases normally found and helps to generate blocks of
519 * symbols for the console driver and thus improve performance.
520 *
a88a69c9
JP
521 * Locking: output_lock to protect column state and space left
522 * (also, this is called from n_tty_write under the
523 * tty layer write lock)
1da177e4 524 */
4edf1827 525
a88a69c9
JP
526static ssize_t process_output_block(struct tty_struct *tty,
527 const unsigned char *buf, unsigned int nr)
1da177e4 528{
53c5ee2c 529 struct n_tty_data *ldata = tty->disc_data;
1da177e4 530 int space;
bbd20759 531 int i;
1da177e4
LT
532 const unsigned char *cp;
533
bddc7152 534 mutex_lock(&ldata->output_lock);
a88a69c9 535
f34d7a5b 536 space = tty_write_room(tty);
300a6204 537 if (!space) {
bddc7152 538 mutex_unlock(&ldata->output_lock);
1da177e4 539 return 0;
a88a69c9 540 }
1da177e4
LT
541 if (nr > space)
542 nr = space;
543
544 for (i = 0, cp = buf; i < nr; i++, cp++) {
a59c0d6f
JP
545 unsigned char c = *cp;
546
547 switch (c) {
1da177e4
LT
548 case '\n':
549 if (O_ONLRET(tty))
53c5ee2c 550 ldata->column = 0;
1da177e4
LT
551 if (O_ONLCR(tty))
552 goto break_out;
ba2e68ac 553 ldata->canon_column = ldata->column;
1da177e4
LT
554 break;
555 case '\r':
53c5ee2c 556 if (O_ONOCR(tty) && ldata->column == 0)
1da177e4
LT
557 goto break_out;
558 if (O_OCRNL(tty))
559 goto break_out;
ba2e68ac 560 ldata->canon_column = ldata->column = 0;
1da177e4
LT
561 break;
562 case '\t':
563 goto break_out;
564 case '\b':
53c5ee2c
JS
565 if (ldata->column > 0)
566 ldata->column--;
1da177e4
LT
567 break;
568 default:
a59c0d6f
JP
569 if (!iscntrl(c)) {
570 if (O_OLCUC(tty))
571 goto break_out;
572 if (!is_continuation(c, tty))
53c5ee2c 573 ldata->column++;
a59c0d6f 574 }
1da177e4
LT
575 break;
576 }
577 }
578break_out:
f34d7a5b 579 i = tty->ops->write(tty, buf, i);
a88a69c9 580
bddc7152 581 mutex_unlock(&ldata->output_lock);
1da177e4
LT
582 return i;
583}
584
a88a69c9
JP
585/**
586 * process_echoes - write pending echo characters
587 * @tty: terminal device
588 *
589 * Write previously buffered echo (and other ldisc-generated)
590 * characters to the tty.
591 *
592 * Characters generated by the ldisc (including echoes) need to
593 * be buffered because the driver's write buffer can fill during
594 * heavy program output. Echoing straight to the driver will
595 * often fail under these conditions, causing lost characters and
596 * resulting mismatches of ldisc state information.
597 *
598 * Since the ldisc state must represent the characters actually sent
599 * to the driver at the time of the write, operations like certain
600 * changes in column state are also saved in the buffer and executed
601 * here.
602 *
603 * A circular fifo buffer is used so that the most recent characters
604 * are prioritized. Also, when control characters are echoed with a
605 * prefixed "^", the pair is treated atomically and thus not separated.
606 *
607 * Locking: output_lock to protect column state and space left,
608 * echo_lock to protect the echo buffer
609 */
610
611static void process_echoes(struct tty_struct *tty)
612{
53c5ee2c 613 struct n_tty_data *ldata = tty->disc_data;
a88a69c9
JP
614 int space, nr;
615 unsigned char c;
616 unsigned char *cp, *buf_end;
617
ba2e68ac 618 if (!ldata->echo_cnt)
a88a69c9
JP
619 return;
620
bddc7152
JS
621 mutex_lock(&ldata->output_lock);
622 mutex_lock(&ldata->echo_lock);
a88a69c9
JP
623
624 space = tty_write_room(tty);
625
ba2e68ac
JS
626 buf_end = ldata->echo_buf + N_TTY_BUF_SIZE;
627 cp = ldata->echo_buf + ldata->echo_pos;
628 nr = ldata->echo_cnt;
a88a69c9
JP
629 while (nr > 0) {
630 c = *cp;
631 if (c == ECHO_OP_START) {
632 unsigned char op;
633 unsigned char *opp;
634 int no_space_left = 0;
635
636 /*
637 * If the buffer byte is the start of a multi-byte
638 * operation, get the next byte, which is either the
639 * op code or a control character value.
640 */
641 opp = cp + 1;
642 if (opp == buf_end)
643 opp -= N_TTY_BUF_SIZE;
644 op = *opp;
300a6204 645
a88a69c9
JP
646 switch (op) {
647 unsigned int num_chars, num_bs;
648
649 case ECHO_OP_ERASE_TAB:
650 if (++opp == buf_end)
651 opp -= N_TTY_BUF_SIZE;
652 num_chars = *opp;
653
654 /*
655 * Determine how many columns to go back
656 * in order to erase the tab.
657 * This depends on the number of columns
658 * used by other characters within the tab
659 * area. If this (modulo 8) count is from
660 * the start of input rather than from a
661 * previous tab, we offset by canon column.
662 * Otherwise, tab spacing is normal.
663 */
664 if (!(num_chars & 0x80))
ba2e68ac 665 num_chars += ldata->canon_column;
a88a69c9
JP
666 num_bs = 8 - (num_chars & 7);
667
668 if (num_bs > space) {
669 no_space_left = 1;
670 break;
671 }
672 space -= num_bs;
673 while (num_bs--) {
674 tty_put_char(tty, '\b');
53c5ee2c
JS
675 if (ldata->column > 0)
676 ldata->column--;
a88a69c9
JP
677 }
678 cp += 3;
679 nr -= 3;
680 break;
681
682 case ECHO_OP_SET_CANON_COL:
ba2e68ac 683 ldata->canon_column = ldata->column;
a88a69c9
JP
684 cp += 2;
685 nr -= 2;
686 break;
687
688 case ECHO_OP_MOVE_BACK_COL:
53c5ee2c
JS
689 if (ldata->column > 0)
690 ldata->column--;
a88a69c9
JP
691 cp += 2;
692 nr -= 2;
693 break;
694
695 case ECHO_OP_START:
696 /* This is an escaped echo op start code */
697 if (!space) {
698 no_space_left = 1;
699 break;
700 }
701 tty_put_char(tty, ECHO_OP_START);
53c5ee2c 702 ldata->column++;
a88a69c9
JP
703 space--;
704 cp += 2;
705 nr -= 2;
706 break;
707
708 default:
a88a69c9 709 /*
62b26358
JP
710 * If the op is not a special byte code,
711 * it is a ctrl char tagged to be echoed
712 * as "^X" (where X is the letter
713 * representing the control char).
714 * Note that we must ensure there is
715 * enough space for the whole ctrl pair.
716 *
a88a69c9 717 */
62b26358
JP
718 if (space < 2) {
719 no_space_left = 1;
720 break;
721 }
722 tty_put_char(tty, '^');
723 tty_put_char(tty, op ^ 0100);
53c5ee2c 724 ldata->column += 2;
62b26358 725 space -= 2;
a88a69c9
JP
726 cp += 2;
727 nr -= 2;
728 }
729
730 if (no_space_left)
731 break;
732 } else {
582f5590 733 if (O_OPOST(tty)) {
ee5aa7b8
JP
734 int retval = do_output_char(c, tty, space);
735 if (retval < 0)
736 break;
737 space -= retval;
738 } else {
739 if (!space)
740 break;
741 tty_put_char(tty, c);
742 space -= 1;
743 }
a88a69c9
JP
744 cp += 1;
745 nr -= 1;
746 }
747
748 /* When end of circular buffer reached, wrap around */
749 if (cp >= buf_end)
750 cp -= N_TTY_BUF_SIZE;
751 }
752
753 if (nr == 0) {
ba2e68ac
JS
754 ldata->echo_pos = 0;
755 ldata->echo_cnt = 0;
53c5ee2c 756 ldata->echo_overrun = 0;
a88a69c9 757 } else {
ba2e68ac
JS
758 int num_processed = ldata->echo_cnt - nr;
759 ldata->echo_pos += num_processed;
760 ldata->echo_pos &= N_TTY_BUF_SIZE - 1;
761 ldata->echo_cnt = nr;
a88a69c9 762 if (num_processed > 0)
53c5ee2c 763 ldata->echo_overrun = 0;
a88a69c9
JP
764 }
765
bddc7152
JS
766 mutex_unlock(&ldata->echo_lock);
767 mutex_unlock(&ldata->output_lock);
a88a69c9
JP
768
769 if (tty->ops->flush_chars)
770 tty->ops->flush_chars(tty);
771}
772
773/**
774 * add_echo_byte - add a byte to the echo buffer
775 * @c: unicode byte to echo
57c94121 776 * @ldata: n_tty data
a88a69c9
JP
777 *
778 * Add a character or operation byte to the echo buffer.
779 *
780 * Should be called under the echo lock to protect the echo buffer.
781 */
782
57c94121 783static void add_echo_byte(unsigned char c, struct n_tty_data *ldata)
a88a69c9
JP
784{
785 int new_byte_pos;
786
ba2e68ac 787 if (ldata->echo_cnt == N_TTY_BUF_SIZE) {
a88a69c9 788 /* Circular buffer is already at capacity */
ba2e68ac 789 new_byte_pos = ldata->echo_pos;
a88a69c9
JP
790
791 /*
792 * Since the buffer start position needs to be advanced,
793 * be sure to step by a whole operation byte group.
794 */
ba2e68ac
JS
795 if (ldata->echo_buf[ldata->echo_pos] == ECHO_OP_START) {
796 if (ldata->echo_buf[(ldata->echo_pos + 1) &
a88a69c9
JP
797 (N_TTY_BUF_SIZE - 1)] ==
798 ECHO_OP_ERASE_TAB) {
ba2e68ac
JS
799 ldata->echo_pos += 3;
800 ldata->echo_cnt -= 2;
a88a69c9 801 } else {
ba2e68ac
JS
802 ldata->echo_pos += 2;
803 ldata->echo_cnt -= 1;
a88a69c9
JP
804 }
805 } else {
ba2e68ac 806 ldata->echo_pos++;
a88a69c9 807 }
ba2e68ac 808 ldata->echo_pos &= N_TTY_BUF_SIZE - 1;
a88a69c9 809
53c5ee2c 810 ldata->echo_overrun = 1;
a88a69c9 811 } else {
ba2e68ac 812 new_byte_pos = ldata->echo_pos + ldata->echo_cnt;
a88a69c9 813 new_byte_pos &= N_TTY_BUF_SIZE - 1;
ba2e68ac 814 ldata->echo_cnt++;
a88a69c9
JP
815 }
816
ba2e68ac 817 ldata->echo_buf[new_byte_pos] = c;
a88a69c9
JP
818}
819
820/**
821 * echo_move_back_col - add operation to move back a column
57c94121 822 * @ldata: n_tty data
a88a69c9
JP
823 *
824 * Add an operation to the echo buffer to move back one column.
825 *
826 * Locking: echo_lock to protect the echo buffer
827 */
828
57c94121 829static void echo_move_back_col(struct n_tty_data *ldata)
a88a69c9 830{
bddc7152 831 mutex_lock(&ldata->echo_lock);
57c94121
JS
832 add_echo_byte(ECHO_OP_START, ldata);
833 add_echo_byte(ECHO_OP_MOVE_BACK_COL, ldata);
bddc7152 834 mutex_unlock(&ldata->echo_lock);
a88a69c9
JP
835}
836
837/**
838 * echo_set_canon_col - add operation to set the canon column
57c94121 839 * @ldata: n_tty data
a88a69c9
JP
840 *
841 * Add an operation to the echo buffer to set the canon column
842 * to the current column.
843 *
844 * Locking: echo_lock to protect the echo buffer
845 */
846
57c94121 847static void echo_set_canon_col(struct n_tty_data *ldata)
a88a69c9 848{
bddc7152 849 mutex_lock(&ldata->echo_lock);
57c94121
JS
850 add_echo_byte(ECHO_OP_START, ldata);
851 add_echo_byte(ECHO_OP_SET_CANON_COL, ldata);
bddc7152 852 mutex_unlock(&ldata->echo_lock);
a88a69c9
JP
853}
854
855/**
856 * echo_erase_tab - add operation to erase a tab
857 * @num_chars: number of character columns already used
858 * @after_tab: true if num_chars starts after a previous tab
57c94121 859 * @ldata: n_tty data
a88a69c9
JP
860 *
861 * Add an operation to the echo buffer to erase a tab.
862 *
863 * Called by the eraser function, which knows how many character
864 * columns have been used since either a previous tab or the start
865 * of input. This information will be used later, along with
866 * canon column (if applicable), to go back the correct number
867 * of columns.
868 *
869 * Locking: echo_lock to protect the echo buffer
870 */
871
872static void echo_erase_tab(unsigned int num_chars, int after_tab,
57c94121 873 struct n_tty_data *ldata)
a88a69c9 874{
bddc7152 875 mutex_lock(&ldata->echo_lock);
a88a69c9 876
57c94121
JS
877 add_echo_byte(ECHO_OP_START, ldata);
878 add_echo_byte(ECHO_OP_ERASE_TAB, ldata);
a88a69c9
JP
879
880 /* We only need to know this modulo 8 (tab spacing) */
881 num_chars &= 7;
882
883 /* Set the high bit as a flag if num_chars is after a previous tab */
884 if (after_tab)
885 num_chars |= 0x80;
300a6204 886
57c94121 887 add_echo_byte(num_chars, ldata);
a88a69c9 888
bddc7152 889 mutex_unlock(&ldata->echo_lock);
a88a69c9
JP
890}
891
892/**
893 * echo_char_raw - echo a character raw
894 * @c: unicode byte to echo
895 * @tty: terminal device
896 *
897 * Echo user input back onto the screen. This must be called only when
898 * L_ECHO(tty) is true. Called from the driver receive_buf path.
899 *
900 * This variant does not treat control characters specially.
901 *
902 * Locking: echo_lock to protect the echo buffer
903 */
904
57c94121 905static void echo_char_raw(unsigned char c, struct n_tty_data *ldata)
a88a69c9 906{
bddc7152 907 mutex_lock(&ldata->echo_lock);
a88a69c9 908 if (c == ECHO_OP_START) {
57c94121
JS
909 add_echo_byte(ECHO_OP_START, ldata);
910 add_echo_byte(ECHO_OP_START, ldata);
a88a69c9 911 } else {
57c94121 912 add_echo_byte(c, ldata);
a88a69c9 913 }
bddc7152 914 mutex_unlock(&ldata->echo_lock);
a88a69c9 915}
1da177e4 916
1da177e4 917/**
a88a69c9 918 * echo_char - echo a character
1da177e4
LT
919 * @c: unicode byte to echo
920 * @tty: terminal device
921 *
4edf1827 922 * Echo user input back onto the screen. This must be called only when
1da177e4 923 * L_ECHO(tty) is true. Called from the driver receive_buf path.
17b82060 924 *
62b26358
JP
925 * This variant tags control characters to be echoed as "^X"
926 * (where X is the letter representing the control char).
a88a69c9
JP
927 *
928 * Locking: echo_lock to protect the echo buffer
1da177e4
LT
929 */
930
931static void echo_char(unsigned char c, struct tty_struct *tty)
932{
bddc7152
JS
933 struct n_tty_data *ldata = tty->disc_data;
934
935 mutex_lock(&ldata->echo_lock);
a88a69c9
JP
936
937 if (c == ECHO_OP_START) {
57c94121
JS
938 add_echo_byte(ECHO_OP_START, ldata);
939 add_echo_byte(ECHO_OP_START, ldata);
a88a69c9 940 } else {
62b26358 941 if (L_ECHOCTL(tty) && iscntrl(c) && c != '\t')
57c94121
JS
942 add_echo_byte(ECHO_OP_START, ldata);
943 add_echo_byte(c, ldata);
a88a69c9
JP
944 }
945
bddc7152 946 mutex_unlock(&ldata->echo_lock);
1da177e4
LT
947}
948
17b82060 949/**
a88a69c9 950 * finish_erasing - complete erase
57c94121 951 * @ldata: n_tty data
17b82060 952 */
a88a69c9 953
57c94121 954static inline void finish_erasing(struct n_tty_data *ldata)
1da177e4 955{
53c5ee2c 956 if (ldata->erasing) {
57c94121 957 echo_char_raw('/', ldata);
53c5ee2c 958 ldata->erasing = 0;
1da177e4
LT
959 }
960}
961
962/**
963 * eraser - handle erase function
964 * @c: character input
965 * @tty: terminal device
966 *
3a4fa0a2 967 * Perform erase and necessary output when an erase character is
1da177e4
LT
968 * present in the stream from the driver layer. Handles the complexities
969 * of UTF-8 multibyte symbols.
17b82060 970 *
6d76bd26
PH
971 * n_tty_receive_buf()/producer path:
972 * caller holds non-exclusive termios_rwsem
973 * modifies read_head
974 *
975 * Modifying the read_head is not considered a publish in this context
976 * because canonical mode is active -- only canon_head publishes
1da177e4 977 */
4edf1827 978
1da177e4
LT
979static void eraser(unsigned char c, struct tty_struct *tty)
980{
53c5ee2c 981 struct n_tty_data *ldata = tty->disc_data;
1da177e4 982 enum { ERASE, WERASE, KILL } kill_type;
bc5a5e3f
PH
983 size_t head;
984 size_t cnt;
985 int seen_alnums;
1da177e4 986
ba2e68ac 987 if (ldata->read_head == ldata->canon_head) {
7e94b1d9 988 /* process_output('\a', tty); */ /* what do you think? */
1da177e4
LT
989 return;
990 }
991 if (c == ERASE_CHAR(tty))
992 kill_type = ERASE;
993 else if (c == WERASE_CHAR(tty))
994 kill_type = WERASE;
995 else {
996 if (!L_ECHO(tty)) {
ba2e68ac 997 ldata->read_head = ldata->canon_head;
1da177e4
LT
998 return;
999 }
1000 if (!L_ECHOK(tty) || !L_ECHOKE(tty) || !L_ECHOE(tty)) {
ba2e68ac 1001 ldata->read_head = ldata->canon_head;
57c94121 1002 finish_erasing(ldata);
1da177e4
LT
1003 echo_char(KILL_CHAR(tty), tty);
1004 /* Add a newline if ECHOK is on and ECHOKE is off. */
1005 if (L_ECHOK(tty))
57c94121 1006 echo_char_raw('\n', ldata);
1da177e4
LT
1007 return;
1008 }
1009 kill_type = KILL;
1010 }
1011
1012 seen_alnums = 0;
ba2e68ac
JS
1013 while (ldata->read_head != ldata->canon_head) {
1014 head = ldata->read_head;
1da177e4
LT
1015
1016 /* erase a single possibly multibyte character */
1017 do {
bc5a5e3f
PH
1018 head--;
1019 c = read_buf(ldata, head);
ba2e68ac 1020 } while (is_continuation(c, tty) && head != ldata->canon_head);
1da177e4
LT
1021
1022 /* do not partially erase */
1023 if (is_continuation(c, tty))
1024 break;
1025
1026 if (kill_type == WERASE) {
1027 /* Equivalent to BSD's ALTWERASE. */
1028 if (isalnum(c) || c == '_')
1029 seen_alnums++;
1030 else if (seen_alnums)
1031 break;
1032 }
bc5a5e3f 1033 cnt = ldata->read_head - head;
ba2e68ac 1034 ldata->read_head = head;
1da177e4
LT
1035 if (L_ECHO(tty)) {
1036 if (L_ECHOPRT(tty)) {
53c5ee2c 1037 if (!ldata->erasing) {
57c94121 1038 echo_char_raw('\\', ldata);
53c5ee2c 1039 ldata->erasing = 1;
1da177e4
LT
1040 }
1041 /* if cnt > 1, output a multi-byte character */
1042 echo_char(c, tty);
1043 while (--cnt > 0) {
bc5a5e3f
PH
1044 head++;
1045 echo_char_raw(read_buf(ldata, head), ldata);
57c94121 1046 echo_move_back_col(ldata);
1da177e4
LT
1047 }
1048 } else if (kill_type == ERASE && !L_ECHOE(tty)) {
1049 echo_char(ERASE_CHAR(tty), tty);
1050 } else if (c == '\t') {
a88a69c9
JP
1051 unsigned int num_chars = 0;
1052 int after_tab = 0;
bc5a5e3f 1053 size_t tail = ldata->read_head;
a88a69c9
JP
1054
1055 /*
1056 * Count the columns used for characters
1057 * since the start of input or after a
1058 * previous tab.
1059 * This info is used to go back the correct
1060 * number of columns.
1061 */
ba2e68ac 1062 while (tail != ldata->canon_head) {
bc5a5e3f
PH
1063 tail--;
1064 c = read_buf(ldata, tail);
a88a69c9
JP
1065 if (c == '\t') {
1066 after_tab = 1;
1067 break;
300a6204 1068 } else if (iscntrl(c)) {
1da177e4 1069 if (L_ECHOCTL(tty))
a88a69c9
JP
1070 num_chars += 2;
1071 } else if (!is_continuation(c, tty)) {
1072 num_chars++;
1073 }
1da177e4 1074 }
57c94121 1075 echo_erase_tab(num_chars, after_tab, ldata);
1da177e4
LT
1076 } else {
1077 if (iscntrl(c) && L_ECHOCTL(tty)) {
57c94121
JS
1078 echo_char_raw('\b', ldata);
1079 echo_char_raw(' ', ldata);
1080 echo_char_raw('\b', ldata);
1da177e4
LT
1081 }
1082 if (!iscntrl(c) || L_ECHOCTL(tty)) {
57c94121
JS
1083 echo_char_raw('\b', ldata);
1084 echo_char_raw(' ', ldata);
1085 echo_char_raw('\b', ldata);
1da177e4
LT
1086 }
1087 }
1088 }
1089 if (kill_type == ERASE)
1090 break;
1091 }
ba2e68ac 1092 if (ldata->read_head == ldata->canon_head && L_ECHO(tty))
57c94121 1093 finish_erasing(ldata);
1da177e4
LT
1094}
1095
1096/**
1097 * isig - handle the ISIG optio
1098 * @sig: signal
1099 * @tty: terminal
1da177e4 1100 *
8c985d18
PH
1101 * Called when a signal is being sent due to terminal input.
1102 * Called from the driver receive_buf path so serialized.
17b82060 1103 *
8c985d18 1104 * Locking: ctrl_lock
1da177e4 1105 */
4edf1827 1106
8c985d18 1107static inline void isig(int sig, struct tty_struct *tty)
1da177e4 1108{
8c985d18
PH
1109 struct pid *tty_pgrp = tty_get_pgrp(tty);
1110 if (tty_pgrp) {
1111 kill_pgrp(tty_pgrp, sig, 1);
1112 put_pid(tty_pgrp);
1da177e4
LT
1113 }
1114}
1115
1116/**
1117 * n_tty_receive_break - handle break
1118 * @tty: terminal
1119 *
1120 * An RS232 break event has been hit in the incoming bitstream. This
1121 * can cause a variety of events depending upon the termios settings.
1122 *
6d76bd26
PH
1123 * n_tty_receive_buf()/producer path:
1124 * caller holds non-exclusive termios_rwsem
1125 * publishes read_head via put_tty_queue()
1126 *
1127 * Note: may get exclusive termios_rwsem if flushing input buffer
1da177e4 1128 */
4edf1827 1129
1da177e4
LT
1130static inline void n_tty_receive_break(struct tty_struct *tty)
1131{
57c94121
JS
1132 struct n_tty_data *ldata = tty->disc_data;
1133
1da177e4
LT
1134 if (I_IGNBRK(tty))
1135 return;
1136 if (I_BRKINT(tty)) {
8c985d18
PH
1137 isig(SIGINT, tty);
1138 if (!L_NOFLSH(tty)) {
6d76bd26
PH
1139 /* flushing needs exclusive termios_rwsem */
1140 up_read(&tty->termios_rwsem);
8c985d18
PH
1141 n_tty_flush_buffer(tty);
1142 tty_driver_flush_buffer(tty);
6d76bd26 1143 down_read(&tty->termios_rwsem);
8c985d18 1144 }
1da177e4
LT
1145 return;
1146 }
1147 if (I_PARMRK(tty)) {
57c94121
JS
1148 put_tty_queue('\377', ldata);
1149 put_tty_queue('\0', ldata);
1da177e4 1150 }
57c94121 1151 put_tty_queue('\0', ldata);
1da177e4
LT
1152 wake_up_interruptible(&tty->read_wait);
1153}
1154
1155/**
1156 * n_tty_receive_overrun - handle overrun reporting
1157 * @tty: terminal
1158 *
1159 * Data arrived faster than we could process it. While the tty
1160 * driver has flagged this the bits that were missed are gone
1161 * forever.
1162 *
1163 * Called from the receive_buf path so single threaded. Does not
1164 * need locking as num_overrun and overrun_time are function
1165 * private.
1166 */
4edf1827 1167
1da177e4
LT
1168static inline void n_tty_receive_overrun(struct tty_struct *tty)
1169{
53c5ee2c 1170 struct n_tty_data *ldata = tty->disc_data;
1da177e4
LT
1171 char buf[64];
1172
53c5ee2c
JS
1173 ldata->num_overrun++;
1174 if (time_after(jiffies, ldata->overrun_time + HZ) ||
1175 time_after(ldata->overrun_time, jiffies)) {
1da177e4
LT
1176 printk(KERN_WARNING "%s: %d input overrun(s)\n",
1177 tty_name(tty, buf),
53c5ee2c
JS
1178 ldata->num_overrun);
1179 ldata->overrun_time = jiffies;
1180 ldata->num_overrun = 0;
1da177e4
LT
1181 }
1182}
1183
1184/**
1185 * n_tty_receive_parity_error - error notifier
1186 * @tty: terminal device
1187 * @c: character
1188 *
1189 * Process a parity error and queue the right data to indicate
6d76bd26
PH
1190 * the error case if necessary.
1191 *
1192 * n_tty_receive_buf()/producer path:
1193 * caller holds non-exclusive termios_rwsem
1194 * publishes read_head via put_tty_queue()
1da177e4
LT
1195 */
1196static inline void n_tty_receive_parity_error(struct tty_struct *tty,
1197 unsigned char c)
1198{
57c94121
JS
1199 struct n_tty_data *ldata = tty->disc_data;
1200
4edf1827 1201 if (I_IGNPAR(tty))
1da177e4 1202 return;
1da177e4 1203 if (I_PARMRK(tty)) {
57c94121
JS
1204 put_tty_queue('\377', ldata);
1205 put_tty_queue('\0', ldata);
1206 put_tty_queue(c, ldata);
1da177e4 1207 } else if (I_INPCK(tty))
57c94121 1208 put_tty_queue('\0', ldata);
1da177e4 1209 else
57c94121 1210 put_tty_queue(c, ldata);
1da177e4
LT
1211 wake_up_interruptible(&tty->read_wait);
1212}
1213
1214/**
1215 * n_tty_receive_char - perform processing
1216 * @tty: terminal device
1217 * @c: character
1218 *
1219 * Process an individual character of input received from the driver.
4edf1827 1220 * This is serialized with respect to itself by the rules for the
1da177e4 1221 * driver above.
6d76bd26
PH
1222 *
1223 * n_tty_receive_buf()/producer path:
1224 * caller holds non-exclusive termios_rwsem
1225 * publishes canon_head if canonical mode is active
1226 * otherwise, publishes read_head via put_tty_queue()
1da177e4
LT
1227 */
1228
1229static inline void n_tty_receive_char(struct tty_struct *tty, unsigned char c)
1230{
53c5ee2c 1231 struct n_tty_data *ldata = tty->disc_data;
acc71bba 1232 int parmrk;
1da177e4 1233
53c5ee2c 1234 if (ldata->raw) {
57c94121 1235 put_tty_queue(c, ldata);
1da177e4
LT
1236 return;
1237 }
4edf1827 1238
1da177e4
LT
1239 if (I_ISTRIP(tty))
1240 c &= 0x7f;
1241 if (I_IUCLC(tty) && L_IEXTEN(tty))
300a6204 1242 c = tolower(c);
1da177e4 1243
26df6d13 1244 if (L_EXTPROC(tty)) {
57c94121 1245 put_tty_queue(c, ldata);
26df6d13 1246 return;
1247 }
1248
54d2a37e 1249 if (tty->stopped && !tty->flow_stopped && I_IXON(tty) &&
a88a69c9
JP
1250 I_IXANY(tty) && c != START_CHAR(tty) && c != STOP_CHAR(tty) &&
1251 c != INTR_CHAR(tty) && c != QUIT_CHAR(tty) && c != SUSP_CHAR(tty)) {
54d2a37e 1252 start_tty(tty);
a88a69c9
JP
1253 process_echoes(tty);
1254 }
54d2a37e 1255
1da177e4
LT
1256 if (tty->closing) {
1257 if (I_IXON(tty)) {
a88a69c9 1258 if (c == START_CHAR(tty)) {
1da177e4 1259 start_tty(tty);
a88a69c9 1260 process_echoes(tty);
300a6204 1261 } else if (c == STOP_CHAR(tty))
1da177e4
LT
1262 stop_tty(tty);
1263 }
1264 return;
1265 }
1266
1267 /*
1268 * If the previous character was LNEXT, or we know that this
1269 * character is not one of the characters that we'll have to
1270 * handle specially, do shortcut processing to speed things
1271 * up.
1272 */
3fe780b3 1273 if (!test_bit(c, ldata->process_char_map) || ldata->lnext) {
53c5ee2c 1274 ldata->lnext = 0;
acc71bba 1275 parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0;
ce74117a 1276 if (read_cnt(ldata) >= (N_TTY_BUF_SIZE - parmrk - 1)) {
acc71bba 1277 /* beep if no space */
7e94b1d9
JP
1278 if (L_ECHO(tty))
1279 process_output('\a', tty);
acc71bba
JP
1280 return;
1281 }
1282 if (L_ECHO(tty)) {
57c94121 1283 finish_erasing(ldata);
1da177e4 1284 /* Record the column of first canon char. */
ba2e68ac 1285 if (ldata->canon_head == ldata->read_head)
57c94121 1286 echo_set_canon_col(ldata);
1da177e4 1287 echo_char(c, tty);
a88a69c9 1288 process_echoes(tty);
1da177e4 1289 }
acc71bba 1290 if (parmrk)
57c94121
JS
1291 put_tty_queue(c, ldata);
1292 put_tty_queue(c, ldata);
1da177e4
LT
1293 return;
1294 }
4edf1827 1295
1da177e4
LT
1296 if (I_IXON(tty)) {
1297 if (c == START_CHAR(tty)) {
1298 start_tty(tty);
a88a69c9 1299 process_echoes(tty);
1da177e4
LT
1300 return;
1301 }
1302 if (c == STOP_CHAR(tty)) {
1303 stop_tty(tty);
1304 return;
1305 }
1306 }
575537b3 1307
1da177e4
LT
1308 if (L_ISIG(tty)) {
1309 int signal;
1310 signal = SIGINT;
1311 if (c == INTR_CHAR(tty))
1312 goto send_signal;
1313 signal = SIGQUIT;
1314 if (c == QUIT_CHAR(tty))
1315 goto send_signal;
1316 signal = SIGTSTP;
1317 if (c == SUSP_CHAR(tty)) {
1318send_signal:
ec5b1157 1319 if (!L_NOFLSH(tty)) {
6d76bd26
PH
1320 /* flushing needs exclusive termios_rwsem */
1321 up_read(&tty->termios_rwsem);
ec5b1157 1322 n_tty_flush_buffer(tty);
f34d7a5b 1323 tty_driver_flush_buffer(tty);
6d76bd26 1324 down_read(&tty->termios_rwsem);
ec5b1157 1325 }
a88a69c9
JP
1326 if (I_IXON(tty))
1327 start_tty(tty);
1328 if (L_ECHO(tty)) {
ec5b1157 1329 echo_char(c, tty);
a88a69c9
JP
1330 process_echoes(tty);
1331 }
8c985d18 1332 isig(signal, tty);
1da177e4
LT
1333 return;
1334 }
1335 }
575537b3
JP
1336
1337 if (c == '\r') {
1338 if (I_IGNCR(tty))
1339 return;
1340 if (I_ICRNL(tty))
1341 c = '\n';
1342 } else if (c == '\n' && I_INLCR(tty))
1343 c = '\r';
1344
53c5ee2c 1345 if (ldata->icanon) {
1da177e4
LT
1346 if (c == ERASE_CHAR(tty) || c == KILL_CHAR(tty) ||
1347 (c == WERASE_CHAR(tty) && L_IEXTEN(tty))) {
1348 eraser(c, tty);
a88a69c9 1349 process_echoes(tty);
1da177e4
LT
1350 return;
1351 }
1352 if (c == LNEXT_CHAR(tty) && L_IEXTEN(tty)) {
53c5ee2c 1353 ldata->lnext = 1;
1da177e4 1354 if (L_ECHO(tty)) {
57c94121 1355 finish_erasing(ldata);
1da177e4 1356 if (L_ECHOCTL(tty)) {
57c94121
JS
1357 echo_char_raw('^', ldata);
1358 echo_char_raw('\b', ldata);
a88a69c9 1359 process_echoes(tty);
1da177e4
LT
1360 }
1361 }
1362 return;
1363 }
1364 if (c == REPRINT_CHAR(tty) && L_ECHO(tty) &&
1365 L_IEXTEN(tty)) {
bc5a5e3f 1366 size_t tail = ldata->canon_head;
1da177e4 1367
57c94121 1368 finish_erasing(ldata);
1da177e4 1369 echo_char(c, tty);
57c94121 1370 echo_char_raw('\n', ldata);
ba2e68ac 1371 while (tail != ldata->read_head) {
bc5a5e3f
PH
1372 echo_char(read_buf(ldata, tail), tty);
1373 tail++;
1da177e4 1374 }
a88a69c9 1375 process_echoes(tty);
1da177e4
LT
1376 return;
1377 }
1378 if (c == '\n') {
ce74117a 1379 if (read_cnt(ldata) >= N_TTY_BUF_SIZE) {
7e94b1d9
JP
1380 if (L_ECHO(tty))
1381 process_output('\a', tty);
acc71bba
JP
1382 return;
1383 }
1384 if (L_ECHO(tty) || L_ECHONL(tty)) {
57c94121 1385 echo_char_raw('\n', ldata);
a88a69c9 1386 process_echoes(tty);
1da177e4
LT
1387 }
1388 goto handle_newline;
1389 }
1390 if (c == EOF_CHAR(tty)) {
ce74117a 1391 if (read_cnt(ldata) >= N_TTY_BUF_SIZE)
acc71bba 1392 return;
ba2e68ac 1393 if (ldata->canon_head != ldata->read_head)
4edf1827 1394 set_bit(TTY_PUSH, &tty->flags);
1da177e4
LT
1395 c = __DISABLED_CHAR;
1396 goto handle_newline;
1397 }
1398 if ((c == EOL_CHAR(tty)) ||
1399 (c == EOL2_CHAR(tty) && L_IEXTEN(tty))) {
acc71bba
JP
1400 parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty))
1401 ? 1 : 0;
ce74117a 1402 if (read_cnt(ldata) >= (N_TTY_BUF_SIZE - parmrk)) {
7e94b1d9
JP
1403 if (L_ECHO(tty))
1404 process_output('\a', tty);
acc71bba
JP
1405 return;
1406 }
1da177e4
LT
1407 /*
1408 * XXX are EOL_CHAR and EOL2_CHAR echoed?!?
1409 */
1410 if (L_ECHO(tty)) {
1da177e4 1411 /* Record the column of first canon char. */
ba2e68ac 1412 if (ldata->canon_head == ldata->read_head)
57c94121 1413 echo_set_canon_col(ldata);
1da177e4 1414 echo_char(c, tty);
a88a69c9 1415 process_echoes(tty);
1da177e4
LT
1416 }
1417 /*
1418 * XXX does PARMRK doubling happen for
1419 * EOL_CHAR and EOL2_CHAR?
1420 */
acc71bba 1421 if (parmrk)
57c94121 1422 put_tty_queue(c, ldata);
1da177e4 1423
4edf1827 1424handle_newline:
bc5a5e3f 1425 set_bit(ldata->read_head & (N_TTY_BUF_SIZE - 1), ldata->read_flags);
6d76bd26 1426 put_tty_queue(c, ldata);
ba2e68ac 1427 ldata->canon_head = ldata->read_head;
1da177e4
LT
1428 kill_fasync(&tty->fasync, SIGIO, POLL_IN);
1429 if (waitqueue_active(&tty->read_wait))
1430 wake_up_interruptible(&tty->read_wait);
1431 return;
1432 }
1433 }
4edf1827 1434
acc71bba 1435 parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0;
ce74117a 1436 if (read_cnt(ldata) >= (N_TTY_BUF_SIZE - parmrk - 1)) {
acc71bba 1437 /* beep if no space */
7e94b1d9
JP
1438 if (L_ECHO(tty))
1439 process_output('\a', tty);
acc71bba
JP
1440 return;
1441 }
1442 if (L_ECHO(tty)) {
57c94121 1443 finish_erasing(ldata);
1da177e4 1444 if (c == '\n')
57c94121 1445 echo_char_raw('\n', ldata);
1da177e4
LT
1446 else {
1447 /* Record the column of first canon char. */
ba2e68ac 1448 if (ldata->canon_head == ldata->read_head)
57c94121 1449 echo_set_canon_col(ldata);
1da177e4
LT
1450 echo_char(c, tty);
1451 }
a88a69c9 1452 process_echoes(tty);
1da177e4
LT
1453 }
1454
acc71bba 1455 if (parmrk)
57c94121 1456 put_tty_queue(c, ldata);
1da177e4 1457
57c94121 1458 put_tty_queue(c, ldata);
4edf1827 1459}
1da177e4 1460
1da177e4
LT
1461
1462/**
1463 * n_tty_write_wakeup - asynchronous I/O notifier
1464 * @tty: tty device
1465 *
1466 * Required for the ptys, serial driver etc. since processes
1467 * that attach themselves to the master and rely on ASYNC
1468 * IO must be woken up
1469 */
1470
1471static void n_tty_write_wakeup(struct tty_struct *tty)
1472{
ff8cb0fd 1473 if (tty->fasync && test_and_clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags))
1da177e4 1474 kill_fasync(&tty->fasync, SIGIO, POLL_OUT);
1da177e4
LT
1475}
1476
1477/**
1478 * n_tty_receive_buf - data receive
1479 * @tty: terminal device
1480 * @cp: buffer
1481 * @fp: flag buffer
1482 * @count: characters
1483 *
1484 * Called by the terminal driver when a block of characters has
1485 * been received. This function must be called from soft contexts
1486 * not from interrupt context. The driver is responsible for making
1487 * calls one at a time and in order (or using flush_to_ldisc)
6d76bd26
PH
1488 *
1489 * n_tty_receive_buf()/producer path:
1490 * claims non-exclusive termios_rwsem
1491 * publishes read_head and canon_head
1da177e4 1492 */
4edf1827 1493
24a89d1c
PH
1494static void __receive_buf(struct tty_struct *tty, const unsigned char *cp,
1495 char *fp, int count)
1da177e4 1496{
53c5ee2c 1497 struct n_tty_data *ldata = tty->disc_data;
1da177e4
LT
1498 const unsigned char *p;
1499 char *f, flags = TTY_NORMAL;
1da177e4 1500 char buf[64];
1da177e4 1501
53c5ee2c 1502 if (ldata->real_raw) {
d1913e39
PH
1503 size_t n, head;
1504
1505 head = ldata->read_head & (N_TTY_BUF_SIZE - 1);
1506 n = N_TTY_BUF_SIZE - max(read_cnt(ldata), head);
1507 n = min_t(size_t, count, n);
1508 memcpy(read_buf_addr(ldata, head), cp, n);
1509 ldata->read_head += n;
1510 cp += n;
1511 count -= n;
1512
1513 head = ldata->read_head & (N_TTY_BUF_SIZE - 1);
1514 n = N_TTY_BUF_SIZE - max(read_cnt(ldata), head);
1515 n = min_t(size_t, count, n);
1516 memcpy(read_buf_addr(ldata, head), cp, n);
1517 ldata->read_head += n;
1da177e4 1518 } else {
d1913e39
PH
1519 int i;
1520
4edf1827 1521 for (i = count, p = cp, f = fp; i; i--, p++) {
1da177e4
LT
1522 if (f)
1523 flags = *f++;
1524 switch (flags) {
1525 case TTY_NORMAL:
1526 n_tty_receive_char(tty, *p);
1527 break;
1528 case TTY_BREAK:
1529 n_tty_receive_break(tty);
1530 break;
1531 case TTY_PARITY:
1532 case TTY_FRAME:
1533 n_tty_receive_parity_error(tty, *p);
1534 break;
1535 case TTY_OVERRUN:
1536 n_tty_receive_overrun(tty);
1537 break;
1538 default:
4edf1827 1539 printk(KERN_ERR "%s: unknown flag %d\n",
1da177e4
LT
1540 tty_name(tty, buf), flags);
1541 break;
1542 }
1543 }
f34d7a5b
AC
1544 if (tty->ops->flush_chars)
1545 tty->ops->flush_chars(tty);
1da177e4
LT
1546 }
1547
ce74117a 1548 if ((!ldata->icanon && (read_cnt(ldata) >= ldata->minimum_to_wake)) ||
26df6d13 1549 L_EXTPROC(tty)) {
1da177e4
LT
1550 kill_fasync(&tty->fasync, SIGIO, POLL_IN);
1551 if (waitqueue_active(&tty->read_wait))
1552 wake_up_interruptible(&tty->read_wait);
1553 }
1554
6367ca72 1555 n_tty_check_throttle(tty);
1da177e4
LT
1556}
1557
24a89d1c
PH
1558static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
1559 char *fp, int count)
1560{
9356b535 1561 down_read(&tty->termios_rwsem);
24a89d1c 1562 __receive_buf(tty, cp, fp, count);
9356b535 1563 up_read(&tty->termios_rwsem);
24a89d1c
PH
1564}
1565
1566static int n_tty_receive_buf2(struct tty_struct *tty, const unsigned char *cp,
1567 char *fp, int count)
1568{
1569 struct n_tty_data *ldata = tty->disc_data;
1570 int room;
1571
9356b535
PH
1572 down_read(&tty->termios_rwsem);
1573
24a89d1c
PH
1574 tty->receive_room = room = receive_room(tty);
1575 if (!room)
1576 ldata->no_room = 1;
1577 count = min(count, room);
1578 if (count)
1579 __receive_buf(tty, cp, fp, count);
1580
9356b535
PH
1581 up_read(&tty->termios_rwsem);
1582
24a89d1c
PH
1583 return count;
1584}
1585
1da177e4
LT
1586int is_ignored(int sig)
1587{
1588 return (sigismember(&current->blocked, sig) ||
4edf1827 1589 current->sighand->action[sig-1].sa.sa_handler == SIG_IGN);
1da177e4
LT
1590}
1591
1592/**
1593 * n_tty_set_termios - termios data changed
1594 * @tty: terminal
1595 * @old: previous data
1596 *
1597 * Called by the tty layer when the user changes termios flags so
1598 * that the line discipline can plan ahead. This function cannot sleep
4edf1827 1599 * and is protected from re-entry by the tty layer. The user is
1da177e4
LT
1600 * guaranteed that this function will not be re-entered or in progress
1601 * when the ldisc is closed.
17b82060 1602 *
6a1c0680 1603 * Locking: Caller holds tty->termios_rwsem
1da177e4 1604 */
4edf1827
AC
1605
1606static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
1da177e4 1607{
53c5ee2c 1608 struct n_tty_data *ldata = tty->disc_data;
47afa7a5 1609 int canon_change = 1;
47afa7a5
AC
1610
1611 if (old)
adc8d746 1612 canon_change = (old->c_lflag ^ tty->termios.c_lflag) & ICANON;
47afa7a5 1613 if (canon_change) {
3fe780b3 1614 bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
ba2e68ac 1615 ldata->canon_head = ldata->read_tail;
53c5ee2c 1616 ldata->erasing = 0;
6f9b028a 1617 ldata->lnext = 0;
47afa7a5
AC
1618 }
1619
ce74117a 1620 if (canon_change && !L_ICANON(tty) && read_cnt(ldata))
47afa7a5 1621 wake_up_interruptible(&tty->read_wait);
4edf1827 1622
53c5ee2c 1623 ldata->icanon = (L_ICANON(tty) != 0);
582f5590 1624
1da177e4
LT
1625 if (I_ISTRIP(tty) || I_IUCLC(tty) || I_IGNCR(tty) ||
1626 I_ICRNL(tty) || I_INLCR(tty) || L_ICANON(tty) ||
1627 I_IXON(tty) || L_ISIG(tty) || L_ECHO(tty) ||
1628 I_PARMRK(tty)) {
3fe780b3 1629 bitmap_zero(ldata->process_char_map, 256);
1da177e4
LT
1630
1631 if (I_IGNCR(tty) || I_ICRNL(tty))
3fe780b3 1632 set_bit('\r', ldata->process_char_map);
1da177e4 1633 if (I_INLCR(tty))
3fe780b3 1634 set_bit('\n', ldata->process_char_map);
1da177e4
LT
1635
1636 if (L_ICANON(tty)) {
3fe780b3
JS
1637 set_bit(ERASE_CHAR(tty), ldata->process_char_map);
1638 set_bit(KILL_CHAR(tty), ldata->process_char_map);
1639 set_bit(EOF_CHAR(tty), ldata->process_char_map);
1640 set_bit('\n', ldata->process_char_map);
1641 set_bit(EOL_CHAR(tty), ldata->process_char_map);
1da177e4
LT
1642 if (L_IEXTEN(tty)) {
1643 set_bit(WERASE_CHAR(tty),
3fe780b3 1644 ldata->process_char_map);
1da177e4 1645 set_bit(LNEXT_CHAR(tty),
3fe780b3 1646 ldata->process_char_map);
1da177e4 1647 set_bit(EOL2_CHAR(tty),
3fe780b3 1648 ldata->process_char_map);
1da177e4
LT
1649 if (L_ECHO(tty))
1650 set_bit(REPRINT_CHAR(tty),
3fe780b3 1651 ldata->process_char_map);
1da177e4
LT
1652 }
1653 }
1654 if (I_IXON(tty)) {
3fe780b3
JS
1655 set_bit(START_CHAR(tty), ldata->process_char_map);
1656 set_bit(STOP_CHAR(tty), ldata->process_char_map);
1da177e4
LT
1657 }
1658 if (L_ISIG(tty)) {
3fe780b3
JS
1659 set_bit(INTR_CHAR(tty), ldata->process_char_map);
1660 set_bit(QUIT_CHAR(tty), ldata->process_char_map);
1661 set_bit(SUSP_CHAR(tty), ldata->process_char_map);
1da177e4 1662 }
3fe780b3 1663 clear_bit(__DISABLED_CHAR, ldata->process_char_map);
53c5ee2c
JS
1664 ldata->raw = 0;
1665 ldata->real_raw = 0;
1da177e4 1666 } else {
53c5ee2c 1667 ldata->raw = 1;
1da177e4
LT
1668 if ((I_IGNBRK(tty) || (!I_BRKINT(tty) && !I_PARMRK(tty))) &&
1669 (I_IGNPAR(tty) || !I_INPCK(tty)) &&
1670 (tty->driver->flags & TTY_DRIVER_REAL_RAW))
53c5ee2c 1671 ldata->real_raw = 1;
1da177e4 1672 else
53c5ee2c 1673 ldata->real_raw = 0;
1da177e4 1674 }
55db4c64 1675 n_tty_set_room(tty);
dab73b4e
WY
1676 /*
1677 * Fix tty hang when I_IXON(tty) is cleared, but the tty
1678 * been stopped by STOP_CHAR(tty) before it.
1679 */
1680 if (!I_IXON(tty) && old && (old->c_iflag & IXON) && !tty->flow_stopped) {
1681 start_tty(tty);
1682 }
1683
f34d7a5b
AC
1684 /* The termios change make the tty ready for I/O */
1685 wake_up_interruptible(&tty->write_wait);
1686 wake_up_interruptible(&tty->read_wait);
1da177e4
LT
1687}
1688
1689/**
1690 * n_tty_close - close the ldisc for this tty
1691 * @tty: device
1692 *
4edf1827
AC
1693 * Called from the terminal layer when this line discipline is
1694 * being shut down, either because of a close or becsuse of a
1da177e4
LT
1695 * discipline change. The function will not be called while other
1696 * ldisc methods are in progress.
1697 */
4edf1827 1698
1da177e4
LT
1699static void n_tty_close(struct tty_struct *tty)
1700{
70ece7a7
JS
1701 struct n_tty_data *ldata = tty->disc_data;
1702
79901317
PH
1703 if (tty->link)
1704 n_tty_packet_mode_flush(tty);
1705
ba2e68ac
JS
1706 kfree(ldata->read_buf);
1707 kfree(ldata->echo_buf);
70ece7a7 1708 kfree(ldata);
70ece7a7 1709 tty->disc_data = NULL;
1da177e4
LT
1710}
1711
1712/**
1713 * n_tty_open - open an ldisc
1714 * @tty: terminal to open
1715 *
4edf1827 1716 * Called when this line discipline is being attached to the
1da177e4
LT
1717 * terminal device. Can sleep. Called serialized so that no
1718 * other events will occur in parallel. No further open will occur
1719 * until a close.
1720 */
1721
1722static int n_tty_open(struct tty_struct *tty)
1723{
70ece7a7
JS
1724 struct n_tty_data *ldata;
1725
1726 ldata = kzalloc(sizeof(*ldata), GFP_KERNEL);
1727 if (!ldata)
1728 goto err;
1729
53c5ee2c 1730 ldata->overrun_time = jiffies;
bddc7152
JS
1731 mutex_init(&ldata->atomic_read_lock);
1732 mutex_init(&ldata->output_lock);
1733 mutex_init(&ldata->echo_lock);
53c5ee2c 1734
a88a69c9 1735 /* These are ugly. Currently a malloc failure here can panic */
ba2e68ac
JS
1736 ldata->read_buf = kzalloc(N_TTY_BUF_SIZE, GFP_KERNEL);
1737 ldata->echo_buf = kzalloc(N_TTY_BUF_SIZE, GFP_KERNEL);
1738 if (!ldata->read_buf || !ldata->echo_buf)
b91939f5 1739 goto err_free_bufs;
0b4068a1 1740
70ece7a7 1741 tty->disc_data = ldata;
b66f4fa5 1742 reset_buffer_flags(tty->disc_data);
53c5ee2c 1743 ldata->column = 0;
f6c8dbe6 1744 ldata->minimum_to_wake = 1;
1da177e4 1745 tty->closing = 0;
b66f4fa5
PH
1746 /* indicate buffer work may resume */
1747 clear_bit(TTY_LDISC_HALTED, &tty->flags);
1748 n_tty_set_termios(tty, NULL);
1749 tty_unthrottle(tty);
70ece7a7 1750
1da177e4 1751 return 0;
b91939f5 1752err_free_bufs:
ba2e68ac
JS
1753 kfree(ldata->read_buf);
1754 kfree(ldata->echo_buf);
70ece7a7
JS
1755 kfree(ldata);
1756err:
b91939f5 1757 return -ENOMEM;
1da177e4
LT
1758}
1759
1760static inline int input_available_p(struct tty_struct *tty, int amt)
1761{
53c5ee2c
JS
1762 struct n_tty_data *ldata = tty->disc_data;
1763
53c5ee2c 1764 if (ldata->icanon && !L_EXTPROC(tty)) {
a73d3d69 1765 if (ldata->canon_head != ldata->read_tail)
1da177e4 1766 return 1;
ce74117a 1767 } else if (read_cnt(ldata) >= (amt ? amt : 1))
1da177e4
LT
1768 return 1;
1769
1770 return 0;
1771}
1772
1773/**
bbd20759 1774 * copy_from_read_buf - copy read data directly
1da177e4
LT
1775 * @tty: terminal device
1776 * @b: user data
1777 * @nr: size of data
1778 *
11a96d18 1779 * Helper function to speed up n_tty_read. It is only called when
1da177e4
LT
1780 * ICANON is off; it copies characters straight from the tty queue to
1781 * user space directly. It can be profitably called twice; once to
1782 * drain the space from the tail pointer to the (physical) end of the
1783 * buffer, and once to drain the space from the (physical) beginning of
1784 * the buffer to head pointer.
1785 *
bddc7152 1786 * Called under the ldata->atomic_read_lock sem
1da177e4 1787 *
6d76bd26
PH
1788 * n_tty_read()/consumer path:
1789 * caller holds non-exclusive termios_rwsem
1790 * read_tail published
1da177e4 1791 */
4edf1827 1792
33f0f88f 1793static int copy_from_read_buf(struct tty_struct *tty,
1da177e4
LT
1794 unsigned char __user **b,
1795 size_t *nr)
1796
1797{
53c5ee2c 1798 struct n_tty_data *ldata = tty->disc_data;
1da177e4
LT
1799 int retval;
1800 size_t n;
3fa10cc8 1801 bool is_eof;
bc5a5e3f 1802 size_t tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1);
1da177e4
LT
1803
1804 retval = 0;
bc5a5e3f 1805 n = min(read_cnt(ldata), N_TTY_BUF_SIZE - tail);
1da177e4 1806 n = min(*nr, n);
1da177e4 1807 if (n) {
bc5a5e3f 1808 retval = copy_to_user(*b, read_buf_addr(ldata, tail), n);
1da177e4 1809 n -= retval;
bc5a5e3f
PH
1810 is_eof = n == 1 && read_buf(ldata, tail) == EOF_CHAR(tty);
1811 tty_audit_add_data(tty, read_buf_addr(ldata, tail), n,
53c5ee2c 1812 ldata->icanon);
bc5a5e3f 1813 ldata->read_tail += n;
26df6d13 1814 /* Turn single EOF into zero-length read */
ce74117a 1815 if (L_EXTPROC(tty) && ldata->icanon && is_eof && !read_cnt(ldata))
3fa10cc8 1816 n = 0;
1da177e4
LT
1817 *b += n;
1818 *nr -= n;
1819 }
1820 return retval;
1821}
1822
88bb0de3 1823/**
32f13521 1824 * canon_copy_from_read_buf - copy read data in canonical mode
88bb0de3
PH
1825 * @tty: terminal device
1826 * @b: user data
1827 * @nr: size of data
1828 *
1829 * Helper function for n_tty_read. It is only called when ICANON is on;
32f13521
PH
1830 * it copies one line of input up to and including the line-delimiting
1831 * character into the user-space buffer.
88bb0de3
PH
1832 *
1833 * Called under the atomic_read_lock mutex
6d76bd26
PH
1834 *
1835 * n_tty_read()/consumer path:
1836 * caller holds non-exclusive termios_rwsem
1837 * read_tail published
88bb0de3
PH
1838 */
1839
32f13521
PH
1840static int canon_copy_from_read_buf(struct tty_struct *tty,
1841 unsigned char __user **b,
1842 size_t *nr)
88bb0de3
PH
1843{
1844 struct n_tty_data *ldata = tty->disc_data;
32f13521 1845 size_t n, size, more, c;
bc5a5e3f
PH
1846 size_t eol;
1847 size_t tail;
1848 int ret, found = 0;
88bb0de3
PH
1849
1850 /* N.B. avoid overrun if nr == 0 */
ce74117a 1851 n = min(*nr, read_cnt(ldata));
6d76bd26 1852 if (!n)
32f13521 1853 return 0;
88bb0de3 1854
bc5a5e3f 1855 tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1);
32f13521
PH
1856 size = min_t(size_t, tail + n, N_TTY_BUF_SIZE);
1857
bc5a5e3f 1858 n_tty_trace("%s: nr:%zu tail:%zu n:%zu size:%zu\n",
32f13521
PH
1859 __func__, *nr, tail, n, size);
1860
1861 eol = find_next_bit(ldata->read_flags, size, tail);
1862 more = n - (size - tail);
1863 if (eol == N_TTY_BUF_SIZE && more) {
1864 /* scan wrapped without finding set bit */
1865 eol = find_next_bit(ldata->read_flags, more, 0);
1866 if (eol != more)
1867 found = 1;
1868 } else if (eol != size)
1869 found = 1;
1870
1871 size = N_TTY_BUF_SIZE - tail;
1872 n = (found + eol + size) & (N_TTY_BUF_SIZE - 1);
1873 c = n;
1874
bc5a5e3f 1875 if (found && read_buf(ldata, eol) == __DISABLED_CHAR)
32f13521
PH
1876 n--;
1877
bc5a5e3f 1878 n_tty_trace("%s: eol:%zu found:%d n:%zu c:%zu size:%zu more:%zu\n",
32f13521
PH
1879 __func__, eol, found, n, c, size, more);
1880
32f13521 1881 if (n > size) {
bc5a5e3f 1882 ret = copy_to_user(*b, read_buf_addr(ldata, tail), size);
32f13521
PH
1883 if (ret)
1884 return -EFAULT;
1885 ret = copy_to_user(*b + size, ldata->read_buf, n - size);
1886 } else
bc5a5e3f 1887 ret = copy_to_user(*b, read_buf_addr(ldata, tail), n);
32f13521
PH
1888
1889 if (ret)
1890 return -EFAULT;
1891 *b += n;
1892 *nr -= n;
1893
a73d3d69 1894 if (found)
6d76bd26
PH
1895 clear_bit(eol, ldata->read_flags);
1896 smp_mb__after_clear_bit();
1897 ldata->read_tail += c;
88bb0de3 1898
32f13521
PH
1899 if (found)
1900 tty_audit_push(tty);
88bb0de3
PH
1901 return 0;
1902}
1903
cc4191dc 1904extern ssize_t redirected_tty_write(struct file *, const char __user *,
4edf1827 1905 size_t, loff_t *);
1da177e4
LT
1906
1907/**
1908 * job_control - check job control
1909 * @tty: tty
1910 * @file: file handle
1911 *
1912 * Perform job control management checks on this file/tty descriptor
4edf1827 1913 * and if appropriate send any needed signals and return a negative
1da177e4 1914 * error code if action should be taken.
04f378b1 1915 *
01a5e440
PH
1916 * Locking: redirected write test is safe
1917 * current->signal->tty check is safe
1918 * ctrl_lock to safely reference tty->pgrp
1da177e4 1919 */
4edf1827 1920
1da177e4
LT
1921static int job_control(struct tty_struct *tty, struct file *file)
1922{
1923 /* Job control check -- must be done at start and after
1924 every sleep (POSIX.1 7.1.1.4). */
1925 /* NOTE: not yet done after every sleep pending a thorough
1926 check of the logic of this change. -- jlc */
1927 /* don't stop on /dev/console */
01a5e440
PH
1928 if (file->f_op->write == redirected_tty_write ||
1929 current->signal->tty != tty)
1930 return 0;
1931
1932 spin_lock_irq(&tty->ctrl_lock);
1933 if (!tty->pgrp)
1934 printk(KERN_ERR "n_tty_read: no tty->pgrp!\n");
1935 else if (task_pgrp(current) != tty->pgrp) {
1936 spin_unlock_irq(&tty->ctrl_lock);
1937 if (is_ignored(SIGTTIN) || is_current_pgrp_orphaned())
1938 return -EIO;
1939 kill_pgrp(task_pgrp(current), SIGTTIN, 1);
1940 set_thread_flag(TIF_SIGPENDING);
1941 return -ERESTARTSYS;
1da177e4 1942 }
01a5e440 1943 spin_unlock_irq(&tty->ctrl_lock);
1da177e4
LT
1944 return 0;
1945}
4edf1827 1946
1da177e4
LT
1947
1948/**
11a96d18 1949 * n_tty_read - read function for tty
1da177e4
LT
1950 * @tty: tty device
1951 * @file: file object
1952 * @buf: userspace buffer pointer
1953 * @nr: size of I/O
1954 *
1955 * Perform reads for the line discipline. We are guaranteed that the
1956 * line discipline will not be closed under us but we may get multiple
1957 * parallel readers and must handle this ourselves. We may also get
1958 * a hangup. Always called in user context, may sleep.
1959 *
1960 * This code must be sure never to sleep through a hangup.
6d76bd26
PH
1961 *
1962 * n_tty_read()/consumer path:
1963 * claims non-exclusive termios_rwsem
1964 * publishes read_tail
1da177e4 1965 */
4edf1827 1966
11a96d18 1967static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,
1da177e4
LT
1968 unsigned char __user *buf, size_t nr)
1969{
53c5ee2c 1970 struct n_tty_data *ldata = tty->disc_data;
1da177e4
LT
1971 unsigned char __user *b = buf;
1972 DECLARE_WAITQUEUE(wait, current);
1973 int c;
1974 int minimum, time;
1975 ssize_t retval = 0;
1976 ssize_t size;
1977 long timeout;
1978 unsigned long flags;
04f378b1 1979 int packet;
1da177e4
LT
1980
1981do_it_again:
1da177e4 1982 c = job_control(tty, file);
4edf1827 1983 if (c < 0)
1da177e4 1984 return c;
4edf1827 1985
9356b535
PH
1986 down_read(&tty->termios_rwsem);
1987
1da177e4
LT
1988 minimum = time = 0;
1989 timeout = MAX_SCHEDULE_TIMEOUT;
53c5ee2c 1990 if (!ldata->icanon) {
1da177e4
LT
1991 minimum = MIN_CHAR(tty);
1992 if (minimum) {
a6e54319 1993 time = (HZ / 10) * TIME_CHAR(tty);
1da177e4 1994 if (time)
f6c8dbe6 1995 ldata->minimum_to_wake = 1;
1da177e4 1996 else if (!waitqueue_active(&tty->read_wait) ||
f6c8dbe6
PH
1997 (ldata->minimum_to_wake > minimum))
1998 ldata->minimum_to_wake = minimum;
1da177e4 1999 } else {
a6e54319 2000 timeout = (HZ / 10) * TIME_CHAR(tty);
f6c8dbe6 2001 ldata->minimum_to_wake = minimum = 1;
1da177e4
LT
2002 }
2003 }
2004
2005 /*
2006 * Internal serialization of reads.
2007 */
2008 if (file->f_flags & O_NONBLOCK) {
9356b535
PH
2009 if (!mutex_trylock(&ldata->atomic_read_lock)) {
2010 up_read(&tty->termios_rwsem);
1da177e4 2011 return -EAGAIN;
9356b535 2012 }
4edf1827 2013 } else {
9356b535
PH
2014 if (mutex_lock_interruptible(&ldata->atomic_read_lock)) {
2015 up_read(&tty->termios_rwsem);
1da177e4 2016 return -ERESTARTSYS;
9356b535 2017 }
1da177e4 2018 }
04f378b1 2019 packet = tty->packet;
1da177e4
LT
2020
2021 add_wait_queue(&tty->read_wait, &wait);
1da177e4
LT
2022 while (nr) {
2023 /* First test for status change. */
04f378b1 2024 if (packet && tty->link->ctrl_status) {
1da177e4
LT
2025 unsigned char cs;
2026 if (b != buf)
2027 break;
04f378b1 2028 spin_lock_irqsave(&tty->link->ctrl_lock, flags);
1da177e4
LT
2029 cs = tty->link->ctrl_status;
2030 tty->link->ctrl_status = 0;
04f378b1 2031 spin_unlock_irqrestore(&tty->link->ctrl_lock, flags);
522ed776 2032 if (tty_put_user(tty, cs, b++)) {
1da177e4
LT
2033 retval = -EFAULT;
2034 b--;
2035 break;
2036 }
2037 nr--;
2038 break;
2039 }
2040 /* This statement must be first before checking for input
2041 so that any interrupt will set the state back to
2042 TASK_RUNNING. */
2043 set_current_state(TASK_INTERRUPTIBLE);
4edf1827 2044
f6c8dbe6 2045 if (((minimum - (b - buf)) < ldata->minimum_to_wake) &&
1da177e4 2046 ((minimum - (b - buf)) >= 1))
f6c8dbe6 2047 ldata->minimum_to_wake = (minimum - (b - buf));
4edf1827 2048
1da177e4
LT
2049 if (!input_available_p(tty, 0)) {
2050 if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) {
2051 retval = -EIO;
2052 break;
2053 }
2054 if (tty_hung_up_p(file))
2055 break;
2056 if (!timeout)
2057 break;
2058 if (file->f_flags & O_NONBLOCK) {
2059 retval = -EAGAIN;
2060 break;
2061 }
2062 if (signal_pending(current)) {
2063 retval = -ERESTARTSYS;
2064 break;
2065 }
55db4c64 2066 n_tty_set_room(tty);
9356b535
PH
2067 up_read(&tty->termios_rwsem);
2068
1da177e4 2069 timeout = schedule_timeout(timeout);
9356b535
PH
2070
2071 down_read(&tty->termios_rwsem);
1da177e4
LT
2072 continue;
2073 }
2074 __set_current_state(TASK_RUNNING);
2075
2076 /* Deal with packet mode. */
04f378b1 2077 if (packet && b == buf) {
522ed776 2078 if (tty_put_user(tty, TIOCPKT_DATA, b++)) {
1da177e4
LT
2079 retval = -EFAULT;
2080 b--;
2081 break;
2082 }
2083 nr--;
2084 }
2085
53c5ee2c 2086 if (ldata->icanon && !L_EXTPROC(tty)) {
32f13521 2087 retval = canon_copy_from_read_buf(tty, &b, &nr);
1da177e4
LT
2088 if (retval)
2089 break;
2090 } else {
2091 int uncopied;
04f378b1
AC
2092 /* The copy function takes the read lock and handles
2093 locking internally for this case */
1da177e4
LT
2094 uncopied = copy_from_read_buf(tty, &b, &nr);
2095 uncopied += copy_from_read_buf(tty, &b, &nr);
2096 if (uncopied) {
2097 retval = -EFAULT;
2098 break;
2099 }
2100 }
2101
6367ca72 2102 n_tty_check_unthrottle(tty);
1da177e4
LT
2103
2104 if (b - buf >= minimum)
2105 break;
2106 if (time)
2107 timeout = time;
2108 }
bddc7152 2109 mutex_unlock(&ldata->atomic_read_lock);
1da177e4
LT
2110 remove_wait_queue(&tty->read_wait, &wait);
2111
2112 if (!waitqueue_active(&tty->read_wait))
f6c8dbe6 2113 ldata->minimum_to_wake = minimum;
1da177e4
LT
2114
2115 __set_current_state(TASK_RUNNING);
2116 size = b - buf;
2117 if (size) {
2118 retval = size;
2119 if (nr)
4edf1827 2120 clear_bit(TTY_PUSH, &tty->flags);
9356b535
PH
2121 } else if (test_and_clear_bit(TTY_PUSH, &tty->flags)) {
2122 up_read(&tty->termios_rwsem);
bbd20759 2123 goto do_it_again;
9356b535 2124 }
1da177e4 2125
55db4c64 2126 n_tty_set_room(tty);
9356b535 2127 up_read(&tty->termios_rwsem);
1da177e4
LT
2128 return retval;
2129}
2130
2131/**
11a96d18 2132 * n_tty_write - write function for tty
1da177e4
LT
2133 * @tty: tty device
2134 * @file: file object
2135 * @buf: userspace buffer pointer
2136 * @nr: size of I/O
2137 *
a88a69c9 2138 * Write function of the terminal device. This is serialized with
1da177e4 2139 * respect to other write callers but not to termios changes, reads
a88a69c9
JP
2140 * and other such events. Since the receive code will echo characters,
2141 * thus calling driver write methods, the output_lock is used in
2142 * the output processing functions called here as well as in the
2143 * echo processing function to protect the column state and space
2144 * left in the buffer.
1da177e4
LT
2145 *
2146 * This code must be sure never to sleep through a hangup.
a88a69c9
JP
2147 *
2148 * Locking: output_lock to protect column state and space left
2149 * (note that the process_output*() functions take this
2150 * lock themselves)
1da177e4 2151 */
4edf1827 2152
11a96d18 2153static ssize_t n_tty_write(struct tty_struct *tty, struct file *file,
a88a69c9 2154 const unsigned char *buf, size_t nr)
1da177e4
LT
2155{
2156 const unsigned char *b = buf;
2157 DECLARE_WAITQUEUE(wait, current);
2158 int c;
2159 ssize_t retval = 0;
2160
2161 /* Job control check -- must be done at start (POSIX.1 7.1.1.4). */
2162 if (L_TOSTOP(tty) && file->f_op->write != redirected_tty_write) {
2163 retval = tty_check_change(tty);
2164 if (retval)
2165 return retval;
2166 }
2167
9356b535
PH
2168 down_read(&tty->termios_rwsem);
2169
a88a69c9
JP
2170 /* Write out any echoed characters that are still pending */
2171 process_echoes(tty);
300a6204 2172
1da177e4
LT
2173 add_wait_queue(&tty->write_wait, &wait);
2174 while (1) {
2175 set_current_state(TASK_INTERRUPTIBLE);
2176 if (signal_pending(current)) {
2177 retval = -ERESTARTSYS;
2178 break;
2179 }
2180 if (tty_hung_up_p(file) || (tty->link && !tty->link->count)) {
2181 retval = -EIO;
2182 break;
2183 }
582f5590 2184 if (O_OPOST(tty)) {
1da177e4 2185 while (nr > 0) {
a88a69c9 2186 ssize_t num = process_output_block(tty, b, nr);
1da177e4
LT
2187 if (num < 0) {
2188 if (num == -EAGAIN)
2189 break;
2190 retval = num;
2191 goto break_out;
2192 }
2193 b += num;
2194 nr -= num;
2195 if (nr == 0)
2196 break;
2197 c = *b;
a88a69c9 2198 if (process_output(c, tty) < 0)
1da177e4
LT
2199 break;
2200 b++; nr--;
2201 }
f34d7a5b
AC
2202 if (tty->ops->flush_chars)
2203 tty->ops->flush_chars(tty);
1da177e4 2204 } else {
d6afe27b 2205 while (nr > 0) {
f34d7a5b 2206 c = tty->ops->write(tty, b, nr);
d6afe27b
RZ
2207 if (c < 0) {
2208 retval = c;
2209 goto break_out;
2210 }
2211 if (!c)
2212 break;
2213 b += c;
2214 nr -= c;
1da177e4 2215 }
1da177e4
LT
2216 }
2217 if (!nr)
2218 break;
2219 if (file->f_flags & O_NONBLOCK) {
2220 retval = -EAGAIN;
2221 break;
2222 }
9356b535
PH
2223 up_read(&tty->termios_rwsem);
2224
1da177e4 2225 schedule();
9356b535
PH
2226
2227 down_read(&tty->termios_rwsem);
1da177e4
LT
2228 }
2229break_out:
2230 __set_current_state(TASK_RUNNING);
2231 remove_wait_queue(&tty->write_wait, &wait);
ff8cb0fd
TP
2232 if (b - buf != nr && tty->fasync)
2233 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
9356b535 2234 up_read(&tty->termios_rwsem);
1da177e4
LT
2235 return (b - buf) ? b - buf : retval;
2236}
2237
2238/**
11a96d18 2239 * n_tty_poll - poll method for N_TTY
1da177e4
LT
2240 * @tty: terminal device
2241 * @file: file accessing it
2242 * @wait: poll table
2243 *
2244 * Called when the line discipline is asked to poll() for data or
2245 * for special events. This code is not serialized with respect to
2246 * other events save open/close.
2247 *
2248 * This code must be sure never to sleep through a hangup.
2249 * Called without the kernel lock held - fine
1da177e4 2250 */
4edf1827 2251
11a96d18 2252static unsigned int n_tty_poll(struct tty_struct *tty, struct file *file,
4edf1827 2253 poll_table *wait)
1da177e4 2254{
f6c8dbe6 2255 struct n_tty_data *ldata = tty->disc_data;
1da177e4
LT
2256 unsigned int mask = 0;
2257
2258 poll_wait(file, &tty->read_wait, wait);
2259 poll_wait(file, &tty->write_wait, wait);
2260 if (input_available_p(tty, TIME_CHAR(tty) ? 0 : MIN_CHAR(tty)))
2261 mask |= POLLIN | POLLRDNORM;
2262 if (tty->packet && tty->link->ctrl_status)
2263 mask |= POLLPRI | POLLIN | POLLRDNORM;
2264 if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
2265 mask |= POLLHUP;
2266 if (tty_hung_up_p(file))
2267 mask |= POLLHUP;
2268 if (!(mask & (POLLHUP | POLLIN | POLLRDNORM))) {
2269 if (MIN_CHAR(tty) && !TIME_CHAR(tty))
f6c8dbe6 2270 ldata->minimum_to_wake = MIN_CHAR(tty);
1da177e4 2271 else
f6c8dbe6 2272 ldata->minimum_to_wake = 1;
1da177e4 2273 }
f34d7a5b
AC
2274 if (tty->ops->write && !tty_is_writelocked(tty) &&
2275 tty_chars_in_buffer(tty) < WAKEUP_CHARS &&
2276 tty_write_room(tty) > 0)
1da177e4
LT
2277 mask |= POLLOUT | POLLWRNORM;
2278 return mask;
2279}
2280
57c94121 2281static unsigned long inq_canon(struct n_tty_data *ldata)
47afa7a5 2282{
bc5a5e3f 2283 size_t nr, head, tail;
47afa7a5 2284
a73d3d69 2285 if (ldata->canon_head == ldata->read_tail)
47afa7a5 2286 return 0;
ba2e68ac
JS
2287 head = ldata->canon_head;
2288 tail = ldata->read_tail;
bc5a5e3f 2289 nr = head - tail;
47afa7a5
AC
2290 /* Skip EOF-chars.. */
2291 while (head != tail) {
bc5a5e3f
PH
2292 if (test_bit(tail & (N_TTY_BUF_SIZE - 1), ldata->read_flags) &&
2293 read_buf(ldata, tail) == __DISABLED_CHAR)
47afa7a5 2294 nr--;
bc5a5e3f 2295 tail++;
47afa7a5
AC
2296 }
2297 return nr;
2298}
2299
2300static int n_tty_ioctl(struct tty_struct *tty, struct file *file,
2301 unsigned int cmd, unsigned long arg)
2302{
ba2e68ac 2303 struct n_tty_data *ldata = tty->disc_data;
47afa7a5
AC
2304 int retval;
2305
2306 switch (cmd) {
2307 case TIOCOUTQ:
2308 return put_user(tty_chars_in_buffer(tty), (int __user *) arg);
2309 case TIOCINQ:
6d76bd26 2310 down_write(&tty->termios_rwsem);
47afa7a5 2311 if (L_ICANON(tty))
57c94121 2312 retval = inq_canon(ldata);
6d76bd26
PH
2313 else
2314 retval = read_cnt(ldata);
2315 up_write(&tty->termios_rwsem);
47afa7a5
AC
2316 return put_user(retval, (unsigned int __user *) arg);
2317 default:
2318 return n_tty_ioctl_helper(tty, file, cmd, arg);
2319 }
2320}
2321
f6c8dbe6
PH
2322static void n_tty_fasync(struct tty_struct *tty, int on)
2323{
2324 struct n_tty_data *ldata = tty->disc_data;
2325
2326 if (!waitqueue_active(&tty->read_wait)) {
2327 if (on)
2328 ldata->minimum_to_wake = 1;
2329 else if (!tty->fasync)
2330 ldata->minimum_to_wake = N_TTY_BUF_SIZE;
2331 }
2332}
2333
a352def2 2334struct tty_ldisc_ops tty_ldisc_N_TTY = {
e10cc1df
PF
2335 .magic = TTY_LDISC_MAGIC,
2336 .name = "n_tty",
2337 .open = n_tty_open,
2338 .close = n_tty_close,
2339 .flush_buffer = n_tty_flush_buffer,
2340 .chars_in_buffer = n_tty_chars_in_buffer,
11a96d18
AC
2341 .read = n_tty_read,
2342 .write = n_tty_write,
e10cc1df
PF
2343 .ioctl = n_tty_ioctl,
2344 .set_termios = n_tty_set_termios,
11a96d18 2345 .poll = n_tty_poll,
e10cc1df 2346 .receive_buf = n_tty_receive_buf,
f6c8dbe6
PH
2347 .write_wakeup = n_tty_write_wakeup,
2348 .fasync = n_tty_fasync,
24a89d1c 2349 .receive_buf2 = n_tty_receive_buf2,
1da177e4 2350};
572b9adb
RG
2351
2352/**
2353 * n_tty_inherit_ops - inherit N_TTY methods
2354 * @ops: struct tty_ldisc_ops where to save N_TTY methods
2355 *
593fb1ae 2356 * Enables a 'subclass' line discipline to 'inherit' N_TTY
572b9adb
RG
2357 * methods.
2358 */
2359
2360void n_tty_inherit_ops(struct tty_ldisc_ops *ops)
2361{
2362 *ops = tty_ldisc_N_TTY;
2363 ops->owner = NULL;
2364 ops->refcount = ops->flags = 0;
2365}
2366EXPORT_SYMBOL_GPL(n_tty_inherit_ops);
This page took 0.874826 seconds and 5 git commands to generate.