blob: 20de673a7730738cb1b8f2d8f74a2b72044c7a95 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * n_tty.c --- implements the N_TTY line discipline.
Alan Cox4edf1822008-02-08 04:18:44 -08003 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07004 * 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
Alan Cox4edf1822008-02-08 04:18:44 -080011 * to N_TTY if it can not switch to any other line discipline.
Linus Torvalds1da177e2005-04-16 15:20:36 -070012 *
13 * Written by Theodore Ts'o, Copyright 1994.
Alan Cox4edf1822008-02-08 04:18:44 -080014 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070015 * This file also contains code originally written by Linus Torvalds,
16 * Copyright 1991, 1992, 1993, and by Julian Cowley, Copyright 1994.
Alan Cox4edf1822008-02-08 04:18:44 -080017 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 * 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 *
Alan Cox4edf1822008-02-08 04:18:44 -080023 * 2000/01/20 Fixed SMP locking on put_tty_queue using bits of
Linus Torvalds1da177e2005-04-16 15:20:36 -070024 * 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>.
Alan Cox11a96d12008-10-13 10:46:24 +010029 * Also fixed a bug in BLOCKING mode where n_tty_write returns
Linus Torvalds1da177e2005-04-16 15:20:36 -070030 * 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>
Miloslav Trmac522ed772007-07-15 23:40:56 -070048#include <linux/audit.h>
49#include <linux/file.h>
Alan Cox300a6202009-01-02 13:41:04 +000050#include <linux/uaccess.h>
Rodolfo Giometti572b9ad2010-03-10 15:23:46 -080051#include <linux/module.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070052
Linus Torvalds1da177e2005-04-16 15:20:36 -070053
54/* number of characters left in xmit buffer before select has we have room */
55#define WAKEUP_CHARS 256
56
57/*
58 * This defines the low- and high-watermarks for throttling and
59 * unthrottling the TTY driver. These watermarks are used for
60 * controlling the space in the read buffer.
61 */
62#define TTY_THRESHOLD_THROTTLE 128 /* now based on remaining room */
Thorsten Wißmannbbd20752011-12-08 17:47:33 +010063#define TTY_THRESHOLD_UNTHROTTLE 128
Linus Torvalds1da177e2005-04-16 15:20:36 -070064
Joe Petersona88a69c2009-01-02 13:40:53 +000065/*
66 * Special byte codes used in the echo buffer to represent operations
67 * or special handling of characters. Bytes in the echo buffer that
68 * are not part of such special blocks are treated as normal character
69 * codes.
70 */
71#define ECHO_OP_START 0xff
72#define ECHO_OP_MOVE_BACK_COL 0x80
73#define ECHO_OP_SET_CANON_COL 0x81
74#define ECHO_OP_ERASE_TAB 0x82
75
Miloslav Trmac522ed772007-07-15 23:40:56 -070076static inline int tty_put_user(struct tty_struct *tty, unsigned char x,
77 unsigned char __user *ptr)
78{
79 tty_audit_add_data(tty, &x, 1);
80 return put_user(x, ptr);
81}
82
Linus Torvalds55db4c62011-06-04 06:33:24 +090083/**
84 * n_tty_set__room - receive space
85 * @tty: terminal
86 *
87 * Called by the driver to find out how much data it is
88 * permitted to feed to the line discipline without any being lost
89 * and thus to manage flow control. Not serialized. Answers for the
90 * "instant".
91 */
92
93static void n_tty_set_room(struct tty_struct *tty)
94{
95 /* tty->read_cnt is not read locked ? */
96 int left = N_TTY_BUF_SIZE - tty->read_cnt - 1;
97 int old_left;
98
99 /*
100 * If we are doing input canonicalization, and there are no
101 * pending newlines, let characters through without limit, so
102 * that erase characters will be handled. Other excess
103 * characters will be beeped.
104 */
105 if (left <= 0)
106 left = tty->icanon && !tty->canon_data;
107 old_left = tty->receive_room;
108 tty->receive_room = left;
109
110 /* Did this open up the receive buffer? We may need to flip */
111 if (left && !old_left)
112 schedule_work(&tty->buf.work);
113}
114
Alan Cox33f0f882006-01-09 20:54:13 -0800115static void put_tty_queue_nolock(unsigned char c, struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116{
117 if (tty->read_cnt < N_TTY_BUF_SIZE) {
118 tty->read_buf[tty->read_head] = c;
119 tty->read_head = (tty->read_head + 1) & (N_TTY_BUF_SIZE-1);
120 tty->read_cnt++;
121 }
122}
123
Alan Cox17b82062008-10-13 10:45:06 +0100124/**
125 * put_tty_queue - add character to tty
126 * @c: character
127 * @tty: tty device
128 *
129 * Add a character to the tty read_buf queue. This is done under the
130 * read_lock to serialize character addition and also to protect us
131 * against parallel reads or flushes
132 */
133
Alan Cox33f0f882006-01-09 20:54:13 -0800134static void put_tty_queue(unsigned char c, struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700135{
136 unsigned long flags;
137 /*
138 * The problem of stomping on the buffers ends here.
139 * Why didn't anyone see this one coming? --AJK
140 */
141 spin_lock_irqsave(&tty->read_lock, flags);
142 put_tty_queue_nolock(c, tty);
143 spin_unlock_irqrestore(&tty->read_lock, flags);
144}
145
146/**
147 * check_unthrottle - allow new receive data
148 * @tty; tty device
149 *
Alan Cox17b82062008-10-13 10:45:06 +0100150 * Check whether to call the driver unthrottle functions
151 *
Ingo Molnar70522e12006-03-23 03:00:31 -0800152 * Can sleep, may be called under the atomic_read_lock mutex but
Linus Torvalds1da177e2005-04-16 15:20:36 -0700153 * this is not guaranteed.
154 */
Alan Cox4edf1822008-02-08 04:18:44 -0800155static void check_unthrottle(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700156{
Alan Cox39c2e602008-04-30 00:54:18 -0700157 if (tty->count)
158 tty_unthrottle(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700159}
160
161/**
162 * reset_buffer_flags - reset buffer state
163 * @tty: terminal to reset
164 *
Alan Cox4edf1822008-02-08 04:18:44 -0800165 * Reset the read buffer counters, clear the flags,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700166 * and make sure the driver is unthrottled. Called
167 * from n_tty_open() and n_tty_flush_buffer().
Alan Cox17b82062008-10-13 10:45:06 +0100168 *
169 * Locking: tty_read_lock for read fields.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700170 */
Joe Petersona88a69c2009-01-02 13:40:53 +0000171
Linus Torvalds1da177e2005-04-16 15:20:36 -0700172static void reset_buffer_flags(struct tty_struct *tty)
173{
174 unsigned long flags;
175
176 spin_lock_irqsave(&tty->read_lock, flags);
177 tty->read_head = tty->read_tail = tty->read_cnt = 0;
178 spin_unlock_irqrestore(&tty->read_lock, flags);
Joe Petersona88a69c2009-01-02 13:40:53 +0000179
180 mutex_lock(&tty->echo_lock);
181 tty->echo_pos = tty->echo_cnt = tty->echo_overrun = 0;
182 mutex_unlock(&tty->echo_lock);
183
Linus Torvalds1da177e2005-04-16 15:20:36 -0700184 tty->canon_head = tty->canon_data = tty->erasing = 0;
185 memset(&tty->read_flags, 0, sizeof tty->read_flags);
Linus Torvalds55db4c62011-06-04 06:33:24 +0900186 n_tty_set_room(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700187}
188
189/**
190 * n_tty_flush_buffer - clean input queue
191 * @tty: terminal device
192 *
193 * Flush the input buffer. Called when the line discipline is
194 * being closed, when the tty layer wants the buffer flushed (eg
195 * at hangup) or when the N_TTY line discipline internally has to
196 * clean the pending queue (for example some signals).
197 *
Alan Cox17b82062008-10-13 10:45:06 +0100198 * Locking: ctrl_lock, read_lock.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700199 */
Alan Cox4edf1822008-02-08 04:18:44 -0800200
201static void n_tty_flush_buffer(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700202{
Alan Cox04f378b2008-04-30 00:53:29 -0700203 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700204 /* clear everything and unthrottle the driver */
205 reset_buffer_flags(tty);
Alan Cox4edf1822008-02-08 04:18:44 -0800206
Linus Torvalds1da177e2005-04-16 15:20:36 -0700207 if (!tty->link)
208 return;
209
Alan Cox04f378b2008-04-30 00:53:29 -0700210 spin_lock_irqsave(&tty->ctrl_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211 if (tty->link->packet) {
212 tty->ctrl_status |= TIOCPKT_FLUSHREAD;
213 wake_up_interruptible(&tty->link->read_wait);
214 }
Alan Cox04f378b2008-04-30 00:53:29 -0700215 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700216}
217
218/**
219 * n_tty_chars_in_buffer - report available bytes
220 * @tty: tty device
221 *
222 * Report the number of characters buffered to be delivered to user
Alan Cox4edf1822008-02-08 04:18:44 -0800223 * at this instant in time.
Alan Cox17b82062008-10-13 10:45:06 +0100224 *
225 * Locking: read_lock
Linus Torvalds1da177e2005-04-16 15:20:36 -0700226 */
Alan Cox4edf1822008-02-08 04:18:44 -0800227
Linus Torvalds1da177e2005-04-16 15:20:36 -0700228static ssize_t n_tty_chars_in_buffer(struct tty_struct *tty)
229{
230 unsigned long flags;
231 ssize_t n = 0;
232
233 spin_lock_irqsave(&tty->read_lock, flags);
234 if (!tty->icanon) {
235 n = tty->read_cnt;
236 } else if (tty->canon_data) {
237 n = (tty->canon_head > tty->read_tail) ?
238 tty->canon_head - tty->read_tail :
239 tty->canon_head + (N_TTY_BUF_SIZE - tty->read_tail);
240 }
241 spin_unlock_irqrestore(&tty->read_lock, flags);
242 return n;
243}
244
245/**
246 * is_utf8_continuation - utf8 multibyte check
247 * @c: byte to check
248 *
249 * Returns true if the utf8 character 'c' is a multibyte continuation
250 * character. We use this to correctly compute the on screen size
251 * of the character when printing
252 */
Alan Cox4edf1822008-02-08 04:18:44 -0800253
Linus Torvalds1da177e2005-04-16 15:20:36 -0700254static inline int is_utf8_continuation(unsigned char c)
255{
256 return (c & 0xc0) == 0x80;
257}
258
259/**
260 * is_continuation - multibyte check
261 * @c: byte to check
262 *
263 * Returns true if the utf8 character 'c' is a multibyte continuation
264 * character and the terminal is in unicode mode.
265 */
Alan Cox4edf1822008-02-08 04:18:44 -0800266
Linus Torvalds1da177e2005-04-16 15:20:36 -0700267static inline int is_continuation(unsigned char c, struct tty_struct *tty)
268{
269 return I_IUTF8(tty) && is_utf8_continuation(c);
270}
271
272/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000273 * do_output_char - output one character
274 * @c: character (or partial unicode symbol)
275 * @tty: terminal device
276 * @space: space available in tty driver write buffer
277 *
278 * This is a helper function that handles one output character
279 * (including special characters like TAB, CR, LF, etc.),
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600280 * doing OPOST processing and putting the results in the
281 * tty driver's write buffer.
Joe Petersona88a69c2009-01-02 13:40:53 +0000282 *
283 * Note that Linux currently ignores TABDLY, CRDLY, VTDLY, FFDLY
284 * and NLDLY. They simply aren't relevant in the world today.
285 * If you ever need them, add them here.
286 *
287 * Returns the number of bytes of buffer space used or -1 if
288 * no space left.
289 *
290 * Locking: should be called under the output_lock to protect
291 * the column state and space left in the buffer
292 */
293
294static int do_output_char(unsigned char c, struct tty_struct *tty, int space)
295{
296 int spaces;
297
298 if (!space)
299 return -1;
Alan Cox300a6202009-01-02 13:41:04 +0000300
Joe Petersona88a69c2009-01-02 13:40:53 +0000301 switch (c) {
302 case '\n':
303 if (O_ONLRET(tty))
304 tty->column = 0;
305 if (O_ONLCR(tty)) {
306 if (space < 2)
307 return -1;
308 tty->canon_column = tty->column = 0;
Linus Torvalds37f81fa2009-09-05 12:46:07 -0700309 tty->ops->write(tty, "\r\n", 2);
Joe Petersona88a69c2009-01-02 13:40:53 +0000310 return 2;
311 }
312 tty->canon_column = tty->column;
313 break;
314 case '\r':
315 if (O_ONOCR(tty) && tty->column == 0)
316 return 0;
317 if (O_OCRNL(tty)) {
318 c = '\n';
319 if (O_ONLRET(tty))
320 tty->canon_column = tty->column = 0;
321 break;
322 }
323 tty->canon_column = tty->column = 0;
324 break;
325 case '\t':
326 spaces = 8 - (tty->column & 7);
327 if (O_TABDLY(tty) == XTABS) {
328 if (space < spaces)
329 return -1;
330 tty->column += spaces;
331 tty->ops->write(tty, " ", spaces);
332 return spaces;
333 }
334 tty->column += spaces;
335 break;
336 case '\b':
337 if (tty->column > 0)
338 tty->column--;
339 break;
340 default:
Joe Petersona59c0d62009-01-02 13:43:25 +0000341 if (!iscntrl(c)) {
342 if (O_OLCUC(tty))
343 c = toupper(c);
344 if (!is_continuation(c, tty))
345 tty->column++;
346 }
Joe Petersona88a69c2009-01-02 13:40:53 +0000347 break;
348 }
349
350 tty_put_char(tty, c);
351 return 1;
352}
353
354/**
355 * process_output - output post processor
Linus Torvalds1da177e2005-04-16 15:20:36 -0700356 * @c: character (or partial unicode symbol)
357 * @tty: terminal device
358 *
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600359 * Output one character with OPOST processing.
360 * Returns -1 when the output device is full and the character
361 * must be retried.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700362 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000363 * Locking: output_lock to protect column state and space left
364 * (also, this is called from n_tty_write under the
365 * tty layer write lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700366 */
Alan Cox4edf1822008-02-08 04:18:44 -0800367
Joe Petersona88a69c2009-01-02 13:40:53 +0000368static int process_output(unsigned char c, struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700369{
Joe Petersona88a69c2009-01-02 13:40:53 +0000370 int space, retval;
371
372 mutex_lock(&tty->output_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700373
Alan Coxf34d7a52008-04-30 00:54:13 -0700374 space = tty_write_room(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +0000375 retval = do_output_char(c, tty, space);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700376
Joe Petersona88a69c2009-01-02 13:40:53 +0000377 mutex_unlock(&tty->output_lock);
378 if (retval < 0)
379 return -1;
380 else
381 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700382}
383
384/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000385 * process_output_block - block post processor
Linus Torvalds1da177e2005-04-16 15:20:36 -0700386 * @tty: terminal device
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600387 * @buf: character buffer
388 * @nr: number of bytes to output
389 *
390 * Output a block of characters with OPOST processing.
391 * Returns the number of characters output.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700392 *
393 * This path is used to speed up block console writes, among other
394 * things when processing blocks of output data. It handles only
395 * the simple cases normally found and helps to generate blocks of
396 * symbols for the console driver and thus improve performance.
397 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000398 * Locking: output_lock to protect column state and space left
399 * (also, this is called from n_tty_write under the
400 * tty layer write lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401 */
Alan Cox4edf1822008-02-08 04:18:44 -0800402
Joe Petersona88a69c2009-01-02 13:40:53 +0000403static ssize_t process_output_block(struct tty_struct *tty,
404 const unsigned char *buf, unsigned int nr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700405{
406 int space;
Thorsten Wißmannbbd20752011-12-08 17:47:33 +0100407 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700408 const unsigned char *cp;
409
Joe Petersona88a69c2009-01-02 13:40:53 +0000410 mutex_lock(&tty->output_lock);
411
Alan Coxf34d7a52008-04-30 00:54:13 -0700412 space = tty_write_room(tty);
Alan Cox300a6202009-01-02 13:41:04 +0000413 if (!space) {
Joe Petersona88a69c2009-01-02 13:40:53 +0000414 mutex_unlock(&tty->output_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700415 return 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000416 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700417 if (nr > space)
418 nr = space;
419
420 for (i = 0, cp = buf; i < nr; i++, cp++) {
Joe Petersona59c0d62009-01-02 13:43:25 +0000421 unsigned char c = *cp;
422
423 switch (c) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700424 case '\n':
425 if (O_ONLRET(tty))
426 tty->column = 0;
427 if (O_ONLCR(tty))
428 goto break_out;
429 tty->canon_column = tty->column;
430 break;
431 case '\r':
432 if (O_ONOCR(tty) && tty->column == 0)
433 goto break_out;
434 if (O_OCRNL(tty))
435 goto break_out;
436 tty->canon_column = tty->column = 0;
437 break;
438 case '\t':
439 goto break_out;
440 case '\b':
441 if (tty->column > 0)
442 tty->column--;
443 break;
444 default:
Joe Petersona59c0d62009-01-02 13:43:25 +0000445 if (!iscntrl(c)) {
446 if (O_OLCUC(tty))
447 goto break_out;
448 if (!is_continuation(c, tty))
449 tty->column++;
450 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700451 break;
452 }
453 }
454break_out:
Alan Coxf34d7a52008-04-30 00:54:13 -0700455 i = tty->ops->write(tty, buf, i);
Joe Petersona88a69c2009-01-02 13:40:53 +0000456
457 mutex_unlock(&tty->output_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700458 return i;
459}
460
Joe Petersona88a69c2009-01-02 13:40:53 +0000461/**
462 * process_echoes - write pending echo characters
463 * @tty: terminal device
464 *
465 * Write previously buffered echo (and other ldisc-generated)
466 * characters to the tty.
467 *
468 * Characters generated by the ldisc (including echoes) need to
469 * be buffered because the driver's write buffer can fill during
470 * heavy program output. Echoing straight to the driver will
471 * often fail under these conditions, causing lost characters and
472 * resulting mismatches of ldisc state information.
473 *
474 * Since the ldisc state must represent the characters actually sent
475 * to the driver at the time of the write, operations like certain
476 * changes in column state are also saved in the buffer and executed
477 * here.
478 *
479 * A circular fifo buffer is used so that the most recent characters
480 * are prioritized. Also, when control characters are echoed with a
481 * prefixed "^", the pair is treated atomically and thus not separated.
482 *
483 * Locking: output_lock to protect column state and space left,
484 * echo_lock to protect the echo buffer
485 */
486
487static void process_echoes(struct tty_struct *tty)
488{
489 int space, nr;
490 unsigned char c;
491 unsigned char *cp, *buf_end;
492
493 if (!tty->echo_cnt)
494 return;
495
496 mutex_lock(&tty->output_lock);
497 mutex_lock(&tty->echo_lock);
498
499 space = tty_write_room(tty);
500
501 buf_end = tty->echo_buf + N_TTY_BUF_SIZE;
502 cp = tty->echo_buf + tty->echo_pos;
503 nr = tty->echo_cnt;
504 while (nr > 0) {
505 c = *cp;
506 if (c == ECHO_OP_START) {
507 unsigned char op;
508 unsigned char *opp;
509 int no_space_left = 0;
510
511 /*
512 * If the buffer byte is the start of a multi-byte
513 * operation, get the next byte, which is either the
514 * op code or a control character value.
515 */
516 opp = cp + 1;
517 if (opp == buf_end)
518 opp -= N_TTY_BUF_SIZE;
519 op = *opp;
Alan Cox300a6202009-01-02 13:41:04 +0000520
Joe Petersona88a69c2009-01-02 13:40:53 +0000521 switch (op) {
522 unsigned int num_chars, num_bs;
523
524 case ECHO_OP_ERASE_TAB:
525 if (++opp == buf_end)
526 opp -= N_TTY_BUF_SIZE;
527 num_chars = *opp;
528
529 /*
530 * Determine how many columns to go back
531 * in order to erase the tab.
532 * This depends on the number of columns
533 * used by other characters within the tab
534 * area. If this (modulo 8) count is from
535 * the start of input rather than from a
536 * previous tab, we offset by canon column.
537 * Otherwise, tab spacing is normal.
538 */
539 if (!(num_chars & 0x80))
540 num_chars += tty->canon_column;
541 num_bs = 8 - (num_chars & 7);
542
543 if (num_bs > space) {
544 no_space_left = 1;
545 break;
546 }
547 space -= num_bs;
548 while (num_bs--) {
549 tty_put_char(tty, '\b');
550 if (tty->column > 0)
551 tty->column--;
552 }
553 cp += 3;
554 nr -= 3;
555 break;
556
557 case ECHO_OP_SET_CANON_COL:
558 tty->canon_column = tty->column;
559 cp += 2;
560 nr -= 2;
561 break;
562
563 case ECHO_OP_MOVE_BACK_COL:
564 if (tty->column > 0)
565 tty->column--;
566 cp += 2;
567 nr -= 2;
568 break;
569
570 case ECHO_OP_START:
571 /* This is an escaped echo op start code */
572 if (!space) {
573 no_space_left = 1;
574 break;
575 }
576 tty_put_char(tty, ECHO_OP_START);
577 tty->column++;
578 space--;
579 cp += 2;
580 nr -= 2;
581 break;
582
583 default:
Joe Petersona88a69c2009-01-02 13:40:53 +0000584 /*
Joe Peterson62b26352009-09-09 15:03:47 -0600585 * If the op is not a special byte code,
586 * it is a ctrl char tagged to be echoed
587 * as "^X" (where X is the letter
588 * representing the control char).
589 * Note that we must ensure there is
590 * enough space for the whole ctrl pair.
591 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000592 */
Joe Peterson62b26352009-09-09 15:03:47 -0600593 if (space < 2) {
594 no_space_left = 1;
595 break;
596 }
597 tty_put_char(tty, '^');
598 tty_put_char(tty, op ^ 0100);
599 tty->column += 2;
600 space -= 2;
Joe Petersona88a69c2009-01-02 13:40:53 +0000601 cp += 2;
602 nr -= 2;
603 }
604
605 if (no_space_left)
606 break;
607 } else {
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600608 if (O_OPOST(tty) &&
609 !(test_bit(TTY_HW_COOK_OUT, &tty->flags))) {
610 int retval = do_output_char(c, tty, space);
611 if (retval < 0)
612 break;
613 space -= retval;
614 } else {
615 if (!space)
616 break;
617 tty_put_char(tty, c);
618 space -= 1;
619 }
Joe Petersona88a69c2009-01-02 13:40:53 +0000620 cp += 1;
621 nr -= 1;
622 }
623
624 /* When end of circular buffer reached, wrap around */
625 if (cp >= buf_end)
626 cp -= N_TTY_BUF_SIZE;
627 }
628
629 if (nr == 0) {
630 tty->echo_pos = 0;
631 tty->echo_cnt = 0;
632 tty->echo_overrun = 0;
633 } else {
634 int num_processed = tty->echo_cnt - nr;
635 tty->echo_pos += num_processed;
636 tty->echo_pos &= N_TTY_BUF_SIZE - 1;
637 tty->echo_cnt = nr;
638 if (num_processed > 0)
639 tty->echo_overrun = 0;
640 }
641
642 mutex_unlock(&tty->echo_lock);
643 mutex_unlock(&tty->output_lock);
644
645 if (tty->ops->flush_chars)
646 tty->ops->flush_chars(tty);
647}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648
649/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000650 * add_echo_byte - add a byte to the echo buffer
651 * @c: unicode byte to echo
652 * @tty: terminal device
653 *
654 * Add a character or operation byte to the echo buffer.
655 *
656 * Should be called under the echo lock to protect the echo buffer.
657 */
658
659static void add_echo_byte(unsigned char c, struct tty_struct *tty)
660{
661 int new_byte_pos;
662
663 if (tty->echo_cnt == N_TTY_BUF_SIZE) {
664 /* Circular buffer is already at capacity */
665 new_byte_pos = tty->echo_pos;
666
667 /*
668 * Since the buffer start position needs to be advanced,
669 * be sure to step by a whole operation byte group.
670 */
Alan Cox300a6202009-01-02 13:41:04 +0000671 if (tty->echo_buf[tty->echo_pos] == ECHO_OP_START) {
Joe Petersona88a69c2009-01-02 13:40:53 +0000672 if (tty->echo_buf[(tty->echo_pos + 1) &
673 (N_TTY_BUF_SIZE - 1)] ==
674 ECHO_OP_ERASE_TAB) {
675 tty->echo_pos += 3;
676 tty->echo_cnt -= 2;
677 } else {
678 tty->echo_pos += 2;
679 tty->echo_cnt -= 1;
680 }
681 } else {
682 tty->echo_pos++;
683 }
684 tty->echo_pos &= N_TTY_BUF_SIZE - 1;
685
686 tty->echo_overrun = 1;
687 } else {
688 new_byte_pos = tty->echo_pos + tty->echo_cnt;
689 new_byte_pos &= N_TTY_BUF_SIZE - 1;
690 tty->echo_cnt++;
691 }
692
693 tty->echo_buf[new_byte_pos] = c;
694}
695
696/**
697 * echo_move_back_col - add operation to move back a column
698 * @tty: terminal device
699 *
700 * Add an operation to the echo buffer to move back one column.
701 *
702 * Locking: echo_lock to protect the echo buffer
703 */
704
705static void echo_move_back_col(struct tty_struct *tty)
706{
707 mutex_lock(&tty->echo_lock);
708
709 add_echo_byte(ECHO_OP_START, tty);
710 add_echo_byte(ECHO_OP_MOVE_BACK_COL, tty);
711
712 mutex_unlock(&tty->echo_lock);
713}
714
715/**
716 * echo_set_canon_col - add operation to set the canon column
717 * @tty: terminal device
718 *
719 * Add an operation to the echo buffer to set the canon column
720 * to the current column.
721 *
722 * Locking: echo_lock to protect the echo buffer
723 */
724
725static void echo_set_canon_col(struct tty_struct *tty)
726{
727 mutex_lock(&tty->echo_lock);
728
729 add_echo_byte(ECHO_OP_START, tty);
730 add_echo_byte(ECHO_OP_SET_CANON_COL, tty);
731
732 mutex_unlock(&tty->echo_lock);
733}
734
735/**
736 * echo_erase_tab - add operation to erase a tab
737 * @num_chars: number of character columns already used
738 * @after_tab: true if num_chars starts after a previous tab
739 * @tty: terminal device
740 *
741 * Add an operation to the echo buffer to erase a tab.
742 *
743 * Called by the eraser function, which knows how many character
744 * columns have been used since either a previous tab or the start
745 * of input. This information will be used later, along with
746 * canon column (if applicable), to go back the correct number
747 * of columns.
748 *
749 * Locking: echo_lock to protect the echo buffer
750 */
751
752static void echo_erase_tab(unsigned int num_chars, int after_tab,
753 struct tty_struct *tty)
754{
755 mutex_lock(&tty->echo_lock);
756
757 add_echo_byte(ECHO_OP_START, tty);
758 add_echo_byte(ECHO_OP_ERASE_TAB, tty);
759
760 /* We only need to know this modulo 8 (tab spacing) */
761 num_chars &= 7;
762
763 /* Set the high bit as a flag if num_chars is after a previous tab */
764 if (after_tab)
765 num_chars |= 0x80;
Alan Cox300a6202009-01-02 13:41:04 +0000766
Joe Petersona88a69c2009-01-02 13:40:53 +0000767 add_echo_byte(num_chars, tty);
768
769 mutex_unlock(&tty->echo_lock);
770}
771
772/**
773 * echo_char_raw - echo a character raw
Linus Torvalds1da177e2005-04-16 15:20:36 -0700774 * @c: unicode byte to echo
775 * @tty: terminal device
776 *
Alan Cox4edf1822008-02-08 04:18:44 -0800777 * Echo user input back onto the screen. This must be called only when
Linus Torvalds1da177e2005-04-16 15:20:36 -0700778 * L_ECHO(tty) is true. Called from the driver receive_buf path.
Alan Cox17b82062008-10-13 10:45:06 +0100779 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000780 * This variant does not treat control characters specially.
781 *
782 * Locking: echo_lock to protect the echo buffer
783 */
784
785static void echo_char_raw(unsigned char c, struct tty_struct *tty)
786{
787 mutex_lock(&tty->echo_lock);
788
789 if (c == ECHO_OP_START) {
790 add_echo_byte(ECHO_OP_START, tty);
791 add_echo_byte(ECHO_OP_START, tty);
792 } else {
793 add_echo_byte(c, tty);
794 }
795
796 mutex_unlock(&tty->echo_lock);
797}
798
799/**
800 * echo_char - echo a character
801 * @c: unicode byte to echo
802 * @tty: terminal device
803 *
804 * Echo user input back onto the screen. This must be called only when
805 * L_ECHO(tty) is true. Called from the driver receive_buf path.
806 *
Joe Peterson62b26352009-09-09 15:03:47 -0600807 * This variant tags control characters to be echoed as "^X"
808 * (where X is the letter representing the control char).
Joe Petersona88a69c2009-01-02 13:40:53 +0000809 *
810 * Locking: echo_lock to protect the echo buffer
Linus Torvalds1da177e2005-04-16 15:20:36 -0700811 */
812
813static void echo_char(unsigned char c, struct tty_struct *tty)
814{
Joe Petersona88a69c2009-01-02 13:40:53 +0000815 mutex_lock(&tty->echo_lock);
816
817 if (c == ECHO_OP_START) {
818 add_echo_byte(ECHO_OP_START, tty);
819 add_echo_byte(ECHO_OP_START, tty);
820 } else {
Joe Peterson62b26352009-09-09 15:03:47 -0600821 if (L_ECHOCTL(tty) && iscntrl(c) && c != '\t')
Joe Petersona88a69c2009-01-02 13:40:53 +0000822 add_echo_byte(ECHO_OP_START, tty);
823 add_echo_byte(c, tty);
824 }
825
826 mutex_unlock(&tty->echo_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700827}
828
Alan Cox17b82062008-10-13 10:45:06 +0100829/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000830 * finish_erasing - complete erase
Alan Cox17b82062008-10-13 10:45:06 +0100831 * @tty: tty doing the erase
Alan Cox17b82062008-10-13 10:45:06 +0100832 */
Joe Petersona88a69c2009-01-02 13:40:53 +0000833
Linus Torvalds1da177e2005-04-16 15:20:36 -0700834static inline void finish_erasing(struct tty_struct *tty)
835{
836 if (tty->erasing) {
Joe Petersona88a69c2009-01-02 13:40:53 +0000837 echo_char_raw('/', tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700838 tty->erasing = 0;
839 }
840}
841
842/**
843 * eraser - handle erase function
844 * @c: character input
845 * @tty: terminal device
846 *
Robert P. J. Day3a4fa0a2007-10-19 23:10:43 +0200847 * Perform erase and necessary output when an erase character is
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848 * present in the stream from the driver layer. Handles the complexities
849 * of UTF-8 multibyte symbols.
Alan Cox17b82062008-10-13 10:45:06 +0100850 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000851 * Locking: read_lock for tty buffers
Linus Torvalds1da177e2005-04-16 15:20:36 -0700852 */
Alan Cox4edf1822008-02-08 04:18:44 -0800853
Linus Torvalds1da177e2005-04-16 15:20:36 -0700854static void eraser(unsigned char c, struct tty_struct *tty)
855{
856 enum { ERASE, WERASE, KILL } kill_type;
857 int head, seen_alnums, cnt;
858 unsigned long flags;
859
Alan Cox17b82062008-10-13 10:45:06 +0100860 /* FIXME: locking needed ? */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700861 if (tty->read_head == tty->canon_head) {
Joe Peterson7e94b1d2009-01-02 13:43:40 +0000862 /* process_output('\a', tty); */ /* what do you think? */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863 return;
864 }
865 if (c == ERASE_CHAR(tty))
866 kill_type = ERASE;
867 else if (c == WERASE_CHAR(tty))
868 kill_type = WERASE;
869 else {
870 if (!L_ECHO(tty)) {
871 spin_lock_irqsave(&tty->read_lock, flags);
872 tty->read_cnt -= ((tty->read_head - tty->canon_head) &
873 (N_TTY_BUF_SIZE - 1));
874 tty->read_head = tty->canon_head;
875 spin_unlock_irqrestore(&tty->read_lock, flags);
876 return;
877 }
878 if (!L_ECHOK(tty) || !L_ECHOKE(tty) || !L_ECHOE(tty)) {
879 spin_lock_irqsave(&tty->read_lock, flags);
880 tty->read_cnt -= ((tty->read_head - tty->canon_head) &
881 (N_TTY_BUF_SIZE - 1));
882 tty->read_head = tty->canon_head;
883 spin_unlock_irqrestore(&tty->read_lock, flags);
884 finish_erasing(tty);
885 echo_char(KILL_CHAR(tty), tty);
886 /* Add a newline if ECHOK is on and ECHOKE is off. */
887 if (L_ECHOK(tty))
Joe Petersona88a69c2009-01-02 13:40:53 +0000888 echo_char_raw('\n', tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700889 return;
890 }
891 kill_type = KILL;
892 }
893
894 seen_alnums = 0;
Alan Cox17b82062008-10-13 10:45:06 +0100895 /* FIXME: Locking ?? */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700896 while (tty->read_head != tty->canon_head) {
897 head = tty->read_head;
898
899 /* erase a single possibly multibyte character */
900 do {
901 head = (head - 1) & (N_TTY_BUF_SIZE-1);
902 c = tty->read_buf[head];
903 } while (is_continuation(c, tty) && head != tty->canon_head);
904
905 /* do not partially erase */
906 if (is_continuation(c, tty))
907 break;
908
909 if (kill_type == WERASE) {
910 /* Equivalent to BSD's ALTWERASE. */
911 if (isalnum(c) || c == '_')
912 seen_alnums++;
913 else if (seen_alnums)
914 break;
915 }
916 cnt = (tty->read_head - head) & (N_TTY_BUF_SIZE-1);
917 spin_lock_irqsave(&tty->read_lock, flags);
918 tty->read_head = head;
919 tty->read_cnt -= cnt;
920 spin_unlock_irqrestore(&tty->read_lock, flags);
921 if (L_ECHO(tty)) {
922 if (L_ECHOPRT(tty)) {
923 if (!tty->erasing) {
Joe Petersona88a69c2009-01-02 13:40:53 +0000924 echo_char_raw('\\', tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700925 tty->erasing = 1;
926 }
927 /* if cnt > 1, output a multi-byte character */
928 echo_char(c, tty);
929 while (--cnt > 0) {
930 head = (head+1) & (N_TTY_BUF_SIZE-1);
Joe Petersona88a69c2009-01-02 13:40:53 +0000931 echo_char_raw(tty->read_buf[head], tty);
932 echo_move_back_col(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700933 }
934 } else if (kill_type == ERASE && !L_ECHOE(tty)) {
935 echo_char(ERASE_CHAR(tty), tty);
936 } else if (c == '\t') {
Joe Petersona88a69c2009-01-02 13:40:53 +0000937 unsigned int num_chars = 0;
938 int after_tab = 0;
939 unsigned long tail = tty->read_head;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700940
Joe Petersona88a69c2009-01-02 13:40:53 +0000941 /*
942 * Count the columns used for characters
943 * since the start of input or after a
944 * previous tab.
945 * This info is used to go back the correct
946 * number of columns.
947 */
948 while (tail != tty->canon_head) {
949 tail = (tail-1) & (N_TTY_BUF_SIZE-1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700950 c = tty->read_buf[tail];
Joe Petersona88a69c2009-01-02 13:40:53 +0000951 if (c == '\t') {
952 after_tab = 1;
953 break;
Alan Cox300a6202009-01-02 13:41:04 +0000954 } else if (iscntrl(c)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700955 if (L_ECHOCTL(tty))
Joe Petersona88a69c2009-01-02 13:40:53 +0000956 num_chars += 2;
957 } else if (!is_continuation(c, tty)) {
958 num_chars++;
959 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700960 }
Joe Petersona88a69c2009-01-02 13:40:53 +0000961 echo_erase_tab(num_chars, after_tab, tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700962 } else {
963 if (iscntrl(c) && L_ECHOCTL(tty)) {
Joe Petersona88a69c2009-01-02 13:40:53 +0000964 echo_char_raw('\b', tty);
965 echo_char_raw(' ', tty);
966 echo_char_raw('\b', tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700967 }
968 if (!iscntrl(c) || L_ECHOCTL(tty)) {
Joe Petersona88a69c2009-01-02 13:40:53 +0000969 echo_char_raw('\b', tty);
970 echo_char_raw(' ', tty);
971 echo_char_raw('\b', tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700972 }
973 }
974 }
975 if (kill_type == ERASE)
976 break;
977 }
Joe Petersona88a69c2009-01-02 13:40:53 +0000978 if (tty->read_head == tty->canon_head && L_ECHO(tty))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700979 finish_erasing(tty);
980}
981
982/**
983 * isig - handle the ISIG optio
984 * @sig: signal
985 * @tty: terminal
986 * @flush: force flush
987 *
988 * Called when a signal is being sent due to terminal input. This
989 * may caus terminal flushing to take place according to the termios
990 * settings and character used. Called from the driver receive_buf
991 * path so serialized.
Alan Cox17b82062008-10-13 10:45:06 +0100992 *
993 * Locking: ctrl_lock, read_lock (both via flush buffer)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700994 */
Alan Cox4edf1822008-02-08 04:18:44 -0800995
Linus Torvalds1da177e2005-04-16 15:20:36 -0700996static inline void isig(int sig, struct tty_struct *tty, int flush)
997{
Eric W. Biedermanab521dc2007-02-12 00:53:00 -0800998 if (tty->pgrp)
999 kill_pgrp(tty->pgrp, sig, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001000 if (flush || !L_NOFLSH(tty)) {
1001 n_tty_flush_buffer(tty);
Alan Coxf34d7a52008-04-30 00:54:13 -07001002 tty_driver_flush_buffer(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001003 }
1004}
1005
1006/**
1007 * n_tty_receive_break - handle break
1008 * @tty: terminal
1009 *
1010 * An RS232 break event has been hit in the incoming bitstream. This
1011 * can cause a variety of events depending upon the termios settings.
1012 *
1013 * Called from the receive_buf path so single threaded.
1014 */
Alan Cox4edf1822008-02-08 04:18:44 -08001015
Linus Torvalds1da177e2005-04-16 15:20:36 -07001016static inline void n_tty_receive_break(struct tty_struct *tty)
1017{
1018 if (I_IGNBRK(tty))
1019 return;
1020 if (I_BRKINT(tty)) {
1021 isig(SIGINT, tty, 1);
1022 return;
1023 }
1024 if (I_PARMRK(tty)) {
1025 put_tty_queue('\377', tty);
1026 put_tty_queue('\0', tty);
1027 }
1028 put_tty_queue('\0', tty);
1029 wake_up_interruptible(&tty->read_wait);
1030}
1031
1032/**
1033 * n_tty_receive_overrun - handle overrun reporting
1034 * @tty: terminal
1035 *
1036 * Data arrived faster than we could process it. While the tty
1037 * driver has flagged this the bits that were missed are gone
1038 * forever.
1039 *
1040 * Called from the receive_buf path so single threaded. Does not
1041 * need locking as num_overrun and overrun_time are function
1042 * private.
1043 */
Alan Cox4edf1822008-02-08 04:18:44 -08001044
Linus Torvalds1da177e2005-04-16 15:20:36 -07001045static inline void n_tty_receive_overrun(struct tty_struct *tty)
1046{
1047 char buf[64];
1048
1049 tty->num_overrun++;
1050 if (time_before(tty->overrun_time, jiffies - HZ) ||
1051 time_after(tty->overrun_time, jiffies)) {
1052 printk(KERN_WARNING "%s: %d input overrun(s)\n",
1053 tty_name(tty, buf),
1054 tty->num_overrun);
1055 tty->overrun_time = jiffies;
1056 tty->num_overrun = 0;
1057 }
1058}
1059
1060/**
1061 * n_tty_receive_parity_error - error notifier
1062 * @tty: terminal device
1063 * @c: character
1064 *
1065 * Process a parity error and queue the right data to indicate
Robert P. J. Day3a4fa0a2007-10-19 23:10:43 +02001066 * the error case if necessary. Locking as per n_tty_receive_buf.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001067 */
1068static inline void n_tty_receive_parity_error(struct tty_struct *tty,
1069 unsigned char c)
1070{
Alan Cox4edf1822008-02-08 04:18:44 -08001071 if (I_IGNPAR(tty))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001072 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001073 if (I_PARMRK(tty)) {
1074 put_tty_queue('\377', tty);
1075 put_tty_queue('\0', tty);
1076 put_tty_queue(c, tty);
1077 } else if (I_INPCK(tty))
1078 put_tty_queue('\0', tty);
1079 else
1080 put_tty_queue(c, tty);
1081 wake_up_interruptible(&tty->read_wait);
1082}
1083
1084/**
1085 * n_tty_receive_char - perform processing
1086 * @tty: terminal device
1087 * @c: character
1088 *
1089 * Process an individual character of input received from the driver.
Alan Cox4edf1822008-02-08 04:18:44 -08001090 * This is serialized with respect to itself by the rules for the
Linus Torvalds1da177e2005-04-16 15:20:36 -07001091 * driver above.
1092 */
1093
1094static inline void n_tty_receive_char(struct tty_struct *tty, unsigned char c)
1095{
1096 unsigned long flags;
Joe Petersonacc71bb2009-01-02 13:43:32 +00001097 int parmrk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001098
1099 if (tty->raw) {
1100 put_tty_queue(c, tty);
1101 return;
1102 }
Alan Cox4edf1822008-02-08 04:18:44 -08001103
Linus Torvalds1da177e2005-04-16 15:20:36 -07001104 if (I_ISTRIP(tty))
1105 c &= 0x7f;
1106 if (I_IUCLC(tty) && L_IEXTEN(tty))
Alan Cox300a6202009-01-02 13:41:04 +00001107 c = tolower(c);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001108
hyc@symas.com26df6d12010-06-22 10:14:49 -07001109 if (L_EXTPROC(tty)) {
1110 put_tty_queue(c, tty);
1111 return;
1112 }
1113
Joe Peterson54d2a372008-02-06 01:37:59 -08001114 if (tty->stopped && !tty->flow_stopped && I_IXON(tty) &&
Joe Petersona88a69c2009-01-02 13:40:53 +00001115 I_IXANY(tty) && c != START_CHAR(tty) && c != STOP_CHAR(tty) &&
1116 c != INTR_CHAR(tty) && c != QUIT_CHAR(tty) && c != SUSP_CHAR(tty)) {
Joe Peterson54d2a372008-02-06 01:37:59 -08001117 start_tty(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001118 process_echoes(tty);
1119 }
Joe Peterson54d2a372008-02-06 01:37:59 -08001120
Linus Torvalds1da177e2005-04-16 15:20:36 -07001121 if (tty->closing) {
1122 if (I_IXON(tty)) {
Joe Petersona88a69c2009-01-02 13:40:53 +00001123 if (c == START_CHAR(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001124 start_tty(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001125 process_echoes(tty);
Alan Cox300a6202009-01-02 13:41:04 +00001126 } else if (c == STOP_CHAR(tty))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001127 stop_tty(tty);
1128 }
1129 return;
1130 }
1131
1132 /*
1133 * If the previous character was LNEXT, or we know that this
1134 * character is not one of the characters that we'll have to
1135 * handle specially, do shortcut processing to speed things
1136 * up.
1137 */
1138 if (!test_bit(c, tty->process_char_map) || tty->lnext) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001139 tty->lnext = 0;
Joe Petersonacc71bb2009-01-02 13:43:32 +00001140 parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0;
1141 if (tty->read_cnt >= (N_TTY_BUF_SIZE - parmrk - 1)) {
1142 /* beep if no space */
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001143 if (L_ECHO(tty))
1144 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001145 return;
1146 }
1147 if (L_ECHO(tty)) {
1148 finish_erasing(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001149 /* Record the column of first canon char. */
1150 if (tty->canon_head == tty->read_head)
Joe Petersona88a69c2009-01-02 13:40:53 +00001151 echo_set_canon_col(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001152 echo_char(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001153 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154 }
Joe Petersonacc71bb2009-01-02 13:43:32 +00001155 if (parmrk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001156 put_tty_queue(c, tty);
1157 put_tty_queue(c, tty);
1158 return;
1159 }
Alan Cox4edf1822008-02-08 04:18:44 -08001160
Linus Torvalds1da177e2005-04-16 15:20:36 -07001161 if (I_IXON(tty)) {
1162 if (c == START_CHAR(tty)) {
1163 start_tty(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001164 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165 return;
1166 }
1167 if (c == STOP_CHAR(tty)) {
1168 stop_tty(tty);
1169 return;
1170 }
1171 }
Joe Peterson575537b32008-04-30 00:53:30 -07001172
Linus Torvalds1da177e2005-04-16 15:20:36 -07001173 if (L_ISIG(tty)) {
1174 int signal;
1175 signal = SIGINT;
1176 if (c == INTR_CHAR(tty))
1177 goto send_signal;
1178 signal = SIGQUIT;
1179 if (c == QUIT_CHAR(tty))
1180 goto send_signal;
1181 signal = SIGTSTP;
1182 if (c == SUSP_CHAR(tty)) {
1183send_signal:
Joe Petersonec5b1152008-02-06 01:37:38 -08001184 /*
Joe Petersonec5b1152008-02-06 01:37:38 -08001185 * Note that we do not use isig() here because we want
1186 * the order to be:
1187 * 1) flush, 2) echo, 3) signal
1188 */
1189 if (!L_NOFLSH(tty)) {
1190 n_tty_flush_buffer(tty);
Alan Coxf34d7a52008-04-30 00:54:13 -07001191 tty_driver_flush_buffer(tty);
Joe Petersonec5b1152008-02-06 01:37:38 -08001192 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001193 if (I_IXON(tty))
1194 start_tty(tty);
1195 if (L_ECHO(tty)) {
Joe Petersonec5b1152008-02-06 01:37:38 -08001196 echo_char(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001197 process_echoes(tty);
1198 }
Joe Petersonec5b1152008-02-06 01:37:38 -08001199 if (tty->pgrp)
1200 kill_pgrp(tty->pgrp, signal, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001201 return;
1202 }
1203 }
Joe Peterson575537b32008-04-30 00:53:30 -07001204
1205 if (c == '\r') {
1206 if (I_IGNCR(tty))
1207 return;
1208 if (I_ICRNL(tty))
1209 c = '\n';
1210 } else if (c == '\n' && I_INLCR(tty))
1211 c = '\r';
1212
Linus Torvalds1da177e2005-04-16 15:20:36 -07001213 if (tty->icanon) {
1214 if (c == ERASE_CHAR(tty) || c == KILL_CHAR(tty) ||
1215 (c == WERASE_CHAR(tty) && L_IEXTEN(tty))) {
1216 eraser(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001217 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001218 return;
1219 }
1220 if (c == LNEXT_CHAR(tty) && L_IEXTEN(tty)) {
1221 tty->lnext = 1;
1222 if (L_ECHO(tty)) {
1223 finish_erasing(tty);
1224 if (L_ECHOCTL(tty)) {
Joe Petersona88a69c2009-01-02 13:40:53 +00001225 echo_char_raw('^', tty);
1226 echo_char_raw('\b', tty);
1227 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001228 }
1229 }
1230 return;
1231 }
1232 if (c == REPRINT_CHAR(tty) && L_ECHO(tty) &&
1233 L_IEXTEN(tty)) {
1234 unsigned long tail = tty->canon_head;
1235
1236 finish_erasing(tty);
1237 echo_char(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001238 echo_char_raw('\n', tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001239 while (tail != tty->read_head) {
1240 echo_char(tty->read_buf[tail], tty);
1241 tail = (tail+1) & (N_TTY_BUF_SIZE-1);
1242 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001243 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001244 return;
1245 }
1246 if (c == '\n') {
Joe Petersonacc71bb2009-01-02 13:43:32 +00001247 if (tty->read_cnt >= N_TTY_BUF_SIZE) {
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001248 if (L_ECHO(tty))
1249 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001250 return;
1251 }
1252 if (L_ECHO(tty) || L_ECHONL(tty)) {
Joe Petersona88a69c2009-01-02 13:40:53 +00001253 echo_char_raw('\n', tty);
1254 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001255 }
1256 goto handle_newline;
1257 }
1258 if (c == EOF_CHAR(tty)) {
Joe Petersonacc71bb2009-01-02 13:43:32 +00001259 if (tty->read_cnt >= N_TTY_BUF_SIZE)
1260 return;
Alan Cox4edf1822008-02-08 04:18:44 -08001261 if (tty->canon_head != tty->read_head)
1262 set_bit(TTY_PUSH, &tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001263 c = __DISABLED_CHAR;
1264 goto handle_newline;
1265 }
1266 if ((c == EOL_CHAR(tty)) ||
1267 (c == EOL2_CHAR(tty) && L_IEXTEN(tty))) {
Joe Petersonacc71bb2009-01-02 13:43:32 +00001268 parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty))
1269 ? 1 : 0;
1270 if (tty->read_cnt >= (N_TTY_BUF_SIZE - parmrk)) {
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001271 if (L_ECHO(tty))
1272 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001273 return;
1274 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001275 /*
1276 * XXX are EOL_CHAR and EOL2_CHAR echoed?!?
1277 */
1278 if (L_ECHO(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001279 /* Record the column of first canon char. */
1280 if (tty->canon_head == tty->read_head)
Joe Petersona88a69c2009-01-02 13:40:53 +00001281 echo_set_canon_col(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001282 echo_char(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001283 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001284 }
1285 /*
1286 * XXX does PARMRK doubling happen for
1287 * EOL_CHAR and EOL2_CHAR?
1288 */
Joe Petersonacc71bb2009-01-02 13:43:32 +00001289 if (parmrk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001290 put_tty_queue(c, tty);
1291
Alan Cox4edf1822008-02-08 04:18:44 -08001292handle_newline:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001293 spin_lock_irqsave(&tty->read_lock, flags);
1294 set_bit(tty->read_head, tty->read_flags);
1295 put_tty_queue_nolock(c, tty);
1296 tty->canon_head = tty->read_head;
1297 tty->canon_data++;
1298 spin_unlock_irqrestore(&tty->read_lock, flags);
1299 kill_fasync(&tty->fasync, SIGIO, POLL_IN);
1300 if (waitqueue_active(&tty->read_wait))
1301 wake_up_interruptible(&tty->read_wait);
1302 return;
1303 }
1304 }
Alan Cox4edf1822008-02-08 04:18:44 -08001305
Joe Petersonacc71bb2009-01-02 13:43:32 +00001306 parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0;
1307 if (tty->read_cnt >= (N_TTY_BUF_SIZE - parmrk - 1)) {
1308 /* beep if no space */
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001309 if (L_ECHO(tty))
1310 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001311 return;
1312 }
1313 if (L_ECHO(tty)) {
1314 finish_erasing(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001315 if (c == '\n')
Joe Petersona88a69c2009-01-02 13:40:53 +00001316 echo_char_raw('\n', tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001317 else {
1318 /* Record the column of first canon char. */
1319 if (tty->canon_head == tty->read_head)
Joe Petersona88a69c2009-01-02 13:40:53 +00001320 echo_set_canon_col(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001321 echo_char(c, tty);
1322 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001323 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001324 }
1325
Joe Petersonacc71bb2009-01-02 13:43:32 +00001326 if (parmrk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001327 put_tty_queue(c, tty);
1328
1329 put_tty_queue(c, tty);
Alan Cox4edf1822008-02-08 04:18:44 -08001330}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001331
Linus Torvalds1da177e2005-04-16 15:20:36 -07001332
1333/**
1334 * n_tty_write_wakeup - asynchronous I/O notifier
1335 * @tty: tty device
1336 *
1337 * Required for the ptys, serial driver etc. since processes
1338 * that attach themselves to the master and rely on ASYNC
1339 * IO must be woken up
1340 */
1341
1342static void n_tty_write_wakeup(struct tty_struct *tty)
1343{
Thomas Pfaffff8cb0f2009-01-02 13:47:13 +00001344 if (tty->fasync && test_and_clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001345 kill_fasync(&tty->fasync, SIGIO, POLL_OUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001346}
1347
1348/**
1349 * n_tty_receive_buf - data receive
1350 * @tty: terminal device
1351 * @cp: buffer
1352 * @fp: flag buffer
1353 * @count: characters
1354 *
1355 * Called by the terminal driver when a block of characters has
1356 * been received. This function must be called from soft contexts
1357 * not from interrupt context. The driver is responsible for making
1358 * calls one at a time and in order (or using flush_to_ldisc)
1359 */
Alan Cox4edf1822008-02-08 04:18:44 -08001360
Linus Torvalds55db4c62011-06-04 06:33:24 +09001361static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
1362 char *fp, int count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001363{
1364 const unsigned char *p;
1365 char *f, flags = TTY_NORMAL;
1366 int i;
1367 char buf[64];
1368 unsigned long cpuflags;
1369
1370 if (!tty->read_buf)
Linus Torvalds55db4c62011-06-04 06:33:24 +09001371 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001372
1373 if (tty->real_raw) {
1374 spin_lock_irqsave(&tty->read_lock, cpuflags);
1375 i = min(N_TTY_BUF_SIZE - tty->read_cnt,
1376 N_TTY_BUF_SIZE - tty->read_head);
1377 i = min(count, i);
1378 memcpy(tty->read_buf + tty->read_head, cp, i);
1379 tty->read_head = (tty->read_head + i) & (N_TTY_BUF_SIZE-1);
1380 tty->read_cnt += i;
1381 cp += i;
1382 count -= i;
1383
1384 i = min(N_TTY_BUF_SIZE - tty->read_cnt,
1385 N_TTY_BUF_SIZE - tty->read_head);
1386 i = min(count, i);
1387 memcpy(tty->read_buf + tty->read_head, cp, i);
1388 tty->read_head = (tty->read_head + i) & (N_TTY_BUF_SIZE-1);
1389 tty->read_cnt += i;
1390 spin_unlock_irqrestore(&tty->read_lock, cpuflags);
1391 } else {
Alan Cox4edf1822008-02-08 04:18:44 -08001392 for (i = count, p = cp, f = fp; i; i--, p++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001393 if (f)
1394 flags = *f++;
1395 switch (flags) {
1396 case TTY_NORMAL:
1397 n_tty_receive_char(tty, *p);
1398 break;
1399 case TTY_BREAK:
1400 n_tty_receive_break(tty);
1401 break;
1402 case TTY_PARITY:
1403 case TTY_FRAME:
1404 n_tty_receive_parity_error(tty, *p);
1405 break;
1406 case TTY_OVERRUN:
1407 n_tty_receive_overrun(tty);
1408 break;
1409 default:
Alan Cox4edf1822008-02-08 04:18:44 -08001410 printk(KERN_ERR "%s: unknown flag %d\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001411 tty_name(tty, buf), flags);
1412 break;
1413 }
1414 }
Alan Coxf34d7a52008-04-30 00:54:13 -07001415 if (tty->ops->flush_chars)
1416 tty->ops->flush_chars(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001417 }
1418
Linus Torvalds55db4c62011-06-04 06:33:24 +09001419 n_tty_set_room(tty);
1420
hyc@symas.com26df6d12010-06-22 10:14:49 -07001421 if ((!tty->icanon && (tty->read_cnt >= tty->minimum_to_wake)) ||
1422 L_EXTPROC(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001423 kill_fasync(&tty->fasync, SIGIO, POLL_IN);
1424 if (waitqueue_active(&tty->read_wait))
1425 wake_up_interruptible(&tty->read_wait);
1426 }
1427
1428 /*
1429 * Check the remaining room for the input canonicalization
1430 * mode. We don't want to throttle the driver if we're in
1431 * canonical mode and don't have a newline yet!
1432 */
Linus Torvalds55db4c62011-06-04 06:33:24 +09001433 if (tty->receive_room < TTY_THRESHOLD_THROTTLE)
Alan Cox39c2e602008-04-30 00:54:18 -07001434 tty_throttle(tty);
Alan Cox0a44ab42012-06-22 16:40:20 +01001435
1436 /* FIXME: there is a tiny race here if the receive room check runs
1437 before the other work executes and empties the buffer (upping
1438 the receiving room and unthrottling. We then throttle and get
1439 stuck. This has been observed and traced down by Vincent Pillet/
1440 We need to address this when we sort out out the rx path locking */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001441}
1442
1443int is_ignored(int sig)
1444{
1445 return (sigismember(&current->blocked, sig) ||
Alan Cox4edf1822008-02-08 04:18:44 -08001446 current->sighand->action[sig-1].sa.sa_handler == SIG_IGN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001447}
1448
1449/**
1450 * n_tty_set_termios - termios data changed
1451 * @tty: terminal
1452 * @old: previous data
1453 *
1454 * Called by the tty layer when the user changes termios flags so
1455 * that the line discipline can plan ahead. This function cannot sleep
Alan Cox4edf1822008-02-08 04:18:44 -08001456 * and is protected from re-entry by the tty layer. The user is
Linus Torvalds1da177e2005-04-16 15:20:36 -07001457 * guaranteed that this function will not be re-entered or in progress
1458 * when the ldisc is closed.
Alan Cox17b82062008-10-13 10:45:06 +01001459 *
1460 * Locking: Caller holds tty->termios_mutex
Linus Torvalds1da177e2005-04-16 15:20:36 -07001461 */
Alan Cox4edf1822008-02-08 04:18:44 -08001462
1463static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001464{
Alan Cox47afa7a2008-10-13 10:44:17 +01001465 int canon_change = 1;
1466 BUG_ON(!tty);
1467
1468 if (old)
Alan Coxadc8d742012-07-14 15:31:47 +01001469 canon_change = (old->c_lflag ^ tty->termios.c_lflag) & ICANON;
Alan Cox47afa7a2008-10-13 10:44:17 +01001470 if (canon_change) {
1471 memset(&tty->read_flags, 0, sizeof tty->read_flags);
1472 tty->canon_head = tty->read_tail;
1473 tty->canon_data = 0;
1474 tty->erasing = 0;
1475 }
1476
1477 if (canon_change && !L_ICANON(tty) && tty->read_cnt)
1478 wake_up_interruptible(&tty->read_wait);
Alan Cox4edf1822008-02-08 04:18:44 -08001479
Linus Torvalds1da177e2005-04-16 15:20:36 -07001480 tty->icanon = (L_ICANON(tty) != 0);
1481 if (test_bit(TTY_HW_COOK_IN, &tty->flags)) {
1482 tty->raw = 1;
1483 tty->real_raw = 1;
Linus Torvalds55db4c62011-06-04 06:33:24 +09001484 n_tty_set_room(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001485 return;
1486 }
1487 if (I_ISTRIP(tty) || I_IUCLC(tty) || I_IGNCR(tty) ||
1488 I_ICRNL(tty) || I_INLCR(tty) || L_ICANON(tty) ||
1489 I_IXON(tty) || L_ISIG(tty) || L_ECHO(tty) ||
1490 I_PARMRK(tty)) {
1491 memset(tty->process_char_map, 0, 256/8);
1492
1493 if (I_IGNCR(tty) || I_ICRNL(tty))
1494 set_bit('\r', tty->process_char_map);
1495 if (I_INLCR(tty))
1496 set_bit('\n', tty->process_char_map);
1497
1498 if (L_ICANON(tty)) {
1499 set_bit(ERASE_CHAR(tty), tty->process_char_map);
1500 set_bit(KILL_CHAR(tty), tty->process_char_map);
1501 set_bit(EOF_CHAR(tty), tty->process_char_map);
1502 set_bit('\n', tty->process_char_map);
1503 set_bit(EOL_CHAR(tty), tty->process_char_map);
1504 if (L_IEXTEN(tty)) {
1505 set_bit(WERASE_CHAR(tty),
1506 tty->process_char_map);
1507 set_bit(LNEXT_CHAR(tty),
1508 tty->process_char_map);
1509 set_bit(EOL2_CHAR(tty),
1510 tty->process_char_map);
1511 if (L_ECHO(tty))
1512 set_bit(REPRINT_CHAR(tty),
1513 tty->process_char_map);
1514 }
1515 }
1516 if (I_IXON(tty)) {
1517 set_bit(START_CHAR(tty), tty->process_char_map);
1518 set_bit(STOP_CHAR(tty), tty->process_char_map);
1519 }
1520 if (L_ISIG(tty)) {
1521 set_bit(INTR_CHAR(tty), tty->process_char_map);
1522 set_bit(QUIT_CHAR(tty), tty->process_char_map);
1523 set_bit(SUSP_CHAR(tty), tty->process_char_map);
1524 }
1525 clear_bit(__DISABLED_CHAR, tty->process_char_map);
1526 tty->raw = 0;
1527 tty->real_raw = 0;
1528 } else {
1529 tty->raw = 1;
1530 if ((I_IGNBRK(tty) || (!I_BRKINT(tty) && !I_PARMRK(tty))) &&
1531 (I_IGNPAR(tty) || !I_INPCK(tty)) &&
1532 (tty->driver->flags & TTY_DRIVER_REAL_RAW))
1533 tty->real_raw = 1;
1534 else
1535 tty->real_raw = 0;
1536 }
Linus Torvalds55db4c62011-06-04 06:33:24 +09001537 n_tty_set_room(tty);
Alan Coxf34d7a52008-04-30 00:54:13 -07001538 /* The termios change make the tty ready for I/O */
1539 wake_up_interruptible(&tty->write_wait);
1540 wake_up_interruptible(&tty->read_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001541}
1542
1543/**
1544 * n_tty_close - close the ldisc for this tty
1545 * @tty: device
1546 *
Alan Cox4edf1822008-02-08 04:18:44 -08001547 * Called from the terminal layer when this line discipline is
1548 * being shut down, either because of a close or becsuse of a
Linus Torvalds1da177e2005-04-16 15:20:36 -07001549 * discipline change. The function will not be called while other
1550 * ldisc methods are in progress.
1551 */
Alan Cox4edf1822008-02-08 04:18:44 -08001552
Linus Torvalds1da177e2005-04-16 15:20:36 -07001553static void n_tty_close(struct tty_struct *tty)
1554{
1555 n_tty_flush_buffer(tty);
1556 if (tty->read_buf) {
Alan Cox0b4068a2009-06-11 13:05:49 +01001557 kfree(tty->read_buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001558 tty->read_buf = NULL;
1559 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001560 if (tty->echo_buf) {
Alan Cox0b4068a2009-06-11 13:05:49 +01001561 kfree(tty->echo_buf);
Joe Petersona88a69c2009-01-02 13:40:53 +00001562 tty->echo_buf = NULL;
1563 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001564}
1565
1566/**
1567 * n_tty_open - open an ldisc
1568 * @tty: terminal to open
1569 *
Alan Cox4edf1822008-02-08 04:18:44 -08001570 * Called when this line discipline is being attached to the
Linus Torvalds1da177e2005-04-16 15:20:36 -07001571 * terminal device. Can sleep. Called serialized so that no
1572 * other events will occur in parallel. No further open will occur
1573 * until a close.
1574 */
1575
1576static int n_tty_open(struct tty_struct *tty)
1577{
1578 if (!tty)
1579 return -EINVAL;
1580
Joe Petersona88a69c2009-01-02 13:40:53 +00001581 /* These are ugly. Currently a malloc failure here can panic */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001582 if (!tty->read_buf) {
Alan Cox0b4068a2009-06-11 13:05:49 +01001583 tty->read_buf = kzalloc(N_TTY_BUF_SIZE, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001584 if (!tty->read_buf)
1585 return -ENOMEM;
1586 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001587 if (!tty->echo_buf) {
Alan Cox0b4068a2009-06-11 13:05:49 +01001588 tty->echo_buf = kzalloc(N_TTY_BUF_SIZE, GFP_KERNEL);
1589
Joe Petersona88a69c2009-01-02 13:40:53 +00001590 if (!tty->echo_buf)
1591 return -ENOMEM;
1592 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001593 reset_buffer_flags(tty);
Andrew McGregor7b292b42011-06-13 11:31:31 +12001594 tty_unthrottle(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001595 tty->column = 0;
1596 n_tty_set_termios(tty, NULL);
1597 tty->minimum_to_wake = 1;
1598 tty->closing = 0;
1599 return 0;
1600}
1601
1602static inline int input_available_p(struct tty_struct *tty, int amt)
1603{
OGAWA Hirofumie043e422009-07-29 12:15:56 -07001604 tty_flush_to_ldisc(tty);
hyc@symas.com26df6d12010-06-22 10:14:49 -07001605 if (tty->icanon && !L_EXTPROC(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001606 if (tty->canon_data)
1607 return 1;
1608 } else if (tty->read_cnt >= (amt ? amt : 1))
1609 return 1;
1610
1611 return 0;
1612}
1613
1614/**
Thorsten Wißmannbbd20752011-12-08 17:47:33 +01001615 * copy_from_read_buf - copy read data directly
Linus Torvalds1da177e2005-04-16 15:20:36 -07001616 * @tty: terminal device
1617 * @b: user data
1618 * @nr: size of data
1619 *
Alan Cox11a96d12008-10-13 10:46:24 +01001620 * Helper function to speed up n_tty_read. It is only called when
Linus Torvalds1da177e2005-04-16 15:20:36 -07001621 * ICANON is off; it copies characters straight from the tty queue to
1622 * user space directly. It can be profitably called twice; once to
1623 * drain the space from the tail pointer to the (physical) end of the
1624 * buffer, and once to drain the space from the (physical) beginning of
1625 * the buffer to head pointer.
1626 *
Paul Fulghum817d6d32006-06-28 04:26:47 -07001627 * Called under the tty->atomic_read_lock sem
Linus Torvalds1da177e2005-04-16 15:20:36 -07001628 *
1629 */
Alan Cox4edf1822008-02-08 04:18:44 -08001630
Alan Cox33f0f882006-01-09 20:54:13 -08001631static int copy_from_read_buf(struct tty_struct *tty,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001632 unsigned char __user **b,
1633 size_t *nr)
1634
1635{
1636 int retval;
1637 size_t n;
1638 unsigned long flags;
Jiri Slaby3fa10cc2012-04-26 20:13:00 +02001639 bool is_eof;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001640
1641 retval = 0;
1642 spin_lock_irqsave(&tty->read_lock, flags);
1643 n = min(tty->read_cnt, N_TTY_BUF_SIZE - tty->read_tail);
1644 n = min(*nr, n);
1645 spin_unlock_irqrestore(&tty->read_lock, flags);
1646 if (n) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001647 retval = copy_to_user(*b, &tty->read_buf[tty->read_tail], n);
1648 n -= retval;
Jiri Slaby3fa10cc2012-04-26 20:13:00 +02001649 is_eof = n == 1 &&
1650 tty->read_buf[tty->read_tail] == EOF_CHAR(tty);
Miloslav Trmac522ed772007-07-15 23:40:56 -07001651 tty_audit_add_data(tty, &tty->read_buf[tty->read_tail], n);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001652 spin_lock_irqsave(&tty->read_lock, flags);
1653 tty->read_tail = (tty->read_tail + n) & (N_TTY_BUF_SIZE-1);
1654 tty->read_cnt -= n;
hyc@symas.com26df6d12010-06-22 10:14:49 -07001655 /* Turn single EOF into zero-length read */
Jiri Slaby3fa10cc2012-04-26 20:13:00 +02001656 if (L_EXTPROC(tty) && tty->icanon && is_eof && !tty->read_cnt)
1657 n = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001658 spin_unlock_irqrestore(&tty->read_lock, flags);
1659 *b += n;
1660 *nr -= n;
1661 }
1662 return retval;
1663}
1664
Al Virocc4191d2008-03-29 03:08:48 +00001665extern ssize_t redirected_tty_write(struct file *, const char __user *,
Alan Cox4edf1822008-02-08 04:18:44 -08001666 size_t, loff_t *);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001667
1668/**
1669 * job_control - check job control
1670 * @tty: tty
1671 * @file: file handle
1672 *
1673 * Perform job control management checks on this file/tty descriptor
Alan Cox4edf1822008-02-08 04:18:44 -08001674 * and if appropriate send any needed signals and return a negative
Linus Torvalds1da177e2005-04-16 15:20:36 -07001675 * error code if action should be taken.
Alan Cox04f378b2008-04-30 00:53:29 -07001676 *
1677 * FIXME:
1678 * Locking: None - redirected write test is safe, testing
1679 * current->signal should possibly lock current->sighand
1680 * pgrp locking ?
Linus Torvalds1da177e2005-04-16 15:20:36 -07001681 */
Alan Cox4edf1822008-02-08 04:18:44 -08001682
Linus Torvalds1da177e2005-04-16 15:20:36 -07001683static int job_control(struct tty_struct *tty, struct file *file)
1684{
1685 /* Job control check -- must be done at start and after
1686 every sleep (POSIX.1 7.1.1.4). */
1687 /* NOTE: not yet done after every sleep pending a thorough
1688 check of the logic of this change. -- jlc */
1689 /* don't stop on /dev/console */
1690 if (file->f_op->write != redirected_tty_write &&
1691 current->signal->tty == tty) {
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001692 if (!tty->pgrp)
Alan Cox11a96d12008-10-13 10:46:24 +01001693 printk(KERN_ERR "n_tty_read: no tty->pgrp!\n");
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001694 else if (task_pgrp(current) != tty->pgrp) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001695 if (is_ignored(SIGTTIN) ||
Eric W. Biederman3e7cd6c2007-02-12 00:52:58 -08001696 is_current_pgrp_orphaned())
Linus Torvalds1da177e2005-04-16 15:20:36 -07001697 return -EIO;
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001698 kill_pgrp(task_pgrp(current), SIGTTIN, 1);
Oleg Nesterov040b6362007-06-01 00:46:53 -07001699 set_thread_flag(TIF_SIGPENDING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001700 return -ERESTARTSYS;
1701 }
1702 }
1703 return 0;
1704}
Alan Cox4edf1822008-02-08 04:18:44 -08001705
Linus Torvalds1da177e2005-04-16 15:20:36 -07001706
1707/**
Alan Cox11a96d12008-10-13 10:46:24 +01001708 * n_tty_read - read function for tty
Linus Torvalds1da177e2005-04-16 15:20:36 -07001709 * @tty: tty device
1710 * @file: file object
1711 * @buf: userspace buffer pointer
1712 * @nr: size of I/O
1713 *
1714 * Perform reads for the line discipline. We are guaranteed that the
1715 * line discipline will not be closed under us but we may get multiple
1716 * parallel readers and must handle this ourselves. We may also get
1717 * a hangup. Always called in user context, may sleep.
1718 *
1719 * This code must be sure never to sleep through a hangup.
1720 */
Alan Cox4edf1822008-02-08 04:18:44 -08001721
Alan Cox11a96d12008-10-13 10:46:24 +01001722static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001723 unsigned char __user *buf, size_t nr)
1724{
1725 unsigned char __user *b = buf;
1726 DECLARE_WAITQUEUE(wait, current);
1727 int c;
1728 int minimum, time;
1729 ssize_t retval = 0;
1730 ssize_t size;
1731 long timeout;
1732 unsigned long flags;
Alan Cox04f378b2008-04-30 00:53:29 -07001733 int packet;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001734
1735do_it_again:
1736
Alan Cox17b82062008-10-13 10:45:06 +01001737 BUG_ON(!tty->read_buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001738
1739 c = job_control(tty, file);
Alan Cox4edf1822008-02-08 04:18:44 -08001740 if (c < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001741 return c;
Alan Cox4edf1822008-02-08 04:18:44 -08001742
Linus Torvalds1da177e2005-04-16 15:20:36 -07001743 minimum = time = 0;
1744 timeout = MAX_SCHEDULE_TIMEOUT;
1745 if (!tty->icanon) {
1746 time = (HZ / 10) * TIME_CHAR(tty);
1747 minimum = MIN_CHAR(tty);
1748 if (minimum) {
1749 if (time)
1750 tty->minimum_to_wake = 1;
1751 else if (!waitqueue_active(&tty->read_wait) ||
1752 (tty->minimum_to_wake > minimum))
1753 tty->minimum_to_wake = minimum;
1754 } else {
1755 timeout = 0;
1756 if (time) {
1757 timeout = time;
1758 time = 0;
1759 }
1760 tty->minimum_to_wake = minimum = 1;
1761 }
1762 }
1763
1764 /*
1765 * Internal serialization of reads.
1766 */
1767 if (file->f_flags & O_NONBLOCK) {
Ingo Molnar70522e12006-03-23 03:00:31 -08001768 if (!mutex_trylock(&tty->atomic_read_lock))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001769 return -EAGAIN;
Alan Cox4edf1822008-02-08 04:18:44 -08001770 } else {
Ingo Molnar70522e12006-03-23 03:00:31 -08001771 if (mutex_lock_interruptible(&tty->atomic_read_lock))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001772 return -ERESTARTSYS;
1773 }
Alan Cox04f378b2008-04-30 00:53:29 -07001774 packet = tty->packet;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001775
1776 add_wait_queue(&tty->read_wait, &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001777 while (nr) {
1778 /* First test for status change. */
Alan Cox04f378b2008-04-30 00:53:29 -07001779 if (packet && tty->link->ctrl_status) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001780 unsigned char cs;
1781 if (b != buf)
1782 break;
Alan Cox04f378b2008-04-30 00:53:29 -07001783 spin_lock_irqsave(&tty->link->ctrl_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001784 cs = tty->link->ctrl_status;
1785 tty->link->ctrl_status = 0;
Alan Cox04f378b2008-04-30 00:53:29 -07001786 spin_unlock_irqrestore(&tty->link->ctrl_lock, flags);
Miloslav Trmac522ed772007-07-15 23:40:56 -07001787 if (tty_put_user(tty, cs, b++)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001788 retval = -EFAULT;
1789 b--;
1790 break;
1791 }
1792 nr--;
1793 break;
1794 }
1795 /* This statement must be first before checking for input
1796 so that any interrupt will set the state back to
1797 TASK_RUNNING. */
1798 set_current_state(TASK_INTERRUPTIBLE);
Alan Cox4edf1822008-02-08 04:18:44 -08001799
Linus Torvalds1da177e2005-04-16 15:20:36 -07001800 if (((minimum - (b - buf)) < tty->minimum_to_wake) &&
1801 ((minimum - (b - buf)) >= 1))
1802 tty->minimum_to_wake = (minimum - (b - buf));
Alan Cox4edf1822008-02-08 04:18:44 -08001803
Linus Torvalds1da177e2005-04-16 15:20:36 -07001804 if (!input_available_p(tty, 0)) {
1805 if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) {
1806 retval = -EIO;
1807 break;
1808 }
1809 if (tty_hung_up_p(file))
1810 break;
1811 if (!timeout)
1812 break;
1813 if (file->f_flags & O_NONBLOCK) {
1814 retval = -EAGAIN;
1815 break;
1816 }
1817 if (signal_pending(current)) {
1818 retval = -ERESTARTSYS;
1819 break;
1820 }
Linus Torvalds55db4c62011-06-04 06:33:24 +09001821 /* FIXME: does n_tty_set_room need locking ? */
1822 n_tty_set_room(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001823 timeout = schedule_timeout(timeout);
Jiri Slaby28726282011-06-05 14:16:17 +02001824 BUG_ON(!tty->read_buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001825 continue;
1826 }
1827 __set_current_state(TASK_RUNNING);
1828
1829 /* Deal with packet mode. */
Alan Cox04f378b2008-04-30 00:53:29 -07001830 if (packet && b == buf) {
Miloslav Trmac522ed772007-07-15 23:40:56 -07001831 if (tty_put_user(tty, TIOCPKT_DATA, b++)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001832 retval = -EFAULT;
1833 b--;
1834 break;
1835 }
1836 nr--;
1837 }
1838
hyc@symas.com26df6d12010-06-22 10:14:49 -07001839 if (tty->icanon && !L_EXTPROC(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001840 /* N.B. avoid overrun if nr == 0 */
Stanislav Kozina00aaae02012-08-09 14:48:58 +01001841 spin_lock_irqsave(&tty->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001842 while (nr && tty->read_cnt) {
Alan Cox4edf1822008-02-08 04:18:44 -08001843 int eol;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001844
1845 eol = test_and_clear_bit(tty->read_tail,
1846 tty->read_flags);
1847 c = tty->read_buf[tty->read_tail];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001848 tty->read_tail = ((tty->read_tail+1) &
1849 (N_TTY_BUF_SIZE-1));
1850 tty->read_cnt--;
1851 if (eol) {
1852 /* this test should be redundant:
1853 * we shouldn't be reading data if
1854 * canon_data is 0
1855 */
1856 if (--tty->canon_data < 0)
1857 tty->canon_data = 0;
1858 }
1859 spin_unlock_irqrestore(&tty->read_lock, flags);
1860
1861 if (!eol || (c != __DISABLED_CHAR)) {
Miloslav Trmac522ed772007-07-15 23:40:56 -07001862 if (tty_put_user(tty, c, b++)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001863 retval = -EFAULT;
1864 b--;
Stanislav Kozina00aaae02012-08-09 14:48:58 +01001865 spin_lock_irqsave(&tty->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001866 break;
1867 }
1868 nr--;
1869 }
Miloslav Trmac522ed772007-07-15 23:40:56 -07001870 if (eol) {
1871 tty_audit_push(tty);
Stanislav Kozina00aaae02012-08-09 14:48:58 +01001872 spin_lock_irqsave(&tty->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001873 break;
Miloslav Trmac522ed772007-07-15 23:40:56 -07001874 }
Stanislav Kozina00aaae02012-08-09 14:48:58 +01001875 spin_lock_irqsave(&tty->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001876 }
Stanislav Kozina00aaae02012-08-09 14:48:58 +01001877 spin_unlock_irqrestore(&tty->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001878 if (retval)
1879 break;
1880 } else {
1881 int uncopied;
Alan Cox04f378b2008-04-30 00:53:29 -07001882 /* The copy function takes the read lock and handles
1883 locking internally for this case */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001884 uncopied = copy_from_read_buf(tty, &b, &nr);
1885 uncopied += copy_from_read_buf(tty, &b, &nr);
1886 if (uncopied) {
1887 retval = -EFAULT;
1888 break;
1889 }
1890 }
1891
1892 /* If there is enough space in the read buffer now, let the
1893 * low-level driver know. We use n_tty_chars_in_buffer() to
1894 * check the buffer, as it now knows about canonical mode.
1895 * Otherwise, if the driver is throttled and the line is
1896 * longer than TTY_THRESHOLD_UNTHROTTLE in canonical mode,
1897 * we won't get any more characters.
1898 */
Linus Torvalds55db4c62011-06-04 06:33:24 +09001899 if (n_tty_chars_in_buffer(tty) <= TTY_THRESHOLD_UNTHROTTLE) {
1900 n_tty_set_room(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001901 check_unthrottle(tty);
Linus Torvalds55db4c62011-06-04 06:33:24 +09001902 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001903
1904 if (b - buf >= minimum)
1905 break;
1906 if (time)
1907 timeout = time;
1908 }
Ingo Molnar70522e12006-03-23 03:00:31 -08001909 mutex_unlock(&tty->atomic_read_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001910 remove_wait_queue(&tty->read_wait, &wait);
1911
1912 if (!waitqueue_active(&tty->read_wait))
1913 tty->minimum_to_wake = minimum;
1914
1915 __set_current_state(TASK_RUNNING);
1916 size = b - buf;
1917 if (size) {
1918 retval = size;
1919 if (nr)
Alan Cox4edf1822008-02-08 04:18:44 -08001920 clear_bit(TTY_PUSH, &tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001921 } else if (test_and_clear_bit(TTY_PUSH, &tty->flags))
Thorsten Wißmannbbd20752011-12-08 17:47:33 +01001922 goto do_it_again;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001923
Linus Torvalds55db4c62011-06-04 06:33:24 +09001924 n_tty_set_room(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001925 return retval;
1926}
1927
1928/**
Alan Cox11a96d12008-10-13 10:46:24 +01001929 * n_tty_write - write function for tty
Linus Torvalds1da177e2005-04-16 15:20:36 -07001930 * @tty: tty device
1931 * @file: file object
1932 * @buf: userspace buffer pointer
1933 * @nr: size of I/O
1934 *
Joe Petersona88a69c2009-01-02 13:40:53 +00001935 * Write function of the terminal device. This is serialized with
Linus Torvalds1da177e2005-04-16 15:20:36 -07001936 * respect to other write callers but not to termios changes, reads
Joe Petersona88a69c2009-01-02 13:40:53 +00001937 * and other such events. Since the receive code will echo characters,
1938 * thus calling driver write methods, the output_lock is used in
1939 * the output processing functions called here as well as in the
1940 * echo processing function to protect the column state and space
1941 * left in the buffer.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001942 *
1943 * This code must be sure never to sleep through a hangup.
Joe Petersona88a69c2009-01-02 13:40:53 +00001944 *
1945 * Locking: output_lock to protect column state and space left
1946 * (note that the process_output*() functions take this
1947 * lock themselves)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001948 */
Alan Cox4edf1822008-02-08 04:18:44 -08001949
Alan Cox11a96d12008-10-13 10:46:24 +01001950static ssize_t n_tty_write(struct tty_struct *tty, struct file *file,
Joe Petersona88a69c2009-01-02 13:40:53 +00001951 const unsigned char *buf, size_t nr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001952{
1953 const unsigned char *b = buf;
1954 DECLARE_WAITQUEUE(wait, current);
1955 int c;
1956 ssize_t retval = 0;
1957
1958 /* Job control check -- must be done at start (POSIX.1 7.1.1.4). */
1959 if (L_TOSTOP(tty) && file->f_op->write != redirected_tty_write) {
1960 retval = tty_check_change(tty);
1961 if (retval)
1962 return retval;
1963 }
1964
Joe Petersona88a69c2009-01-02 13:40:53 +00001965 /* Write out any echoed characters that are still pending */
1966 process_echoes(tty);
Alan Cox300a6202009-01-02 13:41:04 +00001967
Linus Torvalds1da177e2005-04-16 15:20:36 -07001968 add_wait_queue(&tty->write_wait, &wait);
1969 while (1) {
1970 set_current_state(TASK_INTERRUPTIBLE);
1971 if (signal_pending(current)) {
1972 retval = -ERESTARTSYS;
1973 break;
1974 }
1975 if (tty_hung_up_p(file) || (tty->link && !tty->link->count)) {
1976 retval = -EIO;
1977 break;
1978 }
1979 if (O_OPOST(tty) && !(test_bit(TTY_HW_COOK_OUT, &tty->flags))) {
1980 while (nr > 0) {
Joe Petersona88a69c2009-01-02 13:40:53 +00001981 ssize_t num = process_output_block(tty, b, nr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001982 if (num < 0) {
1983 if (num == -EAGAIN)
1984 break;
1985 retval = num;
1986 goto break_out;
1987 }
1988 b += num;
1989 nr -= num;
1990 if (nr == 0)
1991 break;
1992 c = *b;
Joe Petersona88a69c2009-01-02 13:40:53 +00001993 if (process_output(c, tty) < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001994 break;
1995 b++; nr--;
1996 }
Alan Coxf34d7a52008-04-30 00:54:13 -07001997 if (tty->ops->flush_chars)
1998 tty->ops->flush_chars(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001999 } else {
Roman Zippeld6afe272005-07-07 17:56:55 -07002000 while (nr > 0) {
Alan Coxf34d7a52008-04-30 00:54:13 -07002001 c = tty->ops->write(tty, b, nr);
Roman Zippeld6afe272005-07-07 17:56:55 -07002002 if (c < 0) {
2003 retval = c;
2004 goto break_out;
2005 }
2006 if (!c)
2007 break;
2008 b += c;
2009 nr -= c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002010 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002011 }
2012 if (!nr)
2013 break;
2014 if (file->f_flags & O_NONBLOCK) {
2015 retval = -EAGAIN;
2016 break;
2017 }
2018 schedule();
2019 }
2020break_out:
2021 __set_current_state(TASK_RUNNING);
2022 remove_wait_queue(&tty->write_wait, &wait);
Thomas Pfaffff8cb0f2009-01-02 13:47:13 +00002023 if (b - buf != nr && tty->fasync)
2024 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002025 return (b - buf) ? b - buf : retval;
2026}
2027
2028/**
Alan Cox11a96d12008-10-13 10:46:24 +01002029 * n_tty_poll - poll method for N_TTY
Linus Torvalds1da177e2005-04-16 15:20:36 -07002030 * @tty: terminal device
2031 * @file: file accessing it
2032 * @wait: poll table
2033 *
2034 * Called when the line discipline is asked to poll() for data or
2035 * for special events. This code is not serialized with respect to
2036 * other events save open/close.
2037 *
2038 * This code must be sure never to sleep through a hangup.
2039 * Called without the kernel lock held - fine
Linus Torvalds1da177e2005-04-16 15:20:36 -07002040 */
Alan Cox4edf1822008-02-08 04:18:44 -08002041
Alan Cox11a96d12008-10-13 10:46:24 +01002042static unsigned int n_tty_poll(struct tty_struct *tty, struct file *file,
Alan Cox4edf1822008-02-08 04:18:44 -08002043 poll_table *wait)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002044{
2045 unsigned int mask = 0;
2046
2047 poll_wait(file, &tty->read_wait, wait);
2048 poll_wait(file, &tty->write_wait, wait);
2049 if (input_available_p(tty, TIME_CHAR(tty) ? 0 : MIN_CHAR(tty)))
2050 mask |= POLLIN | POLLRDNORM;
2051 if (tty->packet && tty->link->ctrl_status)
2052 mask |= POLLPRI | POLLIN | POLLRDNORM;
2053 if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
2054 mask |= POLLHUP;
2055 if (tty_hung_up_p(file))
2056 mask |= POLLHUP;
2057 if (!(mask & (POLLHUP | POLLIN | POLLRDNORM))) {
2058 if (MIN_CHAR(tty) && !TIME_CHAR(tty))
2059 tty->minimum_to_wake = MIN_CHAR(tty);
2060 else
2061 tty->minimum_to_wake = 1;
2062 }
Alan Coxf34d7a52008-04-30 00:54:13 -07002063 if (tty->ops->write && !tty_is_writelocked(tty) &&
2064 tty_chars_in_buffer(tty) < WAKEUP_CHARS &&
2065 tty_write_room(tty) > 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002066 mask |= POLLOUT | POLLWRNORM;
2067 return mask;
2068}
2069
Alan Cox47afa7a2008-10-13 10:44:17 +01002070static unsigned long inq_canon(struct tty_struct *tty)
2071{
2072 int nr, head, tail;
2073
Alan Cox17b82062008-10-13 10:45:06 +01002074 if (!tty->canon_data)
Alan Cox47afa7a2008-10-13 10:44:17 +01002075 return 0;
2076 head = tty->canon_head;
2077 tail = tty->read_tail;
2078 nr = (head - tail) & (N_TTY_BUF_SIZE-1);
2079 /* Skip EOF-chars.. */
2080 while (head != tail) {
2081 if (test_bit(tail, tty->read_flags) &&
2082 tty->read_buf[tail] == __DISABLED_CHAR)
2083 nr--;
2084 tail = (tail+1) & (N_TTY_BUF_SIZE-1);
2085 }
2086 return nr;
2087}
2088
2089static int n_tty_ioctl(struct tty_struct *tty, struct file *file,
2090 unsigned int cmd, unsigned long arg)
2091{
2092 int retval;
2093
2094 switch (cmd) {
2095 case TIOCOUTQ:
2096 return put_user(tty_chars_in_buffer(tty), (int __user *) arg);
2097 case TIOCINQ:
Alan Cox17b82062008-10-13 10:45:06 +01002098 /* FIXME: Locking */
Alan Cox47afa7a2008-10-13 10:44:17 +01002099 retval = tty->read_cnt;
2100 if (L_ICANON(tty))
2101 retval = inq_canon(tty);
2102 return put_user(retval, (unsigned int __user *) arg);
2103 default:
2104 return n_tty_ioctl_helper(tty, file, cmd, arg);
2105 }
2106}
2107
Alan Coxa352def2008-07-16 21:53:12 +01002108struct tty_ldisc_ops tty_ldisc_N_TTY = {
Paul Fulghume10cc1d2007-05-10 22:22:50 -07002109 .magic = TTY_LDISC_MAGIC,
2110 .name = "n_tty",
2111 .open = n_tty_open,
2112 .close = n_tty_close,
2113 .flush_buffer = n_tty_flush_buffer,
2114 .chars_in_buffer = n_tty_chars_in_buffer,
Alan Cox11a96d12008-10-13 10:46:24 +01002115 .read = n_tty_read,
2116 .write = n_tty_write,
Paul Fulghume10cc1d2007-05-10 22:22:50 -07002117 .ioctl = n_tty_ioctl,
2118 .set_termios = n_tty_set_termios,
Alan Cox11a96d12008-10-13 10:46:24 +01002119 .poll = n_tty_poll,
Paul Fulghume10cc1d2007-05-10 22:22:50 -07002120 .receive_buf = n_tty_receive_buf,
2121 .write_wakeup = n_tty_write_wakeup
Linus Torvalds1da177e2005-04-16 15:20:36 -07002122};
Rodolfo Giometti572b9ad2010-03-10 15:23:46 -08002123
2124/**
2125 * n_tty_inherit_ops - inherit N_TTY methods
2126 * @ops: struct tty_ldisc_ops where to save N_TTY methods
2127 *
2128 * Used by a generic struct tty_ldisc_ops to easily inherit N_TTY
2129 * methods.
2130 */
2131
2132void n_tty_inherit_ops(struct tty_ldisc_ops *ops)
2133{
2134 *ops = tty_ldisc_N_TTY;
2135 ops->owner = NULL;
2136 ops->refcount = ops->flags = 0;
2137}
2138EXPORT_SYMBOL_GPL(n_tty_inherit_ops);