blob: 0a6fcda9615208301fc4e717630dcdc71af589ee [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * n_tty.c --- implements the N_TTY line discipline.
Alan Cox4edf1822008-02-08 04:18:44 -08003 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07004 * This code used to be in tty_io.c, but things are getting hairy
5 * enough that it made sense to split things off. (The N_TTY
6 * processing has changed so much that it's hardly recognizable,
7 * anyway...)
8 *
9 * Note that the open routine for N_TTY is guaranteed never to return
10 * an error. This is because Linux will fall back to setting a line
Alan Cox4edf1822008-02-08 04:18:44 -080011 * to N_TTY if it can not switch to any other line discipline.
Linus Torvalds1da177e2005-04-16 15:20:36 -070012 *
13 * Written by Theodore Ts'o, Copyright 1994.
Alan Cox4edf1822008-02-08 04:18:44 -080014 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070015 * This file also contains code originally written by Linus Torvalds,
16 * Copyright 1991, 1992, 1993, and by Julian Cowley, Copyright 1994.
Alan Cox4edf1822008-02-08 04:18:44 -080017 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 * This file may be redistributed under the terms of the GNU General Public
19 * License.
20 *
21 * Reduced memory usage for older ARM systems - Russell King.
22 *
Alan Cox4edf1822008-02-08 04:18:44 -080023 * 2000/01/20 Fixed SMP locking on put_tty_queue using bits of
Linus Torvalds1da177e2005-04-16 15:20:36 -070024 * the patch by Andrew J. Kroll <ag784@freenet.buffalo.edu>
25 * who actually finally proved there really was a race.
26 *
27 * 2002/03/18 Implemented n_tty_wakeup to send SIGIO POLL_OUTs to
28 * waiting writing processes-Sapan Bhatia <sapan@corewars.org>.
Alan Cox11a96d12008-10-13 10:46:24 +010029 * Also fixed a bug in BLOCKING mode where n_tty_write returns
Linus Torvalds1da177e2005-04-16 15:20:36 -070030 * EAGAIN
31 */
32
33#include <linux/types.h>
34#include <linux/major.h>
35#include <linux/errno.h>
36#include <linux/signal.h>
37#include <linux/fcntl.h>
38#include <linux/sched.h>
39#include <linux/interrupt.h>
40#include <linux/tty.h>
41#include <linux/timer.h>
42#include <linux/ctype.h>
43#include <linux/mm.h>
44#include <linux/string.h>
45#include <linux/slab.h>
46#include <linux/poll.h>
47#include <linux/bitops.h>
Miloslav Trmac522ed772007-07-15 23:40:56 -070048#include <linux/audit.h>
49#include <linux/file.h>
Alan Cox300a6202009-01-02 13:41:04 +000050#include <linux/uaccess.h>
Rodolfo Giometti572b9ad2010-03-10 15:23:46 -080051#include <linux/module.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070052
Linus Torvalds1da177e2005-04-16 15:20:36 -070053
54/* number of characters left in xmit buffer before select has we have room */
55#define WAKEUP_CHARS 256
56
57/*
58 * This defines the low- and high-watermarks for throttling and
59 * unthrottling the TTY driver. These watermarks are used for
60 * controlling the space in the read buffer.
61 */
62#define TTY_THRESHOLD_THROTTLE 128 /* now based on remaining room */
Thorsten Wißmannbbd20752011-12-08 17:47:33 +010063#define TTY_THRESHOLD_UNTHROTTLE 128
Linus Torvalds1da177e2005-04-16 15:20:36 -070064
Joe Petersona88a69c2009-01-02 13:40:53 +000065/*
66 * Special byte codes used in the echo buffer to represent operations
67 * or special handling of characters. Bytes in the echo buffer that
68 * are not part of such special blocks are treated as normal character
69 * codes.
70 */
71#define ECHO_OP_START 0xff
72#define ECHO_OP_MOVE_BACK_COL 0x80
73#define ECHO_OP_SET_CANON_COL 0x81
74#define ECHO_OP_ERASE_TAB 0x82
75
Jiri Slaby70ece7a2012-10-18 22:26:38 +020076struct n_tty_data {
Jiri Slaby53c5ee22012-10-18 22:26:39 +020077 unsigned int column;
78 unsigned long overrun_time;
79 int num_overrun;
80
81 unsigned char lnext:1, erasing:1, raw:1, real_raw:1, icanon:1;
82 unsigned char echo_overrun:1;
Jiri Slaby3fe780b2012-10-18 22:26:40 +020083
84 DECLARE_BITMAP(process_char_map, 256);
85 DECLARE_BITMAP(read_flags, N_TTY_BUF_SIZE);
Jiri Slabyba2e68a2012-10-18 22:26:41 +020086
87 char *read_buf;
88 int read_head;
89 int read_tail;
90 int read_cnt;
91
92 unsigned char *echo_buf;
93 unsigned int echo_pos;
94 unsigned int echo_cnt;
95
96 int canon_data;
97 unsigned long canon_head;
98 unsigned int canon_column;
Jiri Slabybddc7152012-10-18 22:26:42 +020099
100 struct mutex atomic_read_lock;
101 struct mutex output_lock;
102 struct mutex echo_lock;
103 spinlock_t read_lock;
Jiri Slaby70ece7a2012-10-18 22:26:38 +0200104};
105
Miloslav Trmac522ed772007-07-15 23:40:56 -0700106static inline int tty_put_user(struct tty_struct *tty, unsigned char x,
107 unsigned char __user *ptr)
108{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200109 struct n_tty_data *ldata = tty->disc_data;
110
111 tty_audit_add_data(tty, &x, 1, ldata->icanon);
Miloslav Trmac522ed772007-07-15 23:40:56 -0700112 return put_user(x, ptr);
113}
114
Linus Torvalds55db4c62011-06-04 06:33:24 +0900115/**
116 * n_tty_set__room - receive space
117 * @tty: terminal
118 *
119 * Called by the driver to find out how much data it is
120 * permitted to feed to the line discipline without any being lost
121 * and thus to manage flow control. Not serialized. Answers for the
122 * "instant".
123 */
124
125static void n_tty_set_room(struct tty_struct *tty)
126{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200127 struct n_tty_data *ldata = tty->disc_data;
Jaeden Amero090abf72012-07-27 08:43:11 -0500128 int left;
Linus Torvalds55db4c62011-06-04 06:33:24 +0900129 int old_left;
130
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200131 /* ldata->read_cnt is not read locked ? */
Jaeden Amero090abf72012-07-27 08:43:11 -0500132 if (I_PARMRK(tty)) {
133 /* Multiply read_cnt by 3, since each byte might take up to
134 * three times as many spaces when PARMRK is set (depending on
135 * its flags, e.g. parity error). */
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200136 left = N_TTY_BUF_SIZE - ldata->read_cnt * 3 - 1;
Jaeden Amero090abf72012-07-27 08:43:11 -0500137 } else
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200138 left = N_TTY_BUF_SIZE - ldata->read_cnt - 1;
Jaeden Amero090abf72012-07-27 08:43:11 -0500139
Linus Torvalds55db4c62011-06-04 06:33:24 +0900140 /*
141 * If we are doing input canonicalization, and there are no
142 * pending newlines, let characters through without limit, so
143 * that erase characters will be handled. Other excess
144 * characters will be beeped.
145 */
146 if (left <= 0)
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200147 left = ldata->icanon && !ldata->canon_data;
Linus Torvalds55db4c62011-06-04 06:33:24 +0900148 old_left = tty->receive_room;
149 tty->receive_room = left;
150
151 /* Did this open up the receive buffer? We may need to flip */
152 if (left && !old_left)
153 schedule_work(&tty->buf.work);
154}
155
Alan Cox33f0f882006-01-09 20:54:13 -0800156static void put_tty_queue_nolock(unsigned char c, struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700157{
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200158 struct n_tty_data *ldata = tty->disc_data;
159
160 if (ldata->read_cnt < N_TTY_BUF_SIZE) {
161 ldata->read_buf[ldata->read_head] = c;
162 ldata->read_head = (ldata->read_head + 1) & (N_TTY_BUF_SIZE-1);
163 ldata->read_cnt++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700164 }
165}
166
Alan Cox17b82062008-10-13 10:45:06 +0100167/**
168 * put_tty_queue - add character to tty
169 * @c: character
170 * @tty: tty device
171 *
172 * Add a character to the tty read_buf queue. This is done under the
173 * read_lock to serialize character addition and also to protect us
174 * against parallel reads or flushes
175 */
176
Alan Cox33f0f882006-01-09 20:54:13 -0800177static void put_tty_queue(unsigned char c, struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700178{
Jiri Slabybddc7152012-10-18 22:26:42 +0200179 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700180 unsigned long flags;
181 /*
182 * The problem of stomping on the buffers ends here.
183 * Why didn't anyone see this one coming? --AJK
184 */
Jiri Slabybddc7152012-10-18 22:26:42 +0200185 spin_lock_irqsave(&ldata->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700186 put_tty_queue_nolock(c, tty);
Jiri Slabybddc7152012-10-18 22:26:42 +0200187 spin_unlock_irqrestore(&ldata->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700188}
189
190/**
191 * check_unthrottle - allow new receive data
192 * @tty; tty device
193 *
Alan Cox17b82062008-10-13 10:45:06 +0100194 * Check whether to call the driver unthrottle functions
195 *
Ingo Molnar70522e12006-03-23 03:00:31 -0800196 * Can sleep, may be called under the atomic_read_lock mutex but
Linus Torvalds1da177e2005-04-16 15:20:36 -0700197 * this is not guaranteed.
198 */
Alan Cox4edf1822008-02-08 04:18:44 -0800199static void check_unthrottle(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700200{
Alan Cox39c2e602008-04-30 00:54:18 -0700201 if (tty->count)
202 tty_unthrottle(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700203}
204
205/**
206 * reset_buffer_flags - reset buffer state
207 * @tty: terminal to reset
208 *
Alan Cox4edf1822008-02-08 04:18:44 -0800209 * Reset the read buffer counters, clear the flags,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700210 * and make sure the driver is unthrottled. Called
211 * from n_tty_open() and n_tty_flush_buffer().
Alan Cox17b82062008-10-13 10:45:06 +0100212 *
213 * Locking: tty_read_lock for read fields.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700214 */
Joe Petersona88a69c2009-01-02 13:40:53 +0000215
Linus Torvalds1da177e2005-04-16 15:20:36 -0700216static void reset_buffer_flags(struct tty_struct *tty)
217{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200218 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700219 unsigned long flags;
220
Jiri Slabybddc7152012-10-18 22:26:42 +0200221 spin_lock_irqsave(&ldata->read_lock, flags);
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200222 ldata->read_head = ldata->read_tail = ldata->read_cnt = 0;
Jiri Slabybddc7152012-10-18 22:26:42 +0200223 spin_unlock_irqrestore(&ldata->read_lock, flags);
Joe Petersona88a69c2009-01-02 13:40:53 +0000224
Jiri Slabybddc7152012-10-18 22:26:42 +0200225 mutex_lock(&ldata->echo_lock);
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200226 ldata->echo_pos = ldata->echo_cnt = ldata->echo_overrun = 0;
Jiri Slabybddc7152012-10-18 22:26:42 +0200227 mutex_unlock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000228
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200229 ldata->canon_head = ldata->canon_data = ldata->erasing = 0;
Jiri Slaby3fe780b2012-10-18 22:26:40 +0200230 bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
Linus Torvalds55db4c62011-06-04 06:33:24 +0900231 n_tty_set_room(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232}
233
234/**
235 * n_tty_flush_buffer - clean input queue
236 * @tty: terminal device
237 *
238 * Flush the input buffer. Called when the line discipline is
239 * being closed, when the tty layer wants the buffer flushed (eg
240 * at hangup) or when the N_TTY line discipline internally has to
241 * clean the pending queue (for example some signals).
242 *
Alan Cox17b82062008-10-13 10:45:06 +0100243 * Locking: ctrl_lock, read_lock.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700244 */
Alan Cox4edf1822008-02-08 04:18:44 -0800245
246static void n_tty_flush_buffer(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700247{
Alan Cox04f378b2008-04-30 00:53:29 -0700248 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700249 /* clear everything and unthrottle the driver */
250 reset_buffer_flags(tty);
Alan Cox4edf1822008-02-08 04:18:44 -0800251
Linus Torvalds1da177e2005-04-16 15:20:36 -0700252 if (!tty->link)
253 return;
254
Alan Cox04f378b2008-04-30 00:53:29 -0700255 spin_lock_irqsave(&tty->ctrl_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700256 if (tty->link->packet) {
257 tty->ctrl_status |= TIOCPKT_FLUSHREAD;
258 wake_up_interruptible(&tty->link->read_wait);
259 }
Alan Cox04f378b2008-04-30 00:53:29 -0700260 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700261}
262
263/**
264 * n_tty_chars_in_buffer - report available bytes
265 * @tty: tty device
266 *
267 * Report the number of characters buffered to be delivered to user
Alan Cox4edf1822008-02-08 04:18:44 -0800268 * at this instant in time.
Alan Cox17b82062008-10-13 10:45:06 +0100269 *
270 * Locking: read_lock
Linus Torvalds1da177e2005-04-16 15:20:36 -0700271 */
Alan Cox4edf1822008-02-08 04:18:44 -0800272
Linus Torvalds1da177e2005-04-16 15:20:36 -0700273static ssize_t n_tty_chars_in_buffer(struct tty_struct *tty)
274{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200275 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700276 unsigned long flags;
277 ssize_t n = 0;
278
Jiri Slabybddc7152012-10-18 22:26:42 +0200279 spin_lock_irqsave(&ldata->read_lock, flags);
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200280 if (!ldata->icanon) {
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200281 n = ldata->read_cnt;
282 } else if (ldata->canon_data) {
283 n = (ldata->canon_head > ldata->read_tail) ?
284 ldata->canon_head - ldata->read_tail :
285 ldata->canon_head + (N_TTY_BUF_SIZE - ldata->read_tail);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700286 }
Jiri Slabybddc7152012-10-18 22:26:42 +0200287 spin_unlock_irqrestore(&ldata->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700288 return n;
289}
290
291/**
292 * is_utf8_continuation - utf8 multibyte check
293 * @c: byte to check
294 *
295 * Returns true if the utf8 character 'c' is a multibyte continuation
296 * character. We use this to correctly compute the on screen size
297 * of the character when printing
298 */
Alan Cox4edf1822008-02-08 04:18:44 -0800299
Linus Torvalds1da177e2005-04-16 15:20:36 -0700300static inline int is_utf8_continuation(unsigned char c)
301{
302 return (c & 0xc0) == 0x80;
303}
304
305/**
306 * is_continuation - multibyte check
307 * @c: byte to check
308 *
309 * Returns true if the utf8 character 'c' is a multibyte continuation
310 * character and the terminal is in unicode mode.
311 */
Alan Cox4edf1822008-02-08 04:18:44 -0800312
Linus Torvalds1da177e2005-04-16 15:20:36 -0700313static inline int is_continuation(unsigned char c, struct tty_struct *tty)
314{
315 return I_IUTF8(tty) && is_utf8_continuation(c);
316}
317
318/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000319 * do_output_char - output one character
320 * @c: character (or partial unicode symbol)
321 * @tty: terminal device
322 * @space: space available in tty driver write buffer
323 *
324 * This is a helper function that handles one output character
325 * (including special characters like TAB, CR, LF, etc.),
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600326 * doing OPOST processing and putting the results in the
327 * tty driver's write buffer.
Joe Petersona88a69c2009-01-02 13:40:53 +0000328 *
329 * Note that Linux currently ignores TABDLY, CRDLY, VTDLY, FFDLY
330 * and NLDLY. They simply aren't relevant in the world today.
331 * If you ever need them, add them here.
332 *
333 * Returns the number of bytes of buffer space used or -1 if
334 * no space left.
335 *
336 * Locking: should be called under the output_lock to protect
337 * the column state and space left in the buffer
338 */
339
340static int do_output_char(unsigned char c, struct tty_struct *tty, int space)
341{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200342 struct n_tty_data *ldata = tty->disc_data;
Joe Petersona88a69c2009-01-02 13:40:53 +0000343 int spaces;
344
345 if (!space)
346 return -1;
Alan Cox300a6202009-01-02 13:41:04 +0000347
Joe Petersona88a69c2009-01-02 13:40:53 +0000348 switch (c) {
349 case '\n':
350 if (O_ONLRET(tty))
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200351 ldata->column = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000352 if (O_ONLCR(tty)) {
353 if (space < 2)
354 return -1;
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200355 ldata->canon_column = ldata->column = 0;
Linus Torvalds37f81fa2009-09-05 12:46:07 -0700356 tty->ops->write(tty, "\r\n", 2);
Joe Petersona88a69c2009-01-02 13:40:53 +0000357 return 2;
358 }
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200359 ldata->canon_column = ldata->column;
Joe Petersona88a69c2009-01-02 13:40:53 +0000360 break;
361 case '\r':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200362 if (O_ONOCR(tty) && ldata->column == 0)
Joe Petersona88a69c2009-01-02 13:40:53 +0000363 return 0;
364 if (O_OCRNL(tty)) {
365 c = '\n';
366 if (O_ONLRET(tty))
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200367 ldata->canon_column = ldata->column = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000368 break;
369 }
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200370 ldata->canon_column = ldata->column = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000371 break;
372 case '\t':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200373 spaces = 8 - (ldata->column & 7);
Joe Petersona88a69c2009-01-02 13:40:53 +0000374 if (O_TABDLY(tty) == XTABS) {
375 if (space < spaces)
376 return -1;
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200377 ldata->column += spaces;
Joe Petersona88a69c2009-01-02 13:40:53 +0000378 tty->ops->write(tty, " ", spaces);
379 return spaces;
380 }
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200381 ldata->column += spaces;
Joe Petersona88a69c2009-01-02 13:40:53 +0000382 break;
383 case '\b':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200384 if (ldata->column > 0)
385 ldata->column--;
Joe Petersona88a69c2009-01-02 13:40:53 +0000386 break;
387 default:
Joe Petersona59c0d62009-01-02 13:43:25 +0000388 if (!iscntrl(c)) {
389 if (O_OLCUC(tty))
390 c = toupper(c);
391 if (!is_continuation(c, tty))
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200392 ldata->column++;
Joe Petersona59c0d62009-01-02 13:43:25 +0000393 }
Joe Petersona88a69c2009-01-02 13:40:53 +0000394 break;
395 }
396
397 tty_put_char(tty, c);
398 return 1;
399}
400
401/**
402 * process_output - output post processor
Linus Torvalds1da177e2005-04-16 15:20:36 -0700403 * @c: character (or partial unicode symbol)
404 * @tty: terminal device
405 *
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600406 * Output one character with OPOST processing.
407 * Returns -1 when the output device is full and the character
408 * must be retried.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700409 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000410 * Locking: output_lock to protect column state and space left
411 * (also, this is called from n_tty_write under the
412 * tty layer write lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700413 */
Alan Cox4edf1822008-02-08 04:18:44 -0800414
Joe Petersona88a69c2009-01-02 13:40:53 +0000415static int process_output(unsigned char c, struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416{
Jiri Slabybddc7152012-10-18 22:26:42 +0200417 struct n_tty_data *ldata = tty->disc_data;
Joe Petersona88a69c2009-01-02 13:40:53 +0000418 int space, retval;
419
Jiri Slabybddc7152012-10-18 22:26:42 +0200420 mutex_lock(&ldata->output_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421
Alan Coxf34d7a52008-04-30 00:54:13 -0700422 space = tty_write_room(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +0000423 retval = do_output_char(c, tty, space);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700424
Jiri Slabybddc7152012-10-18 22:26:42 +0200425 mutex_unlock(&ldata->output_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000426 if (retval < 0)
427 return -1;
428 else
429 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700430}
431
432/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000433 * process_output_block - block post processor
Linus Torvalds1da177e2005-04-16 15:20:36 -0700434 * @tty: terminal device
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600435 * @buf: character buffer
436 * @nr: number of bytes to output
437 *
438 * Output a block of characters with OPOST processing.
439 * Returns the number of characters output.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700440 *
441 * This path is used to speed up block console writes, among other
442 * things when processing blocks of output data. It handles only
443 * the simple cases normally found and helps to generate blocks of
444 * symbols for the console driver and thus improve performance.
445 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000446 * Locking: output_lock to protect column state and space left
447 * (also, this is called from n_tty_write under the
448 * tty layer write lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700449 */
Alan Cox4edf1822008-02-08 04:18:44 -0800450
Joe Petersona88a69c2009-01-02 13:40:53 +0000451static ssize_t process_output_block(struct tty_struct *tty,
452 const unsigned char *buf, unsigned int nr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700453{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200454 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700455 int space;
Thorsten Wißmannbbd20752011-12-08 17:47:33 +0100456 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700457 const unsigned char *cp;
458
Jiri Slabybddc7152012-10-18 22:26:42 +0200459 mutex_lock(&ldata->output_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000460
Alan Coxf34d7a52008-04-30 00:54:13 -0700461 space = tty_write_room(tty);
Alan Cox300a6202009-01-02 13:41:04 +0000462 if (!space) {
Jiri Slabybddc7152012-10-18 22:26:42 +0200463 mutex_unlock(&ldata->output_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700464 return 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000465 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700466 if (nr > space)
467 nr = space;
468
469 for (i = 0, cp = buf; i < nr; i++, cp++) {
Joe Petersona59c0d62009-01-02 13:43:25 +0000470 unsigned char c = *cp;
471
472 switch (c) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700473 case '\n':
474 if (O_ONLRET(tty))
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200475 ldata->column = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700476 if (O_ONLCR(tty))
477 goto break_out;
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200478 ldata->canon_column = ldata->column;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700479 break;
480 case '\r':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200481 if (O_ONOCR(tty) && ldata->column == 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700482 goto break_out;
483 if (O_OCRNL(tty))
484 goto break_out;
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200485 ldata->canon_column = ldata->column = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700486 break;
487 case '\t':
488 goto break_out;
489 case '\b':
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200490 if (ldata->column > 0)
491 ldata->column--;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700492 break;
493 default:
Joe Petersona59c0d62009-01-02 13:43:25 +0000494 if (!iscntrl(c)) {
495 if (O_OLCUC(tty))
496 goto break_out;
497 if (!is_continuation(c, tty))
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200498 ldata->column++;
Joe Petersona59c0d62009-01-02 13:43:25 +0000499 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700500 break;
501 }
502 }
503break_out:
Alan Coxf34d7a52008-04-30 00:54:13 -0700504 i = tty->ops->write(tty, buf, i);
Joe Petersona88a69c2009-01-02 13:40:53 +0000505
Jiri Slabybddc7152012-10-18 22:26:42 +0200506 mutex_unlock(&ldata->output_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700507 return i;
508}
509
Joe Petersona88a69c2009-01-02 13:40:53 +0000510/**
511 * process_echoes - write pending echo characters
512 * @tty: terminal device
513 *
514 * Write previously buffered echo (and other ldisc-generated)
515 * characters to the tty.
516 *
517 * Characters generated by the ldisc (including echoes) need to
518 * be buffered because the driver's write buffer can fill during
519 * heavy program output. Echoing straight to the driver will
520 * often fail under these conditions, causing lost characters and
521 * resulting mismatches of ldisc state information.
522 *
523 * Since the ldisc state must represent the characters actually sent
524 * to the driver at the time of the write, operations like certain
525 * changes in column state are also saved in the buffer and executed
526 * here.
527 *
528 * A circular fifo buffer is used so that the most recent characters
529 * are prioritized. Also, when control characters are echoed with a
530 * prefixed "^", the pair is treated atomically and thus not separated.
531 *
532 * Locking: output_lock to protect column state and space left,
533 * echo_lock to protect the echo buffer
534 */
535
536static void process_echoes(struct tty_struct *tty)
537{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200538 struct n_tty_data *ldata = tty->disc_data;
Joe Petersona88a69c2009-01-02 13:40:53 +0000539 int space, nr;
540 unsigned char c;
541 unsigned char *cp, *buf_end;
542
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200543 if (!ldata->echo_cnt)
Joe Petersona88a69c2009-01-02 13:40:53 +0000544 return;
545
Jiri Slabybddc7152012-10-18 22:26:42 +0200546 mutex_lock(&ldata->output_lock);
547 mutex_lock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000548
549 space = tty_write_room(tty);
550
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200551 buf_end = ldata->echo_buf + N_TTY_BUF_SIZE;
552 cp = ldata->echo_buf + ldata->echo_pos;
553 nr = ldata->echo_cnt;
Joe Petersona88a69c2009-01-02 13:40:53 +0000554 while (nr > 0) {
555 c = *cp;
556 if (c == ECHO_OP_START) {
557 unsigned char op;
558 unsigned char *opp;
559 int no_space_left = 0;
560
561 /*
562 * If the buffer byte is the start of a multi-byte
563 * operation, get the next byte, which is either the
564 * op code or a control character value.
565 */
566 opp = cp + 1;
567 if (opp == buf_end)
568 opp -= N_TTY_BUF_SIZE;
569 op = *opp;
Alan Cox300a6202009-01-02 13:41:04 +0000570
Joe Petersona88a69c2009-01-02 13:40:53 +0000571 switch (op) {
572 unsigned int num_chars, num_bs;
573
574 case ECHO_OP_ERASE_TAB:
575 if (++opp == buf_end)
576 opp -= N_TTY_BUF_SIZE;
577 num_chars = *opp;
578
579 /*
580 * Determine how many columns to go back
581 * in order to erase the tab.
582 * This depends on the number of columns
583 * used by other characters within the tab
584 * area. If this (modulo 8) count is from
585 * the start of input rather than from a
586 * previous tab, we offset by canon column.
587 * Otherwise, tab spacing is normal.
588 */
589 if (!(num_chars & 0x80))
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200590 num_chars += ldata->canon_column;
Joe Petersona88a69c2009-01-02 13:40:53 +0000591 num_bs = 8 - (num_chars & 7);
592
593 if (num_bs > space) {
594 no_space_left = 1;
595 break;
596 }
597 space -= num_bs;
598 while (num_bs--) {
599 tty_put_char(tty, '\b');
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200600 if (ldata->column > 0)
601 ldata->column--;
Joe Petersona88a69c2009-01-02 13:40:53 +0000602 }
603 cp += 3;
604 nr -= 3;
605 break;
606
607 case ECHO_OP_SET_CANON_COL:
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200608 ldata->canon_column = ldata->column;
Joe Petersona88a69c2009-01-02 13:40:53 +0000609 cp += 2;
610 nr -= 2;
611 break;
612
613 case ECHO_OP_MOVE_BACK_COL:
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200614 if (ldata->column > 0)
615 ldata->column--;
Joe Petersona88a69c2009-01-02 13:40:53 +0000616 cp += 2;
617 nr -= 2;
618 break;
619
620 case ECHO_OP_START:
621 /* This is an escaped echo op start code */
622 if (!space) {
623 no_space_left = 1;
624 break;
625 }
626 tty_put_char(tty, ECHO_OP_START);
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200627 ldata->column++;
Joe Petersona88a69c2009-01-02 13:40:53 +0000628 space--;
629 cp += 2;
630 nr -= 2;
631 break;
632
633 default:
Joe Petersona88a69c2009-01-02 13:40:53 +0000634 /*
Joe Peterson62b26352009-09-09 15:03:47 -0600635 * If the op is not a special byte code,
636 * it is a ctrl char tagged to be echoed
637 * as "^X" (where X is the letter
638 * representing the control char).
639 * Note that we must ensure there is
640 * enough space for the whole ctrl pair.
641 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000642 */
Joe Peterson62b26352009-09-09 15:03:47 -0600643 if (space < 2) {
644 no_space_left = 1;
645 break;
646 }
647 tty_put_char(tty, '^');
648 tty_put_char(tty, op ^ 0100);
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200649 ldata->column += 2;
Joe Peterson62b26352009-09-09 15:03:47 -0600650 space -= 2;
Joe Petersona88a69c2009-01-02 13:40:53 +0000651 cp += 2;
652 nr -= 2;
653 }
654
655 if (no_space_left)
656 break;
657 } else {
Joe Petersonee5aa7b2009-09-09 15:03:13 -0600658 if (O_OPOST(tty) &&
659 !(test_bit(TTY_HW_COOK_OUT, &tty->flags))) {
660 int retval = do_output_char(c, tty, space);
661 if (retval < 0)
662 break;
663 space -= retval;
664 } else {
665 if (!space)
666 break;
667 tty_put_char(tty, c);
668 space -= 1;
669 }
Joe Petersona88a69c2009-01-02 13:40:53 +0000670 cp += 1;
671 nr -= 1;
672 }
673
674 /* When end of circular buffer reached, wrap around */
675 if (cp >= buf_end)
676 cp -= N_TTY_BUF_SIZE;
677 }
678
679 if (nr == 0) {
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200680 ldata->echo_pos = 0;
681 ldata->echo_cnt = 0;
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200682 ldata->echo_overrun = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000683 } else {
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200684 int num_processed = ldata->echo_cnt - nr;
685 ldata->echo_pos += num_processed;
686 ldata->echo_pos &= N_TTY_BUF_SIZE - 1;
687 ldata->echo_cnt = nr;
Joe Petersona88a69c2009-01-02 13:40:53 +0000688 if (num_processed > 0)
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200689 ldata->echo_overrun = 0;
Joe Petersona88a69c2009-01-02 13:40:53 +0000690 }
691
Jiri Slabybddc7152012-10-18 22:26:42 +0200692 mutex_unlock(&ldata->echo_lock);
693 mutex_unlock(&ldata->output_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000694
695 if (tty->ops->flush_chars)
696 tty->ops->flush_chars(tty);
697}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700698
699/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000700 * add_echo_byte - add a byte to the echo buffer
701 * @c: unicode byte to echo
702 * @tty: terminal device
703 *
704 * Add a character or operation byte to the echo buffer.
705 *
706 * Should be called under the echo lock to protect the echo buffer.
707 */
708
709static void add_echo_byte(unsigned char c, struct tty_struct *tty)
710{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200711 struct n_tty_data *ldata = tty->disc_data;
Joe Petersona88a69c2009-01-02 13:40:53 +0000712 int new_byte_pos;
713
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200714 if (ldata->echo_cnt == N_TTY_BUF_SIZE) {
Joe Petersona88a69c2009-01-02 13:40:53 +0000715 /* Circular buffer is already at capacity */
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200716 new_byte_pos = ldata->echo_pos;
Joe Petersona88a69c2009-01-02 13:40:53 +0000717
718 /*
719 * Since the buffer start position needs to be advanced,
720 * be sure to step by a whole operation byte group.
721 */
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200722 if (ldata->echo_buf[ldata->echo_pos] == ECHO_OP_START) {
723 if (ldata->echo_buf[(ldata->echo_pos + 1) &
Joe Petersona88a69c2009-01-02 13:40:53 +0000724 (N_TTY_BUF_SIZE - 1)] ==
725 ECHO_OP_ERASE_TAB) {
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200726 ldata->echo_pos += 3;
727 ldata->echo_cnt -= 2;
Joe Petersona88a69c2009-01-02 13:40:53 +0000728 } else {
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200729 ldata->echo_pos += 2;
730 ldata->echo_cnt -= 1;
Joe Petersona88a69c2009-01-02 13:40:53 +0000731 }
732 } else {
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200733 ldata->echo_pos++;
Joe Petersona88a69c2009-01-02 13:40:53 +0000734 }
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200735 ldata->echo_pos &= N_TTY_BUF_SIZE - 1;
Joe Petersona88a69c2009-01-02 13:40:53 +0000736
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200737 ldata->echo_overrun = 1;
Joe Petersona88a69c2009-01-02 13:40:53 +0000738 } else {
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200739 new_byte_pos = ldata->echo_pos + ldata->echo_cnt;
Joe Petersona88a69c2009-01-02 13:40:53 +0000740 new_byte_pos &= N_TTY_BUF_SIZE - 1;
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200741 ldata->echo_cnt++;
Joe Petersona88a69c2009-01-02 13:40:53 +0000742 }
743
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200744 ldata->echo_buf[new_byte_pos] = c;
Joe Petersona88a69c2009-01-02 13:40:53 +0000745}
746
747/**
748 * echo_move_back_col - add operation to move back a column
749 * @tty: terminal device
750 *
751 * Add an operation to the echo buffer to move back one column.
752 *
753 * Locking: echo_lock to protect the echo buffer
754 */
755
756static void echo_move_back_col(struct tty_struct *tty)
757{
Jiri Slabybddc7152012-10-18 22:26:42 +0200758 struct n_tty_data *ldata = tty->disc_data;
759
760 mutex_lock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000761
762 add_echo_byte(ECHO_OP_START, tty);
763 add_echo_byte(ECHO_OP_MOVE_BACK_COL, tty);
764
Jiri Slabybddc7152012-10-18 22:26:42 +0200765 mutex_unlock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000766}
767
768/**
769 * echo_set_canon_col - add operation to set the canon column
770 * @tty: terminal device
771 *
772 * Add an operation to the echo buffer to set the canon column
773 * to the current column.
774 *
775 * Locking: echo_lock to protect the echo buffer
776 */
777
778static void echo_set_canon_col(struct tty_struct *tty)
779{
Jiri Slabybddc7152012-10-18 22:26:42 +0200780 struct n_tty_data *ldata = tty->disc_data;
781
782 mutex_lock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000783
784 add_echo_byte(ECHO_OP_START, tty);
785 add_echo_byte(ECHO_OP_SET_CANON_COL, tty);
786
Jiri Slabybddc7152012-10-18 22:26:42 +0200787 mutex_unlock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000788}
789
790/**
791 * echo_erase_tab - add operation to erase a tab
792 * @num_chars: number of character columns already used
793 * @after_tab: true if num_chars starts after a previous tab
794 * @tty: terminal device
795 *
796 * Add an operation to the echo buffer to erase a tab.
797 *
798 * Called by the eraser function, which knows how many character
799 * columns have been used since either a previous tab or the start
800 * of input. This information will be used later, along with
801 * canon column (if applicable), to go back the correct number
802 * of columns.
803 *
804 * Locking: echo_lock to protect the echo buffer
805 */
806
807static void echo_erase_tab(unsigned int num_chars, int after_tab,
808 struct tty_struct *tty)
809{
Jiri Slabybddc7152012-10-18 22:26:42 +0200810 struct n_tty_data *ldata = tty->disc_data;
811
812 mutex_lock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000813
814 add_echo_byte(ECHO_OP_START, tty);
815 add_echo_byte(ECHO_OP_ERASE_TAB, tty);
816
817 /* We only need to know this modulo 8 (tab spacing) */
818 num_chars &= 7;
819
820 /* Set the high bit as a flag if num_chars is after a previous tab */
821 if (after_tab)
822 num_chars |= 0x80;
Alan Cox300a6202009-01-02 13:41:04 +0000823
Joe Petersona88a69c2009-01-02 13:40:53 +0000824 add_echo_byte(num_chars, tty);
825
Jiri Slabybddc7152012-10-18 22:26:42 +0200826 mutex_unlock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000827}
828
829/**
830 * echo_char_raw - echo a character raw
Linus Torvalds1da177e2005-04-16 15:20:36 -0700831 * @c: unicode byte to echo
832 * @tty: terminal device
833 *
Alan Cox4edf1822008-02-08 04:18:44 -0800834 * Echo user input back onto the screen. This must be called only when
Linus Torvalds1da177e2005-04-16 15:20:36 -0700835 * L_ECHO(tty) is true. Called from the driver receive_buf path.
Alan Cox17b82062008-10-13 10:45:06 +0100836 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000837 * This variant does not treat control characters specially.
838 *
839 * Locking: echo_lock to protect the echo buffer
840 */
841
842static void echo_char_raw(unsigned char c, struct tty_struct *tty)
843{
Jiri Slabybddc7152012-10-18 22:26:42 +0200844 struct n_tty_data *ldata = tty->disc_data;
845
846 mutex_lock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000847
848 if (c == ECHO_OP_START) {
849 add_echo_byte(ECHO_OP_START, tty);
850 add_echo_byte(ECHO_OP_START, tty);
851 } else {
852 add_echo_byte(c, tty);
853 }
854
Jiri Slabybddc7152012-10-18 22:26:42 +0200855 mutex_unlock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000856}
857
858/**
859 * echo_char - echo a character
860 * @c: unicode byte to echo
861 * @tty: terminal device
862 *
863 * Echo user input back onto the screen. This must be called only when
864 * L_ECHO(tty) is true. Called from the driver receive_buf path.
865 *
Joe Peterson62b26352009-09-09 15:03:47 -0600866 * This variant tags control characters to be echoed as "^X"
867 * (where X is the letter representing the control char).
Joe Petersona88a69c2009-01-02 13:40:53 +0000868 *
869 * Locking: echo_lock to protect the echo buffer
Linus Torvalds1da177e2005-04-16 15:20:36 -0700870 */
871
872static void echo_char(unsigned char c, struct tty_struct *tty)
873{
Jiri Slabybddc7152012-10-18 22:26:42 +0200874 struct n_tty_data *ldata = tty->disc_data;
875
876 mutex_lock(&ldata->echo_lock);
Joe Petersona88a69c2009-01-02 13:40:53 +0000877
878 if (c == ECHO_OP_START) {
879 add_echo_byte(ECHO_OP_START, tty);
880 add_echo_byte(ECHO_OP_START, tty);
881 } else {
Joe Peterson62b26352009-09-09 15:03:47 -0600882 if (L_ECHOCTL(tty) && iscntrl(c) && c != '\t')
Joe Petersona88a69c2009-01-02 13:40:53 +0000883 add_echo_byte(ECHO_OP_START, tty);
884 add_echo_byte(c, tty);
885 }
886
Jiri Slabybddc7152012-10-18 22:26:42 +0200887 mutex_unlock(&ldata->echo_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700888}
889
Alan Cox17b82062008-10-13 10:45:06 +0100890/**
Joe Petersona88a69c2009-01-02 13:40:53 +0000891 * finish_erasing - complete erase
Alan Cox17b82062008-10-13 10:45:06 +0100892 * @tty: tty doing the erase
Alan Cox17b82062008-10-13 10:45:06 +0100893 */
Joe Petersona88a69c2009-01-02 13:40:53 +0000894
Linus Torvalds1da177e2005-04-16 15:20:36 -0700895static inline void finish_erasing(struct tty_struct *tty)
896{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200897 struct n_tty_data *ldata = tty->disc_data;
898 if (ldata->erasing) {
Joe Petersona88a69c2009-01-02 13:40:53 +0000899 echo_char_raw('/', tty);
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200900 ldata->erasing = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700901 }
902}
903
904/**
905 * eraser - handle erase function
906 * @c: character input
907 * @tty: terminal device
908 *
Robert P. J. Day3a4fa0a2007-10-19 23:10:43 +0200909 * Perform erase and necessary output when an erase character is
Linus Torvalds1da177e2005-04-16 15:20:36 -0700910 * present in the stream from the driver layer. Handles the complexities
911 * of UTF-8 multibyte symbols.
Alan Cox17b82062008-10-13 10:45:06 +0100912 *
Joe Petersona88a69c2009-01-02 13:40:53 +0000913 * Locking: read_lock for tty buffers
Linus Torvalds1da177e2005-04-16 15:20:36 -0700914 */
Alan Cox4edf1822008-02-08 04:18:44 -0800915
Linus Torvalds1da177e2005-04-16 15:20:36 -0700916static void eraser(unsigned char c, struct tty_struct *tty)
917{
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200918 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700919 enum { ERASE, WERASE, KILL } kill_type;
920 int head, seen_alnums, cnt;
921 unsigned long flags;
922
Alan Cox17b82062008-10-13 10:45:06 +0100923 /* FIXME: locking needed ? */
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200924 if (ldata->read_head == ldata->canon_head) {
Joe Peterson7e94b1d2009-01-02 13:43:40 +0000925 /* process_output('\a', tty); */ /* what do you think? */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700926 return;
927 }
928 if (c == ERASE_CHAR(tty))
929 kill_type = ERASE;
930 else if (c == WERASE_CHAR(tty))
931 kill_type = WERASE;
932 else {
933 if (!L_ECHO(tty)) {
Jiri Slabybddc7152012-10-18 22:26:42 +0200934 spin_lock_irqsave(&ldata->read_lock, flags);
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200935 ldata->read_cnt -= ((ldata->read_head - ldata->canon_head) &
Linus Torvalds1da177e2005-04-16 15:20:36 -0700936 (N_TTY_BUF_SIZE - 1));
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200937 ldata->read_head = ldata->canon_head;
Jiri Slabybddc7152012-10-18 22:26:42 +0200938 spin_unlock_irqrestore(&ldata->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700939 return;
940 }
941 if (!L_ECHOK(tty) || !L_ECHOKE(tty) || !L_ECHOE(tty)) {
Jiri Slabybddc7152012-10-18 22:26:42 +0200942 spin_lock_irqsave(&ldata->read_lock, flags);
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200943 ldata->read_cnt -= ((ldata->read_head - ldata->canon_head) &
Linus Torvalds1da177e2005-04-16 15:20:36 -0700944 (N_TTY_BUF_SIZE - 1));
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200945 ldata->read_head = ldata->canon_head;
Jiri Slabybddc7152012-10-18 22:26:42 +0200946 spin_unlock_irqrestore(&ldata->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700947 finish_erasing(tty);
948 echo_char(KILL_CHAR(tty), tty);
949 /* Add a newline if ECHOK is on and ECHOKE is off. */
950 if (L_ECHOK(tty))
Joe Petersona88a69c2009-01-02 13:40:53 +0000951 echo_char_raw('\n', tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700952 return;
953 }
954 kill_type = KILL;
955 }
956
957 seen_alnums = 0;
Alan Cox17b82062008-10-13 10:45:06 +0100958 /* FIXME: Locking ?? */
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200959 while (ldata->read_head != ldata->canon_head) {
960 head = ldata->read_head;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700961
962 /* erase a single possibly multibyte character */
963 do {
964 head = (head - 1) & (N_TTY_BUF_SIZE-1);
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200965 c = ldata->read_buf[head];
966 } while (is_continuation(c, tty) && head != ldata->canon_head);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700967
968 /* do not partially erase */
969 if (is_continuation(c, tty))
970 break;
971
972 if (kill_type == WERASE) {
973 /* Equivalent to BSD's ALTWERASE. */
974 if (isalnum(c) || c == '_')
975 seen_alnums++;
976 else if (seen_alnums)
977 break;
978 }
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200979 cnt = (ldata->read_head - head) & (N_TTY_BUF_SIZE-1);
Jiri Slabybddc7152012-10-18 22:26:42 +0200980 spin_lock_irqsave(&ldata->read_lock, flags);
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200981 ldata->read_head = head;
982 ldata->read_cnt -= cnt;
Jiri Slabybddc7152012-10-18 22:26:42 +0200983 spin_unlock_irqrestore(&ldata->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700984 if (L_ECHO(tty)) {
985 if (L_ECHOPRT(tty)) {
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200986 if (!ldata->erasing) {
Joe Petersona88a69c2009-01-02 13:40:53 +0000987 echo_char_raw('\\', tty);
Jiri Slaby53c5ee22012-10-18 22:26:39 +0200988 ldata->erasing = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700989 }
990 /* if cnt > 1, output a multi-byte character */
991 echo_char(c, tty);
992 while (--cnt > 0) {
993 head = (head+1) & (N_TTY_BUF_SIZE-1);
Jiri Slabyba2e68a2012-10-18 22:26:41 +0200994 echo_char_raw(ldata->read_buf[head], tty);
Joe Petersona88a69c2009-01-02 13:40:53 +0000995 echo_move_back_col(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700996 }
997 } else if (kill_type == ERASE && !L_ECHOE(tty)) {
998 echo_char(ERASE_CHAR(tty), tty);
999 } else if (c == '\t') {
Joe Petersona88a69c2009-01-02 13:40:53 +00001000 unsigned int num_chars = 0;
1001 int after_tab = 0;
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001002 unsigned long tail = ldata->read_head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001003
Joe Petersona88a69c2009-01-02 13:40:53 +00001004 /*
1005 * Count the columns used for characters
1006 * since the start of input or after a
1007 * previous tab.
1008 * This info is used to go back the correct
1009 * number of columns.
1010 */
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001011 while (tail != ldata->canon_head) {
Joe Petersona88a69c2009-01-02 13:40:53 +00001012 tail = (tail-1) & (N_TTY_BUF_SIZE-1);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001013 c = ldata->read_buf[tail];
Joe Petersona88a69c2009-01-02 13:40:53 +00001014 if (c == '\t') {
1015 after_tab = 1;
1016 break;
Alan Cox300a6202009-01-02 13:41:04 +00001017 } else if (iscntrl(c)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001018 if (L_ECHOCTL(tty))
Joe Petersona88a69c2009-01-02 13:40:53 +00001019 num_chars += 2;
1020 } else if (!is_continuation(c, tty)) {
1021 num_chars++;
1022 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001023 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001024 echo_erase_tab(num_chars, after_tab, tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001025 } else {
1026 if (iscntrl(c) && L_ECHOCTL(tty)) {
Joe Petersona88a69c2009-01-02 13:40:53 +00001027 echo_char_raw('\b', tty);
1028 echo_char_raw(' ', tty);
1029 echo_char_raw('\b', tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001030 }
1031 if (!iscntrl(c) || L_ECHOCTL(tty)) {
Joe Petersona88a69c2009-01-02 13:40:53 +00001032 echo_char_raw('\b', tty);
1033 echo_char_raw(' ', tty);
1034 echo_char_raw('\b', tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001035 }
1036 }
1037 }
1038 if (kill_type == ERASE)
1039 break;
1040 }
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001041 if (ldata->read_head == ldata->canon_head && L_ECHO(tty))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001042 finish_erasing(tty);
1043}
1044
1045/**
1046 * isig - handle the ISIG optio
1047 * @sig: signal
1048 * @tty: terminal
1049 * @flush: force flush
1050 *
1051 * Called when a signal is being sent due to terminal input. This
1052 * may caus terminal flushing to take place according to the termios
1053 * settings and character used. Called from the driver receive_buf
1054 * path so serialized.
Alan Cox17b82062008-10-13 10:45:06 +01001055 *
1056 * Locking: ctrl_lock, read_lock (both via flush buffer)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001057 */
Alan Cox4edf1822008-02-08 04:18:44 -08001058
Linus Torvalds1da177e2005-04-16 15:20:36 -07001059static inline void isig(int sig, struct tty_struct *tty, int flush)
1060{
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001061 if (tty->pgrp)
1062 kill_pgrp(tty->pgrp, sig, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001063 if (flush || !L_NOFLSH(tty)) {
1064 n_tty_flush_buffer(tty);
Alan Coxf34d7a52008-04-30 00:54:13 -07001065 tty_driver_flush_buffer(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001066 }
1067}
1068
1069/**
1070 * n_tty_receive_break - handle break
1071 * @tty: terminal
1072 *
1073 * An RS232 break event has been hit in the incoming bitstream. This
1074 * can cause a variety of events depending upon the termios settings.
1075 *
1076 * Called from the receive_buf path so single threaded.
1077 */
Alan Cox4edf1822008-02-08 04:18:44 -08001078
Linus Torvalds1da177e2005-04-16 15:20:36 -07001079static inline void n_tty_receive_break(struct tty_struct *tty)
1080{
1081 if (I_IGNBRK(tty))
1082 return;
1083 if (I_BRKINT(tty)) {
1084 isig(SIGINT, tty, 1);
1085 return;
1086 }
1087 if (I_PARMRK(tty)) {
1088 put_tty_queue('\377', tty);
1089 put_tty_queue('\0', tty);
1090 }
1091 put_tty_queue('\0', tty);
1092 wake_up_interruptible(&tty->read_wait);
1093}
1094
1095/**
1096 * n_tty_receive_overrun - handle overrun reporting
1097 * @tty: terminal
1098 *
1099 * Data arrived faster than we could process it. While the tty
1100 * driver has flagged this the bits that were missed are gone
1101 * forever.
1102 *
1103 * Called from the receive_buf path so single threaded. Does not
1104 * need locking as num_overrun and overrun_time are function
1105 * private.
1106 */
Alan Cox4edf1822008-02-08 04:18:44 -08001107
Linus Torvalds1da177e2005-04-16 15:20:36 -07001108static inline void n_tty_receive_overrun(struct tty_struct *tty)
1109{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001110 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001111 char buf[64];
1112
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001113 ldata->num_overrun++;
1114 if (time_after(jiffies, ldata->overrun_time + HZ) ||
1115 time_after(ldata->overrun_time, jiffies)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001116 printk(KERN_WARNING "%s: %d input overrun(s)\n",
1117 tty_name(tty, buf),
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001118 ldata->num_overrun);
1119 ldata->overrun_time = jiffies;
1120 ldata->num_overrun = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001121 }
1122}
1123
1124/**
1125 * n_tty_receive_parity_error - error notifier
1126 * @tty: terminal device
1127 * @c: character
1128 *
1129 * Process a parity error and queue the right data to indicate
Robert P. J. Day3a4fa0a2007-10-19 23:10:43 +02001130 * the error case if necessary. Locking as per n_tty_receive_buf.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001131 */
1132static inline void n_tty_receive_parity_error(struct tty_struct *tty,
1133 unsigned char c)
1134{
Alan Cox4edf1822008-02-08 04:18:44 -08001135 if (I_IGNPAR(tty))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001136 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001137 if (I_PARMRK(tty)) {
1138 put_tty_queue('\377', tty);
1139 put_tty_queue('\0', tty);
1140 put_tty_queue(c, tty);
1141 } else if (I_INPCK(tty))
1142 put_tty_queue('\0', tty);
1143 else
1144 put_tty_queue(c, tty);
1145 wake_up_interruptible(&tty->read_wait);
1146}
1147
1148/**
1149 * n_tty_receive_char - perform processing
1150 * @tty: terminal device
1151 * @c: character
1152 *
1153 * Process an individual character of input received from the driver.
Alan Cox4edf1822008-02-08 04:18:44 -08001154 * This is serialized with respect to itself by the rules for the
Linus Torvalds1da177e2005-04-16 15:20:36 -07001155 * driver above.
1156 */
1157
1158static inline void n_tty_receive_char(struct tty_struct *tty, unsigned char c)
1159{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001160 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001161 unsigned long flags;
Joe Petersonacc71bb2009-01-02 13:43:32 +00001162 int parmrk;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001164 if (ldata->raw) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165 put_tty_queue(c, tty);
1166 return;
1167 }
Alan Cox4edf1822008-02-08 04:18:44 -08001168
Linus Torvalds1da177e2005-04-16 15:20:36 -07001169 if (I_ISTRIP(tty))
1170 c &= 0x7f;
1171 if (I_IUCLC(tty) && L_IEXTEN(tty))
Alan Cox300a6202009-01-02 13:41:04 +00001172 c = tolower(c);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001173
hyc@symas.com26df6d12010-06-22 10:14:49 -07001174 if (L_EXTPROC(tty)) {
1175 put_tty_queue(c, tty);
1176 return;
1177 }
1178
Joe Peterson54d2a372008-02-06 01:37:59 -08001179 if (tty->stopped && !tty->flow_stopped && I_IXON(tty) &&
Joe Petersona88a69c2009-01-02 13:40:53 +00001180 I_IXANY(tty) && c != START_CHAR(tty) && c != STOP_CHAR(tty) &&
1181 c != INTR_CHAR(tty) && c != QUIT_CHAR(tty) && c != SUSP_CHAR(tty)) {
Joe Peterson54d2a372008-02-06 01:37:59 -08001182 start_tty(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001183 process_echoes(tty);
1184 }
Joe Peterson54d2a372008-02-06 01:37:59 -08001185
Linus Torvalds1da177e2005-04-16 15:20:36 -07001186 if (tty->closing) {
1187 if (I_IXON(tty)) {
Joe Petersona88a69c2009-01-02 13:40:53 +00001188 if (c == START_CHAR(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001189 start_tty(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001190 process_echoes(tty);
Alan Cox300a6202009-01-02 13:41:04 +00001191 } else if (c == STOP_CHAR(tty))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001192 stop_tty(tty);
1193 }
1194 return;
1195 }
1196
1197 /*
1198 * If the previous character was LNEXT, or we know that this
1199 * character is not one of the characters that we'll have to
1200 * handle specially, do shortcut processing to speed things
1201 * up.
1202 */
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001203 if (!test_bit(c, ldata->process_char_map) || ldata->lnext) {
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001204 ldata->lnext = 0;
Joe Petersonacc71bb2009-01-02 13:43:32 +00001205 parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0;
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001206 if (ldata->read_cnt >= (N_TTY_BUF_SIZE - parmrk - 1)) {
Joe Petersonacc71bb2009-01-02 13:43:32 +00001207 /* beep if no space */
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001208 if (L_ECHO(tty))
1209 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001210 return;
1211 }
1212 if (L_ECHO(tty)) {
1213 finish_erasing(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001214 /* Record the column of first canon char. */
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001215 if (ldata->canon_head == ldata->read_head)
Joe Petersona88a69c2009-01-02 13:40:53 +00001216 echo_set_canon_col(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001217 echo_char(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001218 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001219 }
Joe Petersonacc71bb2009-01-02 13:43:32 +00001220 if (parmrk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001221 put_tty_queue(c, tty);
1222 put_tty_queue(c, tty);
1223 return;
1224 }
Alan Cox4edf1822008-02-08 04:18:44 -08001225
Linus Torvalds1da177e2005-04-16 15:20:36 -07001226 if (I_IXON(tty)) {
1227 if (c == START_CHAR(tty)) {
1228 start_tty(tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001229 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001230 return;
1231 }
1232 if (c == STOP_CHAR(tty)) {
1233 stop_tty(tty);
1234 return;
1235 }
1236 }
Joe Peterson575537b32008-04-30 00:53:30 -07001237
Linus Torvalds1da177e2005-04-16 15:20:36 -07001238 if (L_ISIG(tty)) {
1239 int signal;
1240 signal = SIGINT;
1241 if (c == INTR_CHAR(tty))
1242 goto send_signal;
1243 signal = SIGQUIT;
1244 if (c == QUIT_CHAR(tty))
1245 goto send_signal;
1246 signal = SIGTSTP;
1247 if (c == SUSP_CHAR(tty)) {
1248send_signal:
Joe Petersonec5b1152008-02-06 01:37:38 -08001249 /*
Joe Petersonec5b1152008-02-06 01:37:38 -08001250 * Note that we do not use isig() here because we want
1251 * the order to be:
1252 * 1) flush, 2) echo, 3) signal
1253 */
1254 if (!L_NOFLSH(tty)) {
1255 n_tty_flush_buffer(tty);
Alan Coxf34d7a52008-04-30 00:54:13 -07001256 tty_driver_flush_buffer(tty);
Joe Petersonec5b1152008-02-06 01:37:38 -08001257 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001258 if (I_IXON(tty))
1259 start_tty(tty);
1260 if (L_ECHO(tty)) {
Joe Petersonec5b1152008-02-06 01:37:38 -08001261 echo_char(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001262 process_echoes(tty);
1263 }
Joe Petersonec5b1152008-02-06 01:37:38 -08001264 if (tty->pgrp)
1265 kill_pgrp(tty->pgrp, signal, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001266 return;
1267 }
1268 }
Joe Peterson575537b32008-04-30 00:53:30 -07001269
1270 if (c == '\r') {
1271 if (I_IGNCR(tty))
1272 return;
1273 if (I_ICRNL(tty))
1274 c = '\n';
1275 } else if (c == '\n' && I_INLCR(tty))
1276 c = '\r';
1277
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001278 if (ldata->icanon) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001279 if (c == ERASE_CHAR(tty) || c == KILL_CHAR(tty) ||
1280 (c == WERASE_CHAR(tty) && L_IEXTEN(tty))) {
1281 eraser(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001282 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001283 return;
1284 }
1285 if (c == LNEXT_CHAR(tty) && L_IEXTEN(tty)) {
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001286 ldata->lnext = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001287 if (L_ECHO(tty)) {
1288 finish_erasing(tty);
1289 if (L_ECHOCTL(tty)) {
Joe Petersona88a69c2009-01-02 13:40:53 +00001290 echo_char_raw('^', tty);
1291 echo_char_raw('\b', tty);
1292 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001293 }
1294 }
1295 return;
1296 }
1297 if (c == REPRINT_CHAR(tty) && L_ECHO(tty) &&
1298 L_IEXTEN(tty)) {
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001299 unsigned long tail = ldata->canon_head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001300
1301 finish_erasing(tty);
1302 echo_char(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001303 echo_char_raw('\n', tty);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001304 while (tail != ldata->read_head) {
1305 echo_char(ldata->read_buf[tail], tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001306 tail = (tail+1) & (N_TTY_BUF_SIZE-1);
1307 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001308 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001309 return;
1310 }
1311 if (c == '\n') {
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001312 if (ldata->read_cnt >= N_TTY_BUF_SIZE) {
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001313 if (L_ECHO(tty))
1314 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001315 return;
1316 }
1317 if (L_ECHO(tty) || L_ECHONL(tty)) {
Joe Petersona88a69c2009-01-02 13:40:53 +00001318 echo_char_raw('\n', tty);
1319 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001320 }
1321 goto handle_newline;
1322 }
1323 if (c == EOF_CHAR(tty)) {
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001324 if (ldata->read_cnt >= N_TTY_BUF_SIZE)
Joe Petersonacc71bb2009-01-02 13:43:32 +00001325 return;
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001326 if (ldata->canon_head != ldata->read_head)
Alan Cox4edf1822008-02-08 04:18:44 -08001327 set_bit(TTY_PUSH, &tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001328 c = __DISABLED_CHAR;
1329 goto handle_newline;
1330 }
1331 if ((c == EOL_CHAR(tty)) ||
1332 (c == EOL2_CHAR(tty) && L_IEXTEN(tty))) {
Joe Petersonacc71bb2009-01-02 13:43:32 +00001333 parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty))
1334 ? 1 : 0;
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001335 if (ldata->read_cnt >= (N_TTY_BUF_SIZE - parmrk)) {
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001336 if (L_ECHO(tty))
1337 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001338 return;
1339 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001340 /*
1341 * XXX are EOL_CHAR and EOL2_CHAR echoed?!?
1342 */
1343 if (L_ECHO(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001344 /* Record the column of first canon char. */
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001345 if (ldata->canon_head == ldata->read_head)
Joe Petersona88a69c2009-01-02 13:40:53 +00001346 echo_set_canon_col(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001347 echo_char(c, tty);
Joe Petersona88a69c2009-01-02 13:40:53 +00001348 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001349 }
1350 /*
1351 * XXX does PARMRK doubling happen for
1352 * EOL_CHAR and EOL2_CHAR?
1353 */
Joe Petersonacc71bb2009-01-02 13:43:32 +00001354 if (parmrk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001355 put_tty_queue(c, tty);
1356
Alan Cox4edf1822008-02-08 04:18:44 -08001357handle_newline:
Jiri Slabybddc7152012-10-18 22:26:42 +02001358 spin_lock_irqsave(&ldata->read_lock, flags);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001359 set_bit(ldata->read_head, ldata->read_flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001360 put_tty_queue_nolock(c, tty);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001361 ldata->canon_head = ldata->read_head;
1362 ldata->canon_data++;
Jiri Slabybddc7152012-10-18 22:26:42 +02001363 spin_unlock_irqrestore(&ldata->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001364 kill_fasync(&tty->fasync, SIGIO, POLL_IN);
1365 if (waitqueue_active(&tty->read_wait))
1366 wake_up_interruptible(&tty->read_wait);
1367 return;
1368 }
1369 }
Alan Cox4edf1822008-02-08 04:18:44 -08001370
Joe Petersonacc71bb2009-01-02 13:43:32 +00001371 parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0;
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001372 if (ldata->read_cnt >= (N_TTY_BUF_SIZE - parmrk - 1)) {
Joe Petersonacc71bb2009-01-02 13:43:32 +00001373 /* beep if no space */
Joe Peterson7e94b1d2009-01-02 13:43:40 +00001374 if (L_ECHO(tty))
1375 process_output('\a', tty);
Joe Petersonacc71bb2009-01-02 13:43:32 +00001376 return;
1377 }
1378 if (L_ECHO(tty)) {
1379 finish_erasing(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001380 if (c == '\n')
Joe Petersona88a69c2009-01-02 13:40:53 +00001381 echo_char_raw('\n', tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001382 else {
1383 /* Record the column of first canon char. */
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001384 if (ldata->canon_head == ldata->read_head)
Joe Petersona88a69c2009-01-02 13:40:53 +00001385 echo_set_canon_col(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001386 echo_char(c, tty);
1387 }
Joe Petersona88a69c2009-01-02 13:40:53 +00001388 process_echoes(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001389 }
1390
Joe Petersonacc71bb2009-01-02 13:43:32 +00001391 if (parmrk)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001392 put_tty_queue(c, tty);
1393
1394 put_tty_queue(c, tty);
Alan Cox4edf1822008-02-08 04:18:44 -08001395}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001396
Linus Torvalds1da177e2005-04-16 15:20:36 -07001397
1398/**
1399 * n_tty_write_wakeup - asynchronous I/O notifier
1400 * @tty: tty device
1401 *
1402 * Required for the ptys, serial driver etc. since processes
1403 * that attach themselves to the master and rely on ASYNC
1404 * IO must be woken up
1405 */
1406
1407static void n_tty_write_wakeup(struct tty_struct *tty)
1408{
Thomas Pfaffff8cb0f2009-01-02 13:47:13 +00001409 if (tty->fasync && test_and_clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001410 kill_fasync(&tty->fasync, SIGIO, POLL_OUT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001411}
1412
1413/**
1414 * n_tty_receive_buf - data receive
1415 * @tty: terminal device
1416 * @cp: buffer
1417 * @fp: flag buffer
1418 * @count: characters
1419 *
1420 * Called by the terminal driver when a block of characters has
1421 * been received. This function must be called from soft contexts
1422 * not from interrupt context. The driver is responsible for making
1423 * calls one at a time and in order (or using flush_to_ldisc)
1424 */
Alan Cox4edf1822008-02-08 04:18:44 -08001425
Linus Torvalds55db4c62011-06-04 06:33:24 +09001426static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
1427 char *fp, int count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001428{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001429 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001430 const unsigned char *p;
1431 char *f, flags = TTY_NORMAL;
1432 int i;
1433 char buf[64];
1434 unsigned long cpuflags;
1435
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001436 if (ldata->real_raw) {
Jiri Slabybddc7152012-10-18 22:26:42 +02001437 spin_lock_irqsave(&ldata->read_lock, cpuflags);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001438 i = min(N_TTY_BUF_SIZE - ldata->read_cnt,
1439 N_TTY_BUF_SIZE - ldata->read_head);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001440 i = min(count, i);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001441 memcpy(ldata->read_buf + ldata->read_head, cp, i);
1442 ldata->read_head = (ldata->read_head + i) & (N_TTY_BUF_SIZE-1);
1443 ldata->read_cnt += i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001444 cp += i;
1445 count -= i;
1446
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001447 i = min(N_TTY_BUF_SIZE - ldata->read_cnt,
1448 N_TTY_BUF_SIZE - ldata->read_head);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001449 i = min(count, i);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001450 memcpy(ldata->read_buf + ldata->read_head, cp, i);
1451 ldata->read_head = (ldata->read_head + i) & (N_TTY_BUF_SIZE-1);
1452 ldata->read_cnt += i;
Jiri Slabybddc7152012-10-18 22:26:42 +02001453 spin_unlock_irqrestore(&ldata->read_lock, cpuflags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001454 } else {
Alan Cox4edf1822008-02-08 04:18:44 -08001455 for (i = count, p = cp, f = fp; i; i--, p++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001456 if (f)
1457 flags = *f++;
1458 switch (flags) {
1459 case TTY_NORMAL:
1460 n_tty_receive_char(tty, *p);
1461 break;
1462 case TTY_BREAK:
1463 n_tty_receive_break(tty);
1464 break;
1465 case TTY_PARITY:
1466 case TTY_FRAME:
1467 n_tty_receive_parity_error(tty, *p);
1468 break;
1469 case TTY_OVERRUN:
1470 n_tty_receive_overrun(tty);
1471 break;
1472 default:
Alan Cox4edf1822008-02-08 04:18:44 -08001473 printk(KERN_ERR "%s: unknown flag %d\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001474 tty_name(tty, buf), flags);
1475 break;
1476 }
1477 }
Alan Coxf34d7a52008-04-30 00:54:13 -07001478 if (tty->ops->flush_chars)
1479 tty->ops->flush_chars(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001480 }
1481
Linus Torvalds55db4c62011-06-04 06:33:24 +09001482 n_tty_set_room(tty);
1483
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001484 if ((!ldata->icanon && (ldata->read_cnt >= tty->minimum_to_wake)) ||
hyc@symas.com26df6d12010-06-22 10:14:49 -07001485 L_EXTPROC(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001486 kill_fasync(&tty->fasync, SIGIO, POLL_IN);
1487 if (waitqueue_active(&tty->read_wait))
1488 wake_up_interruptible(&tty->read_wait);
1489 }
1490
1491 /*
1492 * Check the remaining room for the input canonicalization
1493 * mode. We don't want to throttle the driver if we're in
1494 * canonical mode and don't have a newline yet!
1495 */
Linus Torvalds55db4c62011-06-04 06:33:24 +09001496 if (tty->receive_room < TTY_THRESHOLD_THROTTLE)
Alan Cox39c2e602008-04-30 00:54:18 -07001497 tty_throttle(tty);
Alan Cox0a44ab42012-06-22 16:40:20 +01001498
1499 /* FIXME: there is a tiny race here if the receive room check runs
1500 before the other work executes and empties the buffer (upping
1501 the receiving room and unthrottling. We then throttle and get
1502 stuck. This has been observed and traced down by Vincent Pillet/
1503 We need to address this when we sort out out the rx path locking */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504}
1505
1506int is_ignored(int sig)
1507{
1508 return (sigismember(&current->blocked, sig) ||
Alan Cox4edf1822008-02-08 04:18:44 -08001509 current->sighand->action[sig-1].sa.sa_handler == SIG_IGN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001510}
1511
1512/**
1513 * n_tty_set_termios - termios data changed
1514 * @tty: terminal
1515 * @old: previous data
1516 *
1517 * Called by the tty layer when the user changes termios flags so
1518 * that the line discipline can plan ahead. This function cannot sleep
Alan Cox4edf1822008-02-08 04:18:44 -08001519 * and is protected from re-entry by the tty layer. The user is
Linus Torvalds1da177e2005-04-16 15:20:36 -07001520 * guaranteed that this function will not be re-entered or in progress
1521 * when the ldisc is closed.
Alan Cox17b82062008-10-13 10:45:06 +01001522 *
1523 * Locking: Caller holds tty->termios_mutex
Linus Torvalds1da177e2005-04-16 15:20:36 -07001524 */
Alan Cox4edf1822008-02-08 04:18:44 -08001525
1526static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001527{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001528 struct n_tty_data *ldata = tty->disc_data;
Alan Cox47afa7a2008-10-13 10:44:17 +01001529 int canon_change = 1;
Alan Cox47afa7a2008-10-13 10:44:17 +01001530
1531 if (old)
Alan Coxadc8d742012-07-14 15:31:47 +01001532 canon_change = (old->c_lflag ^ tty->termios.c_lflag) & ICANON;
Alan Cox47afa7a2008-10-13 10:44:17 +01001533 if (canon_change) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001534 bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001535 ldata->canon_head = ldata->read_tail;
1536 ldata->canon_data = 0;
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001537 ldata->erasing = 0;
Alan Cox47afa7a2008-10-13 10:44:17 +01001538 }
1539
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001540 if (canon_change && !L_ICANON(tty) && ldata->read_cnt)
Alan Cox47afa7a2008-10-13 10:44:17 +01001541 wake_up_interruptible(&tty->read_wait);
Alan Cox4edf1822008-02-08 04:18:44 -08001542
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001543 ldata->icanon = (L_ICANON(tty) != 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001544 if (test_bit(TTY_HW_COOK_IN, &tty->flags)) {
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001545 ldata->raw = 1;
1546 ldata->real_raw = 1;
Linus Torvalds55db4c62011-06-04 06:33:24 +09001547 n_tty_set_room(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001548 return;
1549 }
1550 if (I_ISTRIP(tty) || I_IUCLC(tty) || I_IGNCR(tty) ||
1551 I_ICRNL(tty) || I_INLCR(tty) || L_ICANON(tty) ||
1552 I_IXON(tty) || L_ISIG(tty) || L_ECHO(tty) ||
1553 I_PARMRK(tty)) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001554 bitmap_zero(ldata->process_char_map, 256);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001555
1556 if (I_IGNCR(tty) || I_ICRNL(tty))
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001557 set_bit('\r', ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001558 if (I_INLCR(tty))
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001559 set_bit('\n', ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001560
1561 if (L_ICANON(tty)) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001562 set_bit(ERASE_CHAR(tty), ldata->process_char_map);
1563 set_bit(KILL_CHAR(tty), ldata->process_char_map);
1564 set_bit(EOF_CHAR(tty), ldata->process_char_map);
1565 set_bit('\n', ldata->process_char_map);
1566 set_bit(EOL_CHAR(tty), ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001567 if (L_IEXTEN(tty)) {
1568 set_bit(WERASE_CHAR(tty),
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001569 ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001570 set_bit(LNEXT_CHAR(tty),
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001571 ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001572 set_bit(EOL2_CHAR(tty),
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001573 ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001574 if (L_ECHO(tty))
1575 set_bit(REPRINT_CHAR(tty),
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001576 ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001577 }
1578 }
1579 if (I_IXON(tty)) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001580 set_bit(START_CHAR(tty), ldata->process_char_map);
1581 set_bit(STOP_CHAR(tty), ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001582 }
1583 if (L_ISIG(tty)) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001584 set_bit(INTR_CHAR(tty), ldata->process_char_map);
1585 set_bit(QUIT_CHAR(tty), ldata->process_char_map);
1586 set_bit(SUSP_CHAR(tty), ldata->process_char_map);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001587 }
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001588 clear_bit(__DISABLED_CHAR, ldata->process_char_map);
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001589 ldata->raw = 0;
1590 ldata->real_raw = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001591 } else {
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001592 ldata->raw = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001593 if ((I_IGNBRK(tty) || (!I_BRKINT(tty) && !I_PARMRK(tty))) &&
1594 (I_IGNPAR(tty) || !I_INPCK(tty)) &&
1595 (tty->driver->flags & TTY_DRIVER_REAL_RAW))
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001596 ldata->real_raw = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001597 else
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001598 ldata->real_raw = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001599 }
Linus Torvalds55db4c62011-06-04 06:33:24 +09001600 n_tty_set_room(tty);
Alan Coxf34d7a52008-04-30 00:54:13 -07001601 /* The termios change make the tty ready for I/O */
1602 wake_up_interruptible(&tty->write_wait);
1603 wake_up_interruptible(&tty->read_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001604}
1605
1606/**
1607 * n_tty_close - close the ldisc for this tty
1608 * @tty: device
1609 *
Alan Cox4edf1822008-02-08 04:18:44 -08001610 * Called from the terminal layer when this line discipline is
1611 * being shut down, either because of a close or becsuse of a
Linus Torvalds1da177e2005-04-16 15:20:36 -07001612 * discipline change. The function will not be called while other
1613 * ldisc methods are in progress.
1614 */
Alan Cox4edf1822008-02-08 04:18:44 -08001615
Linus Torvalds1da177e2005-04-16 15:20:36 -07001616static void n_tty_close(struct tty_struct *tty)
1617{
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001618 struct n_tty_data *ldata = tty->disc_data;
1619
Linus Torvalds1da177e2005-04-16 15:20:36 -07001620 n_tty_flush_buffer(tty);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001621 kfree(ldata->read_buf);
1622 kfree(ldata->echo_buf);
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001623 kfree(ldata);
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001624 tty->disc_data = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001625}
1626
1627/**
1628 * n_tty_open - open an ldisc
1629 * @tty: terminal to open
1630 *
Alan Cox4edf1822008-02-08 04:18:44 -08001631 * Called when this line discipline is being attached to the
Linus Torvalds1da177e2005-04-16 15:20:36 -07001632 * terminal device. Can sleep. Called serialized so that no
1633 * other events will occur in parallel. No further open will occur
1634 * until a close.
1635 */
1636
1637static int n_tty_open(struct tty_struct *tty)
1638{
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001639 struct n_tty_data *ldata;
1640
1641 ldata = kzalloc(sizeof(*ldata), GFP_KERNEL);
1642 if (!ldata)
1643 goto err;
1644
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001645 ldata->overrun_time = jiffies;
Jiri Slabybddc7152012-10-18 22:26:42 +02001646 mutex_init(&ldata->atomic_read_lock);
1647 mutex_init(&ldata->output_lock);
1648 mutex_init(&ldata->echo_lock);
1649 spin_lock_init(&ldata->read_lock);
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001650
Joe Petersona88a69c2009-01-02 13:40:53 +00001651 /* These are ugly. Currently a malloc failure here can panic */
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001652 ldata->read_buf = kzalloc(N_TTY_BUF_SIZE, GFP_KERNEL);
1653 ldata->echo_buf = kzalloc(N_TTY_BUF_SIZE, GFP_KERNEL);
1654 if (!ldata->read_buf || !ldata->echo_buf)
Jiri Slabyb91939f2012-10-18 22:26:35 +02001655 goto err_free_bufs;
Alan Cox0b4068a2009-06-11 13:05:49 +01001656
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001657 tty->disc_data = ldata;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001658 reset_buffer_flags(tty);
Andrew McGregor7b292b42011-06-13 11:31:31 +12001659 tty_unthrottle(tty);
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001660 ldata->column = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001661 n_tty_set_termios(tty, NULL);
1662 tty->minimum_to_wake = 1;
1663 tty->closing = 0;
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001664
Linus Torvalds1da177e2005-04-16 15:20:36 -07001665 return 0;
Jiri Slabyb91939f2012-10-18 22:26:35 +02001666err_free_bufs:
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001667 kfree(ldata->read_buf);
1668 kfree(ldata->echo_buf);
Jiri Slaby70ece7a2012-10-18 22:26:38 +02001669 kfree(ldata);
1670err:
Jiri Slabyb91939f2012-10-18 22:26:35 +02001671 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001672}
1673
1674static inline int input_available_p(struct tty_struct *tty, int amt)
1675{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001676 struct n_tty_data *ldata = tty->disc_data;
1677
OGAWA Hirofumie043e422009-07-29 12:15:56 -07001678 tty_flush_to_ldisc(tty);
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001679 if (ldata->icanon && !L_EXTPROC(tty)) {
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001680 if (ldata->canon_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001681 return 1;
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001682 } else if (ldata->read_cnt >= (amt ? amt : 1))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001683 return 1;
1684
1685 return 0;
1686}
1687
1688/**
Thorsten Wißmannbbd20752011-12-08 17:47:33 +01001689 * copy_from_read_buf - copy read data directly
Linus Torvalds1da177e2005-04-16 15:20:36 -07001690 * @tty: terminal device
1691 * @b: user data
1692 * @nr: size of data
1693 *
Alan Cox11a96d12008-10-13 10:46:24 +01001694 * Helper function to speed up n_tty_read. It is only called when
Linus Torvalds1da177e2005-04-16 15:20:36 -07001695 * ICANON is off; it copies characters straight from the tty queue to
1696 * user space directly. It can be profitably called twice; once to
1697 * drain the space from the tail pointer to the (physical) end of the
1698 * buffer, and once to drain the space from the (physical) beginning of
1699 * the buffer to head pointer.
1700 *
Jiri Slabybddc7152012-10-18 22:26:42 +02001701 * Called under the ldata->atomic_read_lock sem
Linus Torvalds1da177e2005-04-16 15:20:36 -07001702 *
1703 */
Alan Cox4edf1822008-02-08 04:18:44 -08001704
Alan Cox33f0f882006-01-09 20:54:13 -08001705static int copy_from_read_buf(struct tty_struct *tty,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001706 unsigned char __user **b,
1707 size_t *nr)
1708
1709{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001710 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001711 int retval;
1712 size_t n;
1713 unsigned long flags;
Jiri Slaby3fa10cc2012-04-26 20:13:00 +02001714 bool is_eof;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001715
1716 retval = 0;
Jiri Slabybddc7152012-10-18 22:26:42 +02001717 spin_lock_irqsave(&ldata->read_lock, flags);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001718 n = min(ldata->read_cnt, N_TTY_BUF_SIZE - ldata->read_tail);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001719 n = min(*nr, n);
Jiri Slabybddc7152012-10-18 22:26:42 +02001720 spin_unlock_irqrestore(&ldata->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001721 if (n) {
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001722 retval = copy_to_user(*b, &ldata->read_buf[ldata->read_tail], n);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001723 n -= retval;
Jiri Slaby3fa10cc2012-04-26 20:13:00 +02001724 is_eof = n == 1 &&
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001725 ldata->read_buf[ldata->read_tail] == EOF_CHAR(tty);
1726 tty_audit_add_data(tty, &ldata->read_buf[ldata->read_tail], n,
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001727 ldata->icanon);
Jiri Slabybddc7152012-10-18 22:26:42 +02001728 spin_lock_irqsave(&ldata->read_lock, flags);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001729 ldata->read_tail = (ldata->read_tail + n) & (N_TTY_BUF_SIZE-1);
1730 ldata->read_cnt -= n;
hyc@symas.com26df6d12010-06-22 10:14:49 -07001731 /* Turn single EOF into zero-length read */
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001732 if (L_EXTPROC(tty) && ldata->icanon && is_eof && !ldata->read_cnt)
Jiri Slaby3fa10cc2012-04-26 20:13:00 +02001733 n = 0;
Jiri Slabybddc7152012-10-18 22:26:42 +02001734 spin_unlock_irqrestore(&ldata->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001735 *b += n;
1736 *nr -= n;
1737 }
1738 return retval;
1739}
1740
Al Virocc4191d2008-03-29 03:08:48 +00001741extern ssize_t redirected_tty_write(struct file *, const char __user *,
Alan Cox4edf1822008-02-08 04:18:44 -08001742 size_t, loff_t *);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001743
1744/**
1745 * job_control - check job control
1746 * @tty: tty
1747 * @file: file handle
1748 *
1749 * Perform job control management checks on this file/tty descriptor
Alan Cox4edf1822008-02-08 04:18:44 -08001750 * and if appropriate send any needed signals and return a negative
Linus Torvalds1da177e2005-04-16 15:20:36 -07001751 * error code if action should be taken.
Alan Cox04f378b2008-04-30 00:53:29 -07001752 *
1753 * FIXME:
1754 * Locking: None - redirected write test is safe, testing
1755 * current->signal should possibly lock current->sighand
1756 * pgrp locking ?
Linus Torvalds1da177e2005-04-16 15:20:36 -07001757 */
Alan Cox4edf1822008-02-08 04:18:44 -08001758
Linus Torvalds1da177e2005-04-16 15:20:36 -07001759static int job_control(struct tty_struct *tty, struct file *file)
1760{
1761 /* Job control check -- must be done at start and after
1762 every sleep (POSIX.1 7.1.1.4). */
1763 /* NOTE: not yet done after every sleep pending a thorough
1764 check of the logic of this change. -- jlc */
1765 /* don't stop on /dev/console */
1766 if (file->f_op->write != redirected_tty_write &&
1767 current->signal->tty == tty) {
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001768 if (!tty->pgrp)
Alan Cox11a96d12008-10-13 10:46:24 +01001769 printk(KERN_ERR "n_tty_read: no tty->pgrp!\n");
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001770 else if (task_pgrp(current) != tty->pgrp) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001771 if (is_ignored(SIGTTIN) ||
Eric W. Biederman3e7cd6c2007-02-12 00:52:58 -08001772 is_current_pgrp_orphaned())
Linus Torvalds1da177e2005-04-16 15:20:36 -07001773 return -EIO;
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001774 kill_pgrp(task_pgrp(current), SIGTTIN, 1);
Oleg Nesterov040b6362007-06-01 00:46:53 -07001775 set_thread_flag(TIF_SIGPENDING);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001776 return -ERESTARTSYS;
1777 }
1778 }
1779 return 0;
1780}
Alan Cox4edf1822008-02-08 04:18:44 -08001781
Linus Torvalds1da177e2005-04-16 15:20:36 -07001782
1783/**
Alan Cox11a96d12008-10-13 10:46:24 +01001784 * n_tty_read - read function for tty
Linus Torvalds1da177e2005-04-16 15:20:36 -07001785 * @tty: tty device
1786 * @file: file object
1787 * @buf: userspace buffer pointer
1788 * @nr: size of I/O
1789 *
1790 * Perform reads for the line discipline. We are guaranteed that the
1791 * line discipline will not be closed under us but we may get multiple
1792 * parallel readers and must handle this ourselves. We may also get
1793 * a hangup. Always called in user context, may sleep.
1794 *
1795 * This code must be sure never to sleep through a hangup.
1796 */
Alan Cox4edf1822008-02-08 04:18:44 -08001797
Alan Cox11a96d12008-10-13 10:46:24 +01001798static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001799 unsigned char __user *buf, size_t nr)
1800{
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001801 struct n_tty_data *ldata = tty->disc_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001802 unsigned char __user *b = buf;
1803 DECLARE_WAITQUEUE(wait, current);
1804 int c;
1805 int minimum, time;
1806 ssize_t retval = 0;
1807 ssize_t size;
1808 long timeout;
1809 unsigned long flags;
Alan Cox04f378b2008-04-30 00:53:29 -07001810 int packet;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001811
1812do_it_again:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001813 c = job_control(tty, file);
Alan Cox4edf1822008-02-08 04:18:44 -08001814 if (c < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001815 return c;
Alan Cox4edf1822008-02-08 04:18:44 -08001816
Linus Torvalds1da177e2005-04-16 15:20:36 -07001817 minimum = time = 0;
1818 timeout = MAX_SCHEDULE_TIMEOUT;
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001819 if (!ldata->icanon) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001820 time = (HZ / 10) * TIME_CHAR(tty);
1821 minimum = MIN_CHAR(tty);
1822 if (minimum) {
1823 if (time)
1824 tty->minimum_to_wake = 1;
1825 else if (!waitqueue_active(&tty->read_wait) ||
1826 (tty->minimum_to_wake > minimum))
1827 tty->minimum_to_wake = minimum;
1828 } else {
1829 timeout = 0;
1830 if (time) {
1831 timeout = time;
1832 time = 0;
1833 }
1834 tty->minimum_to_wake = minimum = 1;
1835 }
1836 }
1837
1838 /*
1839 * Internal serialization of reads.
1840 */
1841 if (file->f_flags & O_NONBLOCK) {
Jiri Slabybddc7152012-10-18 22:26:42 +02001842 if (!mutex_trylock(&ldata->atomic_read_lock))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001843 return -EAGAIN;
Alan Cox4edf1822008-02-08 04:18:44 -08001844 } else {
Jiri Slabybddc7152012-10-18 22:26:42 +02001845 if (mutex_lock_interruptible(&ldata->atomic_read_lock))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001846 return -ERESTARTSYS;
1847 }
Alan Cox04f378b2008-04-30 00:53:29 -07001848 packet = tty->packet;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001849
1850 add_wait_queue(&tty->read_wait, &wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001851 while (nr) {
1852 /* First test for status change. */
Alan Cox04f378b2008-04-30 00:53:29 -07001853 if (packet && tty->link->ctrl_status) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001854 unsigned char cs;
1855 if (b != buf)
1856 break;
Alan Cox04f378b2008-04-30 00:53:29 -07001857 spin_lock_irqsave(&tty->link->ctrl_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001858 cs = tty->link->ctrl_status;
1859 tty->link->ctrl_status = 0;
Alan Cox04f378b2008-04-30 00:53:29 -07001860 spin_unlock_irqrestore(&tty->link->ctrl_lock, flags);
Miloslav Trmac522ed772007-07-15 23:40:56 -07001861 if (tty_put_user(tty, cs, b++)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001862 retval = -EFAULT;
1863 b--;
1864 break;
1865 }
1866 nr--;
1867 break;
1868 }
1869 /* This statement must be first before checking for input
1870 so that any interrupt will set the state back to
1871 TASK_RUNNING. */
1872 set_current_state(TASK_INTERRUPTIBLE);
Alan Cox4edf1822008-02-08 04:18:44 -08001873
Linus Torvalds1da177e2005-04-16 15:20:36 -07001874 if (((minimum - (b - buf)) < tty->minimum_to_wake) &&
1875 ((minimum - (b - buf)) >= 1))
1876 tty->minimum_to_wake = (minimum - (b - buf));
Alan Cox4edf1822008-02-08 04:18:44 -08001877
Linus Torvalds1da177e2005-04-16 15:20:36 -07001878 if (!input_available_p(tty, 0)) {
1879 if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) {
1880 retval = -EIO;
1881 break;
1882 }
1883 if (tty_hung_up_p(file))
1884 break;
1885 if (!timeout)
1886 break;
1887 if (file->f_flags & O_NONBLOCK) {
1888 retval = -EAGAIN;
1889 break;
1890 }
1891 if (signal_pending(current)) {
1892 retval = -ERESTARTSYS;
1893 break;
1894 }
Linus Torvalds55db4c62011-06-04 06:33:24 +09001895 /* FIXME: does n_tty_set_room need locking ? */
1896 n_tty_set_room(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001897 timeout = schedule_timeout(timeout);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001898 continue;
1899 }
1900 __set_current_state(TASK_RUNNING);
1901
1902 /* Deal with packet mode. */
Alan Cox04f378b2008-04-30 00:53:29 -07001903 if (packet && b == buf) {
Miloslav Trmac522ed772007-07-15 23:40:56 -07001904 if (tty_put_user(tty, TIOCPKT_DATA, b++)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001905 retval = -EFAULT;
1906 b--;
1907 break;
1908 }
1909 nr--;
1910 }
1911
Jiri Slaby53c5ee22012-10-18 22:26:39 +02001912 if (ldata->icanon && !L_EXTPROC(tty)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001913 /* N.B. avoid overrun if nr == 0 */
Jiri Slabybddc7152012-10-18 22:26:42 +02001914 spin_lock_irqsave(&ldata->read_lock, flags);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001915 while (nr && ldata->read_cnt) {
Alan Cox4edf1822008-02-08 04:18:44 -08001916 int eol;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001917
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001918 eol = test_and_clear_bit(ldata->read_tail,
Jiri Slaby3fe780b2012-10-18 22:26:40 +02001919 ldata->read_flags);
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001920 c = ldata->read_buf[ldata->read_tail];
1921 ldata->read_tail = ((ldata->read_tail+1) &
Linus Torvalds1da177e2005-04-16 15:20:36 -07001922 (N_TTY_BUF_SIZE-1));
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001923 ldata->read_cnt--;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001924 if (eol) {
1925 /* this test should be redundant:
1926 * we shouldn't be reading data if
1927 * canon_data is 0
1928 */
Jiri Slabyba2e68a2012-10-18 22:26:41 +02001929 if (--ldata->canon_data < 0)
1930 ldata->canon_data = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001931 }
Jiri Slabybddc7152012-10-18 22:26:42 +02001932 spin_unlock_irqrestore(&ldata->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001933
1934 if (!eol || (c != __DISABLED_CHAR)) {
Miloslav Trmac522ed772007-07-15 23:40:56 -07001935 if (tty_put_user(tty, c, b++)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001936 retval = -EFAULT;
1937 b--;
Jiri Slabybddc7152012-10-18 22:26:42 +02001938 spin_lock_irqsave(&ldata->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001939 break;
1940 }
1941 nr--;
1942 }
Miloslav Trmac522ed772007-07-15 23:40:56 -07001943 if (eol) {
1944 tty_audit_push(tty);
Jiri Slabybddc7152012-10-18 22:26:42 +02001945 spin_lock_irqsave(&ldata->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001946 break;
Miloslav Trmac522ed772007-07-15 23:40:56 -07001947 }
Jiri Slabybddc7152012-10-18 22:26:42 +02001948 spin_lock_irqsave(&ldata->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001949 }
Jiri Slabybddc7152012-10-18 22:26:42 +02001950 spin_unlock_irqrestore(&ldata->read_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001951 if (retval)
1952 break;
1953 } else {
1954 int uncopied;
Alan Cox04f378b2008-04-30 00:53:29 -07001955 /* The copy function takes the read lock and handles
1956 locking internally for this case */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001957 uncopied = copy_from_read_buf(tty, &b, &nr);
1958 uncopied += copy_from_read_buf(tty, &b, &nr);
1959 if (uncopied) {
1960 retval = -EFAULT;
1961 break;
1962 }
1963 }
1964
1965 /* If there is enough space in the read buffer now, let the
1966 * low-level driver know. We use n_tty_chars_in_buffer() to
1967 * check the buffer, as it now knows about canonical mode.
1968 * Otherwise, if the driver is throttled and the line is
1969 * longer than TTY_THRESHOLD_UNTHROTTLE in canonical mode,
1970 * we won't get any more characters.
1971 */
Linus Torvalds55db4c62011-06-04 06:33:24 +09001972 if (n_tty_chars_in_buffer(tty) <= TTY_THRESHOLD_UNTHROTTLE) {
1973 n_tty_set_room(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001974 check_unthrottle(tty);
Linus Torvalds55db4c62011-06-04 06:33:24 +09001975 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001976
1977 if (b - buf >= minimum)
1978 break;
1979 if (time)
1980 timeout = time;
1981 }
Jiri Slabybddc7152012-10-18 22:26:42 +02001982 mutex_unlock(&ldata->atomic_read_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001983 remove_wait_queue(&tty->read_wait, &wait);
1984
1985 if (!waitqueue_active(&tty->read_wait))
1986 tty->minimum_to_wake = minimum;
1987
1988 __set_current_state(TASK_RUNNING);
1989 size = b - buf;
1990 if (size) {
1991 retval = size;
1992 if (nr)
Alan Cox4edf1822008-02-08 04:18:44 -08001993 clear_bit(TTY_PUSH, &tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001994 } else if (test_and_clear_bit(TTY_PUSH, &tty->flags))
Thorsten Wißmannbbd20752011-12-08 17:47:33 +01001995 goto do_it_again;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001996
Linus Torvalds55db4c62011-06-04 06:33:24 +09001997 n_tty_set_room(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001998 return retval;
1999}
2000
2001/**
Alan Cox11a96d12008-10-13 10:46:24 +01002002 * n_tty_write - write function for tty
Linus Torvalds1da177e2005-04-16 15:20:36 -07002003 * @tty: tty device
2004 * @file: file object
2005 * @buf: userspace buffer pointer
2006 * @nr: size of I/O
2007 *
Joe Petersona88a69c2009-01-02 13:40:53 +00002008 * Write function of the terminal device. This is serialized with
Linus Torvalds1da177e2005-04-16 15:20:36 -07002009 * respect to other write callers but not to termios changes, reads
Joe Petersona88a69c2009-01-02 13:40:53 +00002010 * and other such events. Since the receive code will echo characters,
2011 * thus calling driver write methods, the output_lock is used in
2012 * the output processing functions called here as well as in the
2013 * echo processing function to protect the column state and space
2014 * left in the buffer.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002015 *
2016 * This code must be sure never to sleep through a hangup.
Joe Petersona88a69c2009-01-02 13:40:53 +00002017 *
2018 * Locking: output_lock to protect column state and space left
2019 * (note that the process_output*() functions take this
2020 * lock themselves)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002021 */
Alan Cox4edf1822008-02-08 04:18:44 -08002022
Alan Cox11a96d12008-10-13 10:46:24 +01002023static ssize_t n_tty_write(struct tty_struct *tty, struct file *file,
Joe Petersona88a69c2009-01-02 13:40:53 +00002024 const unsigned char *buf, size_t nr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002025{
2026 const unsigned char *b = buf;
2027 DECLARE_WAITQUEUE(wait, current);
2028 int c;
2029 ssize_t retval = 0;
2030
2031 /* Job control check -- must be done at start (POSIX.1 7.1.1.4). */
2032 if (L_TOSTOP(tty) && file->f_op->write != redirected_tty_write) {
2033 retval = tty_check_change(tty);
2034 if (retval)
2035 return retval;
2036 }
2037
Joe Petersona88a69c2009-01-02 13:40:53 +00002038 /* Write out any echoed characters that are still pending */
2039 process_echoes(tty);
Alan Cox300a6202009-01-02 13:41:04 +00002040
Linus Torvalds1da177e2005-04-16 15:20:36 -07002041 add_wait_queue(&tty->write_wait, &wait);
2042 while (1) {
2043 set_current_state(TASK_INTERRUPTIBLE);
2044 if (signal_pending(current)) {
2045 retval = -ERESTARTSYS;
2046 break;
2047 }
2048 if (tty_hung_up_p(file) || (tty->link && !tty->link->count)) {
2049 retval = -EIO;
2050 break;
2051 }
2052 if (O_OPOST(tty) && !(test_bit(TTY_HW_COOK_OUT, &tty->flags))) {
2053 while (nr > 0) {
Joe Petersona88a69c2009-01-02 13:40:53 +00002054 ssize_t num = process_output_block(tty, b, nr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002055 if (num < 0) {
2056 if (num == -EAGAIN)
2057 break;
2058 retval = num;
2059 goto break_out;
2060 }
2061 b += num;
2062 nr -= num;
2063 if (nr == 0)
2064 break;
2065 c = *b;
Joe Petersona88a69c2009-01-02 13:40:53 +00002066 if (process_output(c, tty) < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002067 break;
2068 b++; nr--;
2069 }
Alan Coxf34d7a52008-04-30 00:54:13 -07002070 if (tty->ops->flush_chars)
2071 tty->ops->flush_chars(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002072 } else {
Roman Zippeld6afe272005-07-07 17:56:55 -07002073 while (nr > 0) {
Alan Coxf34d7a52008-04-30 00:54:13 -07002074 c = tty->ops->write(tty, b, nr);
Roman Zippeld6afe272005-07-07 17:56:55 -07002075 if (c < 0) {
2076 retval = c;
2077 goto break_out;
2078 }
2079 if (!c)
2080 break;
2081 b += c;
2082 nr -= c;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002083 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002084 }
2085 if (!nr)
2086 break;
2087 if (file->f_flags & O_NONBLOCK) {
2088 retval = -EAGAIN;
2089 break;
2090 }
2091 schedule();
2092 }
2093break_out:
2094 __set_current_state(TASK_RUNNING);
2095 remove_wait_queue(&tty->write_wait, &wait);
Thomas Pfaffff8cb0f2009-01-02 13:47:13 +00002096 if (b - buf != nr && tty->fasync)
2097 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002098 return (b - buf) ? b - buf : retval;
2099}
2100
2101/**
Alan Cox11a96d12008-10-13 10:46:24 +01002102 * n_tty_poll - poll method for N_TTY
Linus Torvalds1da177e2005-04-16 15:20:36 -07002103 * @tty: terminal device
2104 * @file: file accessing it
2105 * @wait: poll table
2106 *
2107 * Called when the line discipline is asked to poll() for data or
2108 * for special events. This code is not serialized with respect to
2109 * other events save open/close.
2110 *
2111 * This code must be sure never to sleep through a hangup.
2112 * Called without the kernel lock held - fine
Linus Torvalds1da177e2005-04-16 15:20:36 -07002113 */
Alan Cox4edf1822008-02-08 04:18:44 -08002114
Alan Cox11a96d12008-10-13 10:46:24 +01002115static unsigned int n_tty_poll(struct tty_struct *tty, struct file *file,
Alan Cox4edf1822008-02-08 04:18:44 -08002116 poll_table *wait)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002117{
2118 unsigned int mask = 0;
2119
2120 poll_wait(file, &tty->read_wait, wait);
2121 poll_wait(file, &tty->write_wait, wait);
2122 if (input_available_p(tty, TIME_CHAR(tty) ? 0 : MIN_CHAR(tty)))
2123 mask |= POLLIN | POLLRDNORM;
2124 if (tty->packet && tty->link->ctrl_status)
2125 mask |= POLLPRI | POLLIN | POLLRDNORM;
2126 if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
2127 mask |= POLLHUP;
2128 if (tty_hung_up_p(file))
2129 mask |= POLLHUP;
2130 if (!(mask & (POLLHUP | POLLIN | POLLRDNORM))) {
2131 if (MIN_CHAR(tty) && !TIME_CHAR(tty))
2132 tty->minimum_to_wake = MIN_CHAR(tty);
2133 else
2134 tty->minimum_to_wake = 1;
2135 }
Alan Coxf34d7a52008-04-30 00:54:13 -07002136 if (tty->ops->write && !tty_is_writelocked(tty) &&
2137 tty_chars_in_buffer(tty) < WAKEUP_CHARS &&
2138 tty_write_room(tty) > 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002139 mask |= POLLOUT | POLLWRNORM;
2140 return mask;
2141}
2142
Alan Cox47afa7a2008-10-13 10:44:17 +01002143static unsigned long inq_canon(struct tty_struct *tty)
2144{
Jiri Slaby3fe780b2012-10-18 22:26:40 +02002145 struct n_tty_data *ldata = tty->disc_data;
Alan Cox47afa7a2008-10-13 10:44:17 +01002146 int nr, head, tail;
2147
Jiri Slabyba2e68a2012-10-18 22:26:41 +02002148 if (!ldata->canon_data)
Alan Cox47afa7a2008-10-13 10:44:17 +01002149 return 0;
Jiri Slabyba2e68a2012-10-18 22:26:41 +02002150 head = ldata->canon_head;
2151 tail = ldata->read_tail;
Alan Cox47afa7a2008-10-13 10:44:17 +01002152 nr = (head - tail) & (N_TTY_BUF_SIZE-1);
2153 /* Skip EOF-chars.. */
2154 while (head != tail) {
Jiri Slaby3fe780b2012-10-18 22:26:40 +02002155 if (test_bit(tail, ldata->read_flags) &&
Jiri Slabyba2e68a2012-10-18 22:26:41 +02002156 ldata->read_buf[tail] == __DISABLED_CHAR)
Alan Cox47afa7a2008-10-13 10:44:17 +01002157 nr--;
2158 tail = (tail+1) & (N_TTY_BUF_SIZE-1);
2159 }
2160 return nr;
2161}
2162
2163static int n_tty_ioctl(struct tty_struct *tty, struct file *file,
2164 unsigned int cmd, unsigned long arg)
2165{
Jiri Slabyba2e68a2012-10-18 22:26:41 +02002166 struct n_tty_data *ldata = tty->disc_data;
Alan Cox47afa7a2008-10-13 10:44:17 +01002167 int retval;
2168
2169 switch (cmd) {
2170 case TIOCOUTQ:
2171 return put_user(tty_chars_in_buffer(tty), (int __user *) arg);
2172 case TIOCINQ:
Alan Cox17b82062008-10-13 10:45:06 +01002173 /* FIXME: Locking */
Jiri Slabyba2e68a2012-10-18 22:26:41 +02002174 retval = ldata->read_cnt;
Alan Cox47afa7a2008-10-13 10:44:17 +01002175 if (L_ICANON(tty))
2176 retval = inq_canon(tty);
2177 return put_user(retval, (unsigned int __user *) arg);
2178 default:
2179 return n_tty_ioctl_helper(tty, file, cmd, arg);
2180 }
2181}
2182
Alan Coxa352def2008-07-16 21:53:12 +01002183struct tty_ldisc_ops tty_ldisc_N_TTY = {
Paul Fulghume10cc1d2007-05-10 22:22:50 -07002184 .magic = TTY_LDISC_MAGIC,
2185 .name = "n_tty",
2186 .open = n_tty_open,
2187 .close = n_tty_close,
2188 .flush_buffer = n_tty_flush_buffer,
2189 .chars_in_buffer = n_tty_chars_in_buffer,
Alan Cox11a96d12008-10-13 10:46:24 +01002190 .read = n_tty_read,
2191 .write = n_tty_write,
Paul Fulghume10cc1d2007-05-10 22:22:50 -07002192 .ioctl = n_tty_ioctl,
2193 .set_termios = n_tty_set_termios,
Alan Cox11a96d12008-10-13 10:46:24 +01002194 .poll = n_tty_poll,
Paul Fulghume10cc1d2007-05-10 22:22:50 -07002195 .receive_buf = n_tty_receive_buf,
2196 .write_wakeup = n_tty_write_wakeup
Linus Torvalds1da177e2005-04-16 15:20:36 -07002197};
Rodolfo Giometti572b9ad2010-03-10 15:23:46 -08002198
2199/**
2200 * n_tty_inherit_ops - inherit N_TTY methods
2201 * @ops: struct tty_ldisc_ops where to save N_TTY methods
2202 *
2203 * Used by a generic struct tty_ldisc_ops to easily inherit N_TTY
2204 * methods.
2205 */
2206
2207void n_tty_inherit_ops(struct tty_ldisc_ops *ops)
2208{
2209 *ops = tty_ldisc_N_TTY;
2210 ops->owner = NULL;
2211 ops->refcount = ops->flags = 0;
2212}
2213EXPORT_SYMBOL_GPL(n_tty_inherit_ops);