blob: 9e13c804ae723e29e92912e0f1a6d2e80c7e2721 [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>
George Spelvin593fb1ae42013-02-12 02:00:43 -050052#include <linux/ratelimit.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070053
Linus Torvalds1da177e2005-04-16 15:20:36 -070054
55/* number of characters left in xmit buffer before select has we have room */
56#define WAKEUP_CHARS 256
57
58/*
59 * This defines the low- and high-watermarks for throttling and
60 * unthrottling the TTY driver. These watermarks are used for
61 * controlling the space in the read buffer.
62 */
63#define TTY_THRESHOLD_THROTTLE 128 /* now based on remaining room */
Thorsten Wißmannbbd20752011-12-08 17:47:33 +010064#define TTY_THRESHOLD_UNTHROTTLE 128
Linus Torvalds1da177e2005-04-16 15:20:36 -070065
Joe Petersona88a69c2009-01-02 13:40:53 +000066/*
67 * Special byte codes used in the echo buffer to represent operations
68 * or special handling of characters. Bytes in the echo buffer that
69 * are not part of such special blocks are treated as normal character
70 * codes.
71 */
72#define ECHO_OP_START 0xff
73#define ECHO_OP_MOVE_BACK_COL 0x80
74#define ECHO_OP_SET_CANON_COL 0x81
75#define ECHO_OP_ERASE_TAB 0x82
76
Peter Hurley32f13522013-06-15 09:14:17 -040077#undef N_TTY_TRACE
78#ifdef N_TTY_TRACE
79# define n_tty_trace(f, args...) trace_printk(f, ##args)
80#else
81# define n_tty_trace(f, args...)
82#endif
83
Jiri Slaby70ece7a2012-10-18 22:26:38 +020084struct n_tty_data {
Peter Hurleyfb7aa032013-06-15 09:14:30 -040085 /* producer-published */
86 size_t read_head;
87 size_t canon_head;
88 DECLARE_BITMAP(process_char_map, 256);
89
90 /* private to n_tty_receive_overrun (single-threaded) */
Jiri Slaby53c5ee22012-10-18 22:26:39 +020091 unsigned long overrun_time;
92 int num_overrun;
93
Peter Hurley24a89d12013-06-15 09:14:15 -040094 /* non-atomic */
95 bool no_room;
96
Peter Hurleyfb7aa032013-06-15 09:14:30 -040097 /* must hold exclusive termios_rwsem to reset these */
Jiri Slaby53c5ee22012-10-18 22:26:39 +020098 unsigned char lnext:1, erasing:1, raw:1, real_raw:1, icanon:1;
99 unsigned char echo_overrun:1;
Jiri Slaby3fe780b2012-10-18 22:26:40 +0200100
Peter Hurleyfb7aa032013-06-15 09:14:30 -0400101 /* shared by producer and consumer */
102 char *read_buf;
Jiri Slaby3fe780b2012-10-18 22:26:40 +0200103 DECLARE_BITMAP(read_flags, N_TTY_BUF_SIZE);
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200104
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -0400105 int minimum_to_wake;
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200106
Peter Hurleyfb7aa032013-06-15 09:14:30 -0400107 /* consumer-published */
108 size_t read_tail;
109
110 /* protected by echo_lock */
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200111 unsigned char *echo_buf;
112 unsigned int echo_pos;
113 unsigned int echo_cnt;
114
Peter Hurleyfb7aa032013-06-15 09:14:30 -0400115 /* protected by output lock */
116 unsigned int column;
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200117 unsigned int canon_column;
Jiri Slabybddc7152012-10-18 22:26:42 +0200118
119 struct mutex atomic_read_lock;
120 struct mutex output_lock;
121 struct mutex echo_lock;
Jiri Slaby70ece7a2012-10-18 22:26:38 +0200122};
123
Peter Hurleyce741172013-06-15 09:14:20 -0400124static inline size_t read_cnt(struct n_tty_data *ldata)
125{
Peter Hurleya2f73be2013-06-15 09:14:22 -0400126 return ldata->read_head - ldata->read_tail;
Peter Hurleyce741172013-06-15 09:14:20 -0400127}
128
Peter Hurleybc5a5e32013-06-15 09:14:21 -0400129static inline unsigned char read_buf(struct n_tty_data *ldata, size_t i)
130{
131 return ldata->read_buf[i & (N_TTY_BUF_SIZE - 1)];
132}
133
134static inline unsigned char *read_buf_addr(struct n_tty_data *ldata, size_t i)
135{
136 return &ldata->read_buf[i & (N_TTY_BUF_SIZE - 1)];
137}
138
Miloslav Trmac522ed772007-07-15 23:40:56 -0700139static inline int tty_put_user(struct tty_struct *tty, unsigned char x,
140 unsigned char __user *ptr)
141{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200142 struct n_tty_data *ldata = tty->disc_data;
143
144 tty_audit_add_data(tty, &x, 1, ldata->icanon);
Miloslav Trmac522ed772007-07-15 23:40:56 -0700145 return put_user(x, ptr);
146}
147
Peter Hurley24a89d12013-06-15 09:14:15 -0400148static int receive_room(struct tty_struct *tty)
Linus Torvalds55db4c62011-06-04 06:33:24 +0900149{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200150 struct n_tty_data *ldata = tty->disc_data;
Jaeden Amero090abf72012-07-27 08:43:11 -0500151 int left;
Peter Hurleyb8483052013-06-15 07:28:30 -0400152
Jaeden Amero090abf72012-07-27 08:43:11 -0500153 if (I_PARMRK(tty)) {
154 /* Multiply read_cnt by 3, since each byte might take up to
155 * three times as many spaces when PARMRK is set (depending on
156 * its flags, e.g. parity error). */
Peter Hurleyce741172013-06-15 09:14:20 -0400157 left = N_TTY_BUF_SIZE - read_cnt(ldata) * 3 - 1;
Jaeden Amero090abf72012-07-27 08:43:11 -0500158 } else
Peter Hurleyce741172013-06-15 09:14:20 -0400159 left = N_TTY_BUF_SIZE - read_cnt(ldata) - 1;
Jaeden Amero090abf72012-07-27 08:43:11 -0500160
Linus Torvalds55db4c62011-06-04 06:33:24 +0900161 /*
162 * If we are doing input canonicalization, and there are no
163 * pending newlines, let characters through without limit, so
164 * that erase characters will be handled. Other excess
165 * characters will be beeped.
166 */
167 if (left <= 0)
Peter Hurleya73d3d62013-06-15 09:14:25 -0400168 left = ldata->icanon && ldata->canon_head == ldata->read_tail;
Linus Torvalds55db4c62011-06-04 06:33:24 +0900169
Peter Hurley24a89d12013-06-15 09:14:15 -0400170 return left;
Peter Hurley7879a9f2013-06-15 07:28:31 -0400171}
172
Peter Hurley24a89d12013-06-15 09:14:15 -0400173/**
174 * n_tty_set_room - receive space
175 * @tty: terminal
176 *
177 * Re-schedules the flip buffer work if space just became available.
178 *
Peter Hurley6d76bd22013-06-15 09:14:26 -0400179 * Caller holds exclusive termios_rwsem
180 * or
181 * n_tty_read()/consumer path:
182 * holds non-exclusive termios_rwsem
Peter Hurley24a89d12013-06-15 09:14:15 -0400183 */
184
Peter Hurley7879a9f2013-06-15 07:28:31 -0400185static void n_tty_set_room(struct tty_struct *tty)
186{
Peter Hurley24a89d12013-06-15 09:14:15 -0400187 struct n_tty_data *ldata = tty->disc_data;
188
Linus Torvalds55db4c62011-06-04 06:33:24 +0900189 /* Did this open up the receive buffer? We may need to flip */
Peter Hurley24a89d12013-06-15 09:14:15 -0400190 if (unlikely(ldata->no_room) && receive_room(tty)) {
191 ldata->no_room = 0;
192
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200193 WARN_RATELIMIT(tty->port->itty == NULL,
Sasha Levincadf7482012-10-25 14:26:35 -0400194 "scheduling with invalid itty\n");
Peter Hurley21622932013-03-11 16:44:21 -0400195 /* see if ldisc has been killed - if so, this means that
196 * even though the ldisc has been halted and ->buf.work
197 * cancelled, ->buf.work is about to be rescheduled
198 */
199 WARN_RATELIMIT(test_bit(TTY_LDISC_HALTED, &tty->flags),
200 "scheduling buffer work for halted ldisc\n");
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200201 schedule_work(&tty->port->buf.work);
202 }
Linus Torvalds55db4c62011-06-04 06:33:24 +0900203}
204
Peter Hurley9a4aec22013-06-15 09:14:32 -0400205static ssize_t chars_in_buffer(struct tty_struct *tty)
206{
207 struct n_tty_data *ldata = tty->disc_data;
208 ssize_t n = 0;
209
210 if (!ldata->icanon)
211 n = read_cnt(ldata);
212 else
213 n = ldata->canon_head - ldata->read_tail;
214 return n;
215}
216
Peter Hurley6367ca72013-06-15 09:14:33 -0400217static inline void n_tty_check_throttle(struct tty_struct *tty)
218{
219 /*
220 * Check the remaining room for the input canonicalization
221 * mode. We don't want to throttle the driver if we're in
222 * canonical mode and don't have a newline yet!
223 */
224 while (1) {
225 int throttled;
226 tty_set_flow_change(tty, TTY_THROTTLE_SAFE);
227 if (receive_room(tty) >= TTY_THRESHOLD_THROTTLE)
228 break;
229 throttled = tty_throttle_safe(tty);
230 if (!throttled)
231 break;
232 }
233 __tty_set_flow_change(tty, 0);
234}
235
236static inline void n_tty_check_unthrottle(struct tty_struct *tty)
237{
238 /* If there is enough space in the read buffer now, let the
239 * low-level driver know. We use chars_in_buffer() to
240 * check the buffer, as it now knows about canonical mode.
241 * Otherwise, if the driver is throttled and the line is
242 * longer than TTY_THRESHOLD_UNTHROTTLE in canonical mode,
243 * we won't get any more characters.
244 */
245
246 while (1) {
247 int unthrottled;
248 tty_set_flow_change(tty, TTY_UNTHROTTLE_SAFE);
249 if (chars_in_buffer(tty) > TTY_THRESHOLD_UNTHROTTLE)
250 break;
251 if (!tty->count)
252 break;
253 n_tty_set_room(tty);
254 unthrottled = tty_unthrottle_safe(tty);
255 if (!unthrottled)
256 break;
257 }
258 __tty_set_flow_change(tty, 0);
259}
260
Alan Cox17b82062008-10-13 10:45:06 +0100261/**
262 * put_tty_queue - add character to tty
263 * @c: character
Jiri Slaby57c94122012-10-18 22:26:43 +0200264 * @ldata: n_tty data
Alan Cox17b82062008-10-13 10:45:06 +0100265 *
Peter Hurley6d76bd22013-06-15 09:14:26 -0400266 * Add a character to the tty read_buf queue.
267 *
268 * n_tty_receive_buf()/producer path:
269 * caller holds non-exclusive termios_rwsem
270 * modifies read_head
271 *
272 * read_head is only considered 'published' if canonical mode is
273 * not active.
Alan Cox17b82062008-10-13 10:45:06 +0100274 */
275
Jiri Slaby57c94122012-10-18 22:26:43 +0200276static void put_tty_queue(unsigned char c, struct n_tty_data *ldata)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700277{
Peter Hurley6d76bd22013-06-15 09:14:26 -0400278 if (read_cnt(ldata) < N_TTY_BUF_SIZE) {
279 *read_buf_addr(ldata, ldata->read_head) = c;
280 ldata->read_head++;
281 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700282}
283
284/**
Linus Torvalds1da177e2005-04-16 15:20:36 -0700285 * reset_buffer_flags - reset buffer state
286 * @tty: terminal to reset
287 *
Peter Hurley25518c62013-03-11 16:44:31 -0400288 * Reset the read buffer counters and clear the flags.
289 * Called from n_tty_open() and n_tty_flush_buffer().
Alan Cox17b82062008-10-13 10:45:06 +0100290 *
Peter Hurley6d76bd22013-06-15 09:14:26 -0400291 * Locking: caller holds exclusive termios_rwsem
292 * (or locking is not required)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700293 */
Joe Petersona88a69c2009-01-02 13:40:53 +0000294
Peter Hurleyb66f4fa2013-03-11 16:44:32 -0400295static void reset_buffer_flags(struct n_tty_data *ldata)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296{
Peter Hurleya73d3d62013-06-15 09:14:25 -0400297 ldata->read_head = ldata->canon_head = ldata->read_tail = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000298
Jiri Slabybddc7152012-10-18 22:26:42 +0200299 mutex_lock(&ldata->echo_lock);
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200300 ldata->echo_pos = ldata->echo_cnt = ldata->echo_overrun = 0;
Jiri Slabybddc7152012-10-18 22:26:42 +0200301 mutex_unlock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000302
Peter Hurleya73d3d62013-06-15 09:14:25 -0400303 ldata->erasing = 0;
Jiri Slaby3fe780b2012-10-18 22:26:40 +0200304 bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700305}
306
Peter Hurleya30737a2013-03-11 16:44:22 -0400307static void n_tty_packet_mode_flush(struct tty_struct *tty)
308{
309 unsigned long flags;
310
311 spin_lock_irqsave(&tty->ctrl_lock, flags);
312 if (tty->link->packet) {
313 tty->ctrl_status |= TIOCPKT_FLUSHREAD;
314 wake_up_interruptible(&tty->link->read_wait);
315 }
316 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
317}
318
Linus Torvalds1da177e2005-04-16 15:20:36 -0700319/**
320 * n_tty_flush_buffer - clean input queue
321 * @tty: terminal device
322 *
Peter Hurley25518c62013-03-11 16:44:31 -0400323 * Flush the input buffer. Called when the tty layer wants the
324 * buffer flushed (eg at hangup) or when the N_TTY line discipline
325 * internally has to clean the pending queue (for example some signals).
Linus Torvalds1da177e2005-04-16 15:20:36 -0700326 *
Peter Hurley6d76bd22013-06-15 09:14:26 -0400327 * Holds termios_rwsem to exclude producer/consumer while
328 * buffer indices are reset.
329 *
330 * Locking: ctrl_lock, exclusive termios_rwsem
Linus Torvalds1da177e2005-04-16 15:20:36 -0700331 */
Alan Cox4edf1822008-02-08 04:18:44 -0800332
333static void n_tty_flush_buffer(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700334{
Peter Hurley6d76bd22013-06-15 09:14:26 -0400335 down_write(&tty->termios_rwsem);
Peter Hurleyb66f4fa2013-03-11 16:44:32 -0400336 reset_buffer_flags(tty->disc_data);
337 n_tty_set_room(tty);
Alan Cox4edf1822008-02-08 04:18:44 -0800338
Peter Hurleya30737a2013-03-11 16:44:22 -0400339 if (tty->link)
340 n_tty_packet_mode_flush(tty);
Peter Hurley6d76bd22013-06-15 09:14:26 -0400341 up_write(&tty->termios_rwsem);
342}
343
Linus Torvalds1da177e2005-04-16 15:20:36 -0700344/**
345 * n_tty_chars_in_buffer - report available bytes
346 * @tty: tty device
347 *
348 * Report the number of characters buffered to be delivered to user
Alan Cox4edf1822008-02-08 04:18:44 -0800349 * at this instant in time.
Alan Cox17b82062008-10-13 10:45:06 +0100350 *
Peter Hurley6d76bd22013-06-15 09:14:26 -0400351 * Locking: exclusive termios_rwsem
Linus Torvalds1da177e2005-04-16 15:20:36 -0700352 */
Alan Cox4edf1822008-02-08 04:18:44 -0800353
Peter Hurleya19d0c62013-06-15 09:14:18 -0400354static ssize_t n_tty_chars_in_buffer(struct tty_struct *tty)
355{
Peter Hurley6d76bd22013-06-15 09:14:26 -0400356 ssize_t n;
357
Peter Hurley47534082013-06-15 09:14:19 -0400358 WARN_ONCE(1, "%s is deprecated and scheduled for removal.", __func__);
Peter Hurley6d76bd22013-06-15 09:14:26 -0400359
360 down_write(&tty->termios_rwsem);
361 n = chars_in_buffer(tty);
362 up_write(&tty->termios_rwsem);
363 return n;
Peter Hurleya19d0c62013-06-15 09:14:18 -0400364}
365
Linus Torvalds1da177e2005-04-16 15:20:36 -0700366/**
367 * is_utf8_continuation - utf8 multibyte check
368 * @c: byte to check
369 *
370 * Returns true if the utf8 character 'c' is a multibyte continuation
371 * character. We use this to correctly compute the on screen size
372 * of the character when printing
373 */
Alan Cox4edf1822008-02-08 04:18:44 -0800374
Linus Torvalds1da177e2005-04-16 15:20:36 -0700375static inline int is_utf8_continuation(unsigned char c)
376{
377 return (c & 0xc0) == 0x80;
378}
379
380/**
381 * is_continuation - multibyte check
382 * @c: byte to check
383 *
384 * Returns true if the utf8 character 'c' is a multibyte continuation
385 * character and the terminal is in unicode mode.
386 */
Alan Cox4edf1822008-02-08 04:18:44 -0800387
Linus Torvalds1da177e2005-04-16 15:20:36 -0700388static inline int is_continuation(unsigned char c, struct tty_struct *tty)
389{
390 return I_IUTF8(tty) && is_utf8_continuation(c);
391}
392
393/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000394 * do_output_char - output one character
395 * @c: character (or partial unicode symbol)
396 * @tty: terminal device
397 * @space: space available in tty driver write buffer
398 *
399 * This is a helper function that handles one output character
400 * (including special characters like TAB, CR, LF, etc.),
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600401 * doing OPOST processing and putting the results in the
402 * tty driver's write buffer.
Joe Petersona88a69c2009-01-02 13:40:53 +0000403 *
404 * Note that Linux currently ignores TABDLY, CRDLY, VTDLY, FFDLY
405 * and NLDLY. They simply aren't relevant in the world today.
406 * If you ever need them, add them here.
407 *
408 * Returns the number of bytes of buffer space used or -1 if
409 * no space left.
410 *
411 * Locking: should be called under the output_lock to protect
412 * the column state and space left in the buffer
413 */
414
415static int do_output_char(unsigned char c, struct tty_struct *tty, int space)
416{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200417 struct n_tty_data *ldata = tty->disc_data;
Joe Petersona88a69c2009-01-02 13:40:53 +0000418 int spaces;
419
420 if (!space)
421 return -1;
Alan Cox300a6202009-01-02 13:41:04 +0000422
Joe Petersona88a69c2009-01-02 13:40:53 +0000423 switch (c) {
424 case '\n':
425 if (O_ONLRET(tty))
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200426 ldata->column = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000427 if (O_ONLCR(tty)) {
428 if (space < 2)
429 return -1;
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200430 ldata->canon_column = ldata->column = 0;
Linus Torvalds37f81fa2009-09-05 12:46:07 -0700431 tty->ops->write(tty, "\r\n", 2);
Joe Petersona88a69c2009-01-02 13:40:53 +0000432 return 2;
433 }
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200434 ldata->canon_column = ldata->column;
Joe Petersona88a69c2009-01-02 13:40:53 +0000435 break;
436 case '\r':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200437 if (O_ONOCR(tty) && ldata->column == 0)
Joe Petersona88a69c2009-01-02 13:40:53 +0000438 return 0;
439 if (O_OCRNL(tty)) {
440 c = '\n';
441 if (O_ONLRET(tty))
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200442 ldata->canon_column = ldata->column = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000443 break;
444 }
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200445 ldata->canon_column = ldata->column = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000446 break;
447 case '\t':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200448 spaces = 8 - (ldata->column & 7);
Joe Petersona88a69c2009-01-02 13:40:53 +0000449 if (O_TABDLY(tty) == XTABS) {
450 if (space < spaces)
451 return -1;
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200452 ldata->column += spaces;
Joe Petersona88a69c2009-01-02 13:40:53 +0000453 tty->ops->write(tty, " ", spaces);
454 return spaces;
455 }
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200456 ldata->column += spaces;
Joe Petersona88a69c2009-01-02 13:40:53 +0000457 break;
458 case '\b':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200459 if (ldata->column > 0)
460 ldata->column--;
Joe Petersona88a69c2009-01-02 13:40:53 +0000461 break;
462 default:
Joe Petersona59c0d62009-01-02 13:43:25 +0000463 if (!iscntrl(c)) {
464 if (O_OLCUC(tty))
465 c = toupper(c);
466 if (!is_continuation(c, tty))
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200467 ldata->column++;
Joe Petersona59c0d62009-01-02 13:43:25 +0000468 }
Joe Petersona88a69c2009-01-02 13:40:53 +0000469 break;
470 }
471
472 tty_put_char(tty, c);
473 return 1;
474}
475
476/**
477 * process_output - output post processor
Linus Torvalds1da177e2005-04-16 15:20:36 -0700478 * @c: character (or partial unicode symbol)
479 * @tty: terminal device
480 *
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600481 * Output one character with OPOST processing.
482 * Returns -1 when the output device is full and the character
483 * must be retried.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700484 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000485 * Locking: output_lock to protect column state and space left
486 * (also, this is called from n_tty_write under the
487 * tty layer write lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700488 */
Alan Cox4edf1822008-02-08 04:18:44 -0800489
Joe Petersona88a69c2009-01-02 13:40:53 +0000490static int process_output(unsigned char c, struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700491{
Jiri Slabybddc7152012-10-18 22:26:42 +0200492 struct n_tty_data *ldata = tty->disc_data;
Joe Petersona88a69c2009-01-02 13:40:53 +0000493 int space, retval;
494
Jiri Slabybddc7152012-10-18 22:26:42 +0200495 mutex_lock(&ldata->output_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700496
Alan Coxf34d7a52008-04-30 00:54:13 -0700497 space = tty_write_room(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +0000498 retval = do_output_char(c, tty, space);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700499
Jiri Slabybddc7152012-10-18 22:26:42 +0200500 mutex_unlock(&ldata->output_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000501 if (retval < 0)
502 return -1;
503 else
504 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700505}
506
507/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000508 * process_output_block - block post processor
Linus Torvalds1da177e2005-04-16 15:20:36 -0700509 * @tty: terminal device
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600510 * @buf: character buffer
511 * @nr: number of bytes to output
512 *
513 * Output a block of characters with OPOST processing.
514 * Returns the number of characters output.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700515 *
516 * This path is used to speed up block console writes, among other
517 * things when processing blocks of output data. It handles only
518 * the simple cases normally found and helps to generate blocks of
519 * symbols for the console driver and thus improve performance.
520 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000521 * Locking: output_lock to protect column state and space left
522 * (also, this is called from n_tty_write under the
523 * tty layer write lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700524 */
Alan Cox4edf1822008-02-08 04:18:44 -0800525
Joe Petersona88a69c2009-01-02 13:40:53 +0000526static ssize_t process_output_block(struct tty_struct *tty,
527 const unsigned char *buf, unsigned int nr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700528{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200529 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700530 int space;
Thorsten Wißmannbbd20752011-12-08 17:47:33 +0100531 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700532 const unsigned char *cp;
533
Jiri Slabybddc7152012-10-18 22:26:42 +0200534 mutex_lock(&ldata->output_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000535
Alan Coxf34d7a52008-04-30 00:54:13 -0700536 space = tty_write_room(tty);
Alan Cox300a6202009-01-02 13:41:04 +0000537 if (!space) {
Jiri Slabybddc7152012-10-18 22:26:42 +0200538 mutex_unlock(&ldata->output_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539 return 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000540 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541 if (nr > space)
542 nr = space;
543
544 for (i = 0, cp = buf; i < nr; i++, cp++) {
Joe Petersona59c0d62009-01-02 13:43:25 +0000545 unsigned char c = *cp;
546
547 switch (c) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548 case '\n':
549 if (O_ONLRET(tty))
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200550 ldata->column = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700551 if (O_ONLCR(tty))
552 goto break_out;
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200553 ldata->canon_column = ldata->column;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700554 break;
555 case '\r':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200556 if (O_ONOCR(tty) && ldata->column == 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700557 goto break_out;
558 if (O_OCRNL(tty))
559 goto break_out;
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200560 ldata->canon_column = ldata->column = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700561 break;
562 case '\t':
563 goto break_out;
564 case '\b':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200565 if (ldata->column > 0)
566 ldata->column--;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700567 break;
568 default:
Joe Petersona59c0d62009-01-02 13:43:25 +0000569 if (!iscntrl(c)) {
570 if (O_OLCUC(tty))
571 goto break_out;
572 if (!is_continuation(c, tty))
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200573 ldata->column++;
Joe Petersona59c0d62009-01-02 13:43:25 +0000574 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700575 break;
576 }
577 }
578break_out:
Alan Coxf34d7a52008-04-30 00:54:13 -0700579 i = tty->ops->write(tty, buf, i);
Joe Petersona88a69c2009-01-02 13:40:53 +0000580
Jiri Slabybddc7152012-10-18 22:26:42 +0200581 mutex_unlock(&ldata->output_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700582 return i;
583}
584
Joe Petersona88a69c2009-01-02 13:40:53 +0000585/**
586 * process_echoes - write pending echo characters
587 * @tty: terminal device
588 *
589 * Write previously buffered echo (and other ldisc-generated)
590 * characters to the tty.
591 *
592 * Characters generated by the ldisc (including echoes) need to
593 * be buffered because the driver's write buffer can fill during
594 * heavy program output. Echoing straight to the driver will
595 * often fail under these conditions, causing lost characters and
596 * resulting mismatches of ldisc state information.
597 *
598 * Since the ldisc state must represent the characters actually sent
599 * to the driver at the time of the write, operations like certain
600 * changes in column state are also saved in the buffer and executed
601 * here.
602 *
603 * A circular fifo buffer is used so that the most recent characters
604 * are prioritized. Also, when control characters are echoed with a
605 * prefixed "^", the pair is treated atomically and thus not separated.
606 *
607 * Locking: output_lock to protect column state and space left,
608 * echo_lock to protect the echo buffer
609 */
610
611static void process_echoes(struct tty_struct *tty)
612{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200613 struct n_tty_data *ldata = tty->disc_data;
Joe Petersona88a69c2009-01-02 13:40:53 +0000614 int space, nr;
615 unsigned char c;
616 unsigned char *cp, *buf_end;
617
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200618 if (!ldata->echo_cnt)
Joe Petersona88a69c2009-01-02 13:40:53 +0000619 return;
620
Jiri Slabybddc7152012-10-18 22:26:42 +0200621 mutex_lock(&ldata->output_lock);
622 mutex_lock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000623
624 space = tty_write_room(tty);
625
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200626 buf_end = ldata->echo_buf + N_TTY_BUF_SIZE;
627 cp = ldata->echo_buf + ldata->echo_pos;
628 nr = ldata->echo_cnt;
Joe Petersona88a69c2009-01-02 13:40:53 +0000629 while (nr > 0) {
630 c = *cp;
631 if (c == ECHO_OP_START) {
632 unsigned char op;
633 unsigned char *opp;
634 int no_space_left = 0;
635
636 /*
637 * If the buffer byte is the start of a multi-byte
638 * operation, get the next byte, which is either the
639 * op code or a control character value.
640 */
641 opp = cp + 1;
642 if (opp == buf_end)
643 opp -= N_TTY_BUF_SIZE;
644 op = *opp;
Alan Cox300a6202009-01-02 13:41:04 +0000645
Joe Petersona88a69c2009-01-02 13:40:53 +0000646 switch (op) {
647 unsigned int num_chars, num_bs;
648
649 case ECHO_OP_ERASE_TAB:
650 if (++opp == buf_end)
651 opp -= N_TTY_BUF_SIZE;
652 num_chars = *opp;
653
654 /*
655 * Determine how many columns to go back
656 * in order to erase the tab.
657 * This depends on the number of columns
658 * used by other characters within the tab
659 * area. If this (modulo 8) count is from
660 * the start of input rather than from a
661 * previous tab, we offset by canon column.
662 * Otherwise, tab spacing is normal.
663 */
664 if (!(num_chars & 0x80))
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200665 num_chars += ldata->canon_column;
Joe Petersona88a69c2009-01-02 13:40:53 +0000666 num_bs = 8 - (num_chars & 7);
667
668 if (num_bs > space) {
669 no_space_left = 1;
670 break;
671 }
672 space -= num_bs;
673 while (num_bs--) {
674 tty_put_char(tty, '\b');
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200675 if (ldata->column > 0)
676 ldata->column--;
Joe Petersona88a69c2009-01-02 13:40:53 +0000677 }
678 cp += 3;
679 nr -= 3;
680 break;
681
682 case ECHO_OP_SET_CANON_COL:
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200683 ldata->canon_column = ldata->column;
Joe Petersona88a69c2009-01-02 13:40:53 +0000684 cp += 2;
685 nr -= 2;
686 break;
687
688 case ECHO_OP_MOVE_BACK_COL:
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200689 if (ldata->column > 0)
690 ldata->column--;
Joe Petersona88a69c2009-01-02 13:40:53 +0000691 cp += 2;
692 nr -= 2;
693 break;
694
695 case ECHO_OP_START:
696 /* This is an escaped echo op start code */
697 if (!space) {
698 no_space_left = 1;
699 break;
700 }
701 tty_put_char(tty, ECHO_OP_START);
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200702 ldata->column++;
Joe Petersona88a69c2009-01-02 13:40:53 +0000703 space--;
704 cp += 2;
705 nr -= 2;
706 break;
707
708 default:
Joe Petersona88a69c2009-01-02 13:40:53 +0000709 /*
Joe Peterson62b26352009-09-09 15:03:47 -0600710 * If the op is not a special byte code,
711 * it is a ctrl char tagged to be echoed
712 * as "^X" (where X is the letter
713 * representing the control char).
714 * Note that we must ensure there is
715 * enough space for the whole ctrl pair.
716 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000717 */
Joe Peterson62b26352009-09-09 15:03:47 -0600718 if (space < 2) {
719 no_space_left = 1;
720 break;
721 }
722 tty_put_char(tty, '^');
723 tty_put_char(tty, op ^ 0100);
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200724 ldata->column += 2;
Joe Peterson62b26352009-09-09 15:03:47 -0600725 space -= 2;
Joe Petersona88a69c2009-01-02 13:40:53 +0000726 cp += 2;
727 nr -= 2;
728 }
729
730 if (no_space_left)
731 break;
732 } else {
Peter Hurley582f5592013-05-17 12:49:48 -0400733 if (O_OPOST(tty)) {
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600734 int retval = do_output_char(c, tty, space);
735 if (retval < 0)
736 break;
737 space -= retval;
738 } else {
739 if (!space)
740 break;
741 tty_put_char(tty, c);
742 space -= 1;
743 }
Joe Petersona88a69c2009-01-02 13:40:53 +0000744 cp += 1;
745 nr -= 1;
746 }
747
748 /* When end of circular buffer reached, wrap around */
749 if (cp >= buf_end)
750 cp -= N_TTY_BUF_SIZE;
751 }
752
753 if (nr == 0) {
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200754 ldata->echo_pos = 0;
755 ldata->echo_cnt = 0;
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200756 ldata->echo_overrun = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000757 } else {
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200758 int num_processed = ldata->echo_cnt - nr;
759 ldata->echo_pos += num_processed;
760 ldata->echo_pos &= N_TTY_BUF_SIZE - 1;
761 ldata->echo_cnt = nr;
Joe Petersona88a69c2009-01-02 13:40:53 +0000762 if (num_processed > 0)
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200763 ldata->echo_overrun = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000764 }
765
Jiri Slabybddc7152012-10-18 22:26:42 +0200766 mutex_unlock(&ldata->echo_lock);
767 mutex_unlock(&ldata->output_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000768
769 if (tty->ops->flush_chars)
770 tty->ops->flush_chars(tty);
771}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700772
773/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000774 * add_echo_byte - add a byte to the echo buffer
775 * @c: unicode byte to echo
Jiri Slaby57c94122012-10-18 22:26:43 +0200776 * @ldata: n_tty data
Joe Petersona88a69c2009-01-02 13:40:53 +0000777 *
778 * Add a character or operation byte to the echo buffer.
779 *
780 * Should be called under the echo lock to protect the echo buffer.
781 */
782
Jiri Slaby57c94122012-10-18 22:26:43 +0200783static void add_echo_byte(unsigned char c, struct n_tty_data *ldata)
Joe Petersona88a69c2009-01-02 13:40:53 +0000784{
785 int new_byte_pos;
786
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200787 if (ldata->echo_cnt == N_TTY_BUF_SIZE) {
Joe Petersona88a69c2009-01-02 13:40:53 +0000788 /* Circular buffer is already at capacity */
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200789 new_byte_pos = ldata->echo_pos;
Joe Petersona88a69c2009-01-02 13:40:53 +0000790
791 /*
792 * Since the buffer start position needs to be advanced,
793 * be sure to step by a whole operation byte group.
794 */
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200795 if (ldata->echo_buf[ldata->echo_pos] == ECHO_OP_START) {
796 if (ldata->echo_buf[(ldata->echo_pos + 1) &
Joe Petersona88a69c2009-01-02 13:40:53 +0000797 (N_TTY_BUF_SIZE - 1)] ==
798 ECHO_OP_ERASE_TAB) {
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200799 ldata->echo_pos += 3;
800 ldata->echo_cnt -= 2;
Joe Petersona88a69c2009-01-02 13:40:53 +0000801 } else {
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200802 ldata->echo_pos += 2;
803 ldata->echo_cnt -= 1;
Joe Petersona88a69c2009-01-02 13:40:53 +0000804 }
805 } else {
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200806 ldata->echo_pos++;
Joe Petersona88a69c2009-01-02 13:40:53 +0000807 }
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200808 ldata->echo_pos &= N_TTY_BUF_SIZE - 1;
Joe Petersona88a69c2009-01-02 13:40:53 +0000809
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200810 ldata->echo_overrun = 1;
Joe Petersona88a69c2009-01-02 13:40:53 +0000811 } else {
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200812 new_byte_pos = ldata->echo_pos + ldata->echo_cnt;
Joe Petersona88a69c2009-01-02 13:40:53 +0000813 new_byte_pos &= N_TTY_BUF_SIZE - 1;
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200814 ldata->echo_cnt++;
Joe Petersona88a69c2009-01-02 13:40:53 +0000815 }
816
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200817 ldata->echo_buf[new_byte_pos] = c;
Joe Petersona88a69c2009-01-02 13:40:53 +0000818}
819
820/**
821 * echo_move_back_col - add operation to move back a column
Jiri Slaby57c94122012-10-18 22:26:43 +0200822 * @ldata: n_tty data
Joe Petersona88a69c2009-01-02 13:40:53 +0000823 *
824 * Add an operation to the echo buffer to move back one column.
825 *
826 * Locking: echo_lock to protect the echo buffer
827 */
828
Jiri Slaby57c94122012-10-18 22:26:43 +0200829static void echo_move_back_col(struct n_tty_data *ldata)
Joe Petersona88a69c2009-01-02 13:40:53 +0000830{
Jiri Slabybddc7152012-10-18 22:26:42 +0200831 mutex_lock(&ldata->echo_lock);
Jiri Slaby57c94122012-10-18 22:26:43 +0200832 add_echo_byte(ECHO_OP_START, ldata);
833 add_echo_byte(ECHO_OP_MOVE_BACK_COL, ldata);
Jiri Slabybddc7152012-10-18 22:26:42 +0200834 mutex_unlock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000835}
836
837/**
838 * echo_set_canon_col - add operation to set the canon column
Jiri Slaby57c94122012-10-18 22:26:43 +0200839 * @ldata: n_tty data
Joe Petersona88a69c2009-01-02 13:40:53 +0000840 *
841 * Add an operation to the echo buffer to set the canon column
842 * to the current column.
843 *
844 * Locking: echo_lock to protect the echo buffer
845 */
846
Jiri Slaby57c94122012-10-18 22:26:43 +0200847static void echo_set_canon_col(struct n_tty_data *ldata)
Joe Petersona88a69c2009-01-02 13:40:53 +0000848{
Jiri Slabybddc7152012-10-18 22:26:42 +0200849 mutex_lock(&ldata->echo_lock);
Jiri Slaby57c94122012-10-18 22:26:43 +0200850 add_echo_byte(ECHO_OP_START, ldata);
851 add_echo_byte(ECHO_OP_SET_CANON_COL, ldata);
Jiri Slabybddc7152012-10-18 22:26:42 +0200852 mutex_unlock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000853}
854
855/**
856 * echo_erase_tab - add operation to erase a tab
857 * @num_chars: number of character columns already used
858 * @after_tab: true if num_chars starts after a previous tab
Jiri Slaby57c94122012-10-18 22:26:43 +0200859 * @ldata: n_tty data
Joe Petersona88a69c2009-01-02 13:40:53 +0000860 *
861 * Add an operation to the echo buffer to erase a tab.
862 *
863 * Called by the eraser function, which knows how many character
864 * columns have been used since either a previous tab or the start
865 * of input. This information will be used later, along with
866 * canon column (if applicable), to go back the correct number
867 * of columns.
868 *
869 * Locking: echo_lock to protect the echo buffer
870 */
871
872static void echo_erase_tab(unsigned int num_chars, int after_tab,
Jiri Slaby57c94122012-10-18 22:26:43 +0200873 struct n_tty_data *ldata)
Joe Petersona88a69c2009-01-02 13:40:53 +0000874{
Jiri Slabybddc7152012-10-18 22:26:42 +0200875 mutex_lock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000876
Jiri Slaby57c94122012-10-18 22:26:43 +0200877 add_echo_byte(ECHO_OP_START, ldata);
878 add_echo_byte(ECHO_OP_ERASE_TAB, ldata);
Joe Petersona88a69c2009-01-02 13:40:53 +0000879
880 /* We only need to know this modulo 8 (tab spacing) */
881 num_chars &= 7;
882
883 /* Set the high bit as a flag if num_chars is after a previous tab */
884 if (after_tab)
885 num_chars |= 0x80;
Alan Cox300a6202009-01-02 13:41:04 +0000886
Jiri Slaby57c94122012-10-18 22:26:43 +0200887 add_echo_byte(num_chars, ldata);
Joe Petersona88a69c2009-01-02 13:40:53 +0000888
Jiri Slabybddc7152012-10-18 22:26:42 +0200889 mutex_unlock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000890}
891
892/**
893 * echo_char_raw - echo a character raw
Linus Torvalds1da177e2005-04-16 15:20:36 -0700894 * @c: unicode byte to echo
895 * @tty: terminal device
896 *
Alan Cox4edf1822008-02-08 04:18:44 -0800897 * Echo user input back onto the screen. This must be called only when
Linus Torvalds1da177e2005-04-16 15:20:36 -0700898 * L_ECHO(tty) is true. Called from the driver receive_buf path.
Alan Cox17b82062008-10-13 10:45:06 +0100899 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000900 * This variant does not treat control characters specially.
901 *
902 * Locking: echo_lock to protect the echo buffer
903 */
904
Jiri Slaby57c94122012-10-18 22:26:43 +0200905static void echo_char_raw(unsigned char c, struct n_tty_data *ldata)
Joe Petersona88a69c2009-01-02 13:40:53 +0000906{
Jiri Slabybddc7152012-10-18 22:26:42 +0200907 mutex_lock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000908 if (c == ECHO_OP_START) {
Jiri Slaby57c94122012-10-18 22:26:43 +0200909 add_echo_byte(ECHO_OP_START, ldata);
910 add_echo_byte(ECHO_OP_START, ldata);
Joe Petersona88a69c2009-01-02 13:40:53 +0000911 } else {
Jiri Slaby57c94122012-10-18 22:26:43 +0200912 add_echo_byte(c, ldata);
Joe Petersona88a69c2009-01-02 13:40:53 +0000913 }
Jiri Slabybddc7152012-10-18 22:26:42 +0200914 mutex_unlock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000915}
916
917/**
918 * echo_char - echo a character
919 * @c: unicode byte to echo
920 * @tty: terminal device
921 *
922 * Echo user input back onto the screen. This must be called only when
923 * L_ECHO(tty) is true. Called from the driver receive_buf path.
924 *
Joe Peterson62b26352009-09-09 15:03:47 -0600925 * This variant tags control characters to be echoed as "^X"
926 * (where X is the letter representing the control char).
Joe Petersona88a69c2009-01-02 13:40:53 +0000927 *
928 * Locking: echo_lock to protect the echo buffer
Linus Torvalds1da177e2005-04-16 15:20:36 -0700929 */
930
931static void echo_char(unsigned char c, struct tty_struct *tty)
932{
Jiri Slabybddc7152012-10-18 22:26:42 +0200933 struct n_tty_data *ldata = tty->disc_data;
934
935 mutex_lock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000936
937 if (c == ECHO_OP_START) {
Jiri Slaby57c94122012-10-18 22:26:43 +0200938 add_echo_byte(ECHO_OP_START, ldata);
939 add_echo_byte(ECHO_OP_START, ldata);
Joe Petersona88a69c2009-01-02 13:40:53 +0000940 } else {
Joe Peterson62b26352009-09-09 15:03:47 -0600941 if (L_ECHOCTL(tty) && iscntrl(c) && c != '\t')
Jiri Slaby57c94122012-10-18 22:26:43 +0200942 add_echo_byte(ECHO_OP_START, ldata);
943 add_echo_byte(c, ldata);
Joe Petersona88a69c2009-01-02 13:40:53 +0000944 }
945
Jiri Slabybddc7152012-10-18 22:26:42 +0200946 mutex_unlock(&ldata->echo_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700947}
948
Alan Cox17b82062008-10-13 10:45:06 +0100949/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000950 * finish_erasing - complete erase
Jiri Slaby57c94122012-10-18 22:26:43 +0200951 * @ldata: n_tty data
Alan Cox17b82062008-10-13 10:45:06 +0100952 */
Joe Petersona88a69c2009-01-02 13:40:53 +0000953
Jiri Slaby57c94122012-10-18 22:26:43 +0200954static inline void finish_erasing(struct n_tty_data *ldata)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700955{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200956 if (ldata->erasing) {
Jiri Slaby57c94122012-10-18 22:26:43 +0200957 echo_char_raw('/', ldata);
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200958 ldata->erasing = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700959 }
960}
961
962/**
963 * eraser - handle erase function
964 * @c: character input
965 * @tty: terminal device
966 *
Robert P. J. Day3a4fa0a2007-10-19 23:10:43 +0200967 * Perform erase and necessary output when an erase character is
Linus Torvalds1da177e2005-04-16 15:20:36 -0700968 * present in the stream from the driver layer. Handles the complexities
969 * of UTF-8 multibyte symbols.
Alan Cox17b82062008-10-13 10:45:06 +0100970 *
Peter Hurley6d76bd22013-06-15 09:14:26 -0400971 * n_tty_receive_buf()/producer path:
972 * caller holds non-exclusive termios_rwsem
973 * modifies read_head
974 *
975 * Modifying the read_head is not considered a publish in this context
976 * because canonical mode is active -- only canon_head publishes
Linus Torvalds1da177e2005-04-16 15:20:36 -0700977 */
Alan Cox4edf1822008-02-08 04:18:44 -0800978
Linus Torvalds1da177e2005-04-16 15:20:36 -0700979static void eraser(unsigned char c, struct tty_struct *tty)
980{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200981 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700982 enum { ERASE, WERASE, KILL } kill_type;
Peter Hurleybc5a5e32013-06-15 09:14:21 -0400983 size_t head;
984 size_t cnt;
985 int seen_alnums;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700986
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200987 if (ldata->read_head == ldata->canon_head) {
Joe Peterson7e94b1d2009-01-02 13:43:40 +0000988 /* process_output('\a', tty); */ /* what do you think? */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700989 return;
990 }
991 if (c == ERASE_CHAR(tty))
992 kill_type = ERASE;
993 else if (c == WERASE_CHAR(tty))
994 kill_type = WERASE;
995 else {
996 if (!L_ECHO(tty)) {
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200997 ldata->read_head = ldata->canon_head;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700998 return;
999 }
1000 if (!L_ECHOK(tty) || !L_ECHOKE(tty) || !L_ECHOE(tty)) {
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001001 ldata->read_head = ldata->canon_head;
Jiri Slaby57c94122012-10-18 22:26:43 +02001002 finish_erasing(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001003 echo_char(KILL_CHAR(tty), tty);
1004 /* Add a newline if ECHOK is on and ECHOKE is off. */
1005 if (L_ECHOK(tty))
Jiri Slaby57c94122012-10-18 22:26:43 +02001006 echo_char_raw('\n', ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001007 return;
1008 }
1009 kill_type = KILL;
1010 }
1011
1012 seen_alnums = 0;
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001013 while (ldata->read_head != ldata->canon_head) {
1014 head = ldata->read_head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001015
1016 /* erase a single possibly multibyte character */
1017 do {
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001018 head--;
1019 c = read_buf(ldata, head);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001020 } while (is_continuation(c, tty) && head != ldata->canon_head);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001021
1022 /* do not partially erase */
1023 if (is_continuation(c, tty))
1024 break;
1025
1026 if (kill_type == WERASE) {
1027 /* Equivalent to BSD's ALTWERASE. */
1028 if (isalnum(c) || c == '_')
1029 seen_alnums++;
1030 else if (seen_alnums)
1031 break;
1032 }
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001033 cnt = ldata->read_head - head;
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001034 ldata->read_head = head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001035 if (L_ECHO(tty)) {
1036 if (L_ECHOPRT(tty)) {
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001037 if (!ldata->erasing) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001038 echo_char_raw('\\', ldata);
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001039 ldata->erasing = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001040 }
1041 /* if cnt > 1, output a multi-byte character */
1042 echo_char(c, tty);
1043 while (--cnt > 0) {
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001044 head++;
1045 echo_char_raw(read_buf(ldata, head), ldata);
Jiri Slaby57c94122012-10-18 22:26:43 +02001046 echo_move_back_col(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001047 }
1048 } else if (kill_type == ERASE && !L_ECHOE(tty)) {
1049 echo_char(ERASE_CHAR(tty), tty);
1050 } else if (c == '\t') {
Joe Petersona88a69c2009-01-02 13:40:53 +00001051 unsigned int num_chars = 0;
1052 int after_tab = 0;
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001053 size_t tail = ldata->read_head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001054
Joe Petersona88a69c2009-01-02 13:40:53 +00001055 /*
1056 * Count the columns used for characters
1057 * since the start of input or after a
1058 * previous tab.
1059 * This info is used to go back the correct
1060 * number of columns.
1061 */
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001062 while (tail != ldata->canon_head) {
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001063 tail--;
1064 c = read_buf(ldata, tail);
Joe Petersona88a69c2009-01-02 13:40:53 +00001065 if (c == '\t') {
1066 after_tab = 1;
1067 break;
Alan Cox300a6202009-01-02 13:41:04 +00001068 } else if (iscntrl(c)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001069 if (L_ECHOCTL(tty))
Joe Petersona88a69c2009-01-02 13:40:53 +00001070 num_chars += 2;
1071 } else if (!is_continuation(c, tty)) {
1072 num_chars++;
1073 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001074 }
Jiri Slaby57c94122012-10-18 22:26:43 +02001075 echo_erase_tab(num_chars, after_tab, ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001076 } else {
1077 if (iscntrl(c) && L_ECHOCTL(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001078 echo_char_raw('\b', ldata);
1079 echo_char_raw(' ', ldata);
1080 echo_char_raw('\b', ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001081 }
1082 if (!iscntrl(c) || L_ECHOCTL(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001083 echo_char_raw('\b', ldata);
1084 echo_char_raw(' ', ldata);
1085 echo_char_raw('\b', ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001086 }
1087 }
1088 }
1089 if (kill_type == ERASE)
1090 break;
1091 }
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001092 if (ldata->read_head == ldata->canon_head && L_ECHO(tty))
Jiri Slaby57c94122012-10-18 22:26:43 +02001093 finish_erasing(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001094}
1095
1096/**
1097 * isig - handle the ISIG optio
1098 * @sig: signal
1099 * @tty: terminal
Linus Torvalds1da177e2005-04-16 15:20:36 -07001100 *
Peter Hurley8c985d12013-03-06 08:38:19 -05001101 * Called when a signal is being sent due to terminal input.
1102 * Called from the driver receive_buf path so serialized.
Alan Cox17b82062008-10-13 10:45:06 +01001103 *
Peter Hurley8c985d12013-03-06 08:38:19 -05001104 * Locking: ctrl_lock
Linus Torvalds1da177e2005-04-16 15:20:36 -07001105 */
Alan Cox4edf1822008-02-08 04:18:44 -08001106
Peter Hurley8c985d12013-03-06 08:38:19 -05001107static inline void isig(int sig, struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001108{
Peter Hurley8c985d12013-03-06 08:38:19 -05001109 struct pid *tty_pgrp = tty_get_pgrp(tty);
1110 if (tty_pgrp) {
1111 kill_pgrp(tty_pgrp, sig, 1);
1112 put_pid(tty_pgrp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001113 }
1114}
1115
1116/**
1117 * n_tty_receive_break - handle break
1118 * @tty: terminal
1119 *
1120 * An RS232 break event has been hit in the incoming bitstream. This
1121 * can cause a variety of events depending upon the termios settings.
1122 *
Peter Hurley6d76bd22013-06-15 09:14:26 -04001123 * n_tty_receive_buf()/producer path:
1124 * caller holds non-exclusive termios_rwsem
1125 * publishes read_head via put_tty_queue()
1126 *
1127 * Note: may get exclusive termios_rwsem if flushing input buffer
Linus Torvalds1da177e2005-04-16 15:20:36 -07001128 */
Alan Cox4edf1822008-02-08 04:18:44 -08001129
Linus Torvalds1da177e2005-04-16 15:20:36 -07001130static inline void n_tty_receive_break(struct tty_struct *tty)
1131{
Jiri Slaby57c94122012-10-18 22:26:43 +02001132 struct n_tty_data *ldata = tty->disc_data;
1133
Linus Torvalds1da177e2005-04-16 15:20:36 -07001134 if (I_IGNBRK(tty))
1135 return;
1136 if (I_BRKINT(tty)) {
Peter Hurley8c985d12013-03-06 08:38:19 -05001137 isig(SIGINT, tty);
1138 if (!L_NOFLSH(tty)) {
Peter Hurley6d76bd22013-06-15 09:14:26 -04001139 /* flushing needs exclusive termios_rwsem */
1140 up_read(&tty->termios_rwsem);
Peter Hurley8c985d12013-03-06 08:38:19 -05001141 n_tty_flush_buffer(tty);
1142 tty_driver_flush_buffer(tty);
Peter Hurley6d76bd22013-06-15 09:14:26 -04001143 down_read(&tty->termios_rwsem);
Peter Hurley8c985d12013-03-06 08:38:19 -05001144 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001145 return;
1146 }
1147 if (I_PARMRK(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001148 put_tty_queue('\377', ldata);
1149 put_tty_queue('\0', ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001150 }
Jiri Slaby57c94122012-10-18 22:26:43 +02001151 put_tty_queue('\0', ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001152 wake_up_interruptible(&tty->read_wait);
1153}
1154
1155/**
1156 * n_tty_receive_overrun - handle overrun reporting
1157 * @tty: terminal
1158 *
1159 * Data arrived faster than we could process it. While the tty
1160 * driver has flagged this the bits that were missed are gone
1161 * forever.
1162 *
1163 * Called from the receive_buf path so single threaded. Does not
1164 * need locking as num_overrun and overrun_time are function
1165 * private.
1166 */
Alan Cox4edf1822008-02-08 04:18:44 -08001167
Linus Torvalds1da177e2005-04-16 15:20:36 -07001168static inline void n_tty_receive_overrun(struct tty_struct *tty)
1169{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001170 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001171 char buf[64];
1172
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001173 ldata->num_overrun++;
1174 if (time_after(jiffies, ldata->overrun_time + HZ) ||
1175 time_after(ldata->overrun_time, jiffies)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001176 printk(KERN_WARNING "%s: %d input overrun(s)\n",
1177 tty_name(tty, buf),
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001178 ldata->num_overrun);
1179 ldata->overrun_time = jiffies;
1180 ldata->num_overrun = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001181 }
1182}
1183
1184/**
1185 * n_tty_receive_parity_error - error notifier
1186 * @tty: terminal device
1187 * @c: character
1188 *
1189 * Process a parity error and queue the right data to indicate
Peter Hurley6d76bd22013-06-15 09:14:26 -04001190 * the error case if necessary.
1191 *
1192 * n_tty_receive_buf()/producer path:
1193 * caller holds non-exclusive termios_rwsem
1194 * publishes read_head via put_tty_queue()
Linus Torvalds1da177e2005-04-16 15:20:36 -07001195 */
1196static inline void n_tty_receive_parity_error(struct tty_struct *tty,
1197 unsigned char c)
1198{
Jiri Slaby57c94122012-10-18 22:26:43 +02001199 struct n_tty_data *ldata = tty->disc_data;
1200
Alan Cox4edf1822008-02-08 04:18:44 -08001201 if (I_IGNPAR(tty))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001203 if (I_PARMRK(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001204 put_tty_queue('\377', ldata);
1205 put_tty_queue('\0', ldata);
1206 put_tty_queue(c, ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001207 } else if (I_INPCK(tty))
Jiri Slaby57c94122012-10-18 22:26:43 +02001208 put_tty_queue('\0', ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001209 else
Jiri Slaby57c94122012-10-18 22:26:43 +02001210 put_tty_queue(c, ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001211 wake_up_interruptible(&tty->read_wait);
1212}
1213
1214/**
1215 * n_tty_receive_char - perform processing
1216 * @tty: terminal device
1217 * @c: character
1218 *
1219 * Process an individual character of input received from the driver.
Alan Cox4edf1822008-02-08 04:18:44 -08001220 * This is serialized with respect to itself by the rules for the
Linus Torvalds1da177e2005-04-16 15:20:36 -07001221 * driver above.
Peter Hurley6d76bd22013-06-15 09:14:26 -04001222 *
1223 * n_tty_receive_buf()/producer path:
1224 * caller holds non-exclusive termios_rwsem
1225 * publishes canon_head if canonical mode is active
1226 * otherwise, publishes read_head via put_tty_queue()
Linus Torvalds1da177e2005-04-16 15:20:36 -07001227 */
1228
1229static inline void n_tty_receive_char(struct tty_struct *tty, unsigned char c)
1230{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001231 struct n_tty_data *ldata = tty->disc_data;
Joe Petersonacc71bb2009-01-02 13:43:32 +00001232 int parmrk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001233
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001234 if (ldata->raw) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001235 put_tty_queue(c, ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001236 return;
1237 }
Alan Cox4edf1822008-02-08 04:18:44 -08001238
Linus Torvalds1da177e2005-04-16 15:20:36 -07001239 if (I_ISTRIP(tty))
1240 c &= 0x7f;
1241 if (I_IUCLC(tty) && L_IEXTEN(tty))
Alan Cox300a6202009-01-02 13:41:04 +00001242 c = tolower(c);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001243
hyc@symas.com26df6d12010-06-22 10:14:49 -07001244 if (L_EXTPROC(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001245 put_tty_queue(c, ldata);
hyc@symas.com26df6d12010-06-22 10:14:49 -07001246 return;
1247 }
1248
Joe Peterson54d2a372008-02-06 01:37:59 -08001249 if (tty->stopped && !tty->flow_stopped && I_IXON(tty) &&
Joe Petersona88a69c2009-01-02 13:40:53 +00001250 I_IXANY(tty) && c != START_CHAR(tty) && c != STOP_CHAR(tty) &&
1251 c != INTR_CHAR(tty) && c != QUIT_CHAR(tty) && c != SUSP_CHAR(tty)) {
Joe Peterson54d2a372008-02-06 01:37:59 -08001252 start_tty(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001253 process_echoes(tty);
1254 }
Joe Peterson54d2a372008-02-06 01:37:59 -08001255
Linus Torvalds1da177e2005-04-16 15:20:36 -07001256 if (tty->closing) {
1257 if (I_IXON(tty)) {
Joe Petersona88a69c2009-01-02 13:40:53 +00001258 if (c == START_CHAR(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001259 start_tty(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001260 process_echoes(tty);
Alan Cox300a6202009-01-02 13:41:04 +00001261 } else if (c == STOP_CHAR(tty))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001262 stop_tty(tty);
1263 }
1264 return;
1265 }
1266
1267 /*
1268 * If the previous character was LNEXT, or we know that this
1269 * character is not one of the characters that we'll have to
1270 * handle specially, do shortcut processing to speed things
1271 * up.
1272 */
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001273 if (!test_bit(c, ldata->process_char_map) || ldata->lnext) {
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001274 ldata->lnext = 0;
Joe Petersonacc71bb2009-01-02 13:43:32 +00001275 parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0;
Peter Hurleyce741172013-06-15 09:14:20 -04001276 if (read_cnt(ldata) >= (N_TTY_BUF_SIZE - parmrk - 1)) {
Joe Petersonacc71bb2009-01-02 13:43:32 +00001277 /* beep if no space */
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001278 if (L_ECHO(tty))
1279 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001280 return;
1281 }
1282 if (L_ECHO(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001283 finish_erasing(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001284 /* Record the column of first canon char. */
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001285 if (ldata->canon_head == ldata->read_head)
Jiri Slaby57c94122012-10-18 22:26:43 +02001286 echo_set_canon_col(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001287 echo_char(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001288 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001289 }
Joe Petersonacc71bb2009-01-02 13:43:32 +00001290 if (parmrk)
Jiri Slaby57c94122012-10-18 22:26:43 +02001291 put_tty_queue(c, ldata);
1292 put_tty_queue(c, ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001293 return;
1294 }
Alan Cox4edf1822008-02-08 04:18:44 -08001295
Linus Torvalds1da177e2005-04-16 15:20:36 -07001296 if (I_IXON(tty)) {
1297 if (c == START_CHAR(tty)) {
1298 start_tty(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001299 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001300 return;
1301 }
1302 if (c == STOP_CHAR(tty)) {
1303 stop_tty(tty);
1304 return;
1305 }
1306 }
Joe Peterson575537b32008-04-30 00:53:30 -07001307
Linus Torvalds1da177e2005-04-16 15:20:36 -07001308 if (L_ISIG(tty)) {
1309 int signal;
1310 signal = SIGINT;
1311 if (c == INTR_CHAR(tty))
1312 goto send_signal;
1313 signal = SIGQUIT;
1314 if (c == QUIT_CHAR(tty))
1315 goto send_signal;
1316 signal = SIGTSTP;
1317 if (c == SUSP_CHAR(tty)) {
1318send_signal:
Joe Petersonec5b1152008-02-06 01:37:38 -08001319 if (!L_NOFLSH(tty)) {
Peter Hurley6d76bd22013-06-15 09:14:26 -04001320 /* flushing needs exclusive termios_rwsem */
1321 up_read(&tty->termios_rwsem);
Joe Petersonec5b1152008-02-06 01:37:38 -08001322 n_tty_flush_buffer(tty);
Alan Coxf34d7a52008-04-30 00:54:13 -07001323 tty_driver_flush_buffer(tty);
Peter Hurley6d76bd22013-06-15 09:14:26 -04001324 down_read(&tty->termios_rwsem);
Joe Petersonec5b1152008-02-06 01:37:38 -08001325 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001326 if (I_IXON(tty))
1327 start_tty(tty);
1328 if (L_ECHO(tty)) {
Joe Petersonec5b1152008-02-06 01:37:38 -08001329 echo_char(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001330 process_echoes(tty);
1331 }
Peter Hurley8c985d12013-03-06 08:38:19 -05001332 isig(signal, tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001333 return;
1334 }
1335 }
Joe Peterson575537b32008-04-30 00:53:30 -07001336
1337 if (c == '\r') {
1338 if (I_IGNCR(tty))
1339 return;
1340 if (I_ICRNL(tty))
1341 c = '\n';
1342 } else if (c == '\n' && I_INLCR(tty))
1343 c = '\r';
1344
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001345 if (ldata->icanon) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001346 if (c == ERASE_CHAR(tty) || c == KILL_CHAR(tty) ||
1347 (c == WERASE_CHAR(tty) && L_IEXTEN(tty))) {
1348 eraser(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001349 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001350 return;
1351 }
1352 if (c == LNEXT_CHAR(tty) && L_IEXTEN(tty)) {
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001353 ldata->lnext = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001354 if (L_ECHO(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001355 finish_erasing(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001356 if (L_ECHOCTL(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001357 echo_char_raw('^', ldata);
1358 echo_char_raw('\b', ldata);
Joe Petersona88a69c2009-01-02 13:40:53 +00001359 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001360 }
1361 }
1362 return;
1363 }
1364 if (c == REPRINT_CHAR(tty) && L_ECHO(tty) &&
1365 L_IEXTEN(tty)) {
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001366 size_t tail = ldata->canon_head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001367
Jiri Slaby57c94122012-10-18 22:26:43 +02001368 finish_erasing(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001369 echo_char(c, tty);
Jiri Slaby57c94122012-10-18 22:26:43 +02001370 echo_char_raw('\n', ldata);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001371 while (tail != ldata->read_head) {
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001372 echo_char(read_buf(ldata, tail), tty);
1373 tail++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001374 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001375 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001376 return;
1377 }
1378 if (c == '\n') {
Peter Hurleyce741172013-06-15 09:14:20 -04001379 if (read_cnt(ldata) >= N_TTY_BUF_SIZE) {
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001380 if (L_ECHO(tty))
1381 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001382 return;
1383 }
1384 if (L_ECHO(tty) || L_ECHONL(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001385 echo_char_raw('\n', ldata);
Joe Petersona88a69c2009-01-02 13:40:53 +00001386 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001387 }
1388 goto handle_newline;
1389 }
1390 if (c == EOF_CHAR(tty)) {
Peter Hurleyce741172013-06-15 09:14:20 -04001391 if (read_cnt(ldata) >= N_TTY_BUF_SIZE)
Joe Petersonacc71bb2009-01-02 13:43:32 +00001392 return;
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001393 if (ldata->canon_head != ldata->read_head)
Alan Cox4edf1822008-02-08 04:18:44 -08001394 set_bit(TTY_PUSH, &tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001395 c = __DISABLED_CHAR;
1396 goto handle_newline;
1397 }
1398 if ((c == EOL_CHAR(tty)) ||
1399 (c == EOL2_CHAR(tty) && L_IEXTEN(tty))) {
Joe Petersonacc71bb2009-01-02 13:43:32 +00001400 parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty))
1401 ? 1 : 0;
Peter Hurleyce741172013-06-15 09:14:20 -04001402 if (read_cnt(ldata) >= (N_TTY_BUF_SIZE - parmrk)) {
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001403 if (L_ECHO(tty))
1404 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001405 return;
1406 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001407 /*
1408 * XXX are EOL_CHAR and EOL2_CHAR echoed?!?
1409 */
1410 if (L_ECHO(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001411 /* Record the column of first canon char. */
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001412 if (ldata->canon_head == ldata->read_head)
Jiri Slaby57c94122012-10-18 22:26:43 +02001413 echo_set_canon_col(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001414 echo_char(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001415 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001416 }
1417 /*
1418 * XXX does PARMRK doubling happen for
1419 * EOL_CHAR and EOL2_CHAR?
1420 */
Joe Petersonacc71bb2009-01-02 13:43:32 +00001421 if (parmrk)
Jiri Slaby57c94122012-10-18 22:26:43 +02001422 put_tty_queue(c, ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001423
Alan Cox4edf1822008-02-08 04:18:44 -08001424handle_newline:
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001425 set_bit(ldata->read_head & (N_TTY_BUF_SIZE - 1), ldata->read_flags);
Peter Hurley6d76bd22013-06-15 09:14:26 -04001426 put_tty_queue(c, ldata);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001427 ldata->canon_head = ldata->read_head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001428 kill_fasync(&tty->fasync, SIGIO, POLL_IN);
1429 if (waitqueue_active(&tty->read_wait))
1430 wake_up_interruptible(&tty->read_wait);
1431 return;
1432 }
1433 }
Alan Cox4edf1822008-02-08 04:18:44 -08001434
Joe Petersonacc71bb2009-01-02 13:43:32 +00001435 parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0;
Peter Hurleyce741172013-06-15 09:14:20 -04001436 if (read_cnt(ldata) >= (N_TTY_BUF_SIZE - parmrk - 1)) {
Joe Petersonacc71bb2009-01-02 13:43:32 +00001437 /* beep if no space */
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001438 if (L_ECHO(tty))
1439 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001440 return;
1441 }
1442 if (L_ECHO(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001443 finish_erasing(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001444 if (c == '\n')
Jiri Slaby57c94122012-10-18 22:26:43 +02001445 echo_char_raw('\n', ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001446 else {
1447 /* Record the column of first canon char. */
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001448 if (ldata->canon_head == ldata->read_head)
Jiri Slaby57c94122012-10-18 22:26:43 +02001449 echo_set_canon_col(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001450 echo_char(c, tty);
1451 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001452 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001453 }
1454
Joe Petersonacc71bb2009-01-02 13:43:32 +00001455 if (parmrk)
Jiri Slaby57c94122012-10-18 22:26:43 +02001456 put_tty_queue(c, ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001457
Jiri Slaby57c94122012-10-18 22:26:43 +02001458 put_tty_queue(c, ldata);
Alan Cox4edf1822008-02-08 04:18:44 -08001459}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001460
Linus Torvalds1da177e2005-04-16 15:20:36 -07001461
1462/**
1463 * n_tty_write_wakeup - asynchronous I/O notifier
1464 * @tty: tty device
1465 *
1466 * Required for the ptys, serial driver etc. since processes
1467 * that attach themselves to the master and rely on ASYNC
1468 * IO must be woken up
1469 */
1470
1471static void n_tty_write_wakeup(struct tty_struct *tty)
1472{
Thomas Pfaffff8cb0f2009-01-02 13:47:13 +00001473 if (tty->fasync && test_and_clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001474 kill_fasync(&tty->fasync, SIGIO, POLL_OUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001475}
1476
1477/**
1478 * n_tty_receive_buf - data receive
1479 * @tty: terminal device
1480 * @cp: buffer
1481 * @fp: flag buffer
1482 * @count: characters
1483 *
1484 * Called by the terminal driver when a block of characters has
1485 * been received. This function must be called from soft contexts
1486 * not from interrupt context. The driver is responsible for making
1487 * calls one at a time and in order (or using flush_to_ldisc)
Peter Hurley6d76bd22013-06-15 09:14:26 -04001488 *
1489 * n_tty_receive_buf()/producer path:
1490 * claims non-exclusive termios_rwsem
1491 * publishes read_head and canon_head
Linus Torvalds1da177e2005-04-16 15:20:36 -07001492 */
Alan Cox4edf1822008-02-08 04:18:44 -08001493
Peter Hurley24a89d12013-06-15 09:14:15 -04001494static void __receive_buf(struct tty_struct *tty, const unsigned char *cp,
1495 char *fp, int count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001496{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001497 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001498 const unsigned char *p;
1499 char *f, flags = TTY_NORMAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001500 char buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001501
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001502 if (ldata->real_raw) {
Peter Hurleyd1913e32013-06-15 09:14:28 -04001503 size_t n, head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504
Peter Hurleyd1913e32013-06-15 09:14:28 -04001505 head = ldata->read_head & (N_TTY_BUF_SIZE - 1);
1506 n = N_TTY_BUF_SIZE - max(read_cnt(ldata), head);
1507 n = min_t(size_t, count, n);
1508 memcpy(read_buf_addr(ldata, head), cp, n);
1509 ldata->read_head += n;
1510 cp += n;
1511 count -= n;
1512
1513 head = ldata->read_head & (N_TTY_BUF_SIZE - 1);
1514 n = N_TTY_BUF_SIZE - max(read_cnt(ldata), head);
1515 n = min_t(size_t, count, n);
1516 memcpy(read_buf_addr(ldata, head), cp, n);
1517 ldata->read_head += n;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001518 } else {
Peter Hurleyd1913e32013-06-15 09:14:28 -04001519 int i;
1520
Alan Cox4edf1822008-02-08 04:18:44 -08001521 for (i = count, p = cp, f = fp; i; i--, p++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001522 if (f)
1523 flags = *f++;
1524 switch (flags) {
1525 case TTY_NORMAL:
1526 n_tty_receive_char(tty, *p);
1527 break;
1528 case TTY_BREAK:
1529 n_tty_receive_break(tty);
1530 break;
1531 case TTY_PARITY:
1532 case TTY_FRAME:
1533 n_tty_receive_parity_error(tty, *p);
1534 break;
1535 case TTY_OVERRUN:
1536 n_tty_receive_overrun(tty);
1537 break;
1538 default:
Alan Cox4edf1822008-02-08 04:18:44 -08001539 printk(KERN_ERR "%s: unknown flag %d\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001540 tty_name(tty, buf), flags);
1541 break;
1542 }
1543 }
Alan Coxf34d7a52008-04-30 00:54:13 -07001544 if (tty->ops->flush_chars)
1545 tty->ops->flush_chars(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001546 }
1547
Peter Hurleyce741172013-06-15 09:14:20 -04001548 if ((!ldata->icanon && (read_cnt(ldata) >= ldata->minimum_to_wake)) ||
hyc@symas.com26df6d12010-06-22 10:14:49 -07001549 L_EXTPROC(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001550 kill_fasync(&tty->fasync, SIGIO, POLL_IN);
1551 if (waitqueue_active(&tty->read_wait))
1552 wake_up_interruptible(&tty->read_wait);
1553 }
1554
Peter Hurley6367ca72013-06-15 09:14:33 -04001555 n_tty_check_throttle(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001556}
1557
Peter Hurley24a89d12013-06-15 09:14:15 -04001558static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
1559 char *fp, int count)
1560{
Peter Hurley9356b532013-06-15 09:14:24 -04001561 down_read(&tty->termios_rwsem);
Peter Hurley24a89d12013-06-15 09:14:15 -04001562 __receive_buf(tty, cp, fp, count);
Peter Hurley9356b532013-06-15 09:14:24 -04001563 up_read(&tty->termios_rwsem);
Peter Hurley24a89d12013-06-15 09:14:15 -04001564}
1565
1566static int n_tty_receive_buf2(struct tty_struct *tty, const unsigned char *cp,
1567 char *fp, int count)
1568{
1569 struct n_tty_data *ldata = tty->disc_data;
1570 int room;
1571
Peter Hurley9356b532013-06-15 09:14:24 -04001572 down_read(&tty->termios_rwsem);
1573
Peter Hurley24a89d12013-06-15 09:14:15 -04001574 tty->receive_room = room = receive_room(tty);
1575 if (!room)
1576 ldata->no_room = 1;
1577 count = min(count, room);
1578 if (count)
1579 __receive_buf(tty, cp, fp, count);
1580
Peter Hurley9356b532013-06-15 09:14:24 -04001581 up_read(&tty->termios_rwsem);
1582
Peter Hurley24a89d12013-06-15 09:14:15 -04001583 return count;
1584}
1585
Linus Torvalds1da177e2005-04-16 15:20:36 -07001586int is_ignored(int sig)
1587{
1588 return (sigismember(&current->blocked, sig) ||
Alan Cox4edf1822008-02-08 04:18:44 -08001589 current->sighand->action[sig-1].sa.sa_handler == SIG_IGN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001590}
1591
1592/**
1593 * n_tty_set_termios - termios data changed
1594 * @tty: terminal
1595 * @old: previous data
1596 *
1597 * Called by the tty layer when the user changes termios flags so
1598 * that the line discipline can plan ahead. This function cannot sleep
Alan Cox4edf1822008-02-08 04:18:44 -08001599 * and is protected from re-entry by the tty layer. The user is
Linus Torvalds1da177e2005-04-16 15:20:36 -07001600 * guaranteed that this function will not be re-entered or in progress
1601 * when the ldisc is closed.
Alan Cox17b82062008-10-13 10:45:06 +01001602 *
Peter Hurley6a1c0682013-06-15 09:14:23 -04001603 * Locking: Caller holds tty->termios_rwsem
Linus Torvalds1da177e2005-04-16 15:20:36 -07001604 */
Alan Cox4edf1822008-02-08 04:18:44 -08001605
1606static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001607{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001608 struct n_tty_data *ldata = tty->disc_data;
Alan Cox47afa7a2008-10-13 10:44:17 +01001609 int canon_change = 1;
Alan Cox47afa7a2008-10-13 10:44:17 +01001610
1611 if (old)
Alan Coxadc8d742012-07-14 15:31:47 +01001612 canon_change = (old->c_lflag ^ tty->termios.c_lflag) & ICANON;
Alan Cox47afa7a2008-10-13 10:44:17 +01001613 if (canon_change) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001614 bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001615 ldata->canon_head = ldata->read_tail;
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001616 ldata->erasing = 0;
Peter Hurley6f9b0282013-06-15 09:14:27 -04001617 ldata->lnext = 0;
Alan Cox47afa7a2008-10-13 10:44:17 +01001618 }
1619
Peter Hurleyce741172013-06-15 09:14:20 -04001620 if (canon_change && !L_ICANON(tty) && read_cnt(ldata))
Alan Cox47afa7a2008-10-13 10:44:17 +01001621 wake_up_interruptible(&tty->read_wait);
Alan Cox4edf1822008-02-08 04:18:44 -08001622
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001623 ldata->icanon = (L_ICANON(tty) != 0);
Peter Hurley582f5592013-05-17 12:49:48 -04001624
Linus Torvalds1da177e2005-04-16 15:20:36 -07001625 if (I_ISTRIP(tty) || I_IUCLC(tty) || I_IGNCR(tty) ||
1626 I_ICRNL(tty) || I_INLCR(tty) || L_ICANON(tty) ||
1627 I_IXON(tty) || L_ISIG(tty) || L_ECHO(tty) ||
1628 I_PARMRK(tty)) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001629 bitmap_zero(ldata->process_char_map, 256);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001630
1631 if (I_IGNCR(tty) || I_ICRNL(tty))
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001632 set_bit('\r', ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001633 if (I_INLCR(tty))
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001634 set_bit('\n', ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001635
1636 if (L_ICANON(tty)) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001637 set_bit(ERASE_CHAR(tty), ldata->process_char_map);
1638 set_bit(KILL_CHAR(tty), ldata->process_char_map);
1639 set_bit(EOF_CHAR(tty), ldata->process_char_map);
1640 set_bit('\n', ldata->process_char_map);
1641 set_bit(EOL_CHAR(tty), ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001642 if (L_IEXTEN(tty)) {
1643 set_bit(WERASE_CHAR(tty),
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001644 ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001645 set_bit(LNEXT_CHAR(tty),
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001646 ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001647 set_bit(EOL2_CHAR(tty),
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001648 ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001649 if (L_ECHO(tty))
1650 set_bit(REPRINT_CHAR(tty),
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001651 ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001652 }
1653 }
1654 if (I_IXON(tty)) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001655 set_bit(START_CHAR(tty), ldata->process_char_map);
1656 set_bit(STOP_CHAR(tty), ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001657 }
1658 if (L_ISIG(tty)) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001659 set_bit(INTR_CHAR(tty), ldata->process_char_map);
1660 set_bit(QUIT_CHAR(tty), ldata->process_char_map);
1661 set_bit(SUSP_CHAR(tty), ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001662 }
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001663 clear_bit(__DISABLED_CHAR, ldata->process_char_map);
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001664 ldata->raw = 0;
1665 ldata->real_raw = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001666 } else {
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001667 ldata->raw = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001668 if ((I_IGNBRK(tty) || (!I_BRKINT(tty) && !I_PARMRK(tty))) &&
1669 (I_IGNPAR(tty) || !I_INPCK(tty)) &&
1670 (tty->driver->flags & TTY_DRIVER_REAL_RAW))
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001671 ldata->real_raw = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001672 else
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001673 ldata->real_raw = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001674 }
Linus Torvalds55db4c62011-06-04 06:33:24 +09001675 n_tty_set_room(tty);
Wang YanQingdab73b42013-05-09 14:16:47 +08001676 /*
1677 * Fix tty hang when I_IXON(tty) is cleared, but the tty
1678 * been stopped by STOP_CHAR(tty) before it.
1679 */
1680 if (!I_IXON(tty) && old && (old->c_iflag & IXON) && !tty->flow_stopped) {
1681 start_tty(tty);
1682 }
1683
Alan Coxf34d7a52008-04-30 00:54:13 -07001684 /* The termios change make the tty ready for I/O */
1685 wake_up_interruptible(&tty->write_wait);
1686 wake_up_interruptible(&tty->read_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001687}
1688
1689/**
1690 * n_tty_close - close the ldisc for this tty
1691 * @tty: device
1692 *
Alan Cox4edf1822008-02-08 04:18:44 -08001693 * Called from the terminal layer when this line discipline is
1694 * being shut down, either because of a close or becsuse of a
Linus Torvalds1da177e2005-04-16 15:20:36 -07001695 * discipline change. The function will not be called while other
1696 * ldisc methods are in progress.
1697 */
Alan Cox4edf1822008-02-08 04:18:44 -08001698
Linus Torvalds1da177e2005-04-16 15:20:36 -07001699static void n_tty_close(struct tty_struct *tty)
1700{
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001701 struct n_tty_data *ldata = tty->disc_data;
1702
Peter Hurley79901312013-03-11 16:44:23 -04001703 if (tty->link)
1704 n_tty_packet_mode_flush(tty);
1705
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001706 kfree(ldata->read_buf);
1707 kfree(ldata->echo_buf);
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001708 kfree(ldata);
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001709 tty->disc_data = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001710}
1711
1712/**
1713 * n_tty_open - open an ldisc
1714 * @tty: terminal to open
1715 *
Alan Cox4edf1822008-02-08 04:18:44 -08001716 * Called when this line discipline is being attached to the
Linus Torvalds1da177e2005-04-16 15:20:36 -07001717 * terminal device. Can sleep. Called serialized so that no
1718 * other events will occur in parallel. No further open will occur
1719 * until a close.
1720 */
1721
1722static int n_tty_open(struct tty_struct *tty)
1723{
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001724 struct n_tty_data *ldata;
1725
1726 ldata = kzalloc(sizeof(*ldata), GFP_KERNEL);
1727 if (!ldata)
1728 goto err;
1729
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001730 ldata->overrun_time = jiffies;
Jiri Slabybddc7152012-10-18 22:26:42 +02001731 mutex_init(&ldata->atomic_read_lock);
1732 mutex_init(&ldata->output_lock);
1733 mutex_init(&ldata->echo_lock);
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001734
Joe Petersona88a69c2009-01-02 13:40:53 +00001735 /* These are ugly. Currently a malloc failure here can panic */
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001736 ldata->read_buf = kzalloc(N_TTY_BUF_SIZE, GFP_KERNEL);
1737 ldata->echo_buf = kzalloc(N_TTY_BUF_SIZE, GFP_KERNEL);
1738 if (!ldata->read_buf || !ldata->echo_buf)
Jiri Slabyb91939f2012-10-18 22:26:35 +02001739 goto err_free_bufs;
Alan Cox0b4068a2009-06-11 13:05:49 +01001740
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001741 tty->disc_data = ldata;
Peter Hurleyb66f4fa2013-03-11 16:44:32 -04001742 reset_buffer_flags(tty->disc_data);
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001743 ldata->column = 0;
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04001744 ldata->minimum_to_wake = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001745 tty->closing = 0;
Peter Hurleyb66f4fa2013-03-11 16:44:32 -04001746 /* indicate buffer work may resume */
1747 clear_bit(TTY_LDISC_HALTED, &tty->flags);
1748 n_tty_set_termios(tty, NULL);
1749 tty_unthrottle(tty);
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001750
Linus Torvalds1da177e2005-04-16 15:20:36 -07001751 return 0;
Jiri Slabyb91939f2012-10-18 22:26:35 +02001752err_free_bufs:
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001753 kfree(ldata->read_buf);
1754 kfree(ldata->echo_buf);
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001755 kfree(ldata);
1756err:
Jiri Slabyb91939f2012-10-18 22:26:35 +02001757 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001758}
1759
1760static inline int input_available_p(struct tty_struct *tty, int amt)
1761{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001762 struct n_tty_data *ldata = tty->disc_data;
1763
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001764 if (ldata->icanon && !L_EXTPROC(tty)) {
Peter Hurleya73d3d62013-06-15 09:14:25 -04001765 if (ldata->canon_head != ldata->read_tail)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001766 return 1;
Peter Hurleyce741172013-06-15 09:14:20 -04001767 } else if (read_cnt(ldata) >= (amt ? amt : 1))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001768 return 1;
1769
1770 return 0;
1771}
1772
1773/**
Thorsten Wißmannbbd20752011-12-08 17:47:33 +01001774 * copy_from_read_buf - copy read data directly
Linus Torvalds1da177e2005-04-16 15:20:36 -07001775 * @tty: terminal device
1776 * @b: user data
1777 * @nr: size of data
1778 *
Alan Cox11a96d12008-10-13 10:46:24 +01001779 * Helper function to speed up n_tty_read. It is only called when
Linus Torvalds1da177e2005-04-16 15:20:36 -07001780 * ICANON is off; it copies characters straight from the tty queue to
1781 * user space directly. It can be profitably called twice; once to
1782 * drain the space from the tail pointer to the (physical) end of the
1783 * buffer, and once to drain the space from the (physical) beginning of
1784 * the buffer to head pointer.
1785 *
Jiri Slabybddc7152012-10-18 22:26:42 +02001786 * Called under the ldata->atomic_read_lock sem
Linus Torvalds1da177e2005-04-16 15:20:36 -07001787 *
Peter Hurley6d76bd22013-06-15 09:14:26 -04001788 * n_tty_read()/consumer path:
1789 * caller holds non-exclusive termios_rwsem
1790 * read_tail published
Linus Torvalds1da177e2005-04-16 15:20:36 -07001791 */
Alan Cox4edf1822008-02-08 04:18:44 -08001792
Alan Cox33f0f882006-01-09 20:54:13 -08001793static int copy_from_read_buf(struct tty_struct *tty,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001794 unsigned char __user **b,
1795 size_t *nr)
1796
1797{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001798 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001799 int retval;
1800 size_t n;
Jiri Slaby3fa10cc2012-04-26 20:13:00 +02001801 bool is_eof;
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001802 size_t tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001803
1804 retval = 0;
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001805 n = min(read_cnt(ldata), N_TTY_BUF_SIZE - tail);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001806 n = min(*nr, n);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001807 if (n) {
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001808 retval = copy_to_user(*b, read_buf_addr(ldata, tail), n);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001809 n -= retval;
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001810 is_eof = n == 1 && read_buf(ldata, tail) == EOF_CHAR(tty);
1811 tty_audit_add_data(tty, read_buf_addr(ldata, tail), n,
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001812 ldata->icanon);
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001813 ldata->read_tail += n;
hyc@symas.com26df6d12010-06-22 10:14:49 -07001814 /* Turn single EOF into zero-length read */
Peter Hurleyce741172013-06-15 09:14:20 -04001815 if (L_EXTPROC(tty) && ldata->icanon && is_eof && !read_cnt(ldata))
Jiri Slaby3fa10cc2012-04-26 20:13:00 +02001816 n = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001817 *b += n;
1818 *nr -= n;
1819 }
1820 return retval;
1821}
1822
Peter Hurley88bb0de2013-06-15 09:14:16 -04001823/**
Peter Hurley32f13522013-06-15 09:14:17 -04001824 * canon_copy_from_read_buf - copy read data in canonical mode
Peter Hurley88bb0de2013-06-15 09:14:16 -04001825 * @tty: terminal device
1826 * @b: user data
1827 * @nr: size of data
1828 *
1829 * Helper function for n_tty_read. It is only called when ICANON is on;
Peter Hurley32f13522013-06-15 09:14:17 -04001830 * it copies one line of input up to and including the line-delimiting
1831 * character into the user-space buffer.
Peter Hurley88bb0de2013-06-15 09:14:16 -04001832 *
1833 * Called under the atomic_read_lock mutex
Peter Hurley6d76bd22013-06-15 09:14:26 -04001834 *
1835 * n_tty_read()/consumer path:
1836 * caller holds non-exclusive termios_rwsem
1837 * read_tail published
Peter Hurley88bb0de2013-06-15 09:14:16 -04001838 */
1839
Peter Hurley32f13522013-06-15 09:14:17 -04001840static int canon_copy_from_read_buf(struct tty_struct *tty,
1841 unsigned char __user **b,
1842 size_t *nr)
Peter Hurley88bb0de2013-06-15 09:14:16 -04001843{
1844 struct n_tty_data *ldata = tty->disc_data;
Peter Hurley32f13522013-06-15 09:14:17 -04001845 size_t n, size, more, c;
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001846 size_t eol;
1847 size_t tail;
1848 int ret, found = 0;
Peter Hurley88bb0de2013-06-15 09:14:16 -04001849
1850 /* N.B. avoid overrun if nr == 0 */
Peter Hurleyce741172013-06-15 09:14:20 -04001851 n = min(*nr, read_cnt(ldata));
Peter Hurley6d76bd22013-06-15 09:14:26 -04001852 if (!n)
Peter Hurley32f13522013-06-15 09:14:17 -04001853 return 0;
Peter Hurley88bb0de2013-06-15 09:14:16 -04001854
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001855 tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1);
Peter Hurley32f13522013-06-15 09:14:17 -04001856 size = min_t(size_t, tail + n, N_TTY_BUF_SIZE);
1857
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001858 n_tty_trace("%s: nr:%zu tail:%zu n:%zu size:%zu\n",
Peter Hurley32f13522013-06-15 09:14:17 -04001859 __func__, *nr, tail, n, size);
1860
1861 eol = find_next_bit(ldata->read_flags, size, tail);
1862 more = n - (size - tail);
1863 if (eol == N_TTY_BUF_SIZE && more) {
1864 /* scan wrapped without finding set bit */
1865 eol = find_next_bit(ldata->read_flags, more, 0);
1866 if (eol != more)
1867 found = 1;
1868 } else if (eol != size)
1869 found = 1;
1870
1871 size = N_TTY_BUF_SIZE - tail;
1872 n = (found + eol + size) & (N_TTY_BUF_SIZE - 1);
1873 c = n;
1874
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001875 if (found && read_buf(ldata, eol) == __DISABLED_CHAR)
Peter Hurley32f13522013-06-15 09:14:17 -04001876 n--;
1877
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001878 n_tty_trace("%s: eol:%zu found:%d n:%zu c:%zu size:%zu more:%zu\n",
Peter Hurley32f13522013-06-15 09:14:17 -04001879 __func__, eol, found, n, c, size, more);
1880
Peter Hurley32f13522013-06-15 09:14:17 -04001881 if (n > size) {
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001882 ret = copy_to_user(*b, read_buf_addr(ldata, tail), size);
Peter Hurley32f13522013-06-15 09:14:17 -04001883 if (ret)
1884 return -EFAULT;
1885 ret = copy_to_user(*b + size, ldata->read_buf, n - size);
1886 } else
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001887 ret = copy_to_user(*b, read_buf_addr(ldata, tail), n);
Peter Hurley32f13522013-06-15 09:14:17 -04001888
1889 if (ret)
1890 return -EFAULT;
1891 *b += n;
1892 *nr -= n;
1893
Peter Hurleya73d3d62013-06-15 09:14:25 -04001894 if (found)
Peter Hurley6d76bd22013-06-15 09:14:26 -04001895 clear_bit(eol, ldata->read_flags);
1896 smp_mb__after_clear_bit();
1897 ldata->read_tail += c;
Peter Hurley88bb0de2013-06-15 09:14:16 -04001898
Peter Hurley32f13522013-06-15 09:14:17 -04001899 if (found)
1900 tty_audit_push(tty);
Peter Hurley88bb0de2013-06-15 09:14:16 -04001901 return 0;
1902}
1903
Al Virocc4191d2008-03-29 03:08:48 +00001904extern ssize_t redirected_tty_write(struct file *, const char __user *,
Alan Cox4edf1822008-02-08 04:18:44 -08001905 size_t, loff_t *);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001906
1907/**
1908 * job_control - check job control
1909 * @tty: tty
1910 * @file: file handle
1911 *
1912 * Perform job control management checks on this file/tty descriptor
Alan Cox4edf1822008-02-08 04:18:44 -08001913 * and if appropriate send any needed signals and return a negative
Linus Torvalds1da177e2005-04-16 15:20:36 -07001914 * error code if action should be taken.
Alan Cox04f378b2008-04-30 00:53:29 -07001915 *
Peter Hurley01a5e442013-03-06 08:38:20 -05001916 * Locking: redirected write test is safe
1917 * current->signal->tty check is safe
1918 * ctrl_lock to safely reference tty->pgrp
Linus Torvalds1da177e2005-04-16 15:20:36 -07001919 */
Alan Cox4edf1822008-02-08 04:18:44 -08001920
Linus Torvalds1da177e2005-04-16 15:20:36 -07001921static int job_control(struct tty_struct *tty, struct file *file)
1922{
1923 /* Job control check -- must be done at start and after
1924 every sleep (POSIX.1 7.1.1.4). */
1925 /* NOTE: not yet done after every sleep pending a thorough
1926 check of the logic of this change. -- jlc */
1927 /* don't stop on /dev/console */
Peter Hurley01a5e442013-03-06 08:38:20 -05001928 if (file->f_op->write == redirected_tty_write ||
1929 current->signal->tty != tty)
1930 return 0;
1931
1932 spin_lock_irq(&tty->ctrl_lock);
1933 if (!tty->pgrp)
1934 printk(KERN_ERR "n_tty_read: no tty->pgrp!\n");
1935 else if (task_pgrp(current) != tty->pgrp) {
1936 spin_unlock_irq(&tty->ctrl_lock);
1937 if (is_ignored(SIGTTIN) || is_current_pgrp_orphaned())
1938 return -EIO;
1939 kill_pgrp(task_pgrp(current), SIGTTIN, 1);
1940 set_thread_flag(TIF_SIGPENDING);
1941 return -ERESTARTSYS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001942 }
Peter Hurley01a5e442013-03-06 08:38:20 -05001943 spin_unlock_irq(&tty->ctrl_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001944 return 0;
1945}
Alan Cox4edf1822008-02-08 04:18:44 -08001946
Linus Torvalds1da177e2005-04-16 15:20:36 -07001947
1948/**
Alan Cox11a96d12008-10-13 10:46:24 +01001949 * n_tty_read - read function for tty
Linus Torvalds1da177e2005-04-16 15:20:36 -07001950 * @tty: tty device
1951 * @file: file object
1952 * @buf: userspace buffer pointer
1953 * @nr: size of I/O
1954 *
1955 * Perform reads for the line discipline. We are guaranteed that the
1956 * line discipline will not be closed under us but we may get multiple
1957 * parallel readers and must handle this ourselves. We may also get
1958 * a hangup. Always called in user context, may sleep.
1959 *
1960 * This code must be sure never to sleep through a hangup.
Peter Hurley6d76bd22013-06-15 09:14:26 -04001961 *
1962 * n_tty_read()/consumer path:
1963 * claims non-exclusive termios_rwsem
1964 * publishes read_tail
Linus Torvalds1da177e2005-04-16 15:20:36 -07001965 */
Alan Cox4edf1822008-02-08 04:18:44 -08001966
Alan Cox11a96d12008-10-13 10:46:24 +01001967static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001968 unsigned char __user *buf, size_t nr)
1969{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001970 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001971 unsigned char __user *b = buf;
1972 DECLARE_WAITQUEUE(wait, current);
1973 int c;
1974 int minimum, time;
1975 ssize_t retval = 0;
1976 ssize_t size;
1977 long timeout;
1978 unsigned long flags;
Alan Cox04f378b2008-04-30 00:53:29 -07001979 int packet;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001980
1981do_it_again:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001982 c = job_control(tty, file);
Alan Cox4edf1822008-02-08 04:18:44 -08001983 if (c < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001984 return c;
Alan Cox4edf1822008-02-08 04:18:44 -08001985
Peter Hurley9356b532013-06-15 09:14:24 -04001986 down_read(&tty->termios_rwsem);
1987
Linus Torvalds1da177e2005-04-16 15:20:36 -07001988 minimum = time = 0;
1989 timeout = MAX_SCHEDULE_TIMEOUT;
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001990 if (!ldata->icanon) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001991 minimum = MIN_CHAR(tty);
1992 if (minimum) {
Peter Hurleya6e54312013-06-15 07:28:29 -04001993 time = (HZ / 10) * TIME_CHAR(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001994 if (time)
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04001995 ldata->minimum_to_wake = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001996 else if (!waitqueue_active(&tty->read_wait) ||
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04001997 (ldata->minimum_to_wake > minimum))
1998 ldata->minimum_to_wake = minimum;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001999 } else {
Peter Hurleya6e54312013-06-15 07:28:29 -04002000 timeout = (HZ / 10) * TIME_CHAR(tty);
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04002001 ldata->minimum_to_wake = minimum = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002002 }
2003 }
2004
2005 /*
2006 * Internal serialization of reads.
2007 */
2008 if (file->f_flags & O_NONBLOCK) {
Peter Hurley9356b532013-06-15 09:14:24 -04002009 if (!mutex_trylock(&ldata->atomic_read_lock)) {
2010 up_read(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002011 return -EAGAIN;
Peter Hurley9356b532013-06-15 09:14:24 -04002012 }
Alan Cox4edf1822008-02-08 04:18:44 -08002013 } else {
Peter Hurley9356b532013-06-15 09:14:24 -04002014 if (mutex_lock_interruptible(&ldata->atomic_read_lock)) {
2015 up_read(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002016 return -ERESTARTSYS;
Peter Hurley9356b532013-06-15 09:14:24 -04002017 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002018 }
Alan Cox04f378b2008-04-30 00:53:29 -07002019 packet = tty->packet;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002020
2021 add_wait_queue(&tty->read_wait, &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002022 while (nr) {
2023 /* First test for status change. */
Alan Cox04f378b2008-04-30 00:53:29 -07002024 if (packet && tty->link->ctrl_status) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002025 unsigned char cs;
2026 if (b != buf)
2027 break;
Alan Cox04f378b2008-04-30 00:53:29 -07002028 spin_lock_irqsave(&tty->link->ctrl_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002029 cs = tty->link->ctrl_status;
2030 tty->link->ctrl_status = 0;
Alan Cox04f378b2008-04-30 00:53:29 -07002031 spin_unlock_irqrestore(&tty->link->ctrl_lock, flags);
Miloslav Trmac522ed772007-07-15 23:40:56 -07002032 if (tty_put_user(tty, cs, b++)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002033 retval = -EFAULT;
2034 b--;
2035 break;
2036 }
2037 nr--;
2038 break;
2039 }
2040 /* This statement must be first before checking for input
2041 so that any interrupt will set the state back to
2042 TASK_RUNNING. */
2043 set_current_state(TASK_INTERRUPTIBLE);
Alan Cox4edf1822008-02-08 04:18:44 -08002044
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04002045 if (((minimum - (b - buf)) < ldata->minimum_to_wake) &&
Linus Torvalds1da177e2005-04-16 15:20:36 -07002046 ((minimum - (b - buf)) >= 1))
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04002047 ldata->minimum_to_wake = (minimum - (b - buf));
Alan Cox4edf1822008-02-08 04:18:44 -08002048
Linus Torvalds1da177e2005-04-16 15:20:36 -07002049 if (!input_available_p(tty, 0)) {
2050 if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) {
2051 retval = -EIO;
2052 break;
2053 }
2054 if (tty_hung_up_p(file))
2055 break;
2056 if (!timeout)
2057 break;
2058 if (file->f_flags & O_NONBLOCK) {
2059 retval = -EAGAIN;
2060 break;
2061 }
2062 if (signal_pending(current)) {
2063 retval = -ERESTARTSYS;
2064 break;
2065 }
Linus Torvalds55db4c62011-06-04 06:33:24 +09002066 n_tty_set_room(tty);
Peter Hurley9356b532013-06-15 09:14:24 -04002067 up_read(&tty->termios_rwsem);
2068
Linus Torvalds1da177e2005-04-16 15:20:36 -07002069 timeout = schedule_timeout(timeout);
Peter Hurley9356b532013-06-15 09:14:24 -04002070
2071 down_read(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002072 continue;
2073 }
2074 __set_current_state(TASK_RUNNING);
2075
2076 /* Deal with packet mode. */
Alan Cox04f378b2008-04-30 00:53:29 -07002077 if (packet && b == buf) {
Miloslav Trmac522ed772007-07-15 23:40:56 -07002078 if (tty_put_user(tty, TIOCPKT_DATA, b++)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002079 retval = -EFAULT;
2080 b--;
2081 break;
2082 }
2083 nr--;
2084 }
2085
Jiri Slaby53c5ee22012-10-18 22:26:39 +02002086 if (ldata->icanon && !L_EXTPROC(tty)) {
Peter Hurley32f13522013-06-15 09:14:17 -04002087 retval = canon_copy_from_read_buf(tty, &b, &nr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002088 if (retval)
2089 break;
2090 } else {
2091 int uncopied;
Alan Cox04f378b2008-04-30 00:53:29 -07002092 /* The copy function takes the read lock and handles
2093 locking internally for this case */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002094 uncopied = copy_from_read_buf(tty, &b, &nr);
2095 uncopied += copy_from_read_buf(tty, &b, &nr);
2096 if (uncopied) {
2097 retval = -EFAULT;
2098 break;
2099 }
2100 }
2101
Peter Hurley6367ca72013-06-15 09:14:33 -04002102 n_tty_check_unthrottle(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002103
2104 if (b - buf >= minimum)
2105 break;
2106 if (time)
2107 timeout = time;
2108 }
Jiri Slabybddc7152012-10-18 22:26:42 +02002109 mutex_unlock(&ldata->atomic_read_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002110 remove_wait_queue(&tty->read_wait, &wait);
2111
2112 if (!waitqueue_active(&tty->read_wait))
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04002113 ldata->minimum_to_wake = minimum;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002114
2115 __set_current_state(TASK_RUNNING);
2116 size = b - buf;
2117 if (size) {
2118 retval = size;
2119 if (nr)
Alan Cox4edf1822008-02-08 04:18:44 -08002120 clear_bit(TTY_PUSH, &tty->flags);
Peter Hurley9356b532013-06-15 09:14:24 -04002121 } else if (test_and_clear_bit(TTY_PUSH, &tty->flags)) {
2122 up_read(&tty->termios_rwsem);
Thorsten Wißmannbbd20752011-12-08 17:47:33 +01002123 goto do_it_again;
Peter Hurley9356b532013-06-15 09:14:24 -04002124 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002125
Linus Torvalds55db4c62011-06-04 06:33:24 +09002126 n_tty_set_room(tty);
Peter Hurley9356b532013-06-15 09:14:24 -04002127 up_read(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002128 return retval;
2129}
2130
2131/**
Alan Cox11a96d12008-10-13 10:46:24 +01002132 * n_tty_write - write function for tty
Linus Torvalds1da177e2005-04-16 15:20:36 -07002133 * @tty: tty device
2134 * @file: file object
2135 * @buf: userspace buffer pointer
2136 * @nr: size of I/O
2137 *
Joe Petersona88a69c2009-01-02 13:40:53 +00002138 * Write function of the terminal device. This is serialized with
Linus Torvalds1da177e2005-04-16 15:20:36 -07002139 * respect to other write callers but not to termios changes, reads
Joe Petersona88a69c2009-01-02 13:40:53 +00002140 * and other such events. Since the receive code will echo characters,
2141 * thus calling driver write methods, the output_lock is used in
2142 * the output processing functions called here as well as in the
2143 * echo processing function to protect the column state and space
2144 * left in the buffer.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002145 *
2146 * This code must be sure never to sleep through a hangup.
Joe Petersona88a69c2009-01-02 13:40:53 +00002147 *
2148 * Locking: output_lock to protect column state and space left
2149 * (note that the process_output*() functions take this
2150 * lock themselves)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151 */
Alan Cox4edf1822008-02-08 04:18:44 -08002152
Alan Cox11a96d12008-10-13 10:46:24 +01002153static ssize_t n_tty_write(struct tty_struct *tty, struct file *file,
Joe Petersona88a69c2009-01-02 13:40:53 +00002154 const unsigned char *buf, size_t nr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002155{
2156 const unsigned char *b = buf;
2157 DECLARE_WAITQUEUE(wait, current);
2158 int c;
2159 ssize_t retval = 0;
2160
2161 /* Job control check -- must be done at start (POSIX.1 7.1.1.4). */
2162 if (L_TOSTOP(tty) && file->f_op->write != redirected_tty_write) {
2163 retval = tty_check_change(tty);
2164 if (retval)
2165 return retval;
2166 }
2167
Peter Hurley9356b532013-06-15 09:14:24 -04002168 down_read(&tty->termios_rwsem);
2169
Joe Petersona88a69c2009-01-02 13:40:53 +00002170 /* Write out any echoed characters that are still pending */
2171 process_echoes(tty);
Alan Cox300a6202009-01-02 13:41:04 +00002172
Linus Torvalds1da177e2005-04-16 15:20:36 -07002173 add_wait_queue(&tty->write_wait, &wait);
2174 while (1) {
2175 set_current_state(TASK_INTERRUPTIBLE);
2176 if (signal_pending(current)) {
2177 retval = -ERESTARTSYS;
2178 break;
2179 }
2180 if (tty_hung_up_p(file) || (tty->link && !tty->link->count)) {
2181 retval = -EIO;
2182 break;
2183 }
Peter Hurley582f5592013-05-17 12:49:48 -04002184 if (O_OPOST(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002185 while (nr > 0) {
Joe Petersona88a69c2009-01-02 13:40:53 +00002186 ssize_t num = process_output_block(tty, b, nr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002187 if (num < 0) {
2188 if (num == -EAGAIN)
2189 break;
2190 retval = num;
2191 goto break_out;
2192 }
2193 b += num;
2194 nr -= num;
2195 if (nr == 0)
2196 break;
2197 c = *b;
Joe Petersona88a69c2009-01-02 13:40:53 +00002198 if (process_output(c, tty) < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002199 break;
2200 b++; nr--;
2201 }
Alan Coxf34d7a52008-04-30 00:54:13 -07002202 if (tty->ops->flush_chars)
2203 tty->ops->flush_chars(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002204 } else {
Roman Zippeld6afe272005-07-07 17:56:55 -07002205 while (nr > 0) {
Alan Coxf34d7a52008-04-30 00:54:13 -07002206 c = tty->ops->write(tty, b, nr);
Roman Zippeld6afe272005-07-07 17:56:55 -07002207 if (c < 0) {
2208 retval = c;
2209 goto break_out;
2210 }
2211 if (!c)
2212 break;
2213 b += c;
2214 nr -= c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002215 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002216 }
2217 if (!nr)
2218 break;
2219 if (file->f_flags & O_NONBLOCK) {
2220 retval = -EAGAIN;
2221 break;
2222 }
Peter Hurley9356b532013-06-15 09:14:24 -04002223 up_read(&tty->termios_rwsem);
2224
Linus Torvalds1da177e2005-04-16 15:20:36 -07002225 schedule();
Peter Hurley9356b532013-06-15 09:14:24 -04002226
2227 down_read(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002228 }
2229break_out:
2230 __set_current_state(TASK_RUNNING);
2231 remove_wait_queue(&tty->write_wait, &wait);
Thomas Pfaffff8cb0f2009-01-02 13:47:13 +00002232 if (b - buf != nr && tty->fasync)
2233 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
Peter Hurley9356b532013-06-15 09:14:24 -04002234 up_read(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002235 return (b - buf) ? b - buf : retval;
2236}
2237
2238/**
Alan Cox11a96d12008-10-13 10:46:24 +01002239 * n_tty_poll - poll method for N_TTY
Linus Torvalds1da177e2005-04-16 15:20:36 -07002240 * @tty: terminal device
2241 * @file: file accessing it
2242 * @wait: poll table
2243 *
2244 * Called when the line discipline is asked to poll() for data or
2245 * for special events. This code is not serialized with respect to
2246 * other events save open/close.
2247 *
2248 * This code must be sure never to sleep through a hangup.
2249 * Called without the kernel lock held - fine
Linus Torvalds1da177e2005-04-16 15:20:36 -07002250 */
Alan Cox4edf1822008-02-08 04:18:44 -08002251
Alan Cox11a96d12008-10-13 10:46:24 +01002252static unsigned int n_tty_poll(struct tty_struct *tty, struct file *file,
Alan Cox4edf1822008-02-08 04:18:44 -08002253 poll_table *wait)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002254{
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04002255 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002256 unsigned int mask = 0;
2257
2258 poll_wait(file, &tty->read_wait, wait);
2259 poll_wait(file, &tty->write_wait, wait);
2260 if (input_available_p(tty, TIME_CHAR(tty) ? 0 : MIN_CHAR(tty)))
2261 mask |= POLLIN | POLLRDNORM;
2262 if (tty->packet && tty->link->ctrl_status)
2263 mask |= POLLPRI | POLLIN | POLLRDNORM;
2264 if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
2265 mask |= POLLHUP;
2266 if (tty_hung_up_p(file))
2267 mask |= POLLHUP;
2268 if (!(mask & (POLLHUP | POLLIN | POLLRDNORM))) {
2269 if (MIN_CHAR(tty) && !TIME_CHAR(tty))
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04002270 ldata->minimum_to_wake = MIN_CHAR(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002271 else
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04002272 ldata->minimum_to_wake = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002273 }
Alan Coxf34d7a52008-04-30 00:54:13 -07002274 if (tty->ops->write && !tty_is_writelocked(tty) &&
2275 tty_chars_in_buffer(tty) < WAKEUP_CHARS &&
2276 tty_write_room(tty) > 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002277 mask |= POLLOUT | POLLWRNORM;
2278 return mask;
2279}
2280
Jiri Slaby57c94122012-10-18 22:26:43 +02002281static unsigned long inq_canon(struct n_tty_data *ldata)
Alan Cox47afa7a2008-10-13 10:44:17 +01002282{
Peter Hurleybc5a5e32013-06-15 09:14:21 -04002283 size_t nr, head, tail;
Alan Cox47afa7a2008-10-13 10:44:17 +01002284
Peter Hurleya73d3d62013-06-15 09:14:25 -04002285 if (ldata->canon_head == ldata->read_tail)
Alan Cox47afa7a2008-10-13 10:44:17 +01002286 return 0;
Jiri Slabyba2e68a2012-10-18 22:26:41 +02002287 head = ldata->canon_head;
2288 tail = ldata->read_tail;
Peter Hurleybc5a5e32013-06-15 09:14:21 -04002289 nr = head - tail;
Alan Cox47afa7a2008-10-13 10:44:17 +01002290 /* Skip EOF-chars.. */
2291 while (head != tail) {
Peter Hurleybc5a5e32013-06-15 09:14:21 -04002292 if (test_bit(tail & (N_TTY_BUF_SIZE - 1), ldata->read_flags) &&
2293 read_buf(ldata, tail) == __DISABLED_CHAR)
Alan Cox47afa7a2008-10-13 10:44:17 +01002294 nr--;
Peter Hurleybc5a5e32013-06-15 09:14:21 -04002295 tail++;
Alan Cox47afa7a2008-10-13 10:44:17 +01002296 }
2297 return nr;
2298}
2299
2300static int n_tty_ioctl(struct tty_struct *tty, struct file *file,
2301 unsigned int cmd, unsigned long arg)
2302{
Jiri Slabyba2e68a2012-10-18 22:26:41 +02002303 struct n_tty_data *ldata = tty->disc_data;
Alan Cox47afa7a2008-10-13 10:44:17 +01002304 int retval;
2305
2306 switch (cmd) {
2307 case TIOCOUTQ:
2308 return put_user(tty_chars_in_buffer(tty), (int __user *) arg);
2309 case TIOCINQ:
Peter Hurley6d76bd22013-06-15 09:14:26 -04002310 down_write(&tty->termios_rwsem);
Alan Cox47afa7a2008-10-13 10:44:17 +01002311 if (L_ICANON(tty))
Jiri Slaby57c94122012-10-18 22:26:43 +02002312 retval = inq_canon(ldata);
Peter Hurley6d76bd22013-06-15 09:14:26 -04002313 else
2314 retval = read_cnt(ldata);
2315 up_write(&tty->termios_rwsem);
Alan Cox47afa7a2008-10-13 10:44:17 +01002316 return put_user(retval, (unsigned int __user *) arg);
2317 default:
2318 return n_tty_ioctl_helper(tty, file, cmd, arg);
2319 }
2320}
2321
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04002322static void n_tty_fasync(struct tty_struct *tty, int on)
2323{
2324 struct n_tty_data *ldata = tty->disc_data;
2325
2326 if (!waitqueue_active(&tty->read_wait)) {
2327 if (on)
2328 ldata->minimum_to_wake = 1;
2329 else if (!tty->fasync)
2330 ldata->minimum_to_wake = N_TTY_BUF_SIZE;
2331 }
2332}
2333
Alan Coxa352def2008-07-16 21:53:12 +01002334struct tty_ldisc_ops tty_ldisc_N_TTY = {
Paul Fulghume10cc1d2007-05-10 22:22:50 -07002335 .magic = TTY_LDISC_MAGIC,
2336 .name = "n_tty",
2337 .open = n_tty_open,
2338 .close = n_tty_close,
2339 .flush_buffer = n_tty_flush_buffer,
2340 .chars_in_buffer = n_tty_chars_in_buffer,
Alan Cox11a96d12008-10-13 10:46:24 +01002341 .read = n_tty_read,
2342 .write = n_tty_write,
Paul Fulghume10cc1d2007-05-10 22:22:50 -07002343 .ioctl = n_tty_ioctl,
2344 .set_termios = n_tty_set_termios,
Alan Cox11a96d12008-10-13 10:46:24 +01002345 .poll = n_tty_poll,
Paul Fulghume10cc1d2007-05-10 22:22:50 -07002346 .receive_buf = n_tty_receive_buf,
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04002347 .write_wakeup = n_tty_write_wakeup,
2348 .fasync = n_tty_fasync,
Peter Hurley24a89d12013-06-15 09:14:15 -04002349 .receive_buf2 = n_tty_receive_buf2,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002350};
Rodolfo Giometti572b9ad2010-03-10 15:23:46 -08002351
2352/**
2353 * n_tty_inherit_ops - inherit N_TTY methods
2354 * @ops: struct tty_ldisc_ops where to save N_TTY methods
2355 *
George Spelvin593fb1ae42013-02-12 02:00:43 -05002356 * Enables a 'subclass' line discipline to 'inherit' N_TTY
Rodolfo Giometti572b9ad2010-03-10 15:23:46 -08002357 * methods.
2358 */
2359
2360void n_tty_inherit_ops(struct tty_ldisc_ops *ops)
2361{
2362 *ops = tty_ldisc_N_TTY;
2363 ops->owner = NULL;
2364 ops->refcount = ops->flags = 0;
2365}
2366EXPORT_SYMBOL_GPL(n_tty_inherit_ops);