blob: 702dd4adbdc9de7fe016a9285ce4139291a7f64d [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
Jiri Slaby70ece7a2012-10-18 22:26:38 +020076struct n_tty_data {
Jiri Slaby53c5ee22012-10-18 22:26:39 +020077 unsigned int column;
78 unsigned long overrun_time;
79 int num_overrun;
80
81 unsigned char lnext:1, erasing:1, raw:1, real_raw:1, icanon:1;
82 unsigned char echo_overrun:1;
Jiri Slaby3fe780b2012-10-18 22:26:40 +020083
84 DECLARE_BITMAP(process_char_map, 256);
85 DECLARE_BITMAP(read_flags, N_TTY_BUF_SIZE);
Jiri Slaby70ece7a2012-10-18 22:26:38 +020086};
87
Miloslav Trmac522ed772007-07-15 23:40:56 -070088static inline int tty_put_user(struct tty_struct *tty, unsigned char x,
89 unsigned char __user *ptr)
90{
Jiri Slaby53c5ee22012-10-18 22:26:39 +020091 struct n_tty_data *ldata = tty->disc_data;
92
93 tty_audit_add_data(tty, &x, 1, ldata->icanon);
Miloslav Trmac522ed772007-07-15 23:40:56 -070094 return put_user(x, ptr);
95}
96
Linus Torvalds55db4c62011-06-04 06:33:24 +090097/**
98 * n_tty_set__room - receive space
99 * @tty: terminal
100 *
101 * Called by the driver to find out how much data it is
102 * permitted to feed to the line discipline without any being lost
103 * and thus to manage flow control. Not serialized. Answers for the
104 * "instant".
105 */
106
107static void n_tty_set_room(struct tty_struct *tty)
108{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200109 struct n_tty_data *ldata = tty->disc_data;
Jaeden Amero090abf72012-07-27 08:43:11 -0500110 int left;
Linus Torvalds55db4c62011-06-04 06:33:24 +0900111 int old_left;
112
Jaeden Amero090abf72012-07-27 08:43:11 -0500113 /* tty->read_cnt is not read locked ? */
114 if (I_PARMRK(tty)) {
115 /* Multiply read_cnt by 3, since each byte might take up to
116 * three times as many spaces when PARMRK is set (depending on
117 * its flags, e.g. parity error). */
118 left = N_TTY_BUF_SIZE - tty->read_cnt * 3 - 1;
119 } else
120 left = N_TTY_BUF_SIZE - tty->read_cnt - 1;
121
Linus Torvalds55db4c62011-06-04 06:33:24 +0900122 /*
123 * If we are doing input canonicalization, and there are no
124 * pending newlines, let characters through without limit, so
125 * that erase characters will be handled. Other excess
126 * characters will be beeped.
127 */
128 if (left <= 0)
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200129 left = ldata->icanon && !tty->canon_data;
Linus Torvalds55db4c62011-06-04 06:33:24 +0900130 old_left = tty->receive_room;
131 tty->receive_room = left;
132
133 /* Did this open up the receive buffer? We may need to flip */
134 if (left && !old_left)
135 schedule_work(&tty->buf.work);
136}
137
Alan Cox33f0f882006-01-09 20:54:13 -0800138static void put_tty_queue_nolock(unsigned char c, struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700139{
140 if (tty->read_cnt < N_TTY_BUF_SIZE) {
141 tty->read_buf[tty->read_head] = c;
142 tty->read_head = (tty->read_head + 1) & (N_TTY_BUF_SIZE-1);
143 tty->read_cnt++;
144 }
145}
146
Alan Cox17b82062008-10-13 10:45:06 +0100147/**
148 * put_tty_queue - add character to tty
149 * @c: character
150 * @tty: tty device
151 *
152 * Add a character to the tty read_buf queue. This is done under the
153 * read_lock to serialize character addition and also to protect us
154 * against parallel reads or flushes
155 */
156
Alan Cox33f0f882006-01-09 20:54:13 -0800157static void put_tty_queue(unsigned char c, struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700158{
159 unsigned long flags;
160 /*
161 * The problem of stomping on the buffers ends here.
162 * Why didn't anyone see this one coming? --AJK
163 */
164 spin_lock_irqsave(&tty->read_lock, flags);
165 put_tty_queue_nolock(c, tty);
166 spin_unlock_irqrestore(&tty->read_lock, flags);
167}
168
169/**
170 * check_unthrottle - allow new receive data
171 * @tty; tty device
172 *
Alan Cox17b82062008-10-13 10:45:06 +0100173 * Check whether to call the driver unthrottle functions
174 *
Ingo Molnar70522e12006-03-23 03:00:31 -0800175 * Can sleep, may be called under the atomic_read_lock mutex but
Linus Torvalds1da177e2005-04-16 15:20:36 -0700176 * this is not guaranteed.
177 */
Alan Cox4edf1822008-02-08 04:18:44 -0800178static void check_unthrottle(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700179{
Alan Cox39c2e602008-04-30 00:54:18 -0700180 if (tty->count)
181 tty_unthrottle(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700182}
183
184/**
185 * reset_buffer_flags - reset buffer state
186 * @tty: terminal to reset
187 *
Alan Cox4edf1822008-02-08 04:18:44 -0800188 * Reset the read buffer counters, clear the flags,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700189 * and make sure the driver is unthrottled. Called
190 * from n_tty_open() and n_tty_flush_buffer().
Alan Cox17b82062008-10-13 10:45:06 +0100191 *
192 * Locking: tty_read_lock for read fields.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700193 */
Joe Petersona88a69c2009-01-02 13:40:53 +0000194
Linus Torvalds1da177e2005-04-16 15:20:36 -0700195static void reset_buffer_flags(struct tty_struct *tty)
196{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200197 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700198 unsigned long flags;
199
200 spin_lock_irqsave(&tty->read_lock, flags);
201 tty->read_head = tty->read_tail = tty->read_cnt = 0;
202 spin_unlock_irqrestore(&tty->read_lock, flags);
Joe Petersona88a69c2009-01-02 13:40:53 +0000203
204 mutex_lock(&tty->echo_lock);
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200205 tty->echo_pos = tty->echo_cnt = ldata->echo_overrun = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000206 mutex_unlock(&tty->echo_lock);
207
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200208 tty->canon_head = tty->canon_data = ldata->erasing = 0;
Jiri Slaby3fe780b2012-10-18 22:26:40 +0200209 bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
Linus Torvalds55db4c62011-06-04 06:33:24 +0900210 n_tty_set_room(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211}
212
213/**
214 * n_tty_flush_buffer - clean input queue
215 * @tty: terminal device
216 *
217 * Flush the input buffer. Called when the line discipline is
218 * being closed, when the tty layer wants the buffer flushed (eg
219 * at hangup) or when the N_TTY line discipline internally has to
220 * clean the pending queue (for example some signals).
221 *
Alan Cox17b82062008-10-13 10:45:06 +0100222 * Locking: ctrl_lock, read_lock.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700223 */
Alan Cox4edf1822008-02-08 04:18:44 -0800224
225static void n_tty_flush_buffer(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700226{
Alan Cox04f378b2008-04-30 00:53:29 -0700227 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700228 /* clear everything and unthrottle the driver */
229 reset_buffer_flags(tty);
Alan Cox4edf1822008-02-08 04:18:44 -0800230
Linus Torvalds1da177e2005-04-16 15:20:36 -0700231 if (!tty->link)
232 return;
233
Alan Cox04f378b2008-04-30 00:53:29 -0700234 spin_lock_irqsave(&tty->ctrl_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700235 if (tty->link->packet) {
236 tty->ctrl_status |= TIOCPKT_FLUSHREAD;
237 wake_up_interruptible(&tty->link->read_wait);
238 }
Alan Cox04f378b2008-04-30 00:53:29 -0700239 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700240}
241
242/**
243 * n_tty_chars_in_buffer - report available bytes
244 * @tty: tty device
245 *
246 * Report the number of characters buffered to be delivered to user
Alan Cox4edf1822008-02-08 04:18:44 -0800247 * at this instant in time.
Alan Cox17b82062008-10-13 10:45:06 +0100248 *
249 * Locking: read_lock
Linus Torvalds1da177e2005-04-16 15:20:36 -0700250 */
Alan Cox4edf1822008-02-08 04:18:44 -0800251
Linus Torvalds1da177e2005-04-16 15:20:36 -0700252static ssize_t n_tty_chars_in_buffer(struct tty_struct *tty)
253{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200254 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700255 unsigned long flags;
256 ssize_t n = 0;
257
258 spin_lock_irqsave(&tty->read_lock, flags);
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200259 if (!ldata->icanon) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700260 n = tty->read_cnt;
261 } else if (tty->canon_data) {
262 n = (tty->canon_head > tty->read_tail) ?
263 tty->canon_head - tty->read_tail :
264 tty->canon_head + (N_TTY_BUF_SIZE - tty->read_tail);
265 }
266 spin_unlock_irqrestore(&tty->read_lock, flags);
267 return n;
268}
269
270/**
271 * is_utf8_continuation - utf8 multibyte check
272 * @c: byte to check
273 *
274 * Returns true if the utf8 character 'c' is a multibyte continuation
275 * character. We use this to correctly compute the on screen size
276 * of the character when printing
277 */
Alan Cox4edf1822008-02-08 04:18:44 -0800278
Linus Torvalds1da177e2005-04-16 15:20:36 -0700279static inline int is_utf8_continuation(unsigned char c)
280{
281 return (c & 0xc0) == 0x80;
282}
283
284/**
285 * is_continuation - multibyte check
286 * @c: byte to check
287 *
288 * Returns true if the utf8 character 'c' is a multibyte continuation
289 * character and the terminal is in unicode mode.
290 */
Alan Cox4edf1822008-02-08 04:18:44 -0800291
Linus Torvalds1da177e2005-04-16 15:20:36 -0700292static inline int is_continuation(unsigned char c, struct tty_struct *tty)
293{
294 return I_IUTF8(tty) && is_utf8_continuation(c);
295}
296
297/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000298 * do_output_char - output one character
299 * @c: character (or partial unicode symbol)
300 * @tty: terminal device
301 * @space: space available in tty driver write buffer
302 *
303 * This is a helper function that handles one output character
304 * (including special characters like TAB, CR, LF, etc.),
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600305 * doing OPOST processing and putting the results in the
306 * tty driver's write buffer.
Joe Petersona88a69c2009-01-02 13:40:53 +0000307 *
308 * Note that Linux currently ignores TABDLY, CRDLY, VTDLY, FFDLY
309 * and NLDLY. They simply aren't relevant in the world today.
310 * If you ever need them, add them here.
311 *
312 * Returns the number of bytes of buffer space used or -1 if
313 * no space left.
314 *
315 * Locking: should be called under the output_lock to protect
316 * the column state and space left in the buffer
317 */
318
319static int do_output_char(unsigned char c, struct tty_struct *tty, int space)
320{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200321 struct n_tty_data *ldata = tty->disc_data;
Joe Petersona88a69c2009-01-02 13:40:53 +0000322 int spaces;
323
324 if (!space)
325 return -1;
Alan Cox300a6202009-01-02 13:41:04 +0000326
Joe Petersona88a69c2009-01-02 13:40:53 +0000327 switch (c) {
328 case '\n':
329 if (O_ONLRET(tty))
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200330 ldata->column = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000331 if (O_ONLCR(tty)) {
332 if (space < 2)
333 return -1;
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200334 tty->canon_column = ldata->column = 0;
Linus Torvalds37f81fa2009-09-05 12:46:07 -0700335 tty->ops->write(tty, "\r\n", 2);
Joe Petersona88a69c2009-01-02 13:40:53 +0000336 return 2;
337 }
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200338 tty->canon_column = ldata->column;
Joe Petersona88a69c2009-01-02 13:40:53 +0000339 break;
340 case '\r':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200341 if (O_ONOCR(tty) && ldata->column == 0)
Joe Petersona88a69c2009-01-02 13:40:53 +0000342 return 0;
343 if (O_OCRNL(tty)) {
344 c = '\n';
345 if (O_ONLRET(tty))
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200346 tty->canon_column = ldata->column = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000347 break;
348 }
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200349 tty->canon_column = ldata->column = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000350 break;
351 case '\t':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200352 spaces = 8 - (ldata->column & 7);
Joe Petersona88a69c2009-01-02 13:40:53 +0000353 if (O_TABDLY(tty) == XTABS) {
354 if (space < spaces)
355 return -1;
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200356 ldata->column += spaces;
Joe Petersona88a69c2009-01-02 13:40:53 +0000357 tty->ops->write(tty, " ", spaces);
358 return spaces;
359 }
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200360 ldata->column += spaces;
Joe Petersona88a69c2009-01-02 13:40:53 +0000361 break;
362 case '\b':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200363 if (ldata->column > 0)
364 ldata->column--;
Joe Petersona88a69c2009-01-02 13:40:53 +0000365 break;
366 default:
Joe Petersona59c0d62009-01-02 13:43:25 +0000367 if (!iscntrl(c)) {
368 if (O_OLCUC(tty))
369 c = toupper(c);
370 if (!is_continuation(c, tty))
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200371 ldata->column++;
Joe Petersona59c0d62009-01-02 13:43:25 +0000372 }
Joe Petersona88a69c2009-01-02 13:40:53 +0000373 break;
374 }
375
376 tty_put_char(tty, c);
377 return 1;
378}
379
380/**
381 * process_output - output post processor
Linus Torvalds1da177e2005-04-16 15:20:36 -0700382 * @c: character (or partial unicode symbol)
383 * @tty: terminal device
384 *
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600385 * Output one character with OPOST processing.
386 * Returns -1 when the output device is full and the character
387 * must be retried.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700388 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000389 * Locking: output_lock to protect column state and space left
390 * (also, this is called from n_tty_write under the
391 * tty layer write lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700392 */
Alan Cox4edf1822008-02-08 04:18:44 -0800393
Joe Petersona88a69c2009-01-02 13:40:53 +0000394static int process_output(unsigned char c, struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700395{
Joe Petersona88a69c2009-01-02 13:40:53 +0000396 int space, retval;
397
398 mutex_lock(&tty->output_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700399
Alan Coxf34d7a52008-04-30 00:54:13 -0700400 space = tty_write_room(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +0000401 retval = do_output_char(c, tty, space);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700402
Joe Petersona88a69c2009-01-02 13:40:53 +0000403 mutex_unlock(&tty->output_lock);
404 if (retval < 0)
405 return -1;
406 else
407 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700408}
409
410/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000411 * process_output_block - block post processor
Linus Torvalds1da177e2005-04-16 15:20:36 -0700412 * @tty: terminal device
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600413 * @buf: character buffer
414 * @nr: number of bytes to output
415 *
416 * Output a block of characters with OPOST processing.
417 * Returns the number of characters output.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700418 *
419 * This path is used to speed up block console writes, among other
420 * things when processing blocks of output data. It handles only
421 * the simple cases normally found and helps to generate blocks of
422 * symbols for the console driver and thus improve performance.
423 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000424 * Locking: output_lock to protect column state and space left
425 * (also, this is called from n_tty_write under the
426 * tty layer write lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700427 */
Alan Cox4edf1822008-02-08 04:18:44 -0800428
Joe Petersona88a69c2009-01-02 13:40:53 +0000429static ssize_t process_output_block(struct tty_struct *tty,
430 const unsigned char *buf, unsigned int nr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700431{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200432 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700433 int space;
Thorsten Wißmannbbd20752011-12-08 17:47:33 +0100434 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700435 const unsigned char *cp;
436
Joe Petersona88a69c2009-01-02 13:40:53 +0000437 mutex_lock(&tty->output_lock);
438
Alan Coxf34d7a52008-04-30 00:54:13 -0700439 space = tty_write_room(tty);
Alan Cox300a6202009-01-02 13:41:04 +0000440 if (!space) {
Joe Petersona88a69c2009-01-02 13:40:53 +0000441 mutex_unlock(&tty->output_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700442 return 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000443 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700444 if (nr > space)
445 nr = space;
446
447 for (i = 0, cp = buf; i < nr; i++, cp++) {
Joe Petersona59c0d62009-01-02 13:43:25 +0000448 unsigned char c = *cp;
449
450 switch (c) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700451 case '\n':
452 if (O_ONLRET(tty))
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200453 ldata->column = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700454 if (O_ONLCR(tty))
455 goto break_out;
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200456 tty->canon_column = ldata->column;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700457 break;
458 case '\r':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200459 if (O_ONOCR(tty) && ldata->column == 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700460 goto break_out;
461 if (O_OCRNL(tty))
462 goto break_out;
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200463 tty->canon_column = ldata->column = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700464 break;
465 case '\t':
466 goto break_out;
467 case '\b':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200468 if (ldata->column > 0)
469 ldata->column--;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700470 break;
471 default:
Joe Petersona59c0d62009-01-02 13:43:25 +0000472 if (!iscntrl(c)) {
473 if (O_OLCUC(tty))
474 goto break_out;
475 if (!is_continuation(c, tty))
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200476 ldata->column++;
Joe Petersona59c0d62009-01-02 13:43:25 +0000477 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700478 break;
479 }
480 }
481break_out:
Alan Coxf34d7a52008-04-30 00:54:13 -0700482 i = tty->ops->write(tty, buf, i);
Joe Petersona88a69c2009-01-02 13:40:53 +0000483
484 mutex_unlock(&tty->output_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700485 return i;
486}
487
Joe Petersona88a69c2009-01-02 13:40:53 +0000488/**
489 * process_echoes - write pending echo characters
490 * @tty: terminal device
491 *
492 * Write previously buffered echo (and other ldisc-generated)
493 * characters to the tty.
494 *
495 * Characters generated by the ldisc (including echoes) need to
496 * be buffered because the driver's write buffer can fill during
497 * heavy program output. Echoing straight to the driver will
498 * often fail under these conditions, causing lost characters and
499 * resulting mismatches of ldisc state information.
500 *
501 * Since the ldisc state must represent the characters actually sent
502 * to the driver at the time of the write, operations like certain
503 * changes in column state are also saved in the buffer and executed
504 * here.
505 *
506 * A circular fifo buffer is used so that the most recent characters
507 * are prioritized. Also, when control characters are echoed with a
508 * prefixed "^", the pair is treated atomically and thus not separated.
509 *
510 * Locking: output_lock to protect column state and space left,
511 * echo_lock to protect the echo buffer
512 */
513
514static void process_echoes(struct tty_struct *tty)
515{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200516 struct n_tty_data *ldata = tty->disc_data;
Joe Petersona88a69c2009-01-02 13:40:53 +0000517 int space, nr;
518 unsigned char c;
519 unsigned char *cp, *buf_end;
520
521 if (!tty->echo_cnt)
522 return;
523
524 mutex_lock(&tty->output_lock);
525 mutex_lock(&tty->echo_lock);
526
527 space = tty_write_room(tty);
528
529 buf_end = tty->echo_buf + N_TTY_BUF_SIZE;
530 cp = tty->echo_buf + tty->echo_pos;
531 nr = tty->echo_cnt;
532 while (nr > 0) {
533 c = *cp;
534 if (c == ECHO_OP_START) {
535 unsigned char op;
536 unsigned char *opp;
537 int no_space_left = 0;
538
539 /*
540 * If the buffer byte is the start of a multi-byte
541 * operation, get the next byte, which is either the
542 * op code or a control character value.
543 */
544 opp = cp + 1;
545 if (opp == buf_end)
546 opp -= N_TTY_BUF_SIZE;
547 op = *opp;
Alan Cox300a6202009-01-02 13:41:04 +0000548
Joe Petersona88a69c2009-01-02 13:40:53 +0000549 switch (op) {
550 unsigned int num_chars, num_bs;
551
552 case ECHO_OP_ERASE_TAB:
553 if (++opp == buf_end)
554 opp -= N_TTY_BUF_SIZE;
555 num_chars = *opp;
556
557 /*
558 * Determine how many columns to go back
559 * in order to erase the tab.
560 * This depends on the number of columns
561 * used by other characters within the tab
562 * area. If this (modulo 8) count is from
563 * the start of input rather than from a
564 * previous tab, we offset by canon column.
565 * Otherwise, tab spacing is normal.
566 */
567 if (!(num_chars & 0x80))
568 num_chars += tty->canon_column;
569 num_bs = 8 - (num_chars & 7);
570
571 if (num_bs > space) {
572 no_space_left = 1;
573 break;
574 }
575 space -= num_bs;
576 while (num_bs--) {
577 tty_put_char(tty, '\b');
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200578 if (ldata->column > 0)
579 ldata->column--;
Joe Petersona88a69c2009-01-02 13:40:53 +0000580 }
581 cp += 3;
582 nr -= 3;
583 break;
584
585 case ECHO_OP_SET_CANON_COL:
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200586 tty->canon_column = ldata->column;
Joe Petersona88a69c2009-01-02 13:40:53 +0000587 cp += 2;
588 nr -= 2;
589 break;
590
591 case ECHO_OP_MOVE_BACK_COL:
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200592 if (ldata->column > 0)
593 ldata->column--;
Joe Petersona88a69c2009-01-02 13:40:53 +0000594 cp += 2;
595 nr -= 2;
596 break;
597
598 case ECHO_OP_START:
599 /* This is an escaped echo op start code */
600 if (!space) {
601 no_space_left = 1;
602 break;
603 }
604 tty_put_char(tty, ECHO_OP_START);
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200605 ldata->column++;
Joe Petersona88a69c2009-01-02 13:40:53 +0000606 space--;
607 cp += 2;
608 nr -= 2;
609 break;
610
611 default:
Joe Petersona88a69c2009-01-02 13:40:53 +0000612 /*
Joe Peterson62b26352009-09-09 15:03:47 -0600613 * If the op is not a special byte code,
614 * it is a ctrl char tagged to be echoed
615 * as "^X" (where X is the letter
616 * representing the control char).
617 * Note that we must ensure there is
618 * enough space for the whole ctrl pair.
619 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000620 */
Joe Peterson62b26352009-09-09 15:03:47 -0600621 if (space < 2) {
622 no_space_left = 1;
623 break;
624 }
625 tty_put_char(tty, '^');
626 tty_put_char(tty, op ^ 0100);
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200627 ldata->column += 2;
Joe Peterson62b26352009-09-09 15:03:47 -0600628 space -= 2;
Joe Petersona88a69c2009-01-02 13:40:53 +0000629 cp += 2;
630 nr -= 2;
631 }
632
633 if (no_space_left)
634 break;
635 } else {
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600636 if (O_OPOST(tty) &&
637 !(test_bit(TTY_HW_COOK_OUT, &tty->flags))) {
638 int retval = do_output_char(c, tty, space);
639 if (retval < 0)
640 break;
641 space -= retval;
642 } else {
643 if (!space)
644 break;
645 tty_put_char(tty, c);
646 space -= 1;
647 }
Joe Petersona88a69c2009-01-02 13:40:53 +0000648 cp += 1;
649 nr -= 1;
650 }
651
652 /* When end of circular buffer reached, wrap around */
653 if (cp >= buf_end)
654 cp -= N_TTY_BUF_SIZE;
655 }
656
657 if (nr == 0) {
658 tty->echo_pos = 0;
659 tty->echo_cnt = 0;
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200660 ldata->echo_overrun = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000661 } else {
662 int num_processed = tty->echo_cnt - nr;
663 tty->echo_pos += num_processed;
664 tty->echo_pos &= N_TTY_BUF_SIZE - 1;
665 tty->echo_cnt = nr;
666 if (num_processed > 0)
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200667 ldata->echo_overrun = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000668 }
669
670 mutex_unlock(&tty->echo_lock);
671 mutex_unlock(&tty->output_lock);
672
673 if (tty->ops->flush_chars)
674 tty->ops->flush_chars(tty);
675}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676
677/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000678 * add_echo_byte - add a byte to the echo buffer
679 * @c: unicode byte to echo
680 * @tty: terminal device
681 *
682 * Add a character or operation byte to the echo buffer.
683 *
684 * Should be called under the echo lock to protect the echo buffer.
685 */
686
687static void add_echo_byte(unsigned char c, struct tty_struct *tty)
688{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200689 struct n_tty_data *ldata = tty->disc_data;
Joe Petersona88a69c2009-01-02 13:40:53 +0000690 int new_byte_pos;
691
692 if (tty->echo_cnt == N_TTY_BUF_SIZE) {
693 /* Circular buffer is already at capacity */
694 new_byte_pos = tty->echo_pos;
695
696 /*
697 * Since the buffer start position needs to be advanced,
698 * be sure to step by a whole operation byte group.
699 */
Alan Cox300a6202009-01-02 13:41:04 +0000700 if (tty->echo_buf[tty->echo_pos] == ECHO_OP_START) {
Joe Petersona88a69c2009-01-02 13:40:53 +0000701 if (tty->echo_buf[(tty->echo_pos + 1) &
702 (N_TTY_BUF_SIZE - 1)] ==
703 ECHO_OP_ERASE_TAB) {
704 tty->echo_pos += 3;
705 tty->echo_cnt -= 2;
706 } else {
707 tty->echo_pos += 2;
708 tty->echo_cnt -= 1;
709 }
710 } else {
711 tty->echo_pos++;
712 }
713 tty->echo_pos &= N_TTY_BUF_SIZE - 1;
714
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200715 ldata->echo_overrun = 1;
Joe Petersona88a69c2009-01-02 13:40:53 +0000716 } else {
717 new_byte_pos = tty->echo_pos + tty->echo_cnt;
718 new_byte_pos &= N_TTY_BUF_SIZE - 1;
719 tty->echo_cnt++;
720 }
721
722 tty->echo_buf[new_byte_pos] = c;
723}
724
725/**
726 * echo_move_back_col - add operation to move back a column
727 * @tty: terminal device
728 *
729 * Add an operation to the echo buffer to move back one column.
730 *
731 * Locking: echo_lock to protect the echo buffer
732 */
733
734static void echo_move_back_col(struct tty_struct *tty)
735{
736 mutex_lock(&tty->echo_lock);
737
738 add_echo_byte(ECHO_OP_START, tty);
739 add_echo_byte(ECHO_OP_MOVE_BACK_COL, tty);
740
741 mutex_unlock(&tty->echo_lock);
742}
743
744/**
745 * echo_set_canon_col - add operation to set the canon column
746 * @tty: terminal device
747 *
748 * Add an operation to the echo buffer to set the canon column
749 * to the current column.
750 *
751 * Locking: echo_lock to protect the echo buffer
752 */
753
754static void echo_set_canon_col(struct tty_struct *tty)
755{
756 mutex_lock(&tty->echo_lock);
757
758 add_echo_byte(ECHO_OP_START, tty);
759 add_echo_byte(ECHO_OP_SET_CANON_COL, tty);
760
761 mutex_unlock(&tty->echo_lock);
762}
763
764/**
765 * echo_erase_tab - add operation to erase a tab
766 * @num_chars: number of character columns already used
767 * @after_tab: true if num_chars starts after a previous tab
768 * @tty: terminal device
769 *
770 * Add an operation to the echo buffer to erase a tab.
771 *
772 * Called by the eraser function, which knows how many character
773 * columns have been used since either a previous tab or the start
774 * of input. This information will be used later, along with
775 * canon column (if applicable), to go back the correct number
776 * of columns.
777 *
778 * Locking: echo_lock to protect the echo buffer
779 */
780
781static void echo_erase_tab(unsigned int num_chars, int after_tab,
782 struct tty_struct *tty)
783{
784 mutex_lock(&tty->echo_lock);
785
786 add_echo_byte(ECHO_OP_START, tty);
787 add_echo_byte(ECHO_OP_ERASE_TAB, tty);
788
789 /* We only need to know this modulo 8 (tab spacing) */
790 num_chars &= 7;
791
792 /* Set the high bit as a flag if num_chars is after a previous tab */
793 if (after_tab)
794 num_chars |= 0x80;
Alan Cox300a6202009-01-02 13:41:04 +0000795
Joe Petersona88a69c2009-01-02 13:40:53 +0000796 add_echo_byte(num_chars, tty);
797
798 mutex_unlock(&tty->echo_lock);
799}
800
801/**
802 * echo_char_raw - echo a character raw
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803 * @c: unicode byte to echo
804 * @tty: terminal device
805 *
Alan Cox4edf1822008-02-08 04:18:44 -0800806 * Echo user input back onto the screen. This must be called only when
Linus Torvalds1da177e2005-04-16 15:20:36 -0700807 * L_ECHO(tty) is true. Called from the driver receive_buf path.
Alan Cox17b82062008-10-13 10:45:06 +0100808 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000809 * This variant does not treat control characters specially.
810 *
811 * Locking: echo_lock to protect the echo buffer
812 */
813
814static void echo_char_raw(unsigned char c, struct tty_struct *tty)
815{
816 mutex_lock(&tty->echo_lock);
817
818 if (c == ECHO_OP_START) {
819 add_echo_byte(ECHO_OP_START, tty);
820 add_echo_byte(ECHO_OP_START, tty);
821 } else {
822 add_echo_byte(c, tty);
823 }
824
825 mutex_unlock(&tty->echo_lock);
826}
827
828/**
829 * echo_char - echo a character
830 * @c: unicode byte to echo
831 * @tty: terminal device
832 *
833 * Echo user input back onto the screen. This must be called only when
834 * L_ECHO(tty) is true. Called from the driver receive_buf path.
835 *
Joe Peterson62b26352009-09-09 15:03:47 -0600836 * This variant tags control characters to be echoed as "^X"
837 * (where X is the letter representing the control char).
Joe Petersona88a69c2009-01-02 13:40:53 +0000838 *
839 * Locking: echo_lock to protect the echo buffer
Linus Torvalds1da177e2005-04-16 15:20:36 -0700840 */
841
842static void echo_char(unsigned char c, struct tty_struct *tty)
843{
Joe Petersona88a69c2009-01-02 13:40:53 +0000844 mutex_lock(&tty->echo_lock);
845
846 if (c == ECHO_OP_START) {
847 add_echo_byte(ECHO_OP_START, tty);
848 add_echo_byte(ECHO_OP_START, tty);
849 } else {
Joe Peterson62b26352009-09-09 15:03:47 -0600850 if (L_ECHOCTL(tty) && iscntrl(c) && c != '\t')
Joe Petersona88a69c2009-01-02 13:40:53 +0000851 add_echo_byte(ECHO_OP_START, tty);
852 add_echo_byte(c, tty);
853 }
854
855 mutex_unlock(&tty->echo_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700856}
857
Alan Cox17b82062008-10-13 10:45:06 +0100858/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000859 * finish_erasing - complete erase
Alan Cox17b82062008-10-13 10:45:06 +0100860 * @tty: tty doing the erase
Alan Cox17b82062008-10-13 10:45:06 +0100861 */
Joe Petersona88a69c2009-01-02 13:40:53 +0000862
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863static inline void finish_erasing(struct tty_struct *tty)
864{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200865 struct n_tty_data *ldata = tty->disc_data;
866 if (ldata->erasing) {
Joe Petersona88a69c2009-01-02 13:40:53 +0000867 echo_char_raw('/', tty);
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200868 ldata->erasing = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700869 }
870}
871
872/**
873 * eraser - handle erase function
874 * @c: character input
875 * @tty: terminal device
876 *
Robert P. J. Day3a4fa0a2007-10-19 23:10:43 +0200877 * Perform erase and necessary output when an erase character is
Linus Torvalds1da177e2005-04-16 15:20:36 -0700878 * present in the stream from the driver layer. Handles the complexities
879 * of UTF-8 multibyte symbols.
Alan Cox17b82062008-10-13 10:45:06 +0100880 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000881 * Locking: read_lock for tty buffers
Linus Torvalds1da177e2005-04-16 15:20:36 -0700882 */
Alan Cox4edf1822008-02-08 04:18:44 -0800883
Linus Torvalds1da177e2005-04-16 15:20:36 -0700884static void eraser(unsigned char c, struct tty_struct *tty)
885{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200886 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700887 enum { ERASE, WERASE, KILL } kill_type;
888 int head, seen_alnums, cnt;
889 unsigned long flags;
890
Alan Cox17b82062008-10-13 10:45:06 +0100891 /* FIXME: locking needed ? */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700892 if (tty->read_head == tty->canon_head) {
Joe Peterson7e94b1d2009-01-02 13:43:40 +0000893 /* process_output('\a', tty); */ /* what do you think? */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700894 return;
895 }
896 if (c == ERASE_CHAR(tty))
897 kill_type = ERASE;
898 else if (c == WERASE_CHAR(tty))
899 kill_type = WERASE;
900 else {
901 if (!L_ECHO(tty)) {
902 spin_lock_irqsave(&tty->read_lock, flags);
903 tty->read_cnt -= ((tty->read_head - tty->canon_head) &
904 (N_TTY_BUF_SIZE - 1));
905 tty->read_head = tty->canon_head;
906 spin_unlock_irqrestore(&tty->read_lock, flags);
907 return;
908 }
909 if (!L_ECHOK(tty) || !L_ECHOKE(tty) || !L_ECHOE(tty)) {
910 spin_lock_irqsave(&tty->read_lock, flags);
911 tty->read_cnt -= ((tty->read_head - tty->canon_head) &
912 (N_TTY_BUF_SIZE - 1));
913 tty->read_head = tty->canon_head;
914 spin_unlock_irqrestore(&tty->read_lock, flags);
915 finish_erasing(tty);
916 echo_char(KILL_CHAR(tty), tty);
917 /* Add a newline if ECHOK is on and ECHOKE is off. */
918 if (L_ECHOK(tty))
Joe Petersona88a69c2009-01-02 13:40:53 +0000919 echo_char_raw('\n', tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700920 return;
921 }
922 kill_type = KILL;
923 }
924
925 seen_alnums = 0;
Alan Cox17b82062008-10-13 10:45:06 +0100926 /* FIXME: Locking ?? */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700927 while (tty->read_head != tty->canon_head) {
928 head = tty->read_head;
929
930 /* erase a single possibly multibyte character */
931 do {
932 head = (head - 1) & (N_TTY_BUF_SIZE-1);
933 c = tty->read_buf[head];
934 } while (is_continuation(c, tty) && head != tty->canon_head);
935
936 /* do not partially erase */
937 if (is_continuation(c, tty))
938 break;
939
940 if (kill_type == WERASE) {
941 /* Equivalent to BSD's ALTWERASE. */
942 if (isalnum(c) || c == '_')
943 seen_alnums++;
944 else if (seen_alnums)
945 break;
946 }
947 cnt = (tty->read_head - head) & (N_TTY_BUF_SIZE-1);
948 spin_lock_irqsave(&tty->read_lock, flags);
949 tty->read_head = head;
950 tty->read_cnt -= cnt;
951 spin_unlock_irqrestore(&tty->read_lock, flags);
952 if (L_ECHO(tty)) {
953 if (L_ECHOPRT(tty)) {
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200954 if (!ldata->erasing) {
Joe Petersona88a69c2009-01-02 13:40:53 +0000955 echo_char_raw('\\', tty);
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200956 ldata->erasing = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700957 }
958 /* if cnt > 1, output a multi-byte character */
959 echo_char(c, tty);
960 while (--cnt > 0) {
961 head = (head+1) & (N_TTY_BUF_SIZE-1);
Joe Petersona88a69c2009-01-02 13:40:53 +0000962 echo_char_raw(tty->read_buf[head], tty);
963 echo_move_back_col(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700964 }
965 } else if (kill_type == ERASE && !L_ECHOE(tty)) {
966 echo_char(ERASE_CHAR(tty), tty);
967 } else if (c == '\t') {
Joe Petersona88a69c2009-01-02 13:40:53 +0000968 unsigned int num_chars = 0;
969 int after_tab = 0;
970 unsigned long tail = tty->read_head;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700971
Joe Petersona88a69c2009-01-02 13:40:53 +0000972 /*
973 * Count the columns used for characters
974 * since the start of input or after a
975 * previous tab.
976 * This info is used to go back the correct
977 * number of columns.
978 */
979 while (tail != tty->canon_head) {
980 tail = (tail-1) & (N_TTY_BUF_SIZE-1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700981 c = tty->read_buf[tail];
Joe Petersona88a69c2009-01-02 13:40:53 +0000982 if (c == '\t') {
983 after_tab = 1;
984 break;
Alan Cox300a6202009-01-02 13:41:04 +0000985 } else if (iscntrl(c)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700986 if (L_ECHOCTL(tty))
Joe Petersona88a69c2009-01-02 13:40:53 +0000987 num_chars += 2;
988 } else if (!is_continuation(c, tty)) {
989 num_chars++;
990 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700991 }
Joe Petersona88a69c2009-01-02 13:40:53 +0000992 echo_erase_tab(num_chars, after_tab, tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700993 } else {
994 if (iscntrl(c) && L_ECHOCTL(tty)) {
Joe Petersona88a69c2009-01-02 13:40:53 +0000995 echo_char_raw('\b', tty);
996 echo_char_raw(' ', tty);
997 echo_char_raw('\b', tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700998 }
999 if (!iscntrl(c) || L_ECHOCTL(tty)) {
Joe Petersona88a69c2009-01-02 13:40:53 +00001000 echo_char_raw('\b', tty);
1001 echo_char_raw(' ', tty);
1002 echo_char_raw('\b', tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001003 }
1004 }
1005 }
1006 if (kill_type == ERASE)
1007 break;
1008 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001009 if (tty->read_head == tty->canon_head && L_ECHO(tty))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001010 finish_erasing(tty);
1011}
1012
1013/**
1014 * isig - handle the ISIG optio
1015 * @sig: signal
1016 * @tty: terminal
1017 * @flush: force flush
1018 *
1019 * Called when a signal is being sent due to terminal input. This
1020 * may caus terminal flushing to take place according to the termios
1021 * settings and character used. Called from the driver receive_buf
1022 * path so serialized.
Alan Cox17b82062008-10-13 10:45:06 +01001023 *
1024 * Locking: ctrl_lock, read_lock (both via flush buffer)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001025 */
Alan Cox4edf1822008-02-08 04:18:44 -08001026
Linus Torvalds1da177e2005-04-16 15:20:36 -07001027static inline void isig(int sig, struct tty_struct *tty, int flush)
1028{
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001029 if (tty->pgrp)
1030 kill_pgrp(tty->pgrp, sig, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001031 if (flush || !L_NOFLSH(tty)) {
1032 n_tty_flush_buffer(tty);
Alan Coxf34d7a52008-04-30 00:54:13 -07001033 tty_driver_flush_buffer(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001034 }
1035}
1036
1037/**
1038 * n_tty_receive_break - handle break
1039 * @tty: terminal
1040 *
1041 * An RS232 break event has been hit in the incoming bitstream. This
1042 * can cause a variety of events depending upon the termios settings.
1043 *
1044 * Called from the receive_buf path so single threaded.
1045 */
Alan Cox4edf1822008-02-08 04:18:44 -08001046
Linus Torvalds1da177e2005-04-16 15:20:36 -07001047static inline void n_tty_receive_break(struct tty_struct *tty)
1048{
1049 if (I_IGNBRK(tty))
1050 return;
1051 if (I_BRKINT(tty)) {
1052 isig(SIGINT, tty, 1);
1053 return;
1054 }
1055 if (I_PARMRK(tty)) {
1056 put_tty_queue('\377', tty);
1057 put_tty_queue('\0', tty);
1058 }
1059 put_tty_queue('\0', tty);
1060 wake_up_interruptible(&tty->read_wait);
1061}
1062
1063/**
1064 * n_tty_receive_overrun - handle overrun reporting
1065 * @tty: terminal
1066 *
1067 * Data arrived faster than we could process it. While the tty
1068 * driver has flagged this the bits that were missed are gone
1069 * forever.
1070 *
1071 * Called from the receive_buf path so single threaded. Does not
1072 * need locking as num_overrun and overrun_time are function
1073 * private.
1074 */
Alan Cox4edf1822008-02-08 04:18:44 -08001075
Linus Torvalds1da177e2005-04-16 15:20:36 -07001076static inline void n_tty_receive_overrun(struct tty_struct *tty)
1077{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001078 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001079 char buf[64];
1080
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001081 ldata->num_overrun++;
1082 if (time_after(jiffies, ldata->overrun_time + HZ) ||
1083 time_after(ldata->overrun_time, jiffies)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001084 printk(KERN_WARNING "%s: %d input overrun(s)\n",
1085 tty_name(tty, buf),
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001086 ldata->num_overrun);
1087 ldata->overrun_time = jiffies;
1088 ldata->num_overrun = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001089 }
1090}
1091
1092/**
1093 * n_tty_receive_parity_error - error notifier
1094 * @tty: terminal device
1095 * @c: character
1096 *
1097 * Process a parity error and queue the right data to indicate
Robert P. J. Day3a4fa0a2007-10-19 23:10:43 +02001098 * the error case if necessary. Locking as per n_tty_receive_buf.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001099 */
1100static inline void n_tty_receive_parity_error(struct tty_struct *tty,
1101 unsigned char c)
1102{
Alan Cox4edf1822008-02-08 04:18:44 -08001103 if (I_IGNPAR(tty))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001104 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001105 if (I_PARMRK(tty)) {
1106 put_tty_queue('\377', tty);
1107 put_tty_queue('\0', tty);
1108 put_tty_queue(c, tty);
1109 } else if (I_INPCK(tty))
1110 put_tty_queue('\0', tty);
1111 else
1112 put_tty_queue(c, tty);
1113 wake_up_interruptible(&tty->read_wait);
1114}
1115
1116/**
1117 * n_tty_receive_char - perform processing
1118 * @tty: terminal device
1119 * @c: character
1120 *
1121 * Process an individual character of input received from the driver.
Alan Cox4edf1822008-02-08 04:18:44 -08001122 * This is serialized with respect to itself by the rules for the
Linus Torvalds1da177e2005-04-16 15:20:36 -07001123 * driver above.
1124 */
1125
1126static inline void n_tty_receive_char(struct tty_struct *tty, unsigned char c)
1127{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001128 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001129 unsigned long flags;
Joe Petersonacc71bb2009-01-02 13:43:32 +00001130 int parmrk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001131
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001132 if (ldata->raw) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001133 put_tty_queue(c, tty);
1134 return;
1135 }
Alan Cox4edf1822008-02-08 04:18:44 -08001136
Linus Torvalds1da177e2005-04-16 15:20:36 -07001137 if (I_ISTRIP(tty))
1138 c &= 0x7f;
1139 if (I_IUCLC(tty) && L_IEXTEN(tty))
Alan Cox300a6202009-01-02 13:41:04 +00001140 c = tolower(c);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001141
hyc@symas.com26df6d12010-06-22 10:14:49 -07001142 if (L_EXTPROC(tty)) {
1143 put_tty_queue(c, tty);
1144 return;
1145 }
1146
Joe Peterson54d2a372008-02-06 01:37:59 -08001147 if (tty->stopped && !tty->flow_stopped && I_IXON(tty) &&
Joe Petersona88a69c2009-01-02 13:40:53 +00001148 I_IXANY(tty) && c != START_CHAR(tty) && c != STOP_CHAR(tty) &&
1149 c != INTR_CHAR(tty) && c != QUIT_CHAR(tty) && c != SUSP_CHAR(tty)) {
Joe Peterson54d2a372008-02-06 01:37:59 -08001150 start_tty(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001151 process_echoes(tty);
1152 }
Joe Peterson54d2a372008-02-06 01:37:59 -08001153
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154 if (tty->closing) {
1155 if (I_IXON(tty)) {
Joe Petersona88a69c2009-01-02 13:40:53 +00001156 if (c == START_CHAR(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001157 start_tty(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001158 process_echoes(tty);
Alan Cox300a6202009-01-02 13:41:04 +00001159 } else if (c == STOP_CHAR(tty))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160 stop_tty(tty);
1161 }
1162 return;
1163 }
1164
1165 /*
1166 * If the previous character was LNEXT, or we know that this
1167 * character is not one of the characters that we'll have to
1168 * handle specially, do shortcut processing to speed things
1169 * up.
1170 */
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001171 if (!test_bit(c, ldata->process_char_map) || ldata->lnext) {
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001172 ldata->lnext = 0;
Joe Petersonacc71bb2009-01-02 13:43:32 +00001173 parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0;
1174 if (tty->read_cnt >= (N_TTY_BUF_SIZE - parmrk - 1)) {
1175 /* beep if no space */
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001176 if (L_ECHO(tty))
1177 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001178 return;
1179 }
1180 if (L_ECHO(tty)) {
1181 finish_erasing(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001182 /* Record the column of first canon char. */
1183 if (tty->canon_head == tty->read_head)
Joe Petersona88a69c2009-01-02 13:40:53 +00001184 echo_set_canon_col(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001185 echo_char(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001186 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001187 }
Joe Petersonacc71bb2009-01-02 13:43:32 +00001188 if (parmrk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001189 put_tty_queue(c, tty);
1190 put_tty_queue(c, tty);
1191 return;
1192 }
Alan Cox4edf1822008-02-08 04:18:44 -08001193
Linus Torvalds1da177e2005-04-16 15:20:36 -07001194 if (I_IXON(tty)) {
1195 if (c == START_CHAR(tty)) {
1196 start_tty(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001197 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001198 return;
1199 }
1200 if (c == STOP_CHAR(tty)) {
1201 stop_tty(tty);
1202 return;
1203 }
1204 }
Joe Peterson575537b32008-04-30 00:53:30 -07001205
Linus Torvalds1da177e2005-04-16 15:20:36 -07001206 if (L_ISIG(tty)) {
1207 int signal;
1208 signal = SIGINT;
1209 if (c == INTR_CHAR(tty))
1210 goto send_signal;
1211 signal = SIGQUIT;
1212 if (c == QUIT_CHAR(tty))
1213 goto send_signal;
1214 signal = SIGTSTP;
1215 if (c == SUSP_CHAR(tty)) {
1216send_signal:
Joe Petersonec5b1152008-02-06 01:37:38 -08001217 /*
Joe Petersonec5b1152008-02-06 01:37:38 -08001218 * Note that we do not use isig() here because we want
1219 * the order to be:
1220 * 1) flush, 2) echo, 3) signal
1221 */
1222 if (!L_NOFLSH(tty)) {
1223 n_tty_flush_buffer(tty);
Alan Coxf34d7a52008-04-30 00:54:13 -07001224 tty_driver_flush_buffer(tty);
Joe Petersonec5b1152008-02-06 01:37:38 -08001225 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001226 if (I_IXON(tty))
1227 start_tty(tty);
1228 if (L_ECHO(tty)) {
Joe Petersonec5b1152008-02-06 01:37:38 -08001229 echo_char(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001230 process_echoes(tty);
1231 }
Joe Petersonec5b1152008-02-06 01:37:38 -08001232 if (tty->pgrp)
1233 kill_pgrp(tty->pgrp, signal, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001234 return;
1235 }
1236 }
Joe Peterson575537b32008-04-30 00:53:30 -07001237
1238 if (c == '\r') {
1239 if (I_IGNCR(tty))
1240 return;
1241 if (I_ICRNL(tty))
1242 c = '\n';
1243 } else if (c == '\n' && I_INLCR(tty))
1244 c = '\r';
1245
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001246 if (ldata->icanon) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001247 if (c == ERASE_CHAR(tty) || c == KILL_CHAR(tty) ||
1248 (c == WERASE_CHAR(tty) && L_IEXTEN(tty))) {
1249 eraser(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001250 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001251 return;
1252 }
1253 if (c == LNEXT_CHAR(tty) && L_IEXTEN(tty)) {
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001254 ldata->lnext = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001255 if (L_ECHO(tty)) {
1256 finish_erasing(tty);
1257 if (L_ECHOCTL(tty)) {
Joe Petersona88a69c2009-01-02 13:40:53 +00001258 echo_char_raw('^', tty);
1259 echo_char_raw('\b', tty);
1260 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261 }
1262 }
1263 return;
1264 }
1265 if (c == REPRINT_CHAR(tty) && L_ECHO(tty) &&
1266 L_IEXTEN(tty)) {
1267 unsigned long tail = tty->canon_head;
1268
1269 finish_erasing(tty);
1270 echo_char(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001271 echo_char_raw('\n', tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001272 while (tail != tty->read_head) {
1273 echo_char(tty->read_buf[tail], tty);
1274 tail = (tail+1) & (N_TTY_BUF_SIZE-1);
1275 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001276 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001277 return;
1278 }
1279 if (c == '\n') {
Joe Petersonacc71bb2009-01-02 13:43:32 +00001280 if (tty->read_cnt >= N_TTY_BUF_SIZE) {
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001281 if (L_ECHO(tty))
1282 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001283 return;
1284 }
1285 if (L_ECHO(tty) || L_ECHONL(tty)) {
Joe Petersona88a69c2009-01-02 13:40:53 +00001286 echo_char_raw('\n', tty);
1287 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001288 }
1289 goto handle_newline;
1290 }
1291 if (c == EOF_CHAR(tty)) {
Joe Petersonacc71bb2009-01-02 13:43:32 +00001292 if (tty->read_cnt >= N_TTY_BUF_SIZE)
1293 return;
Alan Cox4edf1822008-02-08 04:18:44 -08001294 if (tty->canon_head != tty->read_head)
1295 set_bit(TTY_PUSH, &tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001296 c = __DISABLED_CHAR;
1297 goto handle_newline;
1298 }
1299 if ((c == EOL_CHAR(tty)) ||
1300 (c == EOL2_CHAR(tty) && L_IEXTEN(tty))) {
Joe Petersonacc71bb2009-01-02 13:43:32 +00001301 parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty))
1302 ? 1 : 0;
1303 if (tty->read_cnt >= (N_TTY_BUF_SIZE - parmrk)) {
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001304 if (L_ECHO(tty))
1305 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001306 return;
1307 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001308 /*
1309 * XXX are EOL_CHAR and EOL2_CHAR echoed?!?
1310 */
1311 if (L_ECHO(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001312 /* Record the column of first canon char. */
1313 if (tty->canon_head == tty->read_head)
Joe Petersona88a69c2009-01-02 13:40:53 +00001314 echo_set_canon_col(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001315 echo_char(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001316 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001317 }
1318 /*
1319 * XXX does PARMRK doubling happen for
1320 * EOL_CHAR and EOL2_CHAR?
1321 */
Joe Petersonacc71bb2009-01-02 13:43:32 +00001322 if (parmrk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001323 put_tty_queue(c, tty);
1324
Alan Cox4edf1822008-02-08 04:18:44 -08001325handle_newline:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001326 spin_lock_irqsave(&tty->read_lock, flags);
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001327 set_bit(tty->read_head, ldata->read_flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001328 put_tty_queue_nolock(c, tty);
1329 tty->canon_head = tty->read_head;
1330 tty->canon_data++;
1331 spin_unlock_irqrestore(&tty->read_lock, flags);
1332 kill_fasync(&tty->fasync, SIGIO, POLL_IN);
1333 if (waitqueue_active(&tty->read_wait))
1334 wake_up_interruptible(&tty->read_wait);
1335 return;
1336 }
1337 }
Alan Cox4edf1822008-02-08 04:18:44 -08001338
Joe Petersonacc71bb2009-01-02 13:43:32 +00001339 parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0;
1340 if (tty->read_cnt >= (N_TTY_BUF_SIZE - parmrk - 1)) {
1341 /* beep if no space */
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001342 if (L_ECHO(tty))
1343 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001344 return;
1345 }
1346 if (L_ECHO(tty)) {
1347 finish_erasing(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001348 if (c == '\n')
Joe Petersona88a69c2009-01-02 13:40:53 +00001349 echo_char_raw('\n', tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001350 else {
1351 /* Record the column of first canon char. */
1352 if (tty->canon_head == tty->read_head)
Joe Petersona88a69c2009-01-02 13:40:53 +00001353 echo_set_canon_col(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001354 echo_char(c, tty);
1355 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001356 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001357 }
1358
Joe Petersonacc71bb2009-01-02 13:43:32 +00001359 if (parmrk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001360 put_tty_queue(c, tty);
1361
1362 put_tty_queue(c, tty);
Alan Cox4edf1822008-02-08 04:18:44 -08001363}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001364
Linus Torvalds1da177e2005-04-16 15:20:36 -07001365
1366/**
1367 * n_tty_write_wakeup - asynchronous I/O notifier
1368 * @tty: tty device
1369 *
1370 * Required for the ptys, serial driver etc. since processes
1371 * that attach themselves to the master and rely on ASYNC
1372 * IO must be woken up
1373 */
1374
1375static void n_tty_write_wakeup(struct tty_struct *tty)
1376{
Thomas Pfaffff8cb0f2009-01-02 13:47:13 +00001377 if (tty->fasync && test_and_clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001378 kill_fasync(&tty->fasync, SIGIO, POLL_OUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001379}
1380
1381/**
1382 * n_tty_receive_buf - data receive
1383 * @tty: terminal device
1384 * @cp: buffer
1385 * @fp: flag buffer
1386 * @count: characters
1387 *
1388 * Called by the terminal driver when a block of characters has
1389 * been received. This function must be called from soft contexts
1390 * not from interrupt context. The driver is responsible for making
1391 * calls one at a time and in order (or using flush_to_ldisc)
1392 */
Alan Cox4edf1822008-02-08 04:18:44 -08001393
Linus Torvalds55db4c62011-06-04 06:33:24 +09001394static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
1395 char *fp, int count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001396{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001397 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001398 const unsigned char *p;
1399 char *f, flags = TTY_NORMAL;
1400 int i;
1401 char buf[64];
1402 unsigned long cpuflags;
1403
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001404 if (ldata->real_raw) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001405 spin_lock_irqsave(&tty->read_lock, cpuflags);
1406 i = min(N_TTY_BUF_SIZE - tty->read_cnt,
1407 N_TTY_BUF_SIZE - tty->read_head);
1408 i = min(count, i);
1409 memcpy(tty->read_buf + tty->read_head, cp, i);
1410 tty->read_head = (tty->read_head + i) & (N_TTY_BUF_SIZE-1);
1411 tty->read_cnt += i;
1412 cp += i;
1413 count -= i;
1414
1415 i = min(N_TTY_BUF_SIZE - tty->read_cnt,
1416 N_TTY_BUF_SIZE - tty->read_head);
1417 i = min(count, i);
1418 memcpy(tty->read_buf + tty->read_head, cp, i);
1419 tty->read_head = (tty->read_head + i) & (N_TTY_BUF_SIZE-1);
1420 tty->read_cnt += i;
1421 spin_unlock_irqrestore(&tty->read_lock, cpuflags);
1422 } else {
Alan Cox4edf1822008-02-08 04:18:44 -08001423 for (i = count, p = cp, f = fp; i; i--, p++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001424 if (f)
1425 flags = *f++;
1426 switch (flags) {
1427 case TTY_NORMAL:
1428 n_tty_receive_char(tty, *p);
1429 break;
1430 case TTY_BREAK:
1431 n_tty_receive_break(tty);
1432 break;
1433 case TTY_PARITY:
1434 case TTY_FRAME:
1435 n_tty_receive_parity_error(tty, *p);
1436 break;
1437 case TTY_OVERRUN:
1438 n_tty_receive_overrun(tty);
1439 break;
1440 default:
Alan Cox4edf1822008-02-08 04:18:44 -08001441 printk(KERN_ERR "%s: unknown flag %d\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001442 tty_name(tty, buf), flags);
1443 break;
1444 }
1445 }
Alan Coxf34d7a52008-04-30 00:54:13 -07001446 if (tty->ops->flush_chars)
1447 tty->ops->flush_chars(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001448 }
1449
Linus Torvalds55db4c62011-06-04 06:33:24 +09001450 n_tty_set_room(tty);
1451
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001452 if ((!ldata->icanon && (tty->read_cnt >= tty->minimum_to_wake)) ||
hyc@symas.com26df6d12010-06-22 10:14:49 -07001453 L_EXTPROC(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001454 kill_fasync(&tty->fasync, SIGIO, POLL_IN);
1455 if (waitqueue_active(&tty->read_wait))
1456 wake_up_interruptible(&tty->read_wait);
1457 }
1458
1459 /*
1460 * Check the remaining room for the input canonicalization
1461 * mode. We don't want to throttle the driver if we're in
1462 * canonical mode and don't have a newline yet!
1463 */
Linus Torvalds55db4c62011-06-04 06:33:24 +09001464 if (tty->receive_room < TTY_THRESHOLD_THROTTLE)
Alan Cox39c2e602008-04-30 00:54:18 -07001465 tty_throttle(tty);
Alan Cox0a44ab42012-06-22 16:40:20 +01001466
1467 /* FIXME: there is a tiny race here if the receive room check runs
1468 before the other work executes and empties the buffer (upping
1469 the receiving room and unthrottling. We then throttle and get
1470 stuck. This has been observed and traced down by Vincent Pillet/
1471 We need to address this when we sort out out the rx path locking */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001472}
1473
1474int is_ignored(int sig)
1475{
1476 return (sigismember(&current->blocked, sig) ||
Alan Cox4edf1822008-02-08 04:18:44 -08001477 current->sighand->action[sig-1].sa.sa_handler == SIG_IGN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001478}
1479
1480/**
1481 * n_tty_set_termios - termios data changed
1482 * @tty: terminal
1483 * @old: previous data
1484 *
1485 * Called by the tty layer when the user changes termios flags so
1486 * that the line discipline can plan ahead. This function cannot sleep
Alan Cox4edf1822008-02-08 04:18:44 -08001487 * and is protected from re-entry by the tty layer. The user is
Linus Torvalds1da177e2005-04-16 15:20:36 -07001488 * guaranteed that this function will not be re-entered or in progress
1489 * when the ldisc is closed.
Alan Cox17b82062008-10-13 10:45:06 +01001490 *
1491 * Locking: Caller holds tty->termios_mutex
Linus Torvalds1da177e2005-04-16 15:20:36 -07001492 */
Alan Cox4edf1822008-02-08 04:18:44 -08001493
1494static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001495{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001496 struct n_tty_data *ldata = tty->disc_data;
Alan Cox47afa7a2008-10-13 10:44:17 +01001497 int canon_change = 1;
Alan Cox47afa7a2008-10-13 10:44:17 +01001498
1499 if (old)
Alan Coxadc8d742012-07-14 15:31:47 +01001500 canon_change = (old->c_lflag ^ tty->termios.c_lflag) & ICANON;
Alan Cox47afa7a2008-10-13 10:44:17 +01001501 if (canon_change) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001502 bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
Alan Cox47afa7a2008-10-13 10:44:17 +01001503 tty->canon_head = tty->read_tail;
1504 tty->canon_data = 0;
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001505 ldata->erasing = 0;
Alan Cox47afa7a2008-10-13 10:44:17 +01001506 }
1507
1508 if (canon_change && !L_ICANON(tty) && tty->read_cnt)
1509 wake_up_interruptible(&tty->read_wait);
Alan Cox4edf1822008-02-08 04:18:44 -08001510
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001511 ldata->icanon = (L_ICANON(tty) != 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001512 if (test_bit(TTY_HW_COOK_IN, &tty->flags)) {
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001513 ldata->raw = 1;
1514 ldata->real_raw = 1;
Linus Torvalds55db4c62011-06-04 06:33:24 +09001515 n_tty_set_room(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001516 return;
1517 }
1518 if (I_ISTRIP(tty) || I_IUCLC(tty) || I_IGNCR(tty) ||
1519 I_ICRNL(tty) || I_INLCR(tty) || L_ICANON(tty) ||
1520 I_IXON(tty) || L_ISIG(tty) || L_ECHO(tty) ||
1521 I_PARMRK(tty)) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001522 bitmap_zero(ldata->process_char_map, 256);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001523
1524 if (I_IGNCR(tty) || I_ICRNL(tty))
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001525 set_bit('\r', ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001526 if (I_INLCR(tty))
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001527 set_bit('\n', ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001528
1529 if (L_ICANON(tty)) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001530 set_bit(ERASE_CHAR(tty), ldata->process_char_map);
1531 set_bit(KILL_CHAR(tty), ldata->process_char_map);
1532 set_bit(EOF_CHAR(tty), ldata->process_char_map);
1533 set_bit('\n', ldata->process_char_map);
1534 set_bit(EOL_CHAR(tty), ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001535 if (L_IEXTEN(tty)) {
1536 set_bit(WERASE_CHAR(tty),
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001537 ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001538 set_bit(LNEXT_CHAR(tty),
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001539 ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001540 set_bit(EOL2_CHAR(tty),
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001541 ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001542 if (L_ECHO(tty))
1543 set_bit(REPRINT_CHAR(tty),
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001544 ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001545 }
1546 }
1547 if (I_IXON(tty)) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001548 set_bit(START_CHAR(tty), ldata->process_char_map);
1549 set_bit(STOP_CHAR(tty), ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001550 }
1551 if (L_ISIG(tty)) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001552 set_bit(INTR_CHAR(tty), ldata->process_char_map);
1553 set_bit(QUIT_CHAR(tty), ldata->process_char_map);
1554 set_bit(SUSP_CHAR(tty), ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001555 }
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001556 clear_bit(__DISABLED_CHAR, ldata->process_char_map);
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001557 ldata->raw = 0;
1558 ldata->real_raw = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001559 } else {
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001560 ldata->raw = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001561 if ((I_IGNBRK(tty) || (!I_BRKINT(tty) && !I_PARMRK(tty))) &&
1562 (I_IGNPAR(tty) || !I_INPCK(tty)) &&
1563 (tty->driver->flags & TTY_DRIVER_REAL_RAW))
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001564 ldata->real_raw = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001565 else
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001566 ldata->real_raw = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001567 }
Linus Torvalds55db4c62011-06-04 06:33:24 +09001568 n_tty_set_room(tty);
Alan Coxf34d7a52008-04-30 00:54:13 -07001569 /* The termios change make the tty ready for I/O */
1570 wake_up_interruptible(&tty->write_wait);
1571 wake_up_interruptible(&tty->read_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001572}
1573
1574/**
1575 * n_tty_close - close the ldisc for this tty
1576 * @tty: device
1577 *
Alan Cox4edf1822008-02-08 04:18:44 -08001578 * Called from the terminal layer when this line discipline is
1579 * being shut down, either because of a close or becsuse of a
Linus Torvalds1da177e2005-04-16 15:20:36 -07001580 * discipline change. The function will not be called while other
1581 * ldisc methods are in progress.
1582 */
Alan Cox4edf1822008-02-08 04:18:44 -08001583
Linus Torvalds1da177e2005-04-16 15:20:36 -07001584static void n_tty_close(struct tty_struct *tty)
1585{
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001586 struct n_tty_data *ldata = tty->disc_data;
1587
Linus Torvalds1da177e2005-04-16 15:20:36 -07001588 n_tty_flush_buffer(tty);
Jiri Slabyb91939f2012-10-18 22:26:35 +02001589 kfree(tty->read_buf);
1590 kfree(tty->echo_buf);
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001591 kfree(ldata);
Jiri Slabyb91939f2012-10-18 22:26:35 +02001592 tty->read_buf = NULL;
1593 tty->echo_buf = NULL;
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001594 tty->disc_data = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001595}
1596
1597/**
1598 * n_tty_open - open an ldisc
1599 * @tty: terminal to open
1600 *
Alan Cox4edf1822008-02-08 04:18:44 -08001601 * Called when this line discipline is being attached to the
Linus Torvalds1da177e2005-04-16 15:20:36 -07001602 * terminal device. Can sleep. Called serialized so that no
1603 * other events will occur in parallel. No further open will occur
1604 * until a close.
1605 */
1606
1607static int n_tty_open(struct tty_struct *tty)
1608{
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001609 struct n_tty_data *ldata;
1610
1611 ldata = kzalloc(sizeof(*ldata), GFP_KERNEL);
1612 if (!ldata)
1613 goto err;
1614
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001615 ldata->overrun_time = jiffies;
1616
Joe Petersona88a69c2009-01-02 13:40:53 +00001617 /* These are ugly. Currently a malloc failure here can panic */
Jiri Slabyb91939f2012-10-18 22:26:35 +02001618 tty->read_buf = kzalloc(N_TTY_BUF_SIZE, GFP_KERNEL);
1619 tty->echo_buf = kzalloc(N_TTY_BUF_SIZE, GFP_KERNEL);
1620 if (!tty->read_buf || !tty->echo_buf)
1621 goto err_free_bufs;
Alan Cox0b4068a2009-06-11 13:05:49 +01001622
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001623 tty->disc_data = ldata;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001624 reset_buffer_flags(tty);
Andrew McGregor7b292b42011-06-13 11:31:31 +12001625 tty_unthrottle(tty);
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001626 ldata->column = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001627 n_tty_set_termios(tty, NULL);
1628 tty->minimum_to_wake = 1;
1629 tty->closing = 0;
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001630
Linus Torvalds1da177e2005-04-16 15:20:36 -07001631 return 0;
Jiri Slabyb91939f2012-10-18 22:26:35 +02001632err_free_bufs:
1633 kfree(tty->read_buf);
1634 kfree(tty->echo_buf);
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001635 kfree(ldata);
1636err:
Jiri Slabyb91939f2012-10-18 22:26:35 +02001637 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001638}
1639
1640static inline int input_available_p(struct tty_struct *tty, int amt)
1641{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001642 struct n_tty_data *ldata = tty->disc_data;
1643
OGAWA Hirofumie043e422009-07-29 12:15:56 -07001644 tty_flush_to_ldisc(tty);
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001645 if (ldata->icanon && !L_EXTPROC(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001646 if (tty->canon_data)
1647 return 1;
1648 } else if (tty->read_cnt >= (amt ? amt : 1))
1649 return 1;
1650
1651 return 0;
1652}
1653
1654/**
Thorsten Wißmannbbd20752011-12-08 17:47:33 +01001655 * copy_from_read_buf - copy read data directly
Linus Torvalds1da177e2005-04-16 15:20:36 -07001656 * @tty: terminal device
1657 * @b: user data
1658 * @nr: size of data
1659 *
Alan Cox11a96d12008-10-13 10:46:24 +01001660 * Helper function to speed up n_tty_read. It is only called when
Linus Torvalds1da177e2005-04-16 15:20:36 -07001661 * ICANON is off; it copies characters straight from the tty queue to
1662 * user space directly. It can be profitably called twice; once to
1663 * drain the space from the tail pointer to the (physical) end of the
1664 * buffer, and once to drain the space from the (physical) beginning of
1665 * the buffer to head pointer.
1666 *
Paul Fulghum817d6d32006-06-28 04:26:47 -07001667 * Called under the tty->atomic_read_lock sem
Linus Torvalds1da177e2005-04-16 15:20:36 -07001668 *
1669 */
Alan Cox4edf1822008-02-08 04:18:44 -08001670
Alan Cox33f0f882006-01-09 20:54:13 -08001671static int copy_from_read_buf(struct tty_struct *tty,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001672 unsigned char __user **b,
1673 size_t *nr)
1674
1675{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001676 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001677 int retval;
1678 size_t n;
1679 unsigned long flags;
Jiri Slaby3fa10cc2012-04-26 20:13:00 +02001680 bool is_eof;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001681
1682 retval = 0;
1683 spin_lock_irqsave(&tty->read_lock, flags);
1684 n = min(tty->read_cnt, N_TTY_BUF_SIZE - tty->read_tail);
1685 n = min(*nr, n);
1686 spin_unlock_irqrestore(&tty->read_lock, flags);
1687 if (n) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001688 retval = copy_to_user(*b, &tty->read_buf[tty->read_tail], n);
1689 n -= retval;
Jiri Slaby3fa10cc2012-04-26 20:13:00 +02001690 is_eof = n == 1 &&
1691 tty->read_buf[tty->read_tail] == EOF_CHAR(tty);
Jiri Slaby6c633f22012-10-18 22:26:37 +02001692 tty_audit_add_data(tty, &tty->read_buf[tty->read_tail], n,
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001693 ldata->icanon);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001694 spin_lock_irqsave(&tty->read_lock, flags);
1695 tty->read_tail = (tty->read_tail + n) & (N_TTY_BUF_SIZE-1);
1696 tty->read_cnt -= n;
hyc@symas.com26df6d12010-06-22 10:14:49 -07001697 /* Turn single EOF into zero-length read */
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001698 if (L_EXTPROC(tty) && ldata->icanon && is_eof && !tty->read_cnt)
Jiri Slaby3fa10cc2012-04-26 20:13:00 +02001699 n = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001700 spin_unlock_irqrestore(&tty->read_lock, flags);
1701 *b += n;
1702 *nr -= n;
1703 }
1704 return retval;
1705}
1706
Al Virocc4191d2008-03-29 03:08:48 +00001707extern ssize_t redirected_tty_write(struct file *, const char __user *,
Alan Cox4edf1822008-02-08 04:18:44 -08001708 size_t, loff_t *);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001709
1710/**
1711 * job_control - check job control
1712 * @tty: tty
1713 * @file: file handle
1714 *
1715 * Perform job control management checks on this file/tty descriptor
Alan Cox4edf1822008-02-08 04:18:44 -08001716 * and if appropriate send any needed signals and return a negative
Linus Torvalds1da177e2005-04-16 15:20:36 -07001717 * error code if action should be taken.
Alan Cox04f378b2008-04-30 00:53:29 -07001718 *
1719 * FIXME:
1720 * Locking: None - redirected write test is safe, testing
1721 * current->signal should possibly lock current->sighand
1722 * pgrp locking ?
Linus Torvalds1da177e2005-04-16 15:20:36 -07001723 */
Alan Cox4edf1822008-02-08 04:18:44 -08001724
Linus Torvalds1da177e2005-04-16 15:20:36 -07001725static int job_control(struct tty_struct *tty, struct file *file)
1726{
1727 /* Job control check -- must be done at start and after
1728 every sleep (POSIX.1 7.1.1.4). */
1729 /* NOTE: not yet done after every sleep pending a thorough
1730 check of the logic of this change. -- jlc */
1731 /* don't stop on /dev/console */
1732 if (file->f_op->write != redirected_tty_write &&
1733 current->signal->tty == tty) {
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001734 if (!tty->pgrp)
Alan Cox11a96d12008-10-13 10:46:24 +01001735 printk(KERN_ERR "n_tty_read: no tty->pgrp!\n");
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001736 else if (task_pgrp(current) != tty->pgrp) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001737 if (is_ignored(SIGTTIN) ||
Eric W. Biederman3e7cd6c2007-02-12 00:52:58 -08001738 is_current_pgrp_orphaned())
Linus Torvalds1da177e2005-04-16 15:20:36 -07001739 return -EIO;
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001740 kill_pgrp(task_pgrp(current), SIGTTIN, 1);
Oleg Nesterov040b6362007-06-01 00:46:53 -07001741 set_thread_flag(TIF_SIGPENDING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001742 return -ERESTARTSYS;
1743 }
1744 }
1745 return 0;
1746}
Alan Cox4edf1822008-02-08 04:18:44 -08001747
Linus Torvalds1da177e2005-04-16 15:20:36 -07001748
1749/**
Alan Cox11a96d12008-10-13 10:46:24 +01001750 * n_tty_read - read function for tty
Linus Torvalds1da177e2005-04-16 15:20:36 -07001751 * @tty: tty device
1752 * @file: file object
1753 * @buf: userspace buffer pointer
1754 * @nr: size of I/O
1755 *
1756 * Perform reads for the line discipline. We are guaranteed that the
1757 * line discipline will not be closed under us but we may get multiple
1758 * parallel readers and must handle this ourselves. We may also get
1759 * a hangup. Always called in user context, may sleep.
1760 *
1761 * This code must be sure never to sleep through a hangup.
1762 */
Alan Cox4edf1822008-02-08 04:18:44 -08001763
Alan Cox11a96d12008-10-13 10:46:24 +01001764static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001765 unsigned char __user *buf, size_t nr)
1766{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001767 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001768 unsigned char __user *b = buf;
1769 DECLARE_WAITQUEUE(wait, current);
1770 int c;
1771 int minimum, time;
1772 ssize_t retval = 0;
1773 ssize_t size;
1774 long timeout;
1775 unsigned long flags;
Alan Cox04f378b2008-04-30 00:53:29 -07001776 int packet;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001777
1778do_it_again:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001779 c = job_control(tty, file);
Alan Cox4edf1822008-02-08 04:18:44 -08001780 if (c < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001781 return c;
Alan Cox4edf1822008-02-08 04:18:44 -08001782
Linus Torvalds1da177e2005-04-16 15:20:36 -07001783 minimum = time = 0;
1784 timeout = MAX_SCHEDULE_TIMEOUT;
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001785 if (!ldata->icanon) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001786 time = (HZ / 10) * TIME_CHAR(tty);
1787 minimum = MIN_CHAR(tty);
1788 if (minimum) {
1789 if (time)
1790 tty->minimum_to_wake = 1;
1791 else if (!waitqueue_active(&tty->read_wait) ||
1792 (tty->minimum_to_wake > minimum))
1793 tty->minimum_to_wake = minimum;
1794 } else {
1795 timeout = 0;
1796 if (time) {
1797 timeout = time;
1798 time = 0;
1799 }
1800 tty->minimum_to_wake = minimum = 1;
1801 }
1802 }
1803
1804 /*
1805 * Internal serialization of reads.
1806 */
1807 if (file->f_flags & O_NONBLOCK) {
Ingo Molnar70522e12006-03-23 03:00:31 -08001808 if (!mutex_trylock(&tty->atomic_read_lock))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001809 return -EAGAIN;
Alan Cox4edf1822008-02-08 04:18:44 -08001810 } else {
Ingo Molnar70522e12006-03-23 03:00:31 -08001811 if (mutex_lock_interruptible(&tty->atomic_read_lock))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001812 return -ERESTARTSYS;
1813 }
Alan Cox04f378b2008-04-30 00:53:29 -07001814 packet = tty->packet;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001815
1816 add_wait_queue(&tty->read_wait, &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001817 while (nr) {
1818 /* First test for status change. */
Alan Cox04f378b2008-04-30 00:53:29 -07001819 if (packet && tty->link->ctrl_status) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001820 unsigned char cs;
1821 if (b != buf)
1822 break;
Alan Cox04f378b2008-04-30 00:53:29 -07001823 spin_lock_irqsave(&tty->link->ctrl_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001824 cs = tty->link->ctrl_status;
1825 tty->link->ctrl_status = 0;
Alan Cox04f378b2008-04-30 00:53:29 -07001826 spin_unlock_irqrestore(&tty->link->ctrl_lock, flags);
Miloslav Trmac522ed772007-07-15 23:40:56 -07001827 if (tty_put_user(tty, cs, b++)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001828 retval = -EFAULT;
1829 b--;
1830 break;
1831 }
1832 nr--;
1833 break;
1834 }
1835 /* This statement must be first before checking for input
1836 so that any interrupt will set the state back to
1837 TASK_RUNNING. */
1838 set_current_state(TASK_INTERRUPTIBLE);
Alan Cox4edf1822008-02-08 04:18:44 -08001839
Linus Torvalds1da177e2005-04-16 15:20:36 -07001840 if (((minimum - (b - buf)) < tty->minimum_to_wake) &&
1841 ((minimum - (b - buf)) >= 1))
1842 tty->minimum_to_wake = (minimum - (b - buf));
Alan Cox4edf1822008-02-08 04:18:44 -08001843
Linus Torvalds1da177e2005-04-16 15:20:36 -07001844 if (!input_available_p(tty, 0)) {
1845 if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) {
1846 retval = -EIO;
1847 break;
1848 }
1849 if (tty_hung_up_p(file))
1850 break;
1851 if (!timeout)
1852 break;
1853 if (file->f_flags & O_NONBLOCK) {
1854 retval = -EAGAIN;
1855 break;
1856 }
1857 if (signal_pending(current)) {
1858 retval = -ERESTARTSYS;
1859 break;
1860 }
Linus Torvalds55db4c62011-06-04 06:33:24 +09001861 /* FIXME: does n_tty_set_room need locking ? */
1862 n_tty_set_room(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001863 timeout = schedule_timeout(timeout);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001864 continue;
1865 }
1866 __set_current_state(TASK_RUNNING);
1867
1868 /* Deal with packet mode. */
Alan Cox04f378b2008-04-30 00:53:29 -07001869 if (packet && b == buf) {
Miloslav Trmac522ed772007-07-15 23:40:56 -07001870 if (tty_put_user(tty, TIOCPKT_DATA, b++)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001871 retval = -EFAULT;
1872 b--;
1873 break;
1874 }
1875 nr--;
1876 }
1877
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001878 if (ldata->icanon && !L_EXTPROC(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001879 /* N.B. avoid overrun if nr == 0 */
Stanislav Kozina00aaae02012-08-09 14:48:58 +01001880 spin_lock_irqsave(&tty->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001881 while (nr && tty->read_cnt) {
Alan Cox4edf1822008-02-08 04:18:44 -08001882 int eol;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001883
1884 eol = test_and_clear_bit(tty->read_tail,
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001885 ldata->read_flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001886 c = tty->read_buf[tty->read_tail];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001887 tty->read_tail = ((tty->read_tail+1) &
1888 (N_TTY_BUF_SIZE-1));
1889 tty->read_cnt--;
1890 if (eol) {
1891 /* this test should be redundant:
1892 * we shouldn't be reading data if
1893 * canon_data is 0
1894 */
1895 if (--tty->canon_data < 0)
1896 tty->canon_data = 0;
1897 }
1898 spin_unlock_irqrestore(&tty->read_lock, flags);
1899
1900 if (!eol || (c != __DISABLED_CHAR)) {
Miloslav Trmac522ed772007-07-15 23:40:56 -07001901 if (tty_put_user(tty, c, b++)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001902 retval = -EFAULT;
1903 b--;
Stanislav Kozina00aaae02012-08-09 14:48:58 +01001904 spin_lock_irqsave(&tty->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001905 break;
1906 }
1907 nr--;
1908 }
Miloslav Trmac522ed772007-07-15 23:40:56 -07001909 if (eol) {
1910 tty_audit_push(tty);
Stanislav Kozina00aaae02012-08-09 14:48:58 +01001911 spin_lock_irqsave(&tty->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001912 break;
Miloslav Trmac522ed772007-07-15 23:40:56 -07001913 }
Stanislav Kozina00aaae02012-08-09 14:48:58 +01001914 spin_lock_irqsave(&tty->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001915 }
Stanislav Kozina00aaae02012-08-09 14:48:58 +01001916 spin_unlock_irqrestore(&tty->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001917 if (retval)
1918 break;
1919 } else {
1920 int uncopied;
Alan Cox04f378b2008-04-30 00:53:29 -07001921 /* The copy function takes the read lock and handles
1922 locking internally for this case */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001923 uncopied = copy_from_read_buf(tty, &b, &nr);
1924 uncopied += copy_from_read_buf(tty, &b, &nr);
1925 if (uncopied) {
1926 retval = -EFAULT;
1927 break;
1928 }
1929 }
1930
1931 /* If there is enough space in the read buffer now, let the
1932 * low-level driver know. We use n_tty_chars_in_buffer() to
1933 * check the buffer, as it now knows about canonical mode.
1934 * Otherwise, if the driver is throttled and the line is
1935 * longer than TTY_THRESHOLD_UNTHROTTLE in canonical mode,
1936 * we won't get any more characters.
1937 */
Linus Torvalds55db4c62011-06-04 06:33:24 +09001938 if (n_tty_chars_in_buffer(tty) <= TTY_THRESHOLD_UNTHROTTLE) {
1939 n_tty_set_room(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001940 check_unthrottle(tty);
Linus Torvalds55db4c62011-06-04 06:33:24 +09001941 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001942
1943 if (b - buf >= minimum)
1944 break;
1945 if (time)
1946 timeout = time;
1947 }
Ingo Molnar70522e12006-03-23 03:00:31 -08001948 mutex_unlock(&tty->atomic_read_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001949 remove_wait_queue(&tty->read_wait, &wait);
1950
1951 if (!waitqueue_active(&tty->read_wait))
1952 tty->minimum_to_wake = minimum;
1953
1954 __set_current_state(TASK_RUNNING);
1955 size = b - buf;
1956 if (size) {
1957 retval = size;
1958 if (nr)
Alan Cox4edf1822008-02-08 04:18:44 -08001959 clear_bit(TTY_PUSH, &tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001960 } else if (test_and_clear_bit(TTY_PUSH, &tty->flags))
Thorsten Wißmannbbd20752011-12-08 17:47:33 +01001961 goto do_it_again;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001962
Linus Torvalds55db4c62011-06-04 06:33:24 +09001963 n_tty_set_room(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001964 return retval;
1965}
1966
1967/**
Alan Cox11a96d12008-10-13 10:46:24 +01001968 * n_tty_write - write function for tty
Linus Torvalds1da177e2005-04-16 15:20:36 -07001969 * @tty: tty device
1970 * @file: file object
1971 * @buf: userspace buffer pointer
1972 * @nr: size of I/O
1973 *
Joe Petersona88a69c2009-01-02 13:40:53 +00001974 * Write function of the terminal device. This is serialized with
Linus Torvalds1da177e2005-04-16 15:20:36 -07001975 * respect to other write callers but not to termios changes, reads
Joe Petersona88a69c2009-01-02 13:40:53 +00001976 * and other such events. Since the receive code will echo characters,
1977 * thus calling driver write methods, the output_lock is used in
1978 * the output processing functions called here as well as in the
1979 * echo processing function to protect the column state and space
1980 * left in the buffer.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001981 *
1982 * This code must be sure never to sleep through a hangup.
Joe Petersona88a69c2009-01-02 13:40:53 +00001983 *
1984 * Locking: output_lock to protect column state and space left
1985 * (note that the process_output*() functions take this
1986 * lock themselves)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001987 */
Alan Cox4edf1822008-02-08 04:18:44 -08001988
Alan Cox11a96d12008-10-13 10:46:24 +01001989static ssize_t n_tty_write(struct tty_struct *tty, struct file *file,
Joe Petersona88a69c2009-01-02 13:40:53 +00001990 const unsigned char *buf, size_t nr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001991{
1992 const unsigned char *b = buf;
1993 DECLARE_WAITQUEUE(wait, current);
1994 int c;
1995 ssize_t retval = 0;
1996
1997 /* Job control check -- must be done at start (POSIX.1 7.1.1.4). */
1998 if (L_TOSTOP(tty) && file->f_op->write != redirected_tty_write) {
1999 retval = tty_check_change(tty);
2000 if (retval)
2001 return retval;
2002 }
2003
Joe Petersona88a69c2009-01-02 13:40:53 +00002004 /* Write out any echoed characters that are still pending */
2005 process_echoes(tty);
Alan Cox300a6202009-01-02 13:41:04 +00002006
Linus Torvalds1da177e2005-04-16 15:20:36 -07002007 add_wait_queue(&tty->write_wait, &wait);
2008 while (1) {
2009 set_current_state(TASK_INTERRUPTIBLE);
2010 if (signal_pending(current)) {
2011 retval = -ERESTARTSYS;
2012 break;
2013 }
2014 if (tty_hung_up_p(file) || (tty->link && !tty->link->count)) {
2015 retval = -EIO;
2016 break;
2017 }
2018 if (O_OPOST(tty) && !(test_bit(TTY_HW_COOK_OUT, &tty->flags))) {
2019 while (nr > 0) {
Joe Petersona88a69c2009-01-02 13:40:53 +00002020 ssize_t num = process_output_block(tty, b, nr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002021 if (num < 0) {
2022 if (num == -EAGAIN)
2023 break;
2024 retval = num;
2025 goto break_out;
2026 }
2027 b += num;
2028 nr -= num;
2029 if (nr == 0)
2030 break;
2031 c = *b;
Joe Petersona88a69c2009-01-02 13:40:53 +00002032 if (process_output(c, tty) < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002033 break;
2034 b++; nr--;
2035 }
Alan Coxf34d7a52008-04-30 00:54:13 -07002036 if (tty->ops->flush_chars)
2037 tty->ops->flush_chars(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002038 } else {
Roman Zippeld6afe272005-07-07 17:56:55 -07002039 while (nr > 0) {
Alan Coxf34d7a52008-04-30 00:54:13 -07002040 c = tty->ops->write(tty, b, nr);
Roman Zippeld6afe272005-07-07 17:56:55 -07002041 if (c < 0) {
2042 retval = c;
2043 goto break_out;
2044 }
2045 if (!c)
2046 break;
2047 b += c;
2048 nr -= c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002049 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002050 }
2051 if (!nr)
2052 break;
2053 if (file->f_flags & O_NONBLOCK) {
2054 retval = -EAGAIN;
2055 break;
2056 }
2057 schedule();
2058 }
2059break_out:
2060 __set_current_state(TASK_RUNNING);
2061 remove_wait_queue(&tty->write_wait, &wait);
Thomas Pfaffff8cb0f2009-01-02 13:47:13 +00002062 if (b - buf != nr && tty->fasync)
2063 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002064 return (b - buf) ? b - buf : retval;
2065}
2066
2067/**
Alan Cox11a96d12008-10-13 10:46:24 +01002068 * n_tty_poll - poll method for N_TTY
Linus Torvalds1da177e2005-04-16 15:20:36 -07002069 * @tty: terminal device
2070 * @file: file accessing it
2071 * @wait: poll table
2072 *
2073 * Called when the line discipline is asked to poll() for data or
2074 * for special events. This code is not serialized with respect to
2075 * other events save open/close.
2076 *
2077 * This code must be sure never to sleep through a hangup.
2078 * Called without the kernel lock held - fine
Linus Torvalds1da177e2005-04-16 15:20:36 -07002079 */
Alan Cox4edf1822008-02-08 04:18:44 -08002080
Alan Cox11a96d12008-10-13 10:46:24 +01002081static unsigned int n_tty_poll(struct tty_struct *tty, struct file *file,
Alan Cox4edf1822008-02-08 04:18:44 -08002082 poll_table *wait)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002083{
2084 unsigned int mask = 0;
2085
2086 poll_wait(file, &tty->read_wait, wait);
2087 poll_wait(file, &tty->write_wait, wait);
2088 if (input_available_p(tty, TIME_CHAR(tty) ? 0 : MIN_CHAR(tty)))
2089 mask |= POLLIN | POLLRDNORM;
2090 if (tty->packet && tty->link->ctrl_status)
2091 mask |= POLLPRI | POLLIN | POLLRDNORM;
2092 if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
2093 mask |= POLLHUP;
2094 if (tty_hung_up_p(file))
2095 mask |= POLLHUP;
2096 if (!(mask & (POLLHUP | POLLIN | POLLRDNORM))) {
2097 if (MIN_CHAR(tty) && !TIME_CHAR(tty))
2098 tty->minimum_to_wake = MIN_CHAR(tty);
2099 else
2100 tty->minimum_to_wake = 1;
2101 }
Alan Coxf34d7a52008-04-30 00:54:13 -07002102 if (tty->ops->write && !tty_is_writelocked(tty) &&
2103 tty_chars_in_buffer(tty) < WAKEUP_CHARS &&
2104 tty_write_room(tty) > 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002105 mask |= POLLOUT | POLLWRNORM;
2106 return mask;
2107}
2108
Alan Cox47afa7a2008-10-13 10:44:17 +01002109static unsigned long inq_canon(struct tty_struct *tty)
2110{
Jiri Slaby3fe780b2012-10-18 22:26:40 +02002111 struct n_tty_data *ldata = tty->disc_data;
Alan Cox47afa7a2008-10-13 10:44:17 +01002112 int nr, head, tail;
2113
Alan Cox17b82062008-10-13 10:45:06 +01002114 if (!tty->canon_data)
Alan Cox47afa7a2008-10-13 10:44:17 +01002115 return 0;
2116 head = tty->canon_head;
2117 tail = tty->read_tail;
2118 nr = (head - tail) & (N_TTY_BUF_SIZE-1);
2119 /* Skip EOF-chars.. */
2120 while (head != tail) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02002121 if (test_bit(tail, ldata->read_flags) &&
Alan Cox47afa7a2008-10-13 10:44:17 +01002122 tty->read_buf[tail] == __DISABLED_CHAR)
2123 nr--;
2124 tail = (tail+1) & (N_TTY_BUF_SIZE-1);
2125 }
2126 return nr;
2127}
2128
2129static int n_tty_ioctl(struct tty_struct *tty, struct file *file,
2130 unsigned int cmd, unsigned long arg)
2131{
2132 int retval;
2133
2134 switch (cmd) {
2135 case TIOCOUTQ:
2136 return put_user(tty_chars_in_buffer(tty), (int __user *) arg);
2137 case TIOCINQ:
Alan Cox17b82062008-10-13 10:45:06 +01002138 /* FIXME: Locking */
Alan Cox47afa7a2008-10-13 10:44:17 +01002139 retval = tty->read_cnt;
2140 if (L_ICANON(tty))
2141 retval = inq_canon(tty);
2142 return put_user(retval, (unsigned int __user *) arg);
2143 default:
2144 return n_tty_ioctl_helper(tty, file, cmd, arg);
2145 }
2146}
2147
Alan Coxa352def2008-07-16 21:53:12 +01002148struct tty_ldisc_ops tty_ldisc_N_TTY = {
Paul Fulghume10cc1d2007-05-10 22:22:50 -07002149 .magic = TTY_LDISC_MAGIC,
2150 .name = "n_tty",
2151 .open = n_tty_open,
2152 .close = n_tty_close,
2153 .flush_buffer = n_tty_flush_buffer,
2154 .chars_in_buffer = n_tty_chars_in_buffer,
Alan Cox11a96d12008-10-13 10:46:24 +01002155 .read = n_tty_read,
2156 .write = n_tty_write,
Paul Fulghume10cc1d2007-05-10 22:22:50 -07002157 .ioctl = n_tty_ioctl,
2158 .set_termios = n_tty_set_termios,
Alan Cox11a96d12008-10-13 10:46:24 +01002159 .poll = n_tty_poll,
Paul Fulghume10cc1d2007-05-10 22:22:50 -07002160 .receive_buf = n_tty_receive_buf,
2161 .write_wakeup = n_tty_write_wakeup
Linus Torvalds1da177e2005-04-16 15:20:36 -07002162};
Rodolfo Giometti572b9ad2010-03-10 15:23:46 -08002163
2164/**
2165 * n_tty_inherit_ops - inherit N_TTY methods
2166 * @ops: struct tty_ldisc_ops where to save N_TTY methods
2167 *
2168 * Used by a generic struct tty_ldisc_ops to easily inherit N_TTY
2169 * methods.
2170 */
2171
2172void n_tty_inherit_ops(struct tty_ldisc_ops *ops)
2173{
2174 *ops = tty_ldisc_N_TTY;
2175 ops->owner = NULL;
2176 ops->refcount = ops->flags = 0;
2177}
2178EXPORT_SYMBOL_GPL(n_tty_inherit_ops);