blob: 8406a23ee92096f8b047dca5bae5942df3a22cde [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;
Jiri Slaby3fe780b2012-10-18 22:26:40 +020099
Peter Hurleyfb7aa032013-06-15 09:14:30 -0400100 /* shared by producer and consumer */
101 char *read_buf;
Jiri Slaby3fe780b2012-10-18 22:26:40 +0200102 DECLARE_BITMAP(read_flags, N_TTY_BUF_SIZE);
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200103
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -0400104 int minimum_to_wake;
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200105
Peter Hurleyfb7aa032013-06-15 09:14:30 -0400106 /* consumer-published */
107 size_t read_tail;
108
109 /* protected by echo_lock */
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200110 unsigned char *echo_buf;
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400111 size_t echo_head;
112 size_t echo_tail;
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200113
Peter Hurleyfb7aa032013-06-15 09:14:30 -0400114 /* protected by output lock */
115 unsigned int column;
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200116 unsigned int canon_column;
Jiri Slabybddc7152012-10-18 22:26:42 +0200117
118 struct mutex atomic_read_lock;
119 struct mutex output_lock;
120 struct mutex echo_lock;
Jiri Slaby70ece7a2012-10-18 22:26:38 +0200121};
122
Peter Hurleyce741172013-06-15 09:14:20 -0400123static inline size_t read_cnt(struct n_tty_data *ldata)
124{
Peter Hurleya2f73be2013-06-15 09:14:22 -0400125 return ldata->read_head - ldata->read_tail;
Peter Hurleyce741172013-06-15 09:14:20 -0400126}
127
Peter Hurleybc5a5e32013-06-15 09:14:21 -0400128static inline unsigned char read_buf(struct n_tty_data *ldata, size_t i)
129{
130 return ldata->read_buf[i & (N_TTY_BUF_SIZE - 1)];
131}
132
133static inline unsigned char *read_buf_addr(struct n_tty_data *ldata, size_t i)
134{
135 return &ldata->read_buf[i & (N_TTY_BUF_SIZE - 1)];
136}
137
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400138static inline unsigned char echo_buf(struct n_tty_data *ldata, size_t i)
139{
140 return ldata->echo_buf[i & (N_TTY_BUF_SIZE - 1)];
141}
142
143static inline unsigned char *echo_buf_addr(struct n_tty_data *ldata, size_t i)
144{
145 return &ldata->echo_buf[i & (N_TTY_BUF_SIZE - 1)];
146}
147
Miloslav Trmac522ed772007-07-15 23:40:56 -0700148static inline int tty_put_user(struct tty_struct *tty, unsigned char x,
149 unsigned char __user *ptr)
150{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200151 struct n_tty_data *ldata = tty->disc_data;
152
153 tty_audit_add_data(tty, &x, 1, ldata->icanon);
Miloslav Trmac522ed772007-07-15 23:40:56 -0700154 return put_user(x, ptr);
155}
156
Peter Hurley24a89d12013-06-15 09:14:15 -0400157static int receive_room(struct tty_struct *tty)
Linus Torvalds55db4c62011-06-04 06:33:24 +0900158{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200159 struct n_tty_data *ldata = tty->disc_data;
Jaeden Amero090abf72012-07-27 08:43:11 -0500160 int left;
Peter Hurleyb8483052013-06-15 07:28:30 -0400161
Jaeden Amero090abf72012-07-27 08:43:11 -0500162 if (I_PARMRK(tty)) {
163 /* Multiply read_cnt by 3, since each byte might take up to
164 * three times as many spaces when PARMRK is set (depending on
165 * its flags, e.g. parity error). */
Peter Hurleyce741172013-06-15 09:14:20 -0400166 left = N_TTY_BUF_SIZE - read_cnt(ldata) * 3 - 1;
Jaeden Amero090abf72012-07-27 08:43:11 -0500167 } else
Peter Hurleyce741172013-06-15 09:14:20 -0400168 left = N_TTY_BUF_SIZE - read_cnt(ldata) - 1;
Jaeden Amero090abf72012-07-27 08:43:11 -0500169
Linus Torvalds55db4c62011-06-04 06:33:24 +0900170 /*
171 * If we are doing input canonicalization, and there are no
172 * pending newlines, let characters through without limit, so
173 * that erase characters will be handled. Other excess
174 * characters will be beeped.
175 */
176 if (left <= 0)
Peter Hurleya73d3d62013-06-15 09:14:25 -0400177 left = ldata->icanon && ldata->canon_head == ldata->read_tail;
Linus Torvalds55db4c62011-06-04 06:33:24 +0900178
Peter Hurley24a89d12013-06-15 09:14:15 -0400179 return left;
Peter Hurley7879a9f2013-06-15 07:28:31 -0400180}
181
Peter Hurley24a89d12013-06-15 09:14:15 -0400182/**
183 * n_tty_set_room - receive space
184 * @tty: terminal
185 *
186 * Re-schedules the flip buffer work if space just became available.
187 *
Peter Hurley6d76bd22013-06-15 09:14:26 -0400188 * Caller holds exclusive termios_rwsem
189 * or
190 * n_tty_read()/consumer path:
191 * holds non-exclusive termios_rwsem
Peter Hurley24a89d12013-06-15 09:14:15 -0400192 */
193
Peter Hurley7879a9f2013-06-15 07:28:31 -0400194static void n_tty_set_room(struct tty_struct *tty)
195{
Peter Hurley24a89d12013-06-15 09:14:15 -0400196 struct n_tty_data *ldata = tty->disc_data;
197
Linus Torvalds55db4c62011-06-04 06:33:24 +0900198 /* Did this open up the receive buffer? We may need to flip */
Peter Hurley24a89d12013-06-15 09:14:15 -0400199 if (unlikely(ldata->no_room) && receive_room(tty)) {
200 ldata->no_room = 0;
201
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200202 WARN_RATELIMIT(tty->port->itty == NULL,
Sasha Levincadf7482012-10-25 14:26:35 -0400203 "scheduling with invalid itty\n");
Peter Hurley21622932013-03-11 16:44:21 -0400204 /* see if ldisc has been killed - if so, this means that
205 * even though the ldisc has been halted and ->buf.work
206 * cancelled, ->buf.work is about to be rescheduled
207 */
208 WARN_RATELIMIT(test_bit(TTY_LDISC_HALTED, &tty->flags),
209 "scheduling buffer work for halted ldisc\n");
Peter Hurleyf0f947c2013-06-15 09:14:36 -0400210 queue_work(system_unbound_wq, &tty->port->buf.work);
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200211 }
Linus Torvalds55db4c62011-06-04 06:33:24 +0900212}
213
Peter Hurley9a4aec22013-06-15 09:14:32 -0400214static ssize_t chars_in_buffer(struct tty_struct *tty)
215{
216 struct n_tty_data *ldata = tty->disc_data;
217 ssize_t n = 0;
218
219 if (!ldata->icanon)
220 n = read_cnt(ldata);
221 else
222 n = ldata->canon_head - ldata->read_tail;
223 return n;
224}
225
Peter Hurleyee0bab82013-06-15 09:14:34 -0400226/**
227 * n_tty_write_wakeup - asynchronous I/O notifier
228 * @tty: tty device
229 *
230 * Required for the ptys, serial driver etc. since processes
231 * that attach themselves to the master and rely on ASYNC
232 * IO must be woken up
233 */
234
235static void n_tty_write_wakeup(struct tty_struct *tty)
236{
237 if (tty->fasync && test_and_clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags))
238 kill_fasync(&tty->fasync, SIGIO, POLL_OUT);
239}
240
Peter Hurley6367ca72013-06-15 09:14:33 -0400241static inline void n_tty_check_throttle(struct tty_struct *tty)
242{
Peter Hurley3afb1b392013-07-23 08:47:30 -0400243 if (tty->driver->type == TTY_DRIVER_TYPE_PTY)
244 return;
Peter Hurley6367ca72013-06-15 09:14:33 -0400245 /*
246 * Check the remaining room for the input canonicalization
247 * mode. We don't want to throttle the driver if we're in
248 * canonical mode and don't have a newline yet!
249 */
250 while (1) {
251 int throttled;
252 tty_set_flow_change(tty, TTY_THROTTLE_SAFE);
253 if (receive_room(tty) >= TTY_THRESHOLD_THROTTLE)
254 break;
255 throttled = tty_throttle_safe(tty);
256 if (!throttled)
257 break;
258 }
259 __tty_set_flow_change(tty, 0);
260}
261
262static inline void n_tty_check_unthrottle(struct tty_struct *tty)
263{
Peter Hurley3afb1b392013-07-23 08:47:30 -0400264 if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
265 tty->link->ldisc->ops->write_wakeup == n_tty_write_wakeup) {
266 if (chars_in_buffer(tty) > TTY_THRESHOLD_UNTHROTTLE)
267 return;
268 if (!tty->count)
269 return;
270 n_tty_set_room(tty);
271 n_tty_write_wakeup(tty->link);
272 wake_up_interruptible_poll(&tty->link->write_wait, POLLOUT);
273 return;
274 }
275
Peter Hurley6367ca72013-06-15 09:14:33 -0400276 /* If there is enough space in the read buffer now, let the
277 * low-level driver know. We use chars_in_buffer() to
278 * check the buffer, as it now knows about canonical mode.
279 * Otherwise, if the driver is throttled and the line is
280 * longer than TTY_THRESHOLD_UNTHROTTLE in canonical mode,
281 * we won't get any more characters.
282 */
283
284 while (1) {
285 int unthrottled;
286 tty_set_flow_change(tty, TTY_UNTHROTTLE_SAFE);
287 if (chars_in_buffer(tty) > TTY_THRESHOLD_UNTHROTTLE)
288 break;
289 if (!tty->count)
290 break;
291 n_tty_set_room(tty);
292 unthrottled = tty_unthrottle_safe(tty);
293 if (!unthrottled)
294 break;
295 }
296 __tty_set_flow_change(tty, 0);
297}
298
Alan Cox17b82062008-10-13 10:45:06 +0100299/**
300 * put_tty_queue - add character to tty
301 * @c: character
Jiri Slaby57c94122012-10-18 22:26:43 +0200302 * @ldata: n_tty data
Alan Cox17b82062008-10-13 10:45:06 +0100303 *
Peter Hurley6d76bd22013-06-15 09:14:26 -0400304 * Add a character to the tty read_buf queue.
305 *
306 * n_tty_receive_buf()/producer path:
307 * caller holds non-exclusive termios_rwsem
308 * modifies read_head
309 *
310 * read_head is only considered 'published' if canonical mode is
311 * not active.
Alan Cox17b82062008-10-13 10:45:06 +0100312 */
313
Jiri Slaby57c94122012-10-18 22:26:43 +0200314static void put_tty_queue(unsigned char c, struct n_tty_data *ldata)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700315{
Peter Hurley6d76bd22013-06-15 09:14:26 -0400316 if (read_cnt(ldata) < N_TTY_BUF_SIZE) {
317 *read_buf_addr(ldata, ldata->read_head) = c;
318 ldata->read_head++;
319 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700320}
321
322/**
Linus Torvalds1da177e2005-04-16 15:20:36 -0700323 * reset_buffer_flags - reset buffer state
324 * @tty: terminal to reset
325 *
Peter Hurley25518c62013-03-11 16:44:31 -0400326 * Reset the read buffer counters and clear the flags.
327 * Called from n_tty_open() and n_tty_flush_buffer().
Alan Cox17b82062008-10-13 10:45:06 +0100328 *
Peter Hurley6d76bd22013-06-15 09:14:26 -0400329 * Locking: caller holds exclusive termios_rwsem
330 * (or locking is not required)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700331 */
Joe Petersona88a69c2009-01-02 13:40:53 +0000332
Peter Hurleyb66f4fa2013-03-11 16:44:32 -0400333static void reset_buffer_flags(struct n_tty_data *ldata)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700334{
Peter Hurleya73d3d62013-06-15 09:14:25 -0400335 ldata->read_head = ldata->canon_head = ldata->read_tail = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000336
Jiri Slabybddc7152012-10-18 22:26:42 +0200337 mutex_lock(&ldata->echo_lock);
Peter Hurley862eeff2013-06-15 10:04:23 -0400338 ldata->echo_head = ldata->echo_tail = 0;
Jiri Slabybddc7152012-10-18 22:26:42 +0200339 mutex_unlock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000340
Peter Hurleya73d3d62013-06-15 09:14:25 -0400341 ldata->erasing = 0;
Jiri Slaby3fe780b2012-10-18 22:26:40 +0200342 bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700343}
344
Peter Hurleya30737a2013-03-11 16:44:22 -0400345static void n_tty_packet_mode_flush(struct tty_struct *tty)
346{
347 unsigned long flags;
348
349 spin_lock_irqsave(&tty->ctrl_lock, flags);
350 if (tty->link->packet) {
351 tty->ctrl_status |= TIOCPKT_FLUSHREAD;
352 wake_up_interruptible(&tty->link->read_wait);
353 }
354 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
355}
356
Linus Torvalds1da177e2005-04-16 15:20:36 -0700357/**
358 * n_tty_flush_buffer - clean input queue
359 * @tty: terminal device
360 *
Peter Hurley25518c62013-03-11 16:44:31 -0400361 * Flush the input buffer. Called when the tty layer wants the
362 * buffer flushed (eg at hangup) or when the N_TTY line discipline
363 * internally has to clean the pending queue (for example some signals).
Linus Torvalds1da177e2005-04-16 15:20:36 -0700364 *
Peter Hurley6d76bd22013-06-15 09:14:26 -0400365 * Holds termios_rwsem to exclude producer/consumer while
366 * buffer indices are reset.
367 *
368 * Locking: ctrl_lock, exclusive termios_rwsem
Linus Torvalds1da177e2005-04-16 15:20:36 -0700369 */
Alan Cox4edf1822008-02-08 04:18:44 -0800370
371static void n_tty_flush_buffer(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700372{
Peter Hurley6d76bd22013-06-15 09:14:26 -0400373 down_write(&tty->termios_rwsem);
Peter Hurleyb66f4fa2013-03-11 16:44:32 -0400374 reset_buffer_flags(tty->disc_data);
375 n_tty_set_room(tty);
Alan Cox4edf1822008-02-08 04:18:44 -0800376
Peter Hurleya30737a2013-03-11 16:44:22 -0400377 if (tty->link)
378 n_tty_packet_mode_flush(tty);
Peter Hurley6d76bd22013-06-15 09:14:26 -0400379 up_write(&tty->termios_rwsem);
380}
381
Linus Torvalds1da177e2005-04-16 15:20:36 -0700382/**
383 * n_tty_chars_in_buffer - report available bytes
384 * @tty: tty device
385 *
386 * Report the number of characters buffered to be delivered to user
Alan Cox4edf1822008-02-08 04:18:44 -0800387 * at this instant in time.
Alan Cox17b82062008-10-13 10:45:06 +0100388 *
Peter Hurley6d76bd22013-06-15 09:14:26 -0400389 * Locking: exclusive termios_rwsem
Linus Torvalds1da177e2005-04-16 15:20:36 -0700390 */
Alan Cox4edf1822008-02-08 04:18:44 -0800391
Peter Hurleya19d0c62013-06-15 09:14:18 -0400392static ssize_t n_tty_chars_in_buffer(struct tty_struct *tty)
393{
Peter Hurley6d76bd22013-06-15 09:14:26 -0400394 ssize_t n;
395
Peter Hurley47534082013-06-15 09:14:19 -0400396 WARN_ONCE(1, "%s is deprecated and scheduled for removal.", __func__);
Peter Hurley6d76bd22013-06-15 09:14:26 -0400397
398 down_write(&tty->termios_rwsem);
399 n = chars_in_buffer(tty);
400 up_write(&tty->termios_rwsem);
401 return n;
Peter Hurleya19d0c62013-06-15 09:14:18 -0400402}
403
Linus Torvalds1da177e2005-04-16 15:20:36 -0700404/**
405 * is_utf8_continuation - utf8 multibyte check
406 * @c: byte to check
407 *
408 * Returns true if the utf8 character 'c' is a multibyte continuation
409 * character. We use this to correctly compute the on screen size
410 * of the character when printing
411 */
Alan Cox4edf1822008-02-08 04:18:44 -0800412
Linus Torvalds1da177e2005-04-16 15:20:36 -0700413static inline int is_utf8_continuation(unsigned char c)
414{
415 return (c & 0xc0) == 0x80;
416}
417
418/**
419 * is_continuation - multibyte check
420 * @c: byte to check
421 *
422 * Returns true if the utf8 character 'c' is a multibyte continuation
423 * character and the terminal is in unicode mode.
424 */
Alan Cox4edf1822008-02-08 04:18:44 -0800425
Linus Torvalds1da177e2005-04-16 15:20:36 -0700426static inline int is_continuation(unsigned char c, struct tty_struct *tty)
427{
428 return I_IUTF8(tty) && is_utf8_continuation(c);
429}
430
431/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000432 * do_output_char - output one character
433 * @c: character (or partial unicode symbol)
434 * @tty: terminal device
435 * @space: space available in tty driver write buffer
436 *
437 * This is a helper function that handles one output character
438 * (including special characters like TAB, CR, LF, etc.),
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600439 * doing OPOST processing and putting the results in the
440 * tty driver's write buffer.
Joe Petersona88a69c2009-01-02 13:40:53 +0000441 *
442 * Note that Linux currently ignores TABDLY, CRDLY, VTDLY, FFDLY
443 * and NLDLY. They simply aren't relevant in the world today.
444 * If you ever need them, add them here.
445 *
446 * Returns the number of bytes of buffer space used or -1 if
447 * no space left.
448 *
449 * Locking: should be called under the output_lock to protect
450 * the column state and space left in the buffer
451 */
452
453static int do_output_char(unsigned char c, struct tty_struct *tty, int space)
454{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200455 struct n_tty_data *ldata = tty->disc_data;
Joe Petersona88a69c2009-01-02 13:40:53 +0000456 int spaces;
457
458 if (!space)
459 return -1;
Alan Cox300a6202009-01-02 13:41:04 +0000460
Joe Petersona88a69c2009-01-02 13:40:53 +0000461 switch (c) {
462 case '\n':
463 if (O_ONLRET(tty))
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200464 ldata->column = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000465 if (O_ONLCR(tty)) {
466 if (space < 2)
467 return -1;
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200468 ldata->canon_column = ldata->column = 0;
Linus Torvalds37f81fa2009-09-05 12:46:07 -0700469 tty->ops->write(tty, "\r\n", 2);
Joe Petersona88a69c2009-01-02 13:40:53 +0000470 return 2;
471 }
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200472 ldata->canon_column = ldata->column;
Joe Petersona88a69c2009-01-02 13:40:53 +0000473 break;
474 case '\r':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200475 if (O_ONOCR(tty) && ldata->column == 0)
Joe Petersona88a69c2009-01-02 13:40:53 +0000476 return 0;
477 if (O_OCRNL(tty)) {
478 c = '\n';
479 if (O_ONLRET(tty))
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200480 ldata->canon_column = ldata->column = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000481 break;
482 }
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200483 ldata->canon_column = ldata->column = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000484 break;
485 case '\t':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200486 spaces = 8 - (ldata->column & 7);
Joe Petersona88a69c2009-01-02 13:40:53 +0000487 if (O_TABDLY(tty) == XTABS) {
488 if (space < spaces)
489 return -1;
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200490 ldata->column += spaces;
Joe Petersona88a69c2009-01-02 13:40:53 +0000491 tty->ops->write(tty, " ", spaces);
492 return spaces;
493 }
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200494 ldata->column += spaces;
Joe Petersona88a69c2009-01-02 13:40:53 +0000495 break;
496 case '\b':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200497 if (ldata->column > 0)
498 ldata->column--;
Joe Petersona88a69c2009-01-02 13:40:53 +0000499 break;
500 default:
Joe Petersona59c0d62009-01-02 13:43:25 +0000501 if (!iscntrl(c)) {
502 if (O_OLCUC(tty))
503 c = toupper(c);
504 if (!is_continuation(c, tty))
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200505 ldata->column++;
Joe Petersona59c0d62009-01-02 13:43:25 +0000506 }
Joe Petersona88a69c2009-01-02 13:40:53 +0000507 break;
508 }
509
510 tty_put_char(tty, c);
511 return 1;
512}
513
514/**
515 * process_output - output post processor
Linus Torvalds1da177e2005-04-16 15:20:36 -0700516 * @c: character (or partial unicode symbol)
517 * @tty: terminal device
518 *
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600519 * Output one character with OPOST processing.
520 * Returns -1 when the output device is full and the character
521 * must be retried.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700522 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000523 * Locking: output_lock to protect column state and space left
524 * (also, this is called from n_tty_write under the
525 * tty layer write lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700526 */
Alan Cox4edf1822008-02-08 04:18:44 -0800527
Joe Petersona88a69c2009-01-02 13:40:53 +0000528static int process_output(unsigned char c, struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700529{
Jiri Slabybddc7152012-10-18 22:26:42 +0200530 struct n_tty_data *ldata = tty->disc_data;
Joe Petersona88a69c2009-01-02 13:40:53 +0000531 int space, retval;
532
Jiri Slabybddc7152012-10-18 22:26:42 +0200533 mutex_lock(&ldata->output_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534
Alan Coxf34d7a52008-04-30 00:54:13 -0700535 space = tty_write_room(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +0000536 retval = do_output_char(c, tty, space);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700537
Jiri Slabybddc7152012-10-18 22:26:42 +0200538 mutex_unlock(&ldata->output_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000539 if (retval < 0)
540 return -1;
541 else
542 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700543}
544
545/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000546 * process_output_block - block post processor
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547 * @tty: terminal device
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600548 * @buf: character buffer
549 * @nr: number of bytes to output
550 *
551 * Output a block of characters with OPOST processing.
552 * Returns the number of characters output.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553 *
554 * This path is used to speed up block console writes, among other
555 * things when processing blocks of output data. It handles only
556 * the simple cases normally found and helps to generate blocks of
557 * symbols for the console driver and thus improve performance.
558 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000559 * Locking: output_lock to protect column state and space left
560 * (also, this is called from n_tty_write under the
561 * tty layer write lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700562 */
Alan Cox4edf1822008-02-08 04:18:44 -0800563
Joe Petersona88a69c2009-01-02 13:40:53 +0000564static ssize_t process_output_block(struct tty_struct *tty,
565 const unsigned char *buf, unsigned int nr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700566{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200567 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700568 int space;
Thorsten Wißmannbbd20752011-12-08 17:47:33 +0100569 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700570 const unsigned char *cp;
571
Jiri Slabybddc7152012-10-18 22:26:42 +0200572 mutex_lock(&ldata->output_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000573
Alan Coxf34d7a52008-04-30 00:54:13 -0700574 space = tty_write_room(tty);
Alan Cox300a6202009-01-02 13:41:04 +0000575 if (!space) {
Jiri Slabybddc7152012-10-18 22:26:42 +0200576 mutex_unlock(&ldata->output_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700577 return 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000578 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700579 if (nr > space)
580 nr = space;
581
582 for (i = 0, cp = buf; i < nr; i++, cp++) {
Joe Petersona59c0d62009-01-02 13:43:25 +0000583 unsigned char c = *cp;
584
585 switch (c) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700586 case '\n':
587 if (O_ONLRET(tty))
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200588 ldata->column = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700589 if (O_ONLCR(tty))
590 goto break_out;
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200591 ldata->canon_column = ldata->column;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700592 break;
593 case '\r':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200594 if (O_ONOCR(tty) && ldata->column == 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700595 goto break_out;
596 if (O_OCRNL(tty))
597 goto break_out;
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200598 ldata->canon_column = ldata->column = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700599 break;
600 case '\t':
601 goto break_out;
602 case '\b':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200603 if (ldata->column > 0)
604 ldata->column--;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700605 break;
606 default:
Joe Petersona59c0d62009-01-02 13:43:25 +0000607 if (!iscntrl(c)) {
608 if (O_OLCUC(tty))
609 goto break_out;
610 if (!is_continuation(c, tty))
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200611 ldata->column++;
Joe Petersona59c0d62009-01-02 13:43:25 +0000612 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700613 break;
614 }
615 }
616break_out:
Alan Coxf34d7a52008-04-30 00:54:13 -0700617 i = tty->ops->write(tty, buf, i);
Joe Petersona88a69c2009-01-02 13:40:53 +0000618
Jiri Slabybddc7152012-10-18 22:26:42 +0200619 mutex_unlock(&ldata->output_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700620 return i;
621}
622
Joe Petersona88a69c2009-01-02 13:40:53 +0000623/**
624 * process_echoes - write pending echo characters
625 * @tty: terminal device
626 *
627 * Write previously buffered echo (and other ldisc-generated)
628 * characters to the tty.
629 *
630 * Characters generated by the ldisc (including echoes) need to
631 * be buffered because the driver's write buffer can fill during
632 * heavy program output. Echoing straight to the driver will
633 * often fail under these conditions, causing lost characters and
634 * resulting mismatches of ldisc state information.
635 *
636 * Since the ldisc state must represent the characters actually sent
637 * to the driver at the time of the write, operations like certain
638 * changes in column state are also saved in the buffer and executed
639 * here.
640 *
641 * A circular fifo buffer is used so that the most recent characters
642 * are prioritized. Also, when control characters are echoed with a
643 * prefixed "^", the pair is treated atomically and thus not separated.
644 *
645 * Locking: output_lock to protect column state and space left,
646 * echo_lock to protect the echo buffer
647 */
648
649static void process_echoes(struct tty_struct *tty)
650{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200651 struct n_tty_data *ldata = tty->disc_data;
Joe Petersona88a69c2009-01-02 13:40:53 +0000652 int space, nr;
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400653 size_t tail;
Joe Petersona88a69c2009-01-02 13:40:53 +0000654 unsigned char c;
Joe Petersona88a69c2009-01-02 13:40:53 +0000655
Peter Hurley862eeff2013-06-15 10:04:23 -0400656 if (ldata->echo_head == ldata->echo_tail)
Joe Petersona88a69c2009-01-02 13:40:53 +0000657 return;
658
Jiri Slabybddc7152012-10-18 22:26:42 +0200659 mutex_lock(&ldata->output_lock);
660 mutex_lock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000661
662 space = tty_write_room(tty);
663
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400664 tail = ldata->echo_tail;
Peter Hurley862eeff2013-06-15 10:04:23 -0400665 nr = ldata->echo_head - ldata->echo_tail;
Joe Petersona88a69c2009-01-02 13:40:53 +0000666 while (nr > 0) {
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400667 c = echo_buf(ldata, tail);
Joe Petersona88a69c2009-01-02 13:40:53 +0000668 if (c == ECHO_OP_START) {
669 unsigned char op;
Joe Petersona88a69c2009-01-02 13:40:53 +0000670 int no_space_left = 0;
671
672 /*
673 * If the buffer byte is the start of a multi-byte
674 * operation, get the next byte, which is either the
675 * op code or a control character value.
676 */
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400677 op = echo_buf(ldata, tail + 1);
Alan Cox300a6202009-01-02 13:41:04 +0000678
Joe Petersona88a69c2009-01-02 13:40:53 +0000679 switch (op) {
680 unsigned int num_chars, num_bs;
681
682 case ECHO_OP_ERASE_TAB:
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400683 num_chars = echo_buf(ldata, tail + 2);
Joe Petersona88a69c2009-01-02 13:40:53 +0000684
685 /*
686 * Determine how many columns to go back
687 * in order to erase the tab.
688 * This depends on the number of columns
689 * used by other characters within the tab
690 * area. If this (modulo 8) count is from
691 * the start of input rather than from a
692 * previous tab, we offset by canon column.
693 * Otherwise, tab spacing is normal.
694 */
695 if (!(num_chars & 0x80))
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200696 num_chars += ldata->canon_column;
Joe Petersona88a69c2009-01-02 13:40:53 +0000697 num_bs = 8 - (num_chars & 7);
698
699 if (num_bs > space) {
700 no_space_left = 1;
701 break;
702 }
703 space -= num_bs;
704 while (num_bs--) {
705 tty_put_char(tty, '\b');
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200706 if (ldata->column > 0)
707 ldata->column--;
Joe Petersona88a69c2009-01-02 13:40:53 +0000708 }
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400709 tail += 3;
Joe Petersona88a69c2009-01-02 13:40:53 +0000710 nr -= 3;
711 break;
712
713 case ECHO_OP_SET_CANON_COL:
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200714 ldata->canon_column = ldata->column;
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400715 tail += 2;
Joe Petersona88a69c2009-01-02 13:40:53 +0000716 nr -= 2;
717 break;
718
719 case ECHO_OP_MOVE_BACK_COL:
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200720 if (ldata->column > 0)
721 ldata->column--;
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400722 tail += 2;
Joe Petersona88a69c2009-01-02 13:40:53 +0000723 nr -= 2;
724 break;
725
726 case ECHO_OP_START:
727 /* This is an escaped echo op start code */
728 if (!space) {
729 no_space_left = 1;
730 break;
731 }
732 tty_put_char(tty, ECHO_OP_START);
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200733 ldata->column++;
Joe Petersona88a69c2009-01-02 13:40:53 +0000734 space--;
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400735 tail += 2;
Joe Petersona88a69c2009-01-02 13:40:53 +0000736 nr -= 2;
737 break;
738
739 default:
Joe Petersona88a69c2009-01-02 13:40:53 +0000740 /*
Joe Peterson62b26352009-09-09 15:03:47 -0600741 * If the op is not a special byte code,
742 * it is a ctrl char tagged to be echoed
743 * as "^X" (where X is the letter
744 * representing the control char).
745 * Note that we must ensure there is
746 * enough space for the whole ctrl pair.
747 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000748 */
Joe Peterson62b26352009-09-09 15:03:47 -0600749 if (space < 2) {
750 no_space_left = 1;
751 break;
752 }
753 tty_put_char(tty, '^');
754 tty_put_char(tty, op ^ 0100);
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200755 ldata->column += 2;
Joe Peterson62b26352009-09-09 15:03:47 -0600756 space -= 2;
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400757 tail += 2;
Joe Petersona88a69c2009-01-02 13:40:53 +0000758 nr -= 2;
759 }
760
761 if (no_space_left)
762 break;
763 } else {
Peter Hurley582f5592013-05-17 12:49:48 -0400764 if (O_OPOST(tty)) {
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600765 int retval = do_output_char(c, tty, space);
766 if (retval < 0)
767 break;
768 space -= retval;
769 } else {
770 if (!space)
771 break;
772 tty_put_char(tty, c);
773 space -= 1;
774 }
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400775 tail += 1;
Joe Petersona88a69c2009-01-02 13:40:53 +0000776 nr -= 1;
777 }
Joe Petersona88a69c2009-01-02 13:40:53 +0000778 }
779
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400780 ldata->echo_tail = tail;
Joe Petersona88a69c2009-01-02 13:40:53 +0000781
Jiri Slabybddc7152012-10-18 22:26:42 +0200782 mutex_unlock(&ldata->echo_lock);
783 mutex_unlock(&ldata->output_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000784
785 if (tty->ops->flush_chars)
786 tty->ops->flush_chars(tty);
787}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788
789/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000790 * add_echo_byte - add a byte to the echo buffer
791 * @c: unicode byte to echo
Jiri Slaby57c94122012-10-18 22:26:43 +0200792 * @ldata: n_tty data
Joe Petersona88a69c2009-01-02 13:40:53 +0000793 *
794 * Add a character or operation byte to the echo buffer.
795 *
796 * Should be called under the echo lock to protect the echo buffer.
797 */
798
Jiri Slaby57c94122012-10-18 22:26:43 +0200799static void add_echo_byte(unsigned char c, struct n_tty_data *ldata)
Joe Petersona88a69c2009-01-02 13:40:53 +0000800{
Peter Hurley862eeff2013-06-15 10:04:23 -0400801 if (ldata->echo_head - ldata->echo_tail == N_TTY_BUF_SIZE) {
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400802 size_t head = ldata->echo_head;
Joe Petersona88a69c2009-01-02 13:40:53 +0000803 /*
804 * Since the buffer start position needs to be advanced,
805 * be sure to step by a whole operation byte group.
806 */
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400807 if (echo_buf(ldata, head) == ECHO_OP_START) {
Peter Hurley862eeff2013-06-15 10:04:23 -0400808 if (echo_buf(ldata, head + 1) == ECHO_OP_ERASE_TAB)
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400809 ldata->echo_tail += 3;
Peter Hurley862eeff2013-06-15 10:04:23 -0400810 else
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400811 ldata->echo_tail += 2;
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400812 } else
813 ldata->echo_tail++;
Peter Hurley862eeff2013-06-15 10:04:23 -0400814 }
Joe Petersona88a69c2009-01-02 13:40:53 +0000815
Peter Hurleyaddaebc2013-06-15 10:04:22 -0400816 *echo_buf_addr(ldata, ldata->echo_head++) = c;
Joe Petersona88a69c2009-01-02 13:40:53 +0000817}
818
819/**
820 * echo_move_back_col - add operation to move back a column
Jiri Slaby57c94122012-10-18 22:26:43 +0200821 * @ldata: n_tty data
Joe Petersona88a69c2009-01-02 13:40:53 +0000822 *
823 * Add an operation to the echo buffer to move back one column.
824 *
825 * Locking: echo_lock to protect the echo buffer
826 */
827
Jiri Slaby57c94122012-10-18 22:26:43 +0200828static void echo_move_back_col(struct n_tty_data *ldata)
Joe Petersona88a69c2009-01-02 13:40:53 +0000829{
Jiri Slabybddc7152012-10-18 22:26:42 +0200830 mutex_lock(&ldata->echo_lock);
Jiri Slaby57c94122012-10-18 22:26:43 +0200831 add_echo_byte(ECHO_OP_START, ldata);
832 add_echo_byte(ECHO_OP_MOVE_BACK_COL, ldata);
Jiri Slabybddc7152012-10-18 22:26:42 +0200833 mutex_unlock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000834}
835
836/**
837 * echo_set_canon_col - add operation to set the canon column
Jiri Slaby57c94122012-10-18 22:26:43 +0200838 * @ldata: n_tty data
Joe Petersona88a69c2009-01-02 13:40:53 +0000839 *
840 * Add an operation to the echo buffer to set the canon column
841 * to the current column.
842 *
843 * Locking: echo_lock to protect the echo buffer
844 */
845
Jiri Slaby57c94122012-10-18 22:26:43 +0200846static void echo_set_canon_col(struct n_tty_data *ldata)
Joe Petersona88a69c2009-01-02 13:40:53 +0000847{
Jiri Slabybddc7152012-10-18 22:26:42 +0200848 mutex_lock(&ldata->echo_lock);
Jiri Slaby57c94122012-10-18 22:26:43 +0200849 add_echo_byte(ECHO_OP_START, ldata);
850 add_echo_byte(ECHO_OP_SET_CANON_COL, ldata);
Jiri Slabybddc7152012-10-18 22:26:42 +0200851 mutex_unlock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000852}
853
854/**
855 * echo_erase_tab - add operation to erase a tab
856 * @num_chars: number of character columns already used
857 * @after_tab: true if num_chars starts after a previous tab
Jiri Slaby57c94122012-10-18 22:26:43 +0200858 * @ldata: n_tty data
Joe Petersona88a69c2009-01-02 13:40:53 +0000859 *
860 * Add an operation to the echo buffer to erase a tab.
861 *
862 * Called by the eraser function, which knows how many character
863 * columns have been used since either a previous tab or the start
864 * of input. This information will be used later, along with
865 * canon column (if applicable), to go back the correct number
866 * of columns.
867 *
868 * Locking: echo_lock to protect the echo buffer
869 */
870
871static void echo_erase_tab(unsigned int num_chars, int after_tab,
Jiri Slaby57c94122012-10-18 22:26:43 +0200872 struct n_tty_data *ldata)
Joe Petersona88a69c2009-01-02 13:40:53 +0000873{
Jiri Slabybddc7152012-10-18 22:26:42 +0200874 mutex_lock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000875
Jiri Slaby57c94122012-10-18 22:26:43 +0200876 add_echo_byte(ECHO_OP_START, ldata);
877 add_echo_byte(ECHO_OP_ERASE_TAB, ldata);
Joe Petersona88a69c2009-01-02 13:40:53 +0000878
879 /* We only need to know this modulo 8 (tab spacing) */
880 num_chars &= 7;
881
882 /* Set the high bit as a flag if num_chars is after a previous tab */
883 if (after_tab)
884 num_chars |= 0x80;
Alan Cox300a6202009-01-02 13:41:04 +0000885
Jiri Slaby57c94122012-10-18 22:26:43 +0200886 add_echo_byte(num_chars, ldata);
Joe Petersona88a69c2009-01-02 13:40:53 +0000887
Jiri Slabybddc7152012-10-18 22:26:42 +0200888 mutex_unlock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000889}
890
891/**
892 * echo_char_raw - echo a character raw
Linus Torvalds1da177e2005-04-16 15:20:36 -0700893 * @c: unicode byte to echo
894 * @tty: terminal device
895 *
Alan Cox4edf1822008-02-08 04:18:44 -0800896 * Echo user input back onto the screen. This must be called only when
Linus Torvalds1da177e2005-04-16 15:20:36 -0700897 * L_ECHO(tty) is true. Called from the driver receive_buf path.
Alan Cox17b82062008-10-13 10:45:06 +0100898 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000899 * This variant does not treat control characters specially.
900 *
901 * Locking: echo_lock to protect the echo buffer
902 */
903
Jiri Slaby57c94122012-10-18 22:26:43 +0200904static void echo_char_raw(unsigned char c, struct n_tty_data *ldata)
Joe Petersona88a69c2009-01-02 13:40:53 +0000905{
Jiri Slabybddc7152012-10-18 22:26:42 +0200906 mutex_lock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000907 if (c == ECHO_OP_START) {
Jiri Slaby57c94122012-10-18 22:26:43 +0200908 add_echo_byte(ECHO_OP_START, ldata);
909 add_echo_byte(ECHO_OP_START, ldata);
Joe Petersona88a69c2009-01-02 13:40:53 +0000910 } else {
Jiri Slaby57c94122012-10-18 22:26:43 +0200911 add_echo_byte(c, ldata);
Joe Petersona88a69c2009-01-02 13:40:53 +0000912 }
Jiri Slabybddc7152012-10-18 22:26:42 +0200913 mutex_unlock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000914}
915
916/**
917 * echo_char - echo a character
918 * @c: unicode byte to echo
919 * @tty: terminal device
920 *
921 * Echo user input back onto the screen. This must be called only when
922 * L_ECHO(tty) is true. Called from the driver receive_buf path.
923 *
Joe Peterson62b26352009-09-09 15:03:47 -0600924 * This variant tags control characters to be echoed as "^X"
925 * (where X is the letter representing the control char).
Joe Petersona88a69c2009-01-02 13:40:53 +0000926 *
927 * Locking: echo_lock to protect the echo buffer
Linus Torvalds1da177e2005-04-16 15:20:36 -0700928 */
929
930static void echo_char(unsigned char c, struct tty_struct *tty)
931{
Jiri Slabybddc7152012-10-18 22:26:42 +0200932 struct n_tty_data *ldata = tty->disc_data;
933
934 mutex_lock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000935
936 if (c == ECHO_OP_START) {
Jiri Slaby57c94122012-10-18 22:26:43 +0200937 add_echo_byte(ECHO_OP_START, ldata);
938 add_echo_byte(ECHO_OP_START, ldata);
Joe Petersona88a69c2009-01-02 13:40:53 +0000939 } else {
Joe Peterson62b26352009-09-09 15:03:47 -0600940 if (L_ECHOCTL(tty) && iscntrl(c) && c != '\t')
Jiri Slaby57c94122012-10-18 22:26:43 +0200941 add_echo_byte(ECHO_OP_START, ldata);
942 add_echo_byte(c, ldata);
Joe Petersona88a69c2009-01-02 13:40:53 +0000943 }
944
Jiri Slabybddc7152012-10-18 22:26:42 +0200945 mutex_unlock(&ldata->echo_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700946}
947
Alan Cox17b82062008-10-13 10:45:06 +0100948/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000949 * finish_erasing - complete erase
Jiri Slaby57c94122012-10-18 22:26:43 +0200950 * @ldata: n_tty data
Alan Cox17b82062008-10-13 10:45:06 +0100951 */
Joe Petersona88a69c2009-01-02 13:40:53 +0000952
Jiri Slaby57c94122012-10-18 22:26:43 +0200953static inline void finish_erasing(struct n_tty_data *ldata)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700954{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200955 if (ldata->erasing) {
Jiri Slaby57c94122012-10-18 22:26:43 +0200956 echo_char_raw('/', ldata);
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200957 ldata->erasing = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700958 }
959}
960
961/**
962 * eraser - handle erase function
963 * @c: character input
964 * @tty: terminal device
965 *
Robert P. J. Day3a4fa0a2007-10-19 23:10:43 +0200966 * Perform erase and necessary output when an erase character is
Linus Torvalds1da177e2005-04-16 15:20:36 -0700967 * present in the stream from the driver layer. Handles the complexities
968 * of UTF-8 multibyte symbols.
Alan Cox17b82062008-10-13 10:45:06 +0100969 *
Peter Hurley6d76bd22013-06-15 09:14:26 -0400970 * n_tty_receive_buf()/producer path:
971 * caller holds non-exclusive termios_rwsem
972 * modifies read_head
973 *
974 * Modifying the read_head is not considered a publish in this context
975 * because canonical mode is active -- only canon_head publishes
Linus Torvalds1da177e2005-04-16 15:20:36 -0700976 */
Alan Cox4edf1822008-02-08 04:18:44 -0800977
Linus Torvalds1da177e2005-04-16 15:20:36 -0700978static void eraser(unsigned char c, struct tty_struct *tty)
979{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200980 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700981 enum { ERASE, WERASE, KILL } kill_type;
Peter Hurleybc5a5e32013-06-15 09:14:21 -0400982 size_t head;
983 size_t cnt;
984 int seen_alnums;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700985
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200986 if (ldata->read_head == ldata->canon_head) {
Joe Peterson7e94b1d2009-01-02 13:43:40 +0000987 /* process_output('\a', tty); */ /* what do you think? */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700988 return;
989 }
990 if (c == ERASE_CHAR(tty))
991 kill_type = ERASE;
992 else if (c == WERASE_CHAR(tty))
993 kill_type = WERASE;
994 else {
995 if (!L_ECHO(tty)) {
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200996 ldata->read_head = ldata->canon_head;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700997 return;
998 }
999 if (!L_ECHOK(tty) || !L_ECHOKE(tty) || !L_ECHOE(tty)) {
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001000 ldata->read_head = ldata->canon_head;
Jiri Slaby57c94122012-10-18 22:26:43 +02001001 finish_erasing(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001002 echo_char(KILL_CHAR(tty), tty);
1003 /* Add a newline if ECHOK is on and ECHOKE is off. */
1004 if (L_ECHOK(tty))
Jiri Slaby57c94122012-10-18 22:26:43 +02001005 echo_char_raw('\n', ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001006 return;
1007 }
1008 kill_type = KILL;
1009 }
1010
1011 seen_alnums = 0;
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001012 while (ldata->read_head != ldata->canon_head) {
1013 head = ldata->read_head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001014
1015 /* erase a single possibly multibyte character */
1016 do {
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001017 head--;
1018 c = read_buf(ldata, head);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001019 } while (is_continuation(c, tty) && head != ldata->canon_head);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001020
1021 /* do not partially erase */
1022 if (is_continuation(c, tty))
1023 break;
1024
1025 if (kill_type == WERASE) {
1026 /* Equivalent to BSD's ALTWERASE. */
1027 if (isalnum(c) || c == '_')
1028 seen_alnums++;
1029 else if (seen_alnums)
1030 break;
1031 }
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001032 cnt = ldata->read_head - head;
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001033 ldata->read_head = head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001034 if (L_ECHO(tty)) {
1035 if (L_ECHOPRT(tty)) {
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001036 if (!ldata->erasing) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001037 echo_char_raw('\\', ldata);
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001038 ldata->erasing = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001039 }
1040 /* if cnt > 1, output a multi-byte character */
1041 echo_char(c, tty);
1042 while (--cnt > 0) {
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001043 head++;
1044 echo_char_raw(read_buf(ldata, head), ldata);
Jiri Slaby57c94122012-10-18 22:26:43 +02001045 echo_move_back_col(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001046 }
1047 } else if (kill_type == ERASE && !L_ECHOE(tty)) {
1048 echo_char(ERASE_CHAR(tty), tty);
1049 } else if (c == '\t') {
Joe Petersona88a69c2009-01-02 13:40:53 +00001050 unsigned int num_chars = 0;
1051 int after_tab = 0;
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001052 size_t tail = ldata->read_head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001053
Joe Petersona88a69c2009-01-02 13:40:53 +00001054 /*
1055 * Count the columns used for characters
1056 * since the start of input or after a
1057 * previous tab.
1058 * This info is used to go back the correct
1059 * number of columns.
1060 */
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001061 while (tail != ldata->canon_head) {
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001062 tail--;
1063 c = read_buf(ldata, tail);
Joe Petersona88a69c2009-01-02 13:40:53 +00001064 if (c == '\t') {
1065 after_tab = 1;
1066 break;
Alan Cox300a6202009-01-02 13:41:04 +00001067 } else if (iscntrl(c)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001068 if (L_ECHOCTL(tty))
Joe Petersona88a69c2009-01-02 13:40:53 +00001069 num_chars += 2;
1070 } else if (!is_continuation(c, tty)) {
1071 num_chars++;
1072 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001073 }
Jiri Slaby57c94122012-10-18 22:26:43 +02001074 echo_erase_tab(num_chars, after_tab, ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001075 } else {
1076 if (iscntrl(c) && L_ECHOCTL(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001077 echo_char_raw('\b', ldata);
1078 echo_char_raw(' ', ldata);
1079 echo_char_raw('\b', ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001080 }
1081 if (!iscntrl(c) || L_ECHOCTL(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001082 echo_char_raw('\b', ldata);
1083 echo_char_raw(' ', ldata);
1084 echo_char_raw('\b', ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001085 }
1086 }
1087 }
1088 if (kill_type == ERASE)
1089 break;
1090 }
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001091 if (ldata->read_head == ldata->canon_head && L_ECHO(tty))
Jiri Slaby57c94122012-10-18 22:26:43 +02001092 finish_erasing(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001093}
1094
1095/**
1096 * isig - handle the ISIG optio
1097 * @sig: signal
1098 * @tty: terminal
Linus Torvalds1da177e2005-04-16 15:20:36 -07001099 *
Peter Hurley8c985d12013-03-06 08:38:19 -05001100 * Called when a signal is being sent due to terminal input.
1101 * Called from the driver receive_buf path so serialized.
Alan Cox17b82062008-10-13 10:45:06 +01001102 *
Peter Hurley8c985d12013-03-06 08:38:19 -05001103 * Locking: ctrl_lock
Linus Torvalds1da177e2005-04-16 15:20:36 -07001104 */
Alan Cox4edf1822008-02-08 04:18:44 -08001105
Peter Hurley8c985d12013-03-06 08:38:19 -05001106static inline void isig(int sig, struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001107{
Peter Hurley8c985d12013-03-06 08:38:19 -05001108 struct pid *tty_pgrp = tty_get_pgrp(tty);
1109 if (tty_pgrp) {
1110 kill_pgrp(tty_pgrp, sig, 1);
1111 put_pid(tty_pgrp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001112 }
1113}
1114
1115/**
1116 * n_tty_receive_break - handle break
1117 * @tty: terminal
1118 *
1119 * An RS232 break event has been hit in the incoming bitstream. This
1120 * can cause a variety of events depending upon the termios settings.
1121 *
Peter Hurley6d76bd22013-06-15 09:14:26 -04001122 * n_tty_receive_buf()/producer path:
1123 * caller holds non-exclusive termios_rwsem
1124 * publishes read_head via put_tty_queue()
1125 *
1126 * Note: may get exclusive termios_rwsem if flushing input buffer
Linus Torvalds1da177e2005-04-16 15:20:36 -07001127 */
Alan Cox4edf1822008-02-08 04:18:44 -08001128
Linus Torvalds1da177e2005-04-16 15:20:36 -07001129static inline void n_tty_receive_break(struct tty_struct *tty)
1130{
Jiri Slaby57c94122012-10-18 22:26:43 +02001131 struct n_tty_data *ldata = tty->disc_data;
1132
Linus Torvalds1da177e2005-04-16 15:20:36 -07001133 if (I_IGNBRK(tty))
1134 return;
1135 if (I_BRKINT(tty)) {
Peter Hurley8c985d12013-03-06 08:38:19 -05001136 isig(SIGINT, tty);
1137 if (!L_NOFLSH(tty)) {
Peter Hurley6d76bd22013-06-15 09:14:26 -04001138 /* flushing needs exclusive termios_rwsem */
1139 up_read(&tty->termios_rwsem);
Peter Hurley8c985d12013-03-06 08:38:19 -05001140 n_tty_flush_buffer(tty);
1141 tty_driver_flush_buffer(tty);
Peter Hurley6d76bd22013-06-15 09:14:26 -04001142 down_read(&tty->termios_rwsem);
Peter Hurley8c985d12013-03-06 08:38:19 -05001143 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001144 return;
1145 }
1146 if (I_PARMRK(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001147 put_tty_queue('\377', ldata);
1148 put_tty_queue('\0', ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001149 }
Jiri Slaby57c94122012-10-18 22:26:43 +02001150 put_tty_queue('\0', ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001151 wake_up_interruptible(&tty->read_wait);
1152}
1153
1154/**
1155 * n_tty_receive_overrun - handle overrun reporting
1156 * @tty: terminal
1157 *
1158 * Data arrived faster than we could process it. While the tty
1159 * driver has flagged this the bits that were missed are gone
1160 * forever.
1161 *
1162 * Called from the receive_buf path so single threaded. Does not
1163 * need locking as num_overrun and overrun_time are function
1164 * private.
1165 */
Alan Cox4edf1822008-02-08 04:18:44 -08001166
Linus Torvalds1da177e2005-04-16 15:20:36 -07001167static inline void n_tty_receive_overrun(struct tty_struct *tty)
1168{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001169 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001170 char buf[64];
1171
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001172 ldata->num_overrun++;
1173 if (time_after(jiffies, ldata->overrun_time + HZ) ||
1174 time_after(ldata->overrun_time, jiffies)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001175 printk(KERN_WARNING "%s: %d input overrun(s)\n",
1176 tty_name(tty, buf),
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001177 ldata->num_overrun);
1178 ldata->overrun_time = jiffies;
1179 ldata->num_overrun = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180 }
1181}
1182
1183/**
1184 * n_tty_receive_parity_error - error notifier
1185 * @tty: terminal device
1186 * @c: character
1187 *
1188 * Process a parity error and queue the right data to indicate
Peter Hurley6d76bd22013-06-15 09:14:26 -04001189 * the error case if necessary.
1190 *
1191 * n_tty_receive_buf()/producer path:
1192 * caller holds non-exclusive termios_rwsem
1193 * publishes read_head via put_tty_queue()
Linus Torvalds1da177e2005-04-16 15:20:36 -07001194 */
1195static inline void n_tty_receive_parity_error(struct tty_struct *tty,
1196 unsigned char c)
1197{
Jiri Slaby57c94122012-10-18 22:26:43 +02001198 struct n_tty_data *ldata = tty->disc_data;
1199
Alan Cox4edf1822008-02-08 04:18:44 -08001200 if (I_IGNPAR(tty))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001201 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202 if (I_PARMRK(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001203 put_tty_queue('\377', ldata);
1204 put_tty_queue('\0', ldata);
1205 put_tty_queue(c, ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001206 } else if (I_INPCK(tty))
Jiri Slaby57c94122012-10-18 22:26:43 +02001207 put_tty_queue('\0', ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001208 else
Jiri Slaby57c94122012-10-18 22:26:43 +02001209 put_tty_queue(c, ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001210 wake_up_interruptible(&tty->read_wait);
1211}
1212
1213/**
1214 * n_tty_receive_char - perform processing
1215 * @tty: terminal device
1216 * @c: character
1217 *
1218 * Process an individual character of input received from the driver.
Alan Cox4edf1822008-02-08 04:18:44 -08001219 * This is serialized with respect to itself by the rules for the
Linus Torvalds1da177e2005-04-16 15:20:36 -07001220 * driver above.
Peter Hurley6d76bd22013-06-15 09:14:26 -04001221 *
1222 * n_tty_receive_buf()/producer path:
1223 * caller holds non-exclusive termios_rwsem
1224 * publishes canon_head if canonical mode is active
1225 * otherwise, publishes read_head via put_tty_queue()
Linus Torvalds1da177e2005-04-16 15:20:36 -07001226 */
1227
1228static inline void n_tty_receive_char(struct tty_struct *tty, unsigned char c)
1229{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001230 struct n_tty_data *ldata = tty->disc_data;
Joe Petersonacc71bb2009-01-02 13:43:32 +00001231 int parmrk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001232
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001233 if (ldata->raw) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001234 put_tty_queue(c, ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001235 return;
1236 }
Alan Cox4edf1822008-02-08 04:18:44 -08001237
Linus Torvalds1da177e2005-04-16 15:20:36 -07001238 if (I_ISTRIP(tty))
1239 c &= 0x7f;
1240 if (I_IUCLC(tty) && L_IEXTEN(tty))
Alan Cox300a6202009-01-02 13:41:04 +00001241 c = tolower(c);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001242
hyc@symas.com26df6d12010-06-22 10:14:49 -07001243 if (L_EXTPROC(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001244 put_tty_queue(c, ldata);
hyc@symas.com26df6d12010-06-22 10:14:49 -07001245 return;
1246 }
1247
Joe Peterson54d2a372008-02-06 01:37:59 -08001248 if (tty->stopped && !tty->flow_stopped && I_IXON(tty) &&
Joe Petersona88a69c2009-01-02 13:40:53 +00001249 I_IXANY(tty) && c != START_CHAR(tty) && c != STOP_CHAR(tty) &&
1250 c != INTR_CHAR(tty) && c != QUIT_CHAR(tty) && c != SUSP_CHAR(tty)) {
Joe Peterson54d2a372008-02-06 01:37:59 -08001251 start_tty(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001252 process_echoes(tty);
1253 }
Joe Peterson54d2a372008-02-06 01:37:59 -08001254
Linus Torvalds1da177e2005-04-16 15:20:36 -07001255 if (tty->closing) {
1256 if (I_IXON(tty)) {
Joe Petersona88a69c2009-01-02 13:40:53 +00001257 if (c == START_CHAR(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001258 start_tty(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001259 process_echoes(tty);
Alan Cox300a6202009-01-02 13:41:04 +00001260 } else if (c == STOP_CHAR(tty))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261 stop_tty(tty);
1262 }
1263 return;
1264 }
1265
1266 /*
1267 * If the previous character was LNEXT, or we know that this
1268 * character is not one of the characters that we'll have to
1269 * handle specially, do shortcut processing to speed things
1270 * up.
1271 */
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001272 if (!test_bit(c, ldata->process_char_map) || ldata->lnext) {
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001273 ldata->lnext = 0;
Joe Petersonacc71bb2009-01-02 13:43:32 +00001274 parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0;
Peter Hurleyce741172013-06-15 09:14:20 -04001275 if (read_cnt(ldata) >= (N_TTY_BUF_SIZE - parmrk - 1)) {
Joe Petersonacc71bb2009-01-02 13:43:32 +00001276 /* beep if no space */
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001277 if (L_ECHO(tty))
1278 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001279 return;
1280 }
1281 if (L_ECHO(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001282 finish_erasing(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001283 /* Record the column of first canon char. */
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001284 if (ldata->canon_head == ldata->read_head)
Jiri Slaby57c94122012-10-18 22:26:43 +02001285 echo_set_canon_col(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001286 echo_char(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001287 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001288 }
Joe Petersonacc71bb2009-01-02 13:43:32 +00001289 if (parmrk)
Jiri Slaby57c94122012-10-18 22:26:43 +02001290 put_tty_queue(c, ldata);
1291 put_tty_queue(c, ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001292 return;
1293 }
Alan Cox4edf1822008-02-08 04:18:44 -08001294
Linus Torvalds1da177e2005-04-16 15:20:36 -07001295 if (I_IXON(tty)) {
1296 if (c == START_CHAR(tty)) {
1297 start_tty(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001298 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001299 return;
1300 }
1301 if (c == STOP_CHAR(tty)) {
1302 stop_tty(tty);
1303 return;
1304 }
1305 }
Joe Peterson575537b32008-04-30 00:53:30 -07001306
Linus Torvalds1da177e2005-04-16 15:20:36 -07001307 if (L_ISIG(tty)) {
1308 int signal;
1309 signal = SIGINT;
1310 if (c == INTR_CHAR(tty))
1311 goto send_signal;
1312 signal = SIGQUIT;
1313 if (c == QUIT_CHAR(tty))
1314 goto send_signal;
1315 signal = SIGTSTP;
1316 if (c == SUSP_CHAR(tty)) {
1317send_signal:
Joe Petersonec5b1152008-02-06 01:37:38 -08001318 if (!L_NOFLSH(tty)) {
Peter Hurley6d76bd22013-06-15 09:14:26 -04001319 /* flushing needs exclusive termios_rwsem */
1320 up_read(&tty->termios_rwsem);
Joe Petersonec5b1152008-02-06 01:37:38 -08001321 n_tty_flush_buffer(tty);
Alan Coxf34d7a52008-04-30 00:54:13 -07001322 tty_driver_flush_buffer(tty);
Peter Hurley6d76bd22013-06-15 09:14:26 -04001323 down_read(&tty->termios_rwsem);
Joe Petersonec5b1152008-02-06 01:37:38 -08001324 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001325 if (I_IXON(tty))
1326 start_tty(tty);
1327 if (L_ECHO(tty)) {
Joe Petersonec5b1152008-02-06 01:37:38 -08001328 echo_char(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001329 process_echoes(tty);
1330 }
Peter Hurley8c985d12013-03-06 08:38:19 -05001331 isig(signal, tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001332 return;
1333 }
1334 }
Joe Peterson575537b32008-04-30 00:53:30 -07001335
1336 if (c == '\r') {
1337 if (I_IGNCR(tty))
1338 return;
1339 if (I_ICRNL(tty))
1340 c = '\n';
1341 } else if (c == '\n' && I_INLCR(tty))
1342 c = '\r';
1343
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001344 if (ldata->icanon) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001345 if (c == ERASE_CHAR(tty) || c == KILL_CHAR(tty) ||
1346 (c == WERASE_CHAR(tty) && L_IEXTEN(tty))) {
1347 eraser(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001348 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001349 return;
1350 }
1351 if (c == LNEXT_CHAR(tty) && L_IEXTEN(tty)) {
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001352 ldata->lnext = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001353 if (L_ECHO(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001354 finish_erasing(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001355 if (L_ECHOCTL(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001356 echo_char_raw('^', ldata);
1357 echo_char_raw('\b', ldata);
Joe Petersona88a69c2009-01-02 13:40:53 +00001358 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359 }
1360 }
1361 return;
1362 }
1363 if (c == REPRINT_CHAR(tty) && L_ECHO(tty) &&
1364 L_IEXTEN(tty)) {
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001365 size_t tail = ldata->canon_head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001366
Jiri Slaby57c94122012-10-18 22:26:43 +02001367 finish_erasing(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001368 echo_char(c, tty);
Jiri Slaby57c94122012-10-18 22:26:43 +02001369 echo_char_raw('\n', ldata);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001370 while (tail != ldata->read_head) {
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001371 echo_char(read_buf(ldata, tail), tty);
1372 tail++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001373 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001374 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001375 return;
1376 }
1377 if (c == '\n') {
Peter Hurleyce741172013-06-15 09:14:20 -04001378 if (read_cnt(ldata) >= N_TTY_BUF_SIZE) {
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001379 if (L_ECHO(tty))
1380 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001381 return;
1382 }
1383 if (L_ECHO(tty) || L_ECHONL(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001384 echo_char_raw('\n', ldata);
Joe Petersona88a69c2009-01-02 13:40:53 +00001385 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001386 }
1387 goto handle_newline;
1388 }
1389 if (c == EOF_CHAR(tty)) {
Peter Hurleyce741172013-06-15 09:14:20 -04001390 if (read_cnt(ldata) >= N_TTY_BUF_SIZE)
Joe Petersonacc71bb2009-01-02 13:43:32 +00001391 return;
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001392 if (ldata->canon_head != ldata->read_head)
Alan Cox4edf1822008-02-08 04:18:44 -08001393 set_bit(TTY_PUSH, &tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001394 c = __DISABLED_CHAR;
1395 goto handle_newline;
1396 }
1397 if ((c == EOL_CHAR(tty)) ||
1398 (c == EOL2_CHAR(tty) && L_IEXTEN(tty))) {
Joe Petersonacc71bb2009-01-02 13:43:32 +00001399 parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty))
1400 ? 1 : 0;
Peter Hurleyce741172013-06-15 09:14:20 -04001401 if (read_cnt(ldata) >= (N_TTY_BUF_SIZE - parmrk)) {
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001402 if (L_ECHO(tty))
1403 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001404 return;
1405 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001406 /*
1407 * XXX are EOL_CHAR and EOL2_CHAR echoed?!?
1408 */
1409 if (L_ECHO(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001410 /* Record the column of first canon char. */
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001411 if (ldata->canon_head == ldata->read_head)
Jiri Slaby57c94122012-10-18 22:26:43 +02001412 echo_set_canon_col(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001413 echo_char(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001414 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001415 }
1416 /*
1417 * XXX does PARMRK doubling happen for
1418 * EOL_CHAR and EOL2_CHAR?
1419 */
Joe Petersonacc71bb2009-01-02 13:43:32 +00001420 if (parmrk)
Jiri Slaby57c94122012-10-18 22:26:43 +02001421 put_tty_queue(c, ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001422
Alan Cox4edf1822008-02-08 04:18:44 -08001423handle_newline:
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001424 set_bit(ldata->read_head & (N_TTY_BUF_SIZE - 1), ldata->read_flags);
Peter Hurley6d76bd22013-06-15 09:14:26 -04001425 put_tty_queue(c, ldata);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001426 ldata->canon_head = ldata->read_head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001427 kill_fasync(&tty->fasync, SIGIO, POLL_IN);
1428 if (waitqueue_active(&tty->read_wait))
1429 wake_up_interruptible(&tty->read_wait);
1430 return;
1431 }
1432 }
Alan Cox4edf1822008-02-08 04:18:44 -08001433
Joe Petersonacc71bb2009-01-02 13:43:32 +00001434 parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0;
Peter Hurleyce741172013-06-15 09:14:20 -04001435 if (read_cnt(ldata) >= (N_TTY_BUF_SIZE - parmrk - 1)) {
Joe Petersonacc71bb2009-01-02 13:43:32 +00001436 /* beep if no space */
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001437 if (L_ECHO(tty))
1438 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001439 return;
1440 }
1441 if (L_ECHO(tty)) {
Jiri Slaby57c94122012-10-18 22:26:43 +02001442 finish_erasing(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001443 if (c == '\n')
Jiri Slaby57c94122012-10-18 22:26:43 +02001444 echo_char_raw('\n', ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001445 else {
1446 /* Record the column of first canon char. */
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001447 if (ldata->canon_head == ldata->read_head)
Jiri Slaby57c94122012-10-18 22:26:43 +02001448 echo_set_canon_col(ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001449 echo_char(c, tty);
1450 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001451 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001452 }
1453
Joe Petersonacc71bb2009-01-02 13:43:32 +00001454 if (parmrk)
Jiri Slaby57c94122012-10-18 22:26:43 +02001455 put_tty_queue(c, ldata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001456
Jiri Slaby57c94122012-10-18 22:26:43 +02001457 put_tty_queue(c, ldata);
Alan Cox4edf1822008-02-08 04:18:44 -08001458}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001459
Linus Torvalds1da177e2005-04-16 15:20:36 -07001460/**
1461 * n_tty_receive_buf - data receive
1462 * @tty: terminal device
1463 * @cp: buffer
1464 * @fp: flag buffer
1465 * @count: characters
1466 *
1467 * Called by the terminal driver when a block of characters has
1468 * been received. This function must be called from soft contexts
1469 * not from interrupt context. The driver is responsible for making
1470 * calls one at a time and in order (or using flush_to_ldisc)
Peter Hurley6d76bd22013-06-15 09:14:26 -04001471 *
1472 * n_tty_receive_buf()/producer path:
1473 * claims non-exclusive termios_rwsem
1474 * publishes read_head and canon_head
Linus Torvalds1da177e2005-04-16 15:20:36 -07001475 */
Alan Cox4edf1822008-02-08 04:18:44 -08001476
Peter Hurley24a89d12013-06-15 09:14:15 -04001477static void __receive_buf(struct tty_struct *tty, const unsigned char *cp,
1478 char *fp, int count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001479{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001480 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481 const unsigned char *p;
1482 char *f, flags = TTY_NORMAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001483 char buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001484
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001485 if (ldata->real_raw) {
Peter Hurleyd1913e32013-06-15 09:14:28 -04001486 size_t n, head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001487
Peter Hurleyd1913e32013-06-15 09:14:28 -04001488 head = ldata->read_head & (N_TTY_BUF_SIZE - 1);
1489 n = N_TTY_BUF_SIZE - max(read_cnt(ldata), head);
1490 n = min_t(size_t, count, n);
1491 memcpy(read_buf_addr(ldata, head), cp, n);
1492 ldata->read_head += n;
1493 cp += n;
1494 count -= n;
1495
1496 head = ldata->read_head & (N_TTY_BUF_SIZE - 1);
1497 n = N_TTY_BUF_SIZE - max(read_cnt(ldata), head);
1498 n = min_t(size_t, count, n);
1499 memcpy(read_buf_addr(ldata, head), cp, n);
1500 ldata->read_head += n;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001501 } else {
Peter Hurleyd1913e32013-06-15 09:14:28 -04001502 int i;
1503
Alan Cox4edf1822008-02-08 04:18:44 -08001504 for (i = count, p = cp, f = fp; i; i--, p++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001505 if (f)
1506 flags = *f++;
1507 switch (flags) {
1508 case TTY_NORMAL:
1509 n_tty_receive_char(tty, *p);
1510 break;
1511 case TTY_BREAK:
1512 n_tty_receive_break(tty);
1513 break;
1514 case TTY_PARITY:
1515 case TTY_FRAME:
1516 n_tty_receive_parity_error(tty, *p);
1517 break;
1518 case TTY_OVERRUN:
1519 n_tty_receive_overrun(tty);
1520 break;
1521 default:
Alan Cox4edf1822008-02-08 04:18:44 -08001522 printk(KERN_ERR "%s: unknown flag %d\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001523 tty_name(tty, buf), flags);
1524 break;
1525 }
1526 }
Alan Coxf34d7a52008-04-30 00:54:13 -07001527 if (tty->ops->flush_chars)
1528 tty->ops->flush_chars(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001529 }
1530
Peter Hurleyce741172013-06-15 09:14:20 -04001531 if ((!ldata->icanon && (read_cnt(ldata) >= ldata->minimum_to_wake)) ||
hyc@symas.com26df6d12010-06-22 10:14:49 -07001532 L_EXTPROC(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001533 kill_fasync(&tty->fasync, SIGIO, POLL_IN);
1534 if (waitqueue_active(&tty->read_wait))
1535 wake_up_interruptible(&tty->read_wait);
1536 }
1537
Peter Hurley6367ca72013-06-15 09:14:33 -04001538 n_tty_check_throttle(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001539}
1540
Peter Hurley24a89d12013-06-15 09:14:15 -04001541static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
1542 char *fp, int count)
1543{
Peter Hurley9356b532013-06-15 09:14:24 -04001544 down_read(&tty->termios_rwsem);
Peter Hurley24a89d12013-06-15 09:14:15 -04001545 __receive_buf(tty, cp, fp, count);
Peter Hurley9356b532013-06-15 09:14:24 -04001546 up_read(&tty->termios_rwsem);
Peter Hurley24a89d12013-06-15 09:14:15 -04001547}
1548
1549static int n_tty_receive_buf2(struct tty_struct *tty, const unsigned char *cp,
1550 char *fp, int count)
1551{
1552 struct n_tty_data *ldata = tty->disc_data;
1553 int room;
1554
Peter Hurley9356b532013-06-15 09:14:24 -04001555 down_read(&tty->termios_rwsem);
1556
Peter Hurley24a89d12013-06-15 09:14:15 -04001557 tty->receive_room = room = receive_room(tty);
1558 if (!room)
1559 ldata->no_room = 1;
1560 count = min(count, room);
1561 if (count)
1562 __receive_buf(tty, cp, fp, count);
1563
Peter Hurley9356b532013-06-15 09:14:24 -04001564 up_read(&tty->termios_rwsem);
1565
Peter Hurley24a89d12013-06-15 09:14:15 -04001566 return count;
1567}
1568
Linus Torvalds1da177e2005-04-16 15:20:36 -07001569int is_ignored(int sig)
1570{
1571 return (sigismember(&current->blocked, sig) ||
Alan Cox4edf1822008-02-08 04:18:44 -08001572 current->sighand->action[sig-1].sa.sa_handler == SIG_IGN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001573}
1574
1575/**
1576 * n_tty_set_termios - termios data changed
1577 * @tty: terminal
1578 * @old: previous data
1579 *
1580 * Called by the tty layer when the user changes termios flags so
1581 * that the line discipline can plan ahead. This function cannot sleep
Alan Cox4edf1822008-02-08 04:18:44 -08001582 * and is protected from re-entry by the tty layer. The user is
Linus Torvalds1da177e2005-04-16 15:20:36 -07001583 * guaranteed that this function will not be re-entered or in progress
1584 * when the ldisc is closed.
Alan Cox17b82062008-10-13 10:45:06 +01001585 *
Peter Hurley6a1c0682013-06-15 09:14:23 -04001586 * Locking: Caller holds tty->termios_rwsem
Linus Torvalds1da177e2005-04-16 15:20:36 -07001587 */
Alan Cox4edf1822008-02-08 04:18:44 -08001588
1589static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001590{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001591 struct n_tty_data *ldata = tty->disc_data;
Alan Cox47afa7a2008-10-13 10:44:17 +01001592 int canon_change = 1;
Alan Cox47afa7a2008-10-13 10:44:17 +01001593
1594 if (old)
Alan Coxadc8d742012-07-14 15:31:47 +01001595 canon_change = (old->c_lflag ^ tty->termios.c_lflag) & ICANON;
Alan Cox47afa7a2008-10-13 10:44:17 +01001596 if (canon_change) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001597 bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001598 ldata->canon_head = ldata->read_tail;
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001599 ldata->erasing = 0;
Peter Hurley6f9b0282013-06-15 09:14:27 -04001600 ldata->lnext = 0;
Alan Cox47afa7a2008-10-13 10:44:17 +01001601 }
1602
Peter Hurleyce741172013-06-15 09:14:20 -04001603 if (canon_change && !L_ICANON(tty) && read_cnt(ldata))
Alan Cox47afa7a2008-10-13 10:44:17 +01001604 wake_up_interruptible(&tty->read_wait);
Alan Cox4edf1822008-02-08 04:18:44 -08001605
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001606 ldata->icanon = (L_ICANON(tty) != 0);
Peter Hurley582f5592013-05-17 12:49:48 -04001607
Linus Torvalds1da177e2005-04-16 15:20:36 -07001608 if (I_ISTRIP(tty) || I_IUCLC(tty) || I_IGNCR(tty) ||
1609 I_ICRNL(tty) || I_INLCR(tty) || L_ICANON(tty) ||
1610 I_IXON(tty) || L_ISIG(tty) || L_ECHO(tty) ||
1611 I_PARMRK(tty)) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001612 bitmap_zero(ldata->process_char_map, 256);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001613
1614 if (I_IGNCR(tty) || I_ICRNL(tty))
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001615 set_bit('\r', ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001616 if (I_INLCR(tty))
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001617 set_bit('\n', ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001618
1619 if (L_ICANON(tty)) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001620 set_bit(ERASE_CHAR(tty), ldata->process_char_map);
1621 set_bit(KILL_CHAR(tty), ldata->process_char_map);
1622 set_bit(EOF_CHAR(tty), ldata->process_char_map);
1623 set_bit('\n', ldata->process_char_map);
1624 set_bit(EOL_CHAR(tty), ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001625 if (L_IEXTEN(tty)) {
1626 set_bit(WERASE_CHAR(tty),
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001627 ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001628 set_bit(LNEXT_CHAR(tty),
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001629 ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001630 set_bit(EOL2_CHAR(tty),
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001631 ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001632 if (L_ECHO(tty))
1633 set_bit(REPRINT_CHAR(tty),
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001634 ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001635 }
1636 }
1637 if (I_IXON(tty)) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001638 set_bit(START_CHAR(tty), ldata->process_char_map);
1639 set_bit(STOP_CHAR(tty), ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001640 }
1641 if (L_ISIG(tty)) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001642 set_bit(INTR_CHAR(tty), ldata->process_char_map);
1643 set_bit(QUIT_CHAR(tty), ldata->process_char_map);
1644 set_bit(SUSP_CHAR(tty), ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001645 }
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001646 clear_bit(__DISABLED_CHAR, ldata->process_char_map);
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001647 ldata->raw = 0;
1648 ldata->real_raw = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001649 } else {
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001650 ldata->raw = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001651 if ((I_IGNBRK(tty) || (!I_BRKINT(tty) && !I_PARMRK(tty))) &&
1652 (I_IGNPAR(tty) || !I_INPCK(tty)) &&
1653 (tty->driver->flags & TTY_DRIVER_REAL_RAW))
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001654 ldata->real_raw = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001655 else
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001656 ldata->real_raw = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001657 }
Linus Torvalds55db4c62011-06-04 06:33:24 +09001658 n_tty_set_room(tty);
Wang YanQingdab73b42013-05-09 14:16:47 +08001659 /*
1660 * Fix tty hang when I_IXON(tty) is cleared, but the tty
1661 * been stopped by STOP_CHAR(tty) before it.
1662 */
1663 if (!I_IXON(tty) && old && (old->c_iflag & IXON) && !tty->flow_stopped) {
1664 start_tty(tty);
1665 }
1666
Alan Coxf34d7a52008-04-30 00:54:13 -07001667 /* The termios change make the tty ready for I/O */
1668 wake_up_interruptible(&tty->write_wait);
1669 wake_up_interruptible(&tty->read_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001670}
1671
1672/**
1673 * n_tty_close - close the ldisc for this tty
1674 * @tty: device
1675 *
Alan Cox4edf1822008-02-08 04:18:44 -08001676 * Called from the terminal layer when this line discipline is
1677 * being shut down, either because of a close or becsuse of a
Linus Torvalds1da177e2005-04-16 15:20:36 -07001678 * discipline change. The function will not be called while other
1679 * ldisc methods are in progress.
1680 */
Alan Cox4edf1822008-02-08 04:18:44 -08001681
Linus Torvalds1da177e2005-04-16 15:20:36 -07001682static void n_tty_close(struct tty_struct *tty)
1683{
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001684 struct n_tty_data *ldata = tty->disc_data;
1685
Peter Hurley79901312013-03-11 16:44:23 -04001686 if (tty->link)
1687 n_tty_packet_mode_flush(tty);
1688
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001689 kfree(ldata->read_buf);
1690 kfree(ldata->echo_buf);
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001691 kfree(ldata);
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001692 tty->disc_data = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001693}
1694
1695/**
1696 * n_tty_open - open an ldisc
1697 * @tty: terminal to open
1698 *
Alan Cox4edf1822008-02-08 04:18:44 -08001699 * Called when this line discipline is being attached to the
Linus Torvalds1da177e2005-04-16 15:20:36 -07001700 * terminal device. Can sleep. Called serialized so that no
1701 * other events will occur in parallel. No further open will occur
1702 * until a close.
1703 */
1704
1705static int n_tty_open(struct tty_struct *tty)
1706{
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001707 struct n_tty_data *ldata;
1708
1709 ldata = kzalloc(sizeof(*ldata), GFP_KERNEL);
1710 if (!ldata)
1711 goto err;
1712
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001713 ldata->overrun_time = jiffies;
Jiri Slabybddc7152012-10-18 22:26:42 +02001714 mutex_init(&ldata->atomic_read_lock);
1715 mutex_init(&ldata->output_lock);
1716 mutex_init(&ldata->echo_lock);
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001717
Joe Petersona88a69c2009-01-02 13:40:53 +00001718 /* These are ugly. Currently a malloc failure here can panic */
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001719 ldata->read_buf = kzalloc(N_TTY_BUF_SIZE, GFP_KERNEL);
1720 ldata->echo_buf = kzalloc(N_TTY_BUF_SIZE, GFP_KERNEL);
1721 if (!ldata->read_buf || !ldata->echo_buf)
Jiri Slabyb91939f2012-10-18 22:26:35 +02001722 goto err_free_bufs;
Alan Cox0b4068a2009-06-11 13:05:49 +01001723
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001724 tty->disc_data = ldata;
Peter Hurleyb66f4fa2013-03-11 16:44:32 -04001725 reset_buffer_flags(tty->disc_data);
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001726 ldata->column = 0;
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04001727 ldata->minimum_to_wake = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001728 tty->closing = 0;
Peter Hurleyb66f4fa2013-03-11 16:44:32 -04001729 /* indicate buffer work may resume */
1730 clear_bit(TTY_LDISC_HALTED, &tty->flags);
1731 n_tty_set_termios(tty, NULL);
1732 tty_unthrottle(tty);
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001733
Linus Torvalds1da177e2005-04-16 15:20:36 -07001734 return 0;
Jiri Slabyb91939f2012-10-18 22:26:35 +02001735err_free_bufs:
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001736 kfree(ldata->read_buf);
1737 kfree(ldata->echo_buf);
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001738 kfree(ldata);
1739err:
Jiri Slabyb91939f2012-10-18 22:26:35 +02001740 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001741}
1742
1743static inline int input_available_p(struct tty_struct *tty, int amt)
1744{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001745 struct n_tty_data *ldata = tty->disc_data;
1746
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001747 if (ldata->icanon && !L_EXTPROC(tty)) {
Peter Hurleya73d3d62013-06-15 09:14:25 -04001748 if (ldata->canon_head != ldata->read_tail)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001749 return 1;
Peter Hurleyce741172013-06-15 09:14:20 -04001750 } else if (read_cnt(ldata) >= (amt ? amt : 1))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001751 return 1;
1752
1753 return 0;
1754}
1755
1756/**
Thorsten Wißmannbbd20752011-12-08 17:47:33 +01001757 * copy_from_read_buf - copy read data directly
Linus Torvalds1da177e2005-04-16 15:20:36 -07001758 * @tty: terminal device
1759 * @b: user data
1760 * @nr: size of data
1761 *
Alan Cox11a96d12008-10-13 10:46:24 +01001762 * Helper function to speed up n_tty_read. It is only called when
Linus Torvalds1da177e2005-04-16 15:20:36 -07001763 * ICANON is off; it copies characters straight from the tty queue to
1764 * user space directly. It can be profitably called twice; once to
1765 * drain the space from the tail pointer to the (physical) end of the
1766 * buffer, and once to drain the space from the (physical) beginning of
1767 * the buffer to head pointer.
1768 *
Jiri Slabybddc7152012-10-18 22:26:42 +02001769 * Called under the ldata->atomic_read_lock sem
Linus Torvalds1da177e2005-04-16 15:20:36 -07001770 *
Peter Hurley6d76bd22013-06-15 09:14:26 -04001771 * n_tty_read()/consumer path:
1772 * caller holds non-exclusive termios_rwsem
1773 * read_tail published
Linus Torvalds1da177e2005-04-16 15:20:36 -07001774 */
Alan Cox4edf1822008-02-08 04:18:44 -08001775
Alan Cox33f0f882006-01-09 20:54:13 -08001776static int copy_from_read_buf(struct tty_struct *tty,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001777 unsigned char __user **b,
1778 size_t *nr)
1779
1780{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001781 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001782 int retval;
1783 size_t n;
Jiri Slaby3fa10cc2012-04-26 20:13:00 +02001784 bool is_eof;
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001785 size_t tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001786
1787 retval = 0;
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001788 n = min(read_cnt(ldata), N_TTY_BUF_SIZE - tail);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001789 n = min(*nr, n);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001790 if (n) {
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001791 retval = copy_to_user(*b, read_buf_addr(ldata, tail), n);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001792 n -= retval;
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001793 is_eof = n == 1 && read_buf(ldata, tail) == EOF_CHAR(tty);
1794 tty_audit_add_data(tty, read_buf_addr(ldata, tail), n,
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001795 ldata->icanon);
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001796 ldata->read_tail += n;
hyc@symas.com26df6d12010-06-22 10:14:49 -07001797 /* Turn single EOF into zero-length read */
Peter Hurleyce741172013-06-15 09:14:20 -04001798 if (L_EXTPROC(tty) && ldata->icanon && is_eof && !read_cnt(ldata))
Jiri Slaby3fa10cc2012-04-26 20:13:00 +02001799 n = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001800 *b += n;
1801 *nr -= n;
1802 }
1803 return retval;
1804}
1805
Peter Hurley88bb0de2013-06-15 09:14:16 -04001806/**
Peter Hurley32f13522013-06-15 09:14:17 -04001807 * canon_copy_from_read_buf - copy read data in canonical mode
Peter Hurley88bb0de2013-06-15 09:14:16 -04001808 * @tty: terminal device
1809 * @b: user data
1810 * @nr: size of data
1811 *
1812 * Helper function for n_tty_read. It is only called when ICANON is on;
Peter Hurley32f13522013-06-15 09:14:17 -04001813 * it copies one line of input up to and including the line-delimiting
1814 * character into the user-space buffer.
Peter Hurley88bb0de2013-06-15 09:14:16 -04001815 *
1816 * Called under the atomic_read_lock mutex
Peter Hurley6d76bd22013-06-15 09:14:26 -04001817 *
1818 * n_tty_read()/consumer path:
1819 * caller holds non-exclusive termios_rwsem
1820 * read_tail published
Peter Hurley88bb0de2013-06-15 09:14:16 -04001821 */
1822
Peter Hurley32f13522013-06-15 09:14:17 -04001823static int canon_copy_from_read_buf(struct tty_struct *tty,
1824 unsigned char __user **b,
1825 size_t *nr)
Peter Hurley88bb0de2013-06-15 09:14:16 -04001826{
1827 struct n_tty_data *ldata = tty->disc_data;
Peter Hurley32f13522013-06-15 09:14:17 -04001828 size_t n, size, more, c;
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001829 size_t eol;
1830 size_t tail;
1831 int ret, found = 0;
Peter Hurley88bb0de2013-06-15 09:14:16 -04001832
1833 /* N.B. avoid overrun if nr == 0 */
Peter Hurleyce741172013-06-15 09:14:20 -04001834 n = min(*nr, read_cnt(ldata));
Peter Hurley6d76bd22013-06-15 09:14:26 -04001835 if (!n)
Peter Hurley32f13522013-06-15 09:14:17 -04001836 return 0;
Peter Hurley88bb0de2013-06-15 09:14:16 -04001837
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001838 tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1);
Peter Hurley32f13522013-06-15 09:14:17 -04001839 size = min_t(size_t, tail + n, N_TTY_BUF_SIZE);
1840
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001841 n_tty_trace("%s: nr:%zu tail:%zu n:%zu size:%zu\n",
Peter Hurley32f13522013-06-15 09:14:17 -04001842 __func__, *nr, tail, n, size);
1843
1844 eol = find_next_bit(ldata->read_flags, size, tail);
1845 more = n - (size - tail);
1846 if (eol == N_TTY_BUF_SIZE && more) {
1847 /* scan wrapped without finding set bit */
1848 eol = find_next_bit(ldata->read_flags, more, 0);
1849 if (eol != more)
1850 found = 1;
1851 } else if (eol != size)
1852 found = 1;
1853
1854 size = N_TTY_BUF_SIZE - tail;
1855 n = (found + eol + size) & (N_TTY_BUF_SIZE - 1);
1856 c = n;
1857
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001858 if (found && read_buf(ldata, eol) == __DISABLED_CHAR)
Peter Hurley32f13522013-06-15 09:14:17 -04001859 n--;
1860
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001861 n_tty_trace("%s: eol:%zu found:%d n:%zu c:%zu size:%zu more:%zu\n",
Peter Hurley32f13522013-06-15 09:14:17 -04001862 __func__, eol, found, n, c, size, more);
1863
Peter Hurley32f13522013-06-15 09:14:17 -04001864 if (n > size) {
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001865 ret = copy_to_user(*b, read_buf_addr(ldata, tail), size);
Peter Hurley32f13522013-06-15 09:14:17 -04001866 if (ret)
1867 return -EFAULT;
1868 ret = copy_to_user(*b + size, ldata->read_buf, n - size);
1869 } else
Peter Hurleybc5a5e32013-06-15 09:14:21 -04001870 ret = copy_to_user(*b, read_buf_addr(ldata, tail), n);
Peter Hurley32f13522013-06-15 09:14:17 -04001871
1872 if (ret)
1873 return -EFAULT;
1874 *b += n;
1875 *nr -= n;
1876
Peter Hurleya73d3d62013-06-15 09:14:25 -04001877 if (found)
Peter Hurley6d76bd22013-06-15 09:14:26 -04001878 clear_bit(eol, ldata->read_flags);
1879 smp_mb__after_clear_bit();
1880 ldata->read_tail += c;
Peter Hurley88bb0de2013-06-15 09:14:16 -04001881
Peter Hurley32f13522013-06-15 09:14:17 -04001882 if (found)
1883 tty_audit_push(tty);
Peter Hurley88bb0de2013-06-15 09:14:16 -04001884 return 0;
1885}
1886
Al Virocc4191d2008-03-29 03:08:48 +00001887extern ssize_t redirected_tty_write(struct file *, const char __user *,
Alan Cox4edf1822008-02-08 04:18:44 -08001888 size_t, loff_t *);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001889
1890/**
1891 * job_control - check job control
1892 * @tty: tty
1893 * @file: file handle
1894 *
1895 * Perform job control management checks on this file/tty descriptor
Alan Cox4edf1822008-02-08 04:18:44 -08001896 * and if appropriate send any needed signals and return a negative
Linus Torvalds1da177e2005-04-16 15:20:36 -07001897 * error code if action should be taken.
Alan Cox04f378b2008-04-30 00:53:29 -07001898 *
Peter Hurley01a5e442013-03-06 08:38:20 -05001899 * Locking: redirected write test is safe
1900 * current->signal->tty check is safe
1901 * ctrl_lock to safely reference tty->pgrp
Linus Torvalds1da177e2005-04-16 15:20:36 -07001902 */
Alan Cox4edf1822008-02-08 04:18:44 -08001903
Linus Torvalds1da177e2005-04-16 15:20:36 -07001904static int job_control(struct tty_struct *tty, struct file *file)
1905{
1906 /* Job control check -- must be done at start and after
1907 every sleep (POSIX.1 7.1.1.4). */
1908 /* NOTE: not yet done after every sleep pending a thorough
1909 check of the logic of this change. -- jlc */
1910 /* don't stop on /dev/console */
Peter Hurley01a5e442013-03-06 08:38:20 -05001911 if (file->f_op->write == redirected_tty_write ||
1912 current->signal->tty != tty)
1913 return 0;
1914
1915 spin_lock_irq(&tty->ctrl_lock);
1916 if (!tty->pgrp)
1917 printk(KERN_ERR "n_tty_read: no tty->pgrp!\n");
1918 else if (task_pgrp(current) != tty->pgrp) {
1919 spin_unlock_irq(&tty->ctrl_lock);
1920 if (is_ignored(SIGTTIN) || is_current_pgrp_orphaned())
1921 return -EIO;
1922 kill_pgrp(task_pgrp(current), SIGTTIN, 1);
1923 set_thread_flag(TIF_SIGPENDING);
1924 return -ERESTARTSYS;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001925 }
Peter Hurley01a5e442013-03-06 08:38:20 -05001926 spin_unlock_irq(&tty->ctrl_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001927 return 0;
1928}
Alan Cox4edf1822008-02-08 04:18:44 -08001929
Linus Torvalds1da177e2005-04-16 15:20:36 -07001930
1931/**
Alan Cox11a96d12008-10-13 10:46:24 +01001932 * n_tty_read - read function for tty
Linus Torvalds1da177e2005-04-16 15:20:36 -07001933 * @tty: tty device
1934 * @file: file object
1935 * @buf: userspace buffer pointer
1936 * @nr: size of I/O
1937 *
1938 * Perform reads for the line discipline. We are guaranteed that the
1939 * line discipline will not be closed under us but we may get multiple
1940 * parallel readers and must handle this ourselves. We may also get
1941 * a hangup. Always called in user context, may sleep.
1942 *
1943 * This code must be sure never to sleep through a hangup.
Peter Hurley6d76bd22013-06-15 09:14:26 -04001944 *
1945 * n_tty_read()/consumer path:
1946 * claims non-exclusive termios_rwsem
1947 * publishes read_tail
Linus Torvalds1da177e2005-04-16 15:20:36 -07001948 */
Alan Cox4edf1822008-02-08 04:18:44 -08001949
Alan Cox11a96d12008-10-13 10:46:24 +01001950static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001951 unsigned char __user *buf, size_t nr)
1952{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001953 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001954 unsigned char __user *b = buf;
1955 DECLARE_WAITQUEUE(wait, current);
1956 int c;
1957 int minimum, time;
1958 ssize_t retval = 0;
1959 ssize_t size;
1960 long timeout;
1961 unsigned long flags;
Alan Cox04f378b2008-04-30 00:53:29 -07001962 int packet;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001963
1964do_it_again:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001965 c = job_control(tty, file);
Alan Cox4edf1822008-02-08 04:18:44 -08001966 if (c < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001967 return c;
Alan Cox4edf1822008-02-08 04:18:44 -08001968
Peter Hurley9356b532013-06-15 09:14:24 -04001969 down_read(&tty->termios_rwsem);
1970
Linus Torvalds1da177e2005-04-16 15:20:36 -07001971 minimum = time = 0;
1972 timeout = MAX_SCHEDULE_TIMEOUT;
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001973 if (!ldata->icanon) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001974 minimum = MIN_CHAR(tty);
1975 if (minimum) {
Peter Hurleya6e54312013-06-15 07:28:29 -04001976 time = (HZ / 10) * TIME_CHAR(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001977 if (time)
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04001978 ldata->minimum_to_wake = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001979 else if (!waitqueue_active(&tty->read_wait) ||
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04001980 (ldata->minimum_to_wake > minimum))
1981 ldata->minimum_to_wake = minimum;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001982 } else {
Peter Hurleya6e54312013-06-15 07:28:29 -04001983 timeout = (HZ / 10) * TIME_CHAR(tty);
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04001984 ldata->minimum_to_wake = minimum = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001985 }
1986 }
1987
1988 /*
1989 * Internal serialization of reads.
1990 */
1991 if (file->f_flags & O_NONBLOCK) {
Peter Hurley9356b532013-06-15 09:14:24 -04001992 if (!mutex_trylock(&ldata->atomic_read_lock)) {
1993 up_read(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001994 return -EAGAIN;
Peter Hurley9356b532013-06-15 09:14:24 -04001995 }
Alan Cox4edf1822008-02-08 04:18:44 -08001996 } else {
Peter Hurley9356b532013-06-15 09:14:24 -04001997 if (mutex_lock_interruptible(&ldata->atomic_read_lock)) {
1998 up_read(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001999 return -ERESTARTSYS;
Peter Hurley9356b532013-06-15 09:14:24 -04002000 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002001 }
Alan Cox04f378b2008-04-30 00:53:29 -07002002 packet = tty->packet;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002003
2004 add_wait_queue(&tty->read_wait, &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002005 while (nr) {
2006 /* First test for status change. */
Alan Cox04f378b2008-04-30 00:53:29 -07002007 if (packet && tty->link->ctrl_status) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002008 unsigned char cs;
2009 if (b != buf)
2010 break;
Alan Cox04f378b2008-04-30 00:53:29 -07002011 spin_lock_irqsave(&tty->link->ctrl_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002012 cs = tty->link->ctrl_status;
2013 tty->link->ctrl_status = 0;
Alan Cox04f378b2008-04-30 00:53:29 -07002014 spin_unlock_irqrestore(&tty->link->ctrl_lock, flags);
Miloslav Trmac522ed772007-07-15 23:40:56 -07002015 if (tty_put_user(tty, cs, b++)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002016 retval = -EFAULT;
2017 b--;
2018 break;
2019 }
2020 nr--;
2021 break;
2022 }
2023 /* This statement must be first before checking for input
2024 so that any interrupt will set the state back to
2025 TASK_RUNNING. */
2026 set_current_state(TASK_INTERRUPTIBLE);
Alan Cox4edf1822008-02-08 04:18:44 -08002027
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04002028 if (((minimum - (b - buf)) < ldata->minimum_to_wake) &&
Linus Torvalds1da177e2005-04-16 15:20:36 -07002029 ((minimum - (b - buf)) >= 1))
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04002030 ldata->minimum_to_wake = (minimum - (b - buf));
Alan Cox4edf1822008-02-08 04:18:44 -08002031
Linus Torvalds1da177e2005-04-16 15:20:36 -07002032 if (!input_available_p(tty, 0)) {
2033 if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) {
2034 retval = -EIO;
2035 break;
2036 }
2037 if (tty_hung_up_p(file))
2038 break;
2039 if (!timeout)
2040 break;
2041 if (file->f_flags & O_NONBLOCK) {
2042 retval = -EAGAIN;
2043 break;
2044 }
2045 if (signal_pending(current)) {
2046 retval = -ERESTARTSYS;
2047 break;
2048 }
Linus Torvalds55db4c62011-06-04 06:33:24 +09002049 n_tty_set_room(tty);
Peter Hurley9356b532013-06-15 09:14:24 -04002050 up_read(&tty->termios_rwsem);
2051
Linus Torvalds1da177e2005-04-16 15:20:36 -07002052 timeout = schedule_timeout(timeout);
Peter Hurley9356b532013-06-15 09:14:24 -04002053
2054 down_read(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002055 continue;
2056 }
2057 __set_current_state(TASK_RUNNING);
2058
2059 /* Deal with packet mode. */
Alan Cox04f378b2008-04-30 00:53:29 -07002060 if (packet && b == buf) {
Miloslav Trmac522ed772007-07-15 23:40:56 -07002061 if (tty_put_user(tty, TIOCPKT_DATA, b++)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002062 retval = -EFAULT;
2063 b--;
2064 break;
2065 }
2066 nr--;
2067 }
2068
Jiri Slaby53c5ee22012-10-18 22:26:39 +02002069 if (ldata->icanon && !L_EXTPROC(tty)) {
Peter Hurley32f13522013-06-15 09:14:17 -04002070 retval = canon_copy_from_read_buf(tty, &b, &nr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002071 if (retval)
2072 break;
2073 } else {
2074 int uncopied;
Alan Cox04f378b2008-04-30 00:53:29 -07002075 /* The copy function takes the read lock and handles
2076 locking internally for this case */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002077 uncopied = copy_from_read_buf(tty, &b, &nr);
2078 uncopied += copy_from_read_buf(tty, &b, &nr);
2079 if (uncopied) {
2080 retval = -EFAULT;
2081 break;
2082 }
2083 }
2084
Peter Hurley6367ca72013-06-15 09:14:33 -04002085 n_tty_check_unthrottle(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002086
2087 if (b - buf >= minimum)
2088 break;
2089 if (time)
2090 timeout = time;
2091 }
Jiri Slabybddc7152012-10-18 22:26:42 +02002092 mutex_unlock(&ldata->atomic_read_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002093 remove_wait_queue(&tty->read_wait, &wait);
2094
2095 if (!waitqueue_active(&tty->read_wait))
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04002096 ldata->minimum_to_wake = minimum;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002097
2098 __set_current_state(TASK_RUNNING);
2099 size = b - buf;
2100 if (size) {
2101 retval = size;
2102 if (nr)
Alan Cox4edf1822008-02-08 04:18:44 -08002103 clear_bit(TTY_PUSH, &tty->flags);
Peter Hurley9356b532013-06-15 09:14:24 -04002104 } else if (test_and_clear_bit(TTY_PUSH, &tty->flags)) {
2105 up_read(&tty->termios_rwsem);
Thorsten Wißmannbbd20752011-12-08 17:47:33 +01002106 goto do_it_again;
Peter Hurley9356b532013-06-15 09:14:24 -04002107 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002108
Linus Torvalds55db4c62011-06-04 06:33:24 +09002109 n_tty_set_room(tty);
Peter Hurley9356b532013-06-15 09:14:24 -04002110 up_read(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002111 return retval;
2112}
2113
2114/**
Alan Cox11a96d12008-10-13 10:46:24 +01002115 * n_tty_write - write function for tty
Linus Torvalds1da177e2005-04-16 15:20:36 -07002116 * @tty: tty device
2117 * @file: file object
2118 * @buf: userspace buffer pointer
2119 * @nr: size of I/O
2120 *
Joe Petersona88a69c2009-01-02 13:40:53 +00002121 * Write function of the terminal device. This is serialized with
Linus Torvalds1da177e2005-04-16 15:20:36 -07002122 * respect to other write callers but not to termios changes, reads
Joe Petersona88a69c2009-01-02 13:40:53 +00002123 * and other such events. Since the receive code will echo characters,
2124 * thus calling driver write methods, the output_lock is used in
2125 * the output processing functions called here as well as in the
2126 * echo processing function to protect the column state and space
2127 * left in the buffer.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002128 *
2129 * This code must be sure never to sleep through a hangup.
Joe Petersona88a69c2009-01-02 13:40:53 +00002130 *
2131 * Locking: output_lock to protect column state and space left
2132 * (note that the process_output*() functions take this
2133 * lock themselves)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002134 */
Alan Cox4edf1822008-02-08 04:18:44 -08002135
Alan Cox11a96d12008-10-13 10:46:24 +01002136static ssize_t n_tty_write(struct tty_struct *tty, struct file *file,
Joe Petersona88a69c2009-01-02 13:40:53 +00002137 const unsigned char *buf, size_t nr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002138{
2139 const unsigned char *b = buf;
2140 DECLARE_WAITQUEUE(wait, current);
2141 int c;
2142 ssize_t retval = 0;
2143
2144 /* Job control check -- must be done at start (POSIX.1 7.1.1.4). */
2145 if (L_TOSTOP(tty) && file->f_op->write != redirected_tty_write) {
2146 retval = tty_check_change(tty);
2147 if (retval)
2148 return retval;
2149 }
2150
Peter Hurley9356b532013-06-15 09:14:24 -04002151 down_read(&tty->termios_rwsem);
2152
Joe Petersona88a69c2009-01-02 13:40:53 +00002153 /* Write out any echoed characters that are still pending */
2154 process_echoes(tty);
Alan Cox300a6202009-01-02 13:41:04 +00002155
Linus Torvalds1da177e2005-04-16 15:20:36 -07002156 add_wait_queue(&tty->write_wait, &wait);
2157 while (1) {
2158 set_current_state(TASK_INTERRUPTIBLE);
2159 if (signal_pending(current)) {
2160 retval = -ERESTARTSYS;
2161 break;
2162 }
2163 if (tty_hung_up_p(file) || (tty->link && !tty->link->count)) {
2164 retval = -EIO;
2165 break;
2166 }
Peter Hurley582f5592013-05-17 12:49:48 -04002167 if (O_OPOST(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002168 while (nr > 0) {
Joe Petersona88a69c2009-01-02 13:40:53 +00002169 ssize_t num = process_output_block(tty, b, nr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002170 if (num < 0) {
2171 if (num == -EAGAIN)
2172 break;
2173 retval = num;
2174 goto break_out;
2175 }
2176 b += num;
2177 nr -= num;
2178 if (nr == 0)
2179 break;
2180 c = *b;
Joe Petersona88a69c2009-01-02 13:40:53 +00002181 if (process_output(c, tty) < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002182 break;
2183 b++; nr--;
2184 }
Alan Coxf34d7a52008-04-30 00:54:13 -07002185 if (tty->ops->flush_chars)
2186 tty->ops->flush_chars(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002187 } else {
Roman Zippeld6afe272005-07-07 17:56:55 -07002188 while (nr > 0) {
Alan Coxf34d7a52008-04-30 00:54:13 -07002189 c = tty->ops->write(tty, b, nr);
Roman Zippeld6afe272005-07-07 17:56:55 -07002190 if (c < 0) {
2191 retval = c;
2192 goto break_out;
2193 }
2194 if (!c)
2195 break;
2196 b += c;
2197 nr -= c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002198 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002199 }
2200 if (!nr)
2201 break;
2202 if (file->f_flags & O_NONBLOCK) {
2203 retval = -EAGAIN;
2204 break;
2205 }
Peter Hurley9356b532013-06-15 09:14:24 -04002206 up_read(&tty->termios_rwsem);
2207
Linus Torvalds1da177e2005-04-16 15:20:36 -07002208 schedule();
Peter Hurley9356b532013-06-15 09:14:24 -04002209
2210 down_read(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002211 }
2212break_out:
2213 __set_current_state(TASK_RUNNING);
2214 remove_wait_queue(&tty->write_wait, &wait);
Thomas Pfaffff8cb0f2009-01-02 13:47:13 +00002215 if (b - buf != nr && tty->fasync)
2216 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
Peter Hurley9356b532013-06-15 09:14:24 -04002217 up_read(&tty->termios_rwsem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002218 return (b - buf) ? b - buf : retval;
2219}
2220
2221/**
Alan Cox11a96d12008-10-13 10:46:24 +01002222 * n_tty_poll - poll method for N_TTY
Linus Torvalds1da177e2005-04-16 15:20:36 -07002223 * @tty: terminal device
2224 * @file: file accessing it
2225 * @wait: poll table
2226 *
2227 * Called when the line discipline is asked to poll() for data or
2228 * for special events. This code is not serialized with respect to
2229 * other events save open/close.
2230 *
2231 * This code must be sure never to sleep through a hangup.
2232 * Called without the kernel lock held - fine
Linus Torvalds1da177e2005-04-16 15:20:36 -07002233 */
Alan Cox4edf1822008-02-08 04:18:44 -08002234
Alan Cox11a96d12008-10-13 10:46:24 +01002235static unsigned int n_tty_poll(struct tty_struct *tty, struct file *file,
Alan Cox4edf1822008-02-08 04:18:44 -08002236 poll_table *wait)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002237{
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04002238 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002239 unsigned int mask = 0;
2240
2241 poll_wait(file, &tty->read_wait, wait);
2242 poll_wait(file, &tty->write_wait, wait);
2243 if (input_available_p(tty, TIME_CHAR(tty) ? 0 : MIN_CHAR(tty)))
2244 mask |= POLLIN | POLLRDNORM;
2245 if (tty->packet && tty->link->ctrl_status)
2246 mask |= POLLPRI | POLLIN | POLLRDNORM;
2247 if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
2248 mask |= POLLHUP;
2249 if (tty_hung_up_p(file))
2250 mask |= POLLHUP;
2251 if (!(mask & (POLLHUP | POLLIN | POLLRDNORM))) {
2252 if (MIN_CHAR(tty) && !TIME_CHAR(tty))
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04002253 ldata->minimum_to_wake = MIN_CHAR(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002254 else
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04002255 ldata->minimum_to_wake = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002256 }
Alan Coxf34d7a52008-04-30 00:54:13 -07002257 if (tty->ops->write && !tty_is_writelocked(tty) &&
2258 tty_chars_in_buffer(tty) < WAKEUP_CHARS &&
2259 tty_write_room(tty) > 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002260 mask |= POLLOUT | POLLWRNORM;
2261 return mask;
2262}
2263
Jiri Slaby57c94122012-10-18 22:26:43 +02002264static unsigned long inq_canon(struct n_tty_data *ldata)
Alan Cox47afa7a2008-10-13 10:44:17 +01002265{
Peter Hurleybc5a5e32013-06-15 09:14:21 -04002266 size_t nr, head, tail;
Alan Cox47afa7a2008-10-13 10:44:17 +01002267
Peter Hurleya73d3d62013-06-15 09:14:25 -04002268 if (ldata->canon_head == ldata->read_tail)
Alan Cox47afa7a2008-10-13 10:44:17 +01002269 return 0;
Jiri Slabyba2e68a2012-10-18 22:26:41 +02002270 head = ldata->canon_head;
2271 tail = ldata->read_tail;
Peter Hurleybc5a5e32013-06-15 09:14:21 -04002272 nr = head - tail;
Alan Cox47afa7a2008-10-13 10:44:17 +01002273 /* Skip EOF-chars.. */
2274 while (head != tail) {
Peter Hurleybc5a5e32013-06-15 09:14:21 -04002275 if (test_bit(tail & (N_TTY_BUF_SIZE - 1), ldata->read_flags) &&
2276 read_buf(ldata, tail) == __DISABLED_CHAR)
Alan Cox47afa7a2008-10-13 10:44:17 +01002277 nr--;
Peter Hurleybc5a5e32013-06-15 09:14:21 -04002278 tail++;
Alan Cox47afa7a2008-10-13 10:44:17 +01002279 }
2280 return nr;
2281}
2282
2283static int n_tty_ioctl(struct tty_struct *tty, struct file *file,
2284 unsigned int cmd, unsigned long arg)
2285{
Jiri Slabyba2e68a2012-10-18 22:26:41 +02002286 struct n_tty_data *ldata = tty->disc_data;
Alan Cox47afa7a2008-10-13 10:44:17 +01002287 int retval;
2288
2289 switch (cmd) {
2290 case TIOCOUTQ:
2291 return put_user(tty_chars_in_buffer(tty), (int __user *) arg);
2292 case TIOCINQ:
Peter Hurley6d76bd22013-06-15 09:14:26 -04002293 down_write(&tty->termios_rwsem);
Alan Cox47afa7a2008-10-13 10:44:17 +01002294 if (L_ICANON(tty))
Jiri Slaby57c94122012-10-18 22:26:43 +02002295 retval = inq_canon(ldata);
Peter Hurley6d76bd22013-06-15 09:14:26 -04002296 else
2297 retval = read_cnt(ldata);
2298 up_write(&tty->termios_rwsem);
Alan Cox47afa7a2008-10-13 10:44:17 +01002299 return put_user(retval, (unsigned int __user *) arg);
2300 default:
2301 return n_tty_ioctl_helper(tty, file, cmd, arg);
2302 }
2303}
2304
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04002305static void n_tty_fasync(struct tty_struct *tty, int on)
2306{
2307 struct n_tty_data *ldata = tty->disc_data;
2308
2309 if (!waitqueue_active(&tty->read_wait)) {
2310 if (on)
2311 ldata->minimum_to_wake = 1;
2312 else if (!tty->fasync)
2313 ldata->minimum_to_wake = N_TTY_BUF_SIZE;
2314 }
2315}
2316
Alan Coxa352def2008-07-16 21:53:12 +01002317struct tty_ldisc_ops tty_ldisc_N_TTY = {
Paul Fulghume10cc1d2007-05-10 22:22:50 -07002318 .magic = TTY_LDISC_MAGIC,
2319 .name = "n_tty",
2320 .open = n_tty_open,
2321 .close = n_tty_close,
2322 .flush_buffer = n_tty_flush_buffer,
2323 .chars_in_buffer = n_tty_chars_in_buffer,
Alan Cox11a96d12008-10-13 10:46:24 +01002324 .read = n_tty_read,
2325 .write = n_tty_write,
Paul Fulghume10cc1d2007-05-10 22:22:50 -07002326 .ioctl = n_tty_ioctl,
2327 .set_termios = n_tty_set_termios,
Alan Cox11a96d12008-10-13 10:46:24 +01002328 .poll = n_tty_poll,
Paul Fulghume10cc1d2007-05-10 22:22:50 -07002329 .receive_buf = n_tty_receive_buf,
Peter Hurleyf6c8dbe2013-06-15 07:28:28 -04002330 .write_wakeup = n_tty_write_wakeup,
2331 .fasync = n_tty_fasync,
Peter Hurley24a89d12013-06-15 09:14:15 -04002332 .receive_buf2 = n_tty_receive_buf2,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002333};
Rodolfo Giometti572b9ad2010-03-10 15:23:46 -08002334
2335/**
2336 * n_tty_inherit_ops - inherit N_TTY methods
2337 * @ops: struct tty_ldisc_ops where to save N_TTY methods
2338 *
George Spelvin593fb1ae42013-02-12 02:00:43 -05002339 * Enables a 'subclass' line discipline to 'inherit' N_TTY
Rodolfo Giometti572b9ad2010-03-10 15:23:46 -08002340 * methods.
2341 */
2342
2343void n_tty_inherit_ops(struct tty_ldisc_ops *ops)
2344{
2345 *ops = tty_ldisc_N_TTY;
2346 ops->owner = NULL;
2347 ops->refcount = ops->flags = 0;
2348}
2349EXPORT_SYMBOL_GPL(n_tty_inherit_ops);