n_tty.c 57.4 KB
Newer Older
L
Linus Torvalds 已提交
1 2
/*
 * n_tty.c --- implements the N_TTY line discipline.
3
 *
L
Linus Torvalds 已提交
4 5 6 7 8 9 10
 * This code used to be in tty_io.c, but things are getting hairy
 * enough that it made sense to split things off.  (The N_TTY
 * processing has changed so much that it's hardly recognizable,
 * anyway...)
 *
 * Note that the open routine for N_TTY is guaranteed never to return
 * an error.  This is because Linux will fall back to setting a line
11
 * to N_TTY if it can not switch to any other line discipline.
L
Linus Torvalds 已提交
12 13
 *
 * Written by Theodore Ts'o, Copyright 1994.
14
 *
L
Linus Torvalds 已提交
15 16
 * This file also contains code originally written by Linus Torvalds,
 * Copyright 1991, 1992, 1993, and by Julian Cowley, Copyright 1994.
17
 *
L
Linus Torvalds 已提交
18 19 20 21 22
 * This file may be redistributed under the terms of the GNU General Public
 * License.
 *
 * Reduced memory usage for older ARM systems  - Russell King.
 *
23
 * 2000/01/20   Fixed SMP locking on put_tty_queue using bits of
L
Linus Torvalds 已提交
24 25 26 27 28
 *		the patch by Andrew J. Kroll <ag784@freenet.buffalo.edu>
 *		who actually finally proved there really was a race.
 *
 * 2002/03/18   Implemented n_tty_wakeup to send SIGIO POLL_OUTs to
 *		waiting writing processes-Sapan Bhatia <sapan@corewars.org>.
29
 *		Also fixed a bug in BLOCKING mode where n_tty_write returns
L
Linus Torvalds 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
 *		EAGAIN
 */

#include <linux/types.h>
#include <linux/major.h>
#include <linux/errno.h>
#include <linux/signal.h>
#include <linux/fcntl.h>
#include <linux/sched.h>
#include <linux/interrupt.h>
#include <linux/tty.h>
#include <linux/timer.h>
#include <linux/ctype.h>
#include <linux/mm.h>
#include <linux/string.h>
#include <linux/slab.h>
#include <linux/poll.h>
#include <linux/bitops.h>
M
Miloslav Trmac 已提交
48 49
#include <linux/audit.h>
#include <linux/file.h>
A
Alan Cox 已提交
50
#include <linux/uaccess.h>
51
#include <linux/module.h>
52
#include <linux/ratelimit.h>
L
Linus Torvalds 已提交
53 54 55 56 57 58 59 60 61 62 63


/* number of characters left in xmit buffer before select has we have room */
#define WAKEUP_CHARS 256

/*
 * This defines the low- and high-watermarks for throttling and
 * unthrottling the TTY driver.  These watermarks are used for
 * controlling the space in the read buffer.
 */
#define TTY_THRESHOLD_THROTTLE		128 /* now based on remaining room */
64
#define TTY_THRESHOLD_UNTHROTTLE	128
L
Linus Torvalds 已提交
65

66 67 68 69 70 71 72 73 74 75 76
/*
 * Special byte codes used in the echo buffer to represent operations
 * or special handling of characters.  Bytes in the echo buffer that
 * are not part of such special blocks are treated as normal character
 * codes.
 */
#define ECHO_OP_START 0xff
#define ECHO_OP_MOVE_BACK_COL 0x80
#define ECHO_OP_SET_CANON_COL 0x81
#define ECHO_OP_ERASE_TAB 0x82

77 78 79 80 81 82 83
#undef N_TTY_TRACE
#ifdef N_TTY_TRACE
# define n_tty_trace(f, args...)	trace_printk(f, ##args)
#else
# define n_tty_trace(f, args...)
#endif

J
Jiri Slaby 已提交
84
struct n_tty_data {
85 86 87 88
	unsigned int column;
	unsigned long overrun_time;
	int num_overrun;

89 90 91
	/* non-atomic */
	bool no_room;

92 93
	unsigned char lnext:1, erasing:1, raw:1, real_raw:1, icanon:1;
	unsigned char echo_overrun:1;
94 95 96

	DECLARE_BITMAP(process_char_map, 256);
	DECLARE_BITMAP(read_flags, N_TTY_BUF_SIZE);
97 98 99 100 101

	char *read_buf;
	int read_head;
	int read_tail;
	int read_cnt;
102
	int minimum_to_wake;
103 104 105 106 107 108 109 110

	unsigned char *echo_buf;
	unsigned int echo_pos;
	unsigned int echo_cnt;

	int canon_data;
	unsigned long canon_head;
	unsigned int canon_column;
111 112 113 114

	struct mutex atomic_read_lock;
	struct mutex output_lock;
	struct mutex echo_lock;
115
	raw_spinlock_t read_lock;
J
Jiri Slaby 已提交
116 117
};

118 119 120 121 122
static inline size_t read_cnt(struct n_tty_data *ldata)
{
	return ldata->read_cnt;
}

M
Miloslav Trmac 已提交
123 124 125
static inline int tty_put_user(struct tty_struct *tty, unsigned char x,
			       unsigned char __user *ptr)
{
126 127 128
	struct n_tty_data *ldata = tty->disc_data;

	tty_audit_add_data(tty, &x, 1, ldata->icanon);
M
Miloslav Trmac 已提交
129 130 131
	return put_user(x, ptr);
}

132
static int receive_room(struct tty_struct *tty)
133
{
134
	struct n_tty_data *ldata = tty->disc_data;
135
	int left;
136

137 138 139 140
	if (I_PARMRK(tty)) {
		/* Multiply read_cnt by 3, since each byte might take up to
		 * three times as many spaces when PARMRK is set (depending on
		 * its flags, e.g. parity error). */
141
		left = N_TTY_BUF_SIZE - read_cnt(ldata) * 3 - 1;
142
	} else
143
		left = N_TTY_BUF_SIZE - read_cnt(ldata) - 1;
144

145 146 147 148 149 150 151
	/*
	 * If we are doing input canonicalization, and there are no
	 * pending newlines, let characters through without limit, so
	 * that erase characters will be handled.  Other excess
	 * characters will be beeped.
	 */
	if (left <= 0)
152
		left = ldata->icanon && !ldata->canon_data;
153

154
	return left;
155 156
}

157 158 159 160 161 162 163 164 165
/**
 *	n_tty_set_room	-	receive space
 *	@tty: terminal
 *
 *	Re-schedules the flip buffer work if space just became available.
 *
 *	Locks: Concurrent update is protected with read_lock
 */

166 167
static void n_tty_set_room(struct tty_struct *tty)
{
168 169
	struct n_tty_data *ldata = tty->disc_data;

170
	/* Did this open up the receive buffer? We may need to flip */
171 172 173
	if (unlikely(ldata->no_room) && receive_room(tty)) {
		ldata->no_room = 0;

J
Jiri Slaby 已提交
174
		WARN_RATELIMIT(tty->port->itty == NULL,
175
				"scheduling with invalid itty\n");
176 177 178 179 180 181
		/* see if ldisc has been killed - if so, this means that
		 * even though the ldisc has been halted and ->buf.work
		 * cancelled, ->buf.work is about to be rescheduled
		 */
		WARN_RATELIMIT(test_bit(TTY_LDISC_HALTED, &tty->flags),
			       "scheduling buffer work for halted ldisc\n");
J
Jiri Slaby 已提交
182 183
		schedule_work(&tty->port->buf.work);
	}
184 185
}

J
Jiri Slaby 已提交
186
static void put_tty_queue_nolock(unsigned char c, struct n_tty_data *ldata)
L
Linus Torvalds 已提交
187
{
188
	if (read_cnt(ldata) < N_TTY_BUF_SIZE) {
189 190 191
		ldata->read_buf[ldata->read_head] = c;
		ldata->read_head = (ldata->read_head + 1) & (N_TTY_BUF_SIZE-1);
		ldata->read_cnt++;
L
Linus Torvalds 已提交
192 193 194
	}
}

195 196 197
/**
 *	put_tty_queue		-	add character to tty
 *	@c: character
J
Jiri Slaby 已提交
198
 *	@ldata: n_tty data
199 200 201 202 203 204
 *
 *	Add a character to the tty read_buf queue. This is done under the
 *	read_lock to serialize character addition and also to protect us
 *	against parallel reads or flushes
 */

J
Jiri Slaby 已提交
205
static void put_tty_queue(unsigned char c, struct n_tty_data *ldata)
L
Linus Torvalds 已提交
206 207 208 209 210 211
{
	unsigned long flags;
	/*
	 *	The problem of stomping on the buffers ends here.
	 *	Why didn't anyone see this one coming? --AJK
	*/
212
	raw_spin_lock_irqsave(&ldata->read_lock, flags);
J
Jiri Slaby 已提交
213
	put_tty_queue_nolock(c, ldata);
214
	raw_spin_unlock_irqrestore(&ldata->read_lock, flags);
L
Linus Torvalds 已提交
215 216 217 218 219 220
}

/**
 *	reset_buffer_flags	-	reset buffer state
 *	@tty: terminal to reset
 *
221 222
 *	Reset the read buffer counters and clear the flags.
 *	Called from n_tty_open() and n_tty_flush_buffer().
223 224
 *
 *	Locking: tty_read_lock for read fields.
L
Linus Torvalds 已提交
225
 */
226

227
static void reset_buffer_flags(struct n_tty_data *ldata)
L
Linus Torvalds 已提交
228 229 230
{
	unsigned long flags;

231
	raw_spin_lock_irqsave(&ldata->read_lock, flags);
232
	ldata->read_head = ldata->read_tail = ldata->read_cnt = 0;
233
	raw_spin_unlock_irqrestore(&ldata->read_lock, flags);
234

235
	mutex_lock(&ldata->echo_lock);
236
	ldata->echo_pos = ldata->echo_cnt = ldata->echo_overrun = 0;
237
	mutex_unlock(&ldata->echo_lock);
238

239
	ldata->canon_head = ldata->canon_data = ldata->erasing = 0;
240
	bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
L
Linus Torvalds 已提交
241 242
}

243 244 245 246 247 248 249 250 251 252 253 254
static void n_tty_packet_mode_flush(struct tty_struct *tty)
{
	unsigned long flags;

	spin_lock_irqsave(&tty->ctrl_lock, flags);
	if (tty->link->packet) {
		tty->ctrl_status |= TIOCPKT_FLUSHREAD;
		wake_up_interruptible(&tty->link->read_wait);
	}
	spin_unlock_irqrestore(&tty->ctrl_lock, flags);
}

L
Linus Torvalds 已提交
255 256 257 258
/**
 *	n_tty_flush_buffer	-	clean input queue
 *	@tty:	terminal device
 *
259 260 261
 *	Flush the input buffer. Called when the tty layer wants the
 *	buffer flushed (eg at hangup) or when the N_TTY line discipline
 *	internally has to clean the pending queue (for example some signals).
L
Linus Torvalds 已提交
262
 *
263
 *	Locking: ctrl_lock, read_lock.
L
Linus Torvalds 已提交
264
 */
265 266

static void n_tty_flush_buffer(struct tty_struct *tty)
L
Linus Torvalds 已提交
267
{
268 269
	reset_buffer_flags(tty->disc_data);
	n_tty_set_room(tty);
270

271 272
	if (tty->link)
		n_tty_packet_mode_flush(tty);
L
Linus Torvalds 已提交
273 274 275 276 277 278 279
}

/**
 *	n_tty_chars_in_buffer	-	report available bytes
 *	@tty: tty device
 *
 *	Report the number of characters buffered to be delivered to user
280
 *	at this instant in time.
281 282
 *
 *	Locking: read_lock
L
Linus Torvalds 已提交
283
 */
284

285
static ssize_t chars_in_buffer(struct tty_struct *tty)
L
Linus Torvalds 已提交
286
{
287
	struct n_tty_data *ldata = tty->disc_data;
L
Linus Torvalds 已提交
288 289 290
	unsigned long flags;
	ssize_t n = 0;

291
	raw_spin_lock_irqsave(&ldata->read_lock, flags);
292
	if (!ldata->icanon) {
293
		n = read_cnt(ldata);
294 295 296 297
	} else if (ldata->canon_data) {
		n = (ldata->canon_head > ldata->read_tail) ?
			ldata->canon_head - ldata->read_tail :
			ldata->canon_head + (N_TTY_BUF_SIZE - ldata->read_tail);
L
Linus Torvalds 已提交
298
	}
299
	raw_spin_unlock_irqrestore(&ldata->read_lock, flags);
L
Linus Torvalds 已提交
300 301 302
	return n;
}

303 304
static ssize_t n_tty_chars_in_buffer(struct tty_struct *tty)
{
305
	WARN_ONCE(1, "%s is deprecated and scheduled for removal.", __func__);
306 307 308
	return chars_in_buffer(tty);
}

L
Linus Torvalds 已提交
309 310 311 312 313 314 315 316
/**
 *	is_utf8_continuation	-	utf8 multibyte check
 *	@c: byte to check
 *
 *	Returns true if the utf8 character 'c' is a multibyte continuation
 *	character. We use this to correctly compute the on screen size
 *	of the character when printing
 */
317

L
Linus Torvalds 已提交
318 319 320 321 322 323 324 325 326 327 328 329
static inline int is_utf8_continuation(unsigned char c)
{
	return (c & 0xc0) == 0x80;
}

/**
 *	is_continuation		-	multibyte check
 *	@c: byte to check
 *
 *	Returns true if the utf8 character 'c' is a multibyte continuation
 *	character and the terminal is in unicode mode.
 */
330

L
Linus Torvalds 已提交
331 332 333 334 335 336
static inline int is_continuation(unsigned char c, struct tty_struct *tty)
{
	return I_IUTF8(tty) && is_utf8_continuation(c);
}

/**
337
 *	do_output_char			-	output one character
L
Linus Torvalds 已提交
338 339
 *	@c: character (or partial unicode symbol)
 *	@tty: terminal device
340
 *	@space: space available in tty driver write buffer
L
Linus Torvalds 已提交
341
 *
342 343
 *	This is a helper function that handles one output character
 *	(including special characters like TAB, CR, LF, etc.),
344 345
 *	doing OPOST processing and putting the results in the
 *	tty driver's write buffer.
346 347 348 349
 *
 *	Note that Linux currently ignores TABDLY, CRDLY, VTDLY, FFDLY
 *	and NLDLY.  They simply aren't relevant in the world today.
 *	If you ever need them, add them here.
L
Linus Torvalds 已提交
350
 *
351 352 353 354 355
 *	Returns the number of bytes of buffer space used or -1 if
 *	no space left.
 *
 *	Locking: should be called under the output_lock to protect
 *		 the column state and space left in the buffer
L
Linus Torvalds 已提交
356
 */
357

358
static int do_output_char(unsigned char c, struct tty_struct *tty, int space)
L
Linus Torvalds 已提交
359
{
360
	struct n_tty_data *ldata = tty->disc_data;
361
	int	spaces;
L
Linus Torvalds 已提交
362 363 364

	if (!space)
		return -1;
A
Alan Cox 已提交
365

366 367 368
	switch (c) {
	case '\n':
		if (O_ONLRET(tty))
369
			ldata->column = 0;
370 371 372
		if (O_ONLCR(tty)) {
			if (space < 2)
				return -1;
373
			ldata->canon_column = ldata->column = 0;
374
			tty->ops->write(tty, "\r\n", 2);
375 376
			return 2;
		}
377
		ldata->canon_column = ldata->column;
378 379
		break;
	case '\r':
380
		if (O_ONOCR(tty) && ldata->column == 0)
381 382 383 384
			return 0;
		if (O_OCRNL(tty)) {
			c = '\n';
			if (O_ONLRET(tty))
385
				ldata->canon_column = ldata->column = 0;
L
Linus Torvalds 已提交
386
			break;
387
		}
388
		ldata->canon_column = ldata->column = 0;
389 390
		break;
	case '\t':
391
		spaces = 8 - (ldata->column & 7);
392 393 394
		if (O_TABDLY(tty) == XTABS) {
			if (space < spaces)
				return -1;
395
			ldata->column += spaces;
396 397
			tty->ops->write(tty, "        ", spaces);
			return spaces;
L
Linus Torvalds 已提交
398
		}
399
		ldata->column += spaces;
400 401
		break;
	case '\b':
402 403
		if (ldata->column > 0)
			ldata->column--;
404 405
		break;
	default:
406 407 408 409
		if (!iscntrl(c)) {
			if (O_OLCUC(tty))
				c = toupper(c);
			if (!is_continuation(c, tty))
410
				ldata->column++;
411
		}
412
		break;
L
Linus Torvalds 已提交
413
	}
414

A
Alan Cox 已提交
415
	tty_put_char(tty, c);
416 417 418 419 420 421 422 423
	return 1;
}

/**
 *	process_output			-	output post processor
 *	@c: character (or partial unicode symbol)
 *	@tty: terminal device
 *
424 425 426
 *	Output one character with OPOST processing.
 *	Returns -1 when the output device is full and the character
 *	must be retried.
427 428 429 430 431 432 433 434
 *
 *	Locking: output_lock to protect column state and space left
 *		 (also, this is called from n_tty_write under the
 *		  tty layer write lock)
 */

static int process_output(unsigned char c, struct tty_struct *tty)
{
435
	struct n_tty_data *ldata = tty->disc_data;
436 437
	int	space, retval;

438
	mutex_lock(&ldata->output_lock);
439 440 441 442

	space = tty_write_room(tty);
	retval = do_output_char(c, tty, space);

443
	mutex_unlock(&ldata->output_lock);
444 445 446 447
	if (retval < 0)
		return -1;
	else
		return 0;
L
Linus Torvalds 已提交
448 449 450
}

/**
451
 *	process_output_block		-	block post processor
L
Linus Torvalds 已提交
452
 *	@tty: terminal device
453 454 455 456 457
 *	@buf: character buffer
 *	@nr: number of bytes to output
 *
 *	Output a block of characters with OPOST processing.
 *	Returns the number of characters output.
L
Linus Torvalds 已提交
458 459 460 461 462 463
 *
 *	This path is used to speed up block console writes, among other
 *	things when processing blocks of output data. It handles only
 *	the simple cases normally found and helps to generate blocks of
 *	symbols for the console driver and thus improve performance.
 *
464 465 466
 *	Locking: output_lock to protect column state and space left
 *		 (also, this is called from n_tty_write under the
 *		  tty layer write lock)
L
Linus Torvalds 已提交
467
 */
468

469 470
static ssize_t process_output_block(struct tty_struct *tty,
				    const unsigned char *buf, unsigned int nr)
L
Linus Torvalds 已提交
471
{
472
	struct n_tty_data *ldata = tty->disc_data;
L
Linus Torvalds 已提交
473
	int	space;
474
	int	i;
L
Linus Torvalds 已提交
475 476
	const unsigned char *cp;

477
	mutex_lock(&ldata->output_lock);
478

A
Alan Cox 已提交
479
	space = tty_write_room(tty);
A
Alan Cox 已提交
480
	if (!space) {
481
		mutex_unlock(&ldata->output_lock);
L
Linus Torvalds 已提交
482
		return 0;
483
	}
L
Linus Torvalds 已提交
484 485 486 487
	if (nr > space)
		nr = space;

	for (i = 0, cp = buf; i < nr; i++, cp++) {
488 489 490
		unsigned char c = *cp;

		switch (c) {
L
Linus Torvalds 已提交
491 492
		case '\n':
			if (O_ONLRET(tty))
493
				ldata->column = 0;
L
Linus Torvalds 已提交
494 495
			if (O_ONLCR(tty))
				goto break_out;
496
			ldata->canon_column = ldata->column;
L
Linus Torvalds 已提交
497 498
			break;
		case '\r':
499
			if (O_ONOCR(tty) && ldata->column == 0)
L
Linus Torvalds 已提交
500 501 502
				goto break_out;
			if (O_OCRNL(tty))
				goto break_out;
503
			ldata->canon_column = ldata->column = 0;
L
Linus Torvalds 已提交
504 505 506 507
			break;
		case '\t':
			goto break_out;
		case '\b':
508 509
			if (ldata->column > 0)
				ldata->column--;
L
Linus Torvalds 已提交
510 511
			break;
		default:
512 513 514 515
			if (!iscntrl(c)) {
				if (O_OLCUC(tty))
					goto break_out;
				if (!is_continuation(c, tty))
516
					ldata->column++;
517
			}
L
Linus Torvalds 已提交
518 519 520 521
			break;
		}
	}
break_out:
A
Alan Cox 已提交
522
	i = tty->ops->write(tty, buf, i);
523

524
	mutex_unlock(&ldata->output_lock);
L
Linus Torvalds 已提交
525 526 527
	return i;
}

528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555
/**
 *	process_echoes	-	write pending echo characters
 *	@tty: terminal device
 *
 *	Write previously buffered echo (and other ldisc-generated)
 *	characters to the tty.
 *
 *	Characters generated by the ldisc (including echoes) need to
 *	be buffered because the driver's write buffer can fill during
 *	heavy program output.  Echoing straight to the driver will
 *	often fail under these conditions, causing lost characters and
 *	resulting mismatches of ldisc state information.
 *
 *	Since the ldisc state must represent the characters actually sent
 *	to the driver at the time of the write, operations like certain
 *	changes in column state are also saved in the buffer and executed
 *	here.
 *
 *	A circular fifo buffer is used so that the most recent characters
 *	are prioritized.  Also, when control characters are echoed with a
 *	prefixed "^", the pair is treated atomically and thus not separated.
 *
 *	Locking: output_lock to protect column state and space left,
 *		 echo_lock to protect the echo buffer
 */

static void process_echoes(struct tty_struct *tty)
{
556
	struct n_tty_data *ldata = tty->disc_data;
557 558 559 560
	int	space, nr;
	unsigned char c;
	unsigned char *cp, *buf_end;

561
	if (!ldata->echo_cnt)
562 563
		return;

564 565
	mutex_lock(&ldata->output_lock);
	mutex_lock(&ldata->echo_lock);
566 567 568

	space = tty_write_room(tty);

569 570 571
	buf_end = ldata->echo_buf + N_TTY_BUF_SIZE;
	cp = ldata->echo_buf + ldata->echo_pos;
	nr = ldata->echo_cnt;
572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587
	while (nr > 0) {
		c = *cp;
		if (c == ECHO_OP_START) {
			unsigned char op;
			unsigned char *opp;
			int no_space_left = 0;

			/*
			 * If the buffer byte is the start of a multi-byte
			 * operation, get the next byte, which is either the
			 * op code or a control character value.
			 */
			opp = cp + 1;
			if (opp == buf_end)
				opp -= N_TTY_BUF_SIZE;
			op = *opp;
A
Alan Cox 已提交
588

589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607
			switch (op) {
				unsigned int num_chars, num_bs;

			case ECHO_OP_ERASE_TAB:
				if (++opp == buf_end)
					opp -= N_TTY_BUF_SIZE;
				num_chars = *opp;

				/*
				 * Determine how many columns to go back
				 * in order to erase the tab.
				 * This depends on the number of columns
				 * used by other characters within the tab
				 * area.  If this (modulo 8) count is from
				 * the start of input rather than from a
				 * previous tab, we offset by canon column.
				 * Otherwise, tab spacing is normal.
				 */
				if (!(num_chars & 0x80))
608
					num_chars += ldata->canon_column;
609 610 611 612 613 614 615 616 617
				num_bs = 8 - (num_chars & 7);

				if (num_bs > space) {
					no_space_left = 1;
					break;
				}
				space -= num_bs;
				while (num_bs--) {
					tty_put_char(tty, '\b');
618 619
					if (ldata->column > 0)
						ldata->column--;
620 621 622 623 624 625
				}
				cp += 3;
				nr -= 3;
				break;

			case ECHO_OP_SET_CANON_COL:
626
				ldata->canon_column = ldata->column;
627 628 629 630 631
				cp += 2;
				nr -= 2;
				break;

			case ECHO_OP_MOVE_BACK_COL:
632 633
				if (ldata->column > 0)
					ldata->column--;
634 635 636 637 638 639 640 641 642 643 644
				cp += 2;
				nr -= 2;
				break;

			case ECHO_OP_START:
				/* This is an escaped echo op start code */
				if (!space) {
					no_space_left = 1;
					break;
				}
				tty_put_char(tty, ECHO_OP_START);
645
				ldata->column++;
646 647 648 649 650 651 652
				space--;
				cp += 2;
				nr -= 2;
				break;

			default:
				/*
653 654 655 656 657 658 659
				 * If the op is not a special byte code,
				 * it is a ctrl char tagged to be echoed
				 * as "^X" (where X is the letter
				 * representing the control char).
				 * Note that we must ensure there is
				 * enough space for the whole ctrl pair.
				 *
660
				 */
661 662 663 664 665 666
				if (space < 2) {
					no_space_left = 1;
					break;
				}
				tty_put_char(tty, '^');
				tty_put_char(tty, op ^ 0100);
667
				ldata->column += 2;
668
				space -= 2;
669 670 671 672 673 674 675
				cp += 2;
				nr -= 2;
			}

			if (no_space_left)
				break;
		} else {
P
Peter Hurley 已提交
676
			if (O_OPOST(tty)) {
677 678 679 680 681 682 683 684 685 686
				int retval = do_output_char(c, tty, space);
				if (retval < 0)
					break;
				space -= retval;
			} else {
				if (!space)
					break;
				tty_put_char(tty, c);
				space -= 1;
			}
687 688 689 690 691 692 693 694 695 696
			cp += 1;
			nr -= 1;
		}

		/* When end of circular buffer reached, wrap around */
		if (cp >= buf_end)
			cp -= N_TTY_BUF_SIZE;
	}

	if (nr == 0) {
697 698
		ldata->echo_pos = 0;
		ldata->echo_cnt = 0;
699
		ldata->echo_overrun = 0;
700
	} else {
701 702 703 704
		int num_processed = ldata->echo_cnt - nr;
		ldata->echo_pos += num_processed;
		ldata->echo_pos &= N_TTY_BUF_SIZE - 1;
		ldata->echo_cnt = nr;
705
		if (num_processed > 0)
706
			ldata->echo_overrun = 0;
707 708
	}

709 710
	mutex_unlock(&ldata->echo_lock);
	mutex_unlock(&ldata->output_lock);
711 712 713 714 715 716 717 718

	if (tty->ops->flush_chars)
		tty->ops->flush_chars(tty);
}

/**
 *	add_echo_byte	-	add a byte to the echo buffer
 *	@c: unicode byte to echo
J
Jiri Slaby 已提交
719
 *	@ldata: n_tty data
720 721 722 723 724 725
 *
 *	Add a character or operation byte to the echo buffer.
 *
 *	Should be called under the echo lock to protect the echo buffer.
 */

J
Jiri Slaby 已提交
726
static void add_echo_byte(unsigned char c, struct n_tty_data *ldata)
727 728 729
{
	int	new_byte_pos;

730
	if (ldata->echo_cnt == N_TTY_BUF_SIZE) {
731
		/* Circular buffer is already at capacity */
732
		new_byte_pos = ldata->echo_pos;
733 734 735 736 737

		/*
		 * Since the buffer start position needs to be advanced,
		 * be sure to step by a whole operation byte group.
		 */
738 739
		if (ldata->echo_buf[ldata->echo_pos] == ECHO_OP_START) {
			if (ldata->echo_buf[(ldata->echo_pos + 1) &
740 741
					  (N_TTY_BUF_SIZE - 1)] ==
						ECHO_OP_ERASE_TAB) {
742 743
				ldata->echo_pos += 3;
				ldata->echo_cnt -= 2;
744
			} else {
745 746
				ldata->echo_pos += 2;
				ldata->echo_cnt -= 1;
747 748
			}
		} else {
749
			ldata->echo_pos++;
750
		}
751
		ldata->echo_pos &= N_TTY_BUF_SIZE - 1;
752

753
		ldata->echo_overrun = 1;
754
	} else {
755
		new_byte_pos = ldata->echo_pos + ldata->echo_cnt;
756
		new_byte_pos &= N_TTY_BUF_SIZE - 1;
757
		ldata->echo_cnt++;
758 759
	}

760
	ldata->echo_buf[new_byte_pos] = c;
761 762 763 764
}

/**
 *	echo_move_back_col	-	add operation to move back a column
J
Jiri Slaby 已提交
765
 *	@ldata: n_tty data
766 767 768 769 770 771
 *
 *	Add an operation to the echo buffer to move back one column.
 *
 *	Locking: echo_lock to protect the echo buffer
 */

J
Jiri Slaby 已提交
772
static void echo_move_back_col(struct n_tty_data *ldata)
773
{
774
	mutex_lock(&ldata->echo_lock);
J
Jiri Slaby 已提交
775 776
	add_echo_byte(ECHO_OP_START, ldata);
	add_echo_byte(ECHO_OP_MOVE_BACK_COL, ldata);
777
	mutex_unlock(&ldata->echo_lock);
778 779 780 781
}

/**
 *	echo_set_canon_col	-	add operation to set the canon column
J
Jiri Slaby 已提交
782
 *	@ldata: n_tty data
783 784 785 786 787 788 789
 *
 *	Add an operation to the echo buffer to set the canon column
 *	to the current column.
 *
 *	Locking: echo_lock to protect the echo buffer
 */

J
Jiri Slaby 已提交
790
static void echo_set_canon_col(struct n_tty_data *ldata)
791
{
792
	mutex_lock(&ldata->echo_lock);
J
Jiri Slaby 已提交
793 794
	add_echo_byte(ECHO_OP_START, ldata);
	add_echo_byte(ECHO_OP_SET_CANON_COL, ldata);
795
	mutex_unlock(&ldata->echo_lock);
796 797 798 799 800 801
}

/**
 *	echo_erase_tab	-	add operation to erase a tab
 *	@num_chars: number of character columns already used
 *	@after_tab: true if num_chars starts after a previous tab
J
Jiri Slaby 已提交
802
 *	@ldata: n_tty data
803 804 805 806 807 808 809 810 811 812 813 814 815
 *
 *	Add an operation to the echo buffer to erase a tab.
 *
 *	Called by the eraser function, which knows how many character
 *	columns have been used since either a previous tab or the start
 *	of input.  This information will be used later, along with
 *	canon column (if applicable), to go back the correct number
 *	of columns.
 *
 *	Locking: echo_lock to protect the echo buffer
 */

static void echo_erase_tab(unsigned int num_chars, int after_tab,
J
Jiri Slaby 已提交
816
			   struct n_tty_data *ldata)
817
{
818
	mutex_lock(&ldata->echo_lock);
819

J
Jiri Slaby 已提交
820 821
	add_echo_byte(ECHO_OP_START, ldata);
	add_echo_byte(ECHO_OP_ERASE_TAB, ldata);
822 823 824 825 826 827 828

	/* We only need to know this modulo 8 (tab spacing) */
	num_chars &= 7;

	/* Set the high bit as a flag if num_chars is after a previous tab */
	if (after_tab)
		num_chars |= 0x80;
A
Alan Cox 已提交
829

J
Jiri Slaby 已提交
830
	add_echo_byte(num_chars, ldata);
831

832
	mutex_unlock(&ldata->echo_lock);
833 834 835 836 837 838 839 840 841 842 843 844 845 846 847
}

/**
 *	echo_char_raw	-	echo a character raw
 *	@c: unicode byte to echo
 *	@tty: terminal device
 *
 *	Echo user input back onto the screen. This must be called only when
 *	L_ECHO(tty) is true. Called from the driver receive_buf path.
 *
 *	This variant does not treat control characters specially.
 *
 *	Locking: echo_lock to protect the echo buffer
 */

J
Jiri Slaby 已提交
848
static void echo_char_raw(unsigned char c, struct n_tty_data *ldata)
849
{
850
	mutex_lock(&ldata->echo_lock);
851
	if (c == ECHO_OP_START) {
J
Jiri Slaby 已提交
852 853
		add_echo_byte(ECHO_OP_START, ldata);
		add_echo_byte(ECHO_OP_START, ldata);
854
	} else {
J
Jiri Slaby 已提交
855
		add_echo_byte(c, ldata);
856
	}
857
	mutex_unlock(&ldata->echo_lock);
858
}
L
Linus Torvalds 已提交
859 860

/**
861
 *	echo_char	-	echo a character
L
Linus Torvalds 已提交
862 863 864
 *	@c: unicode byte to echo
 *	@tty: terminal device
 *
865
 *	Echo user input back onto the screen. This must be called only when
L
Linus Torvalds 已提交
866
 *	L_ECHO(tty) is true. Called from the driver receive_buf path.
867
 *
868 869
 *	This variant tags control characters to be echoed as "^X"
 *	(where X is the letter representing the control char).
870 871
 *
 *	Locking: echo_lock to protect the echo buffer
L
Linus Torvalds 已提交
872 873 874 875
 */

static void echo_char(unsigned char c, struct tty_struct *tty)
{
876 877 878
	struct n_tty_data *ldata = tty->disc_data;

	mutex_lock(&ldata->echo_lock);
879 880

	if (c == ECHO_OP_START) {
J
Jiri Slaby 已提交
881 882
		add_echo_byte(ECHO_OP_START, ldata);
		add_echo_byte(ECHO_OP_START, ldata);
883
	} else {
884
		if (L_ECHOCTL(tty) && iscntrl(c) && c != '\t')
J
Jiri Slaby 已提交
885 886
			add_echo_byte(ECHO_OP_START, ldata);
		add_echo_byte(c, ldata);
887 888
	}

889
	mutex_unlock(&ldata->echo_lock);
L
Linus Torvalds 已提交
890 891
}

892
/**
893
 *	finish_erasing		-	complete erase
J
Jiri Slaby 已提交
894
 *	@ldata: n_tty data
895
 */
896

J
Jiri Slaby 已提交
897
static inline void finish_erasing(struct n_tty_data *ldata)
L
Linus Torvalds 已提交
898
{
899
	if (ldata->erasing) {
J
Jiri Slaby 已提交
900
		echo_char_raw('/', ldata);
901
		ldata->erasing = 0;
L
Linus Torvalds 已提交
902 903 904 905 906 907 908 909
	}
}

/**
 *	eraser		-	handle erase function
 *	@c: character input
 *	@tty: terminal device
 *
910
 *	Perform erase and necessary output when an erase character is
L
Linus Torvalds 已提交
911 912
 *	present in the stream from the driver layer. Handles the complexities
 *	of UTF-8 multibyte symbols.
913
 *
914
 *	Locking: read_lock for tty buffers
L
Linus Torvalds 已提交
915
 */
916

L
Linus Torvalds 已提交
917 918
static void eraser(unsigned char c, struct tty_struct *tty)
{
919
	struct n_tty_data *ldata = tty->disc_data;
L
Linus Torvalds 已提交
920 921 922 923
	enum { ERASE, WERASE, KILL } kill_type;
	int head, seen_alnums, cnt;
	unsigned long flags;

924
	/* FIXME: locking needed ? */
925
	if (ldata->read_head == ldata->canon_head) {
926
		/* process_output('\a', tty); */ /* what do you think? */
L
Linus Torvalds 已提交
927 928 929 930 931 932 933 934
		return;
	}
	if (c == ERASE_CHAR(tty))
		kill_type = ERASE;
	else if (c == WERASE_CHAR(tty))
		kill_type = WERASE;
	else {
		if (!L_ECHO(tty)) {
935
			raw_spin_lock_irqsave(&ldata->read_lock, flags);
936
			ldata->read_cnt -= ((ldata->read_head - ldata->canon_head) &
L
Linus Torvalds 已提交
937
					  (N_TTY_BUF_SIZE - 1));
938
			ldata->read_head = ldata->canon_head;
939
			raw_spin_unlock_irqrestore(&ldata->read_lock, flags);
L
Linus Torvalds 已提交
940 941 942
			return;
		}
		if (!L_ECHOK(tty) || !L_ECHOKE(tty) || !L_ECHOE(tty)) {
943
			raw_spin_lock_irqsave(&ldata->read_lock, flags);
944
			ldata->read_cnt -= ((ldata->read_head - ldata->canon_head) &
L
Linus Torvalds 已提交
945
					  (N_TTY_BUF_SIZE - 1));
946
			ldata->read_head = ldata->canon_head;
947
			raw_spin_unlock_irqrestore(&ldata->read_lock, flags);
J
Jiri Slaby 已提交
948
			finish_erasing(ldata);
L
Linus Torvalds 已提交
949 950 951
			echo_char(KILL_CHAR(tty), tty);
			/* Add a newline if ECHOK is on and ECHOKE is off. */
			if (L_ECHOK(tty))
J
Jiri Slaby 已提交
952
				echo_char_raw('\n', ldata);
L
Linus Torvalds 已提交
953 954 955 956 957 958
			return;
		}
		kill_type = KILL;
	}

	seen_alnums = 0;
959
	/* FIXME: Locking ?? */
960 961
	while (ldata->read_head != ldata->canon_head) {
		head = ldata->read_head;
L
Linus Torvalds 已提交
962 963 964 965

		/* erase a single possibly multibyte character */
		do {
			head = (head - 1) & (N_TTY_BUF_SIZE-1);
966 967
			c = ldata->read_buf[head];
		} while (is_continuation(c, tty) && head != ldata->canon_head);
L
Linus Torvalds 已提交
968 969 970 971 972 973 974 975 976 977 978 979

		/* do not partially erase */
		if (is_continuation(c, tty))
			break;

		if (kill_type == WERASE) {
			/* Equivalent to BSD's ALTWERASE. */
			if (isalnum(c) || c == '_')
				seen_alnums++;
			else if (seen_alnums)
				break;
		}
980
		cnt = (ldata->read_head - head) & (N_TTY_BUF_SIZE-1);
981
		raw_spin_lock_irqsave(&ldata->read_lock, flags);
982 983
		ldata->read_head = head;
		ldata->read_cnt -= cnt;
984
		raw_spin_unlock_irqrestore(&ldata->read_lock, flags);
L
Linus Torvalds 已提交
985 986
		if (L_ECHO(tty)) {
			if (L_ECHOPRT(tty)) {
987
				if (!ldata->erasing) {
J
Jiri Slaby 已提交
988
					echo_char_raw('\\', ldata);
989
					ldata->erasing = 1;
L
Linus Torvalds 已提交
990 991 992 993 994
				}
				/* if cnt > 1, output a multi-byte character */
				echo_char(c, tty);
				while (--cnt > 0) {
					head = (head+1) & (N_TTY_BUF_SIZE-1);
J
Jiri Slaby 已提交
995 996 997
					echo_char_raw(ldata->read_buf[head],
							ldata);
					echo_move_back_col(ldata);
L
Linus Torvalds 已提交
998 999 1000 1001
				}
			} else if (kill_type == ERASE && !L_ECHOE(tty)) {
				echo_char(ERASE_CHAR(tty), tty);
			} else if (c == '\t') {
1002 1003
				unsigned int num_chars = 0;
				int after_tab = 0;
1004
				unsigned long tail = ldata->read_head;
1005 1006 1007 1008 1009 1010 1011 1012

				/*
				 * Count the columns used for characters
				 * since the start of input or after a
				 * previous tab.
				 * This info is used to go back the correct
				 * number of columns.
				 */
1013
				while (tail != ldata->canon_head) {
1014
					tail = (tail-1) & (N_TTY_BUF_SIZE-1);
1015
					c = ldata->read_buf[tail];
1016 1017 1018
					if (c == '\t') {
						after_tab = 1;
						break;
A
Alan Cox 已提交
1019
					} else if (iscntrl(c)) {
L
Linus Torvalds 已提交
1020
						if (L_ECHOCTL(tty))
1021 1022 1023 1024
							num_chars += 2;
					} else if (!is_continuation(c, tty)) {
						num_chars++;
					}
L
Linus Torvalds 已提交
1025
				}
J
Jiri Slaby 已提交
1026
				echo_erase_tab(num_chars, after_tab, ldata);
L
Linus Torvalds 已提交
1027 1028
			} else {
				if (iscntrl(c) && L_ECHOCTL(tty)) {
J
Jiri Slaby 已提交
1029 1030 1031
					echo_char_raw('\b', ldata);
					echo_char_raw(' ', ldata);
					echo_char_raw('\b', ldata);
L
Linus Torvalds 已提交
1032 1033
				}
				if (!iscntrl(c) || L_ECHOCTL(tty)) {
J
Jiri Slaby 已提交
1034 1035 1036
					echo_char_raw('\b', ldata);
					echo_char_raw(' ', ldata);
					echo_char_raw('\b', ldata);
L
Linus Torvalds 已提交
1037 1038 1039 1040 1041 1042
				}
			}
		}
		if (kill_type == ERASE)
			break;
	}
1043
	if (ldata->read_head == ldata->canon_head && L_ECHO(tty))
J
Jiri Slaby 已提交
1044
		finish_erasing(ldata);
L
Linus Torvalds 已提交
1045 1046 1047 1048 1049 1050 1051
}

/**
 *	isig		-	handle the ISIG optio
 *	@sig: signal
 *	@tty: terminal
 *
1052 1053
 *	Called when a signal is being sent due to terminal input.
 *	Called from the driver receive_buf path so serialized.
1054
 *
1055
 *	Locking: ctrl_lock
L
Linus Torvalds 已提交
1056
 */
1057

1058
static inline void isig(int sig, struct tty_struct *tty)
L
Linus Torvalds 已提交
1059
{
1060 1061 1062 1063
	struct pid *tty_pgrp = tty_get_pgrp(tty);
	if (tty_pgrp) {
		kill_pgrp(tty_pgrp, sig, 1);
		put_pid(tty_pgrp);
L
Linus Torvalds 已提交
1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075
	}
}

/**
 *	n_tty_receive_break	-	handle break
 *	@tty: terminal
 *
 *	An RS232 break event has been hit in the incoming bitstream. This
 *	can cause a variety of events depending upon the termios settings.
 *
 *	Called from the receive_buf path so single threaded.
 */
1076

L
Linus Torvalds 已提交
1077 1078
static inline void n_tty_receive_break(struct tty_struct *tty)
{
J
Jiri Slaby 已提交
1079 1080
	struct n_tty_data *ldata = tty->disc_data;

L
Linus Torvalds 已提交
1081 1082 1083
	if (I_IGNBRK(tty))
		return;
	if (I_BRKINT(tty)) {
1084 1085 1086 1087 1088
		isig(SIGINT, tty);
		if (!L_NOFLSH(tty)) {
			n_tty_flush_buffer(tty);
			tty_driver_flush_buffer(tty);
		}
L
Linus Torvalds 已提交
1089 1090 1091
		return;
	}
	if (I_PARMRK(tty)) {
J
Jiri Slaby 已提交
1092 1093
		put_tty_queue('\377', ldata);
		put_tty_queue('\0', ldata);
L
Linus Torvalds 已提交
1094
	}
J
Jiri Slaby 已提交
1095
	put_tty_queue('\0', ldata);
L
Linus Torvalds 已提交
1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110
	wake_up_interruptible(&tty->read_wait);
}

/**
 *	n_tty_receive_overrun	-	handle overrun reporting
 *	@tty: terminal
 *
 *	Data arrived faster than we could process it. While the tty
 *	driver has flagged this the bits that were missed are gone
 *	forever.
 *
 *	Called from the receive_buf path so single threaded. Does not
 *	need locking as num_overrun and overrun_time are function
 *	private.
 */
1111

L
Linus Torvalds 已提交
1112 1113
static inline void n_tty_receive_overrun(struct tty_struct *tty)
{
1114
	struct n_tty_data *ldata = tty->disc_data;
L
Linus Torvalds 已提交
1115 1116
	char buf[64];

1117 1118 1119
	ldata->num_overrun++;
	if (time_after(jiffies, ldata->overrun_time + HZ) ||
			time_after(ldata->overrun_time, jiffies)) {
L
Linus Torvalds 已提交
1120 1121
		printk(KERN_WARNING "%s: %d input overrun(s)\n",
			tty_name(tty, buf),
1122 1123 1124
			ldata->num_overrun);
		ldata->overrun_time = jiffies;
		ldata->num_overrun = 0;
L
Linus Torvalds 已提交
1125 1126 1127 1128 1129 1130 1131 1132 1133
	}
}

/**
 *	n_tty_receive_parity_error	-	error notifier
 *	@tty: terminal device
 *	@c: character
 *
 *	Process a parity error and queue the right data to indicate
1134
 *	the error case if necessary. Locking as per n_tty_receive_buf.
L
Linus Torvalds 已提交
1135 1136 1137 1138
 */
static inline void n_tty_receive_parity_error(struct tty_struct *tty,
					      unsigned char c)
{
J
Jiri Slaby 已提交
1139 1140
	struct n_tty_data *ldata = tty->disc_data;

1141
	if (I_IGNPAR(tty))
L
Linus Torvalds 已提交
1142 1143
		return;
	if (I_PARMRK(tty)) {
J
Jiri Slaby 已提交
1144 1145 1146
		put_tty_queue('\377', ldata);
		put_tty_queue('\0', ldata);
		put_tty_queue(c, ldata);
L
Linus Torvalds 已提交
1147
	} else	if (I_INPCK(tty))
J
Jiri Slaby 已提交
1148
		put_tty_queue('\0', ldata);
L
Linus Torvalds 已提交
1149
	else
J
Jiri Slaby 已提交
1150
		put_tty_queue(c, ldata);
L
Linus Torvalds 已提交
1151 1152 1153 1154 1155 1156 1157 1158 1159
	wake_up_interruptible(&tty->read_wait);
}

/**
 *	n_tty_receive_char	-	perform processing
 *	@tty: terminal device
 *	@c: character
 *
 *	Process an individual character of input received from the driver.
1160
 *	This is serialized with respect to itself by the rules for the
L
Linus Torvalds 已提交
1161 1162 1163 1164 1165
 *	driver above.
 */

static inline void n_tty_receive_char(struct tty_struct *tty, unsigned char c)
{
1166
	struct n_tty_data *ldata = tty->disc_data;
L
Linus Torvalds 已提交
1167
	unsigned long flags;
1168
	int parmrk;
L
Linus Torvalds 已提交
1169

1170
	if (ldata->raw) {
J
Jiri Slaby 已提交
1171
		put_tty_queue(c, ldata);
L
Linus Torvalds 已提交
1172 1173
		return;
	}
1174

L
Linus Torvalds 已提交
1175 1176 1177
	if (I_ISTRIP(tty))
		c &= 0x7f;
	if (I_IUCLC(tty) && L_IEXTEN(tty))
A
Alan Cox 已提交
1178
		c = tolower(c);
L
Linus Torvalds 已提交
1179

1180
	if (L_EXTPROC(tty)) {
J
Jiri Slaby 已提交
1181
		put_tty_queue(c, ldata);
1182 1183 1184
		return;
	}

1185
	if (tty->stopped && !tty->flow_stopped && I_IXON(tty) &&
1186 1187
	    I_IXANY(tty) && c != START_CHAR(tty) && c != STOP_CHAR(tty) &&
	    c != INTR_CHAR(tty) && c != QUIT_CHAR(tty) && c != SUSP_CHAR(tty)) {
1188
		start_tty(tty);
1189 1190
		process_echoes(tty);
	}
1191

L
Linus Torvalds 已提交
1192 1193
	if (tty->closing) {
		if (I_IXON(tty)) {
1194
			if (c == START_CHAR(tty)) {
L
Linus Torvalds 已提交
1195
				start_tty(tty);
1196
				process_echoes(tty);
A
Alan Cox 已提交
1197
			} else if (c == STOP_CHAR(tty))
L
Linus Torvalds 已提交
1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208
				stop_tty(tty);
		}
		return;
	}

	/*
	 * If the previous character was LNEXT, or we know that this
	 * character is not one of the characters that we'll have to
	 * handle specially, do shortcut processing to speed things
	 * up.
	 */
1209
	if (!test_bit(c, ldata->process_char_map) || ldata->lnext) {
1210
		ldata->lnext = 0;
1211
		parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0;
1212
		if (read_cnt(ldata) >= (N_TTY_BUF_SIZE - parmrk - 1)) {
1213
			/* beep if no space */
1214 1215
			if (L_ECHO(tty))
				process_output('\a', tty);
1216 1217 1218
			return;
		}
		if (L_ECHO(tty)) {
J
Jiri Slaby 已提交
1219
			finish_erasing(ldata);
L
Linus Torvalds 已提交
1220
			/* Record the column of first canon char. */
1221
			if (ldata->canon_head == ldata->read_head)
J
Jiri Slaby 已提交
1222
				echo_set_canon_col(ldata);
L
Linus Torvalds 已提交
1223
			echo_char(c, tty);
1224
			process_echoes(tty);
L
Linus Torvalds 已提交
1225
		}
1226
		if (parmrk)
J
Jiri Slaby 已提交
1227 1228
			put_tty_queue(c, ldata);
		put_tty_queue(c, ldata);
L
Linus Torvalds 已提交
1229 1230
		return;
	}
1231

L
Linus Torvalds 已提交
1232 1233 1234
	if (I_IXON(tty)) {
		if (c == START_CHAR(tty)) {
			start_tty(tty);
1235
			process_echoes(tty);
L
Linus Torvalds 已提交
1236 1237 1238 1239 1240 1241 1242
			return;
		}
		if (c == STOP_CHAR(tty)) {
			stop_tty(tty);
			return;
		}
	}
1243

L
Linus Torvalds 已提交
1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254
	if (L_ISIG(tty)) {
		int signal;
		signal = SIGINT;
		if (c == INTR_CHAR(tty))
			goto send_signal;
		signal = SIGQUIT;
		if (c == QUIT_CHAR(tty))
			goto send_signal;
		signal = SIGTSTP;
		if (c == SUSP_CHAR(tty)) {
send_signal:
1255 1256
			if (!L_NOFLSH(tty)) {
				n_tty_flush_buffer(tty);
A
Alan Cox 已提交
1257
				tty_driver_flush_buffer(tty);
1258
			}
1259 1260 1261
			if (I_IXON(tty))
				start_tty(tty);
			if (L_ECHO(tty)) {
1262
				echo_char(c, tty);
1263 1264
				process_echoes(tty);
			}
1265
			isig(signal, tty);
L
Linus Torvalds 已提交
1266 1267 1268
			return;
		}
	}
1269 1270 1271 1272 1273 1274 1275 1276 1277

	if (c == '\r') {
		if (I_IGNCR(tty))
			return;
		if (I_ICRNL(tty))
			c = '\n';
	} else if (c == '\n' && I_INLCR(tty))
		c = '\r';

1278
	if (ldata->icanon) {
L
Linus Torvalds 已提交
1279 1280 1281
		if (c == ERASE_CHAR(tty) || c == KILL_CHAR(tty) ||
		    (c == WERASE_CHAR(tty) && L_IEXTEN(tty))) {
			eraser(c, tty);
1282
			process_echoes(tty);
L
Linus Torvalds 已提交
1283 1284 1285
			return;
		}
		if (c == LNEXT_CHAR(tty) && L_IEXTEN(tty)) {
1286
			ldata->lnext = 1;
L
Linus Torvalds 已提交
1287
			if (L_ECHO(tty)) {
J
Jiri Slaby 已提交
1288
				finish_erasing(ldata);
L
Linus Torvalds 已提交
1289
				if (L_ECHOCTL(tty)) {
J
Jiri Slaby 已提交
1290 1291
					echo_char_raw('^', ldata);
					echo_char_raw('\b', ldata);
1292
					process_echoes(tty);
L
Linus Torvalds 已提交
1293 1294 1295 1296 1297 1298
				}
			}
			return;
		}
		if (c == REPRINT_CHAR(tty) && L_ECHO(tty) &&
		    L_IEXTEN(tty)) {
1299
			unsigned long tail = ldata->canon_head;
L
Linus Torvalds 已提交
1300

J
Jiri Slaby 已提交
1301
			finish_erasing(ldata);
L
Linus Torvalds 已提交
1302
			echo_char(c, tty);
J
Jiri Slaby 已提交
1303
			echo_char_raw('\n', ldata);
1304 1305
			while (tail != ldata->read_head) {
				echo_char(ldata->read_buf[tail], tty);
L
Linus Torvalds 已提交
1306 1307
				tail = (tail+1) & (N_TTY_BUF_SIZE-1);
			}
1308
			process_echoes(tty);
L
Linus Torvalds 已提交
1309 1310 1311
			return;
		}
		if (c == '\n') {
1312
			if (read_cnt(ldata) >= N_TTY_BUF_SIZE) {
1313 1314
				if (L_ECHO(tty))
					process_output('\a', tty);
1315 1316 1317
				return;
			}
			if (L_ECHO(tty) || L_ECHONL(tty)) {
J
Jiri Slaby 已提交
1318
				echo_char_raw('\n', ldata);
1319
				process_echoes(tty);
L
Linus Torvalds 已提交
1320 1321 1322 1323
			}
			goto handle_newline;
		}
		if (c == EOF_CHAR(tty)) {
1324
			if (read_cnt(ldata) >= N_TTY_BUF_SIZE)
1325
				return;
1326
			if (ldata->canon_head != ldata->read_head)
1327
				set_bit(TTY_PUSH, &tty->flags);
L
Linus Torvalds 已提交
1328 1329 1330 1331 1332
			c = __DISABLED_CHAR;
			goto handle_newline;
		}
		if ((c == EOL_CHAR(tty)) ||
		    (c == EOL2_CHAR(tty) && L_IEXTEN(tty))) {
1333 1334
			parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty))
				 ? 1 : 0;
1335
			if (read_cnt(ldata) >= (N_TTY_BUF_SIZE - parmrk)) {
1336 1337
				if (L_ECHO(tty))
					process_output('\a', tty);
1338 1339
				return;
			}
L
Linus Torvalds 已提交
1340 1341 1342 1343 1344
			/*
			 * XXX are EOL_CHAR and EOL2_CHAR echoed?!?
			 */
			if (L_ECHO(tty)) {
				/* Record the column of first canon char. */
1345
				if (ldata->canon_head == ldata->read_head)
J
Jiri Slaby 已提交
1346
					echo_set_canon_col(ldata);
L
Linus Torvalds 已提交
1347
				echo_char(c, tty);
1348
				process_echoes(tty);
L
Linus Torvalds 已提交
1349 1350 1351 1352 1353
			}
			/*
			 * XXX does PARMRK doubling happen for
			 * EOL_CHAR and EOL2_CHAR?
			 */
1354
			if (parmrk)
J
Jiri Slaby 已提交
1355
				put_tty_queue(c, ldata);
L
Linus Torvalds 已提交
1356

1357
handle_newline:
1358
			raw_spin_lock_irqsave(&ldata->read_lock, flags);
1359
			set_bit(ldata->read_head, ldata->read_flags);
J
Jiri Slaby 已提交
1360
			put_tty_queue_nolock(c, ldata);
1361 1362
			ldata->canon_head = ldata->read_head;
			ldata->canon_data++;
1363
			raw_spin_unlock_irqrestore(&ldata->read_lock, flags);
L
Linus Torvalds 已提交
1364 1365 1366 1367 1368 1369
			kill_fasync(&tty->fasync, SIGIO, POLL_IN);
			if (waitqueue_active(&tty->read_wait))
				wake_up_interruptible(&tty->read_wait);
			return;
		}
	}
1370

1371
	parmrk = (c == (unsigned char) '\377' && I_PARMRK(tty)) ? 1 : 0;
1372
	if (read_cnt(ldata) >= (N_TTY_BUF_SIZE - parmrk - 1)) {
1373
		/* beep if no space */
1374 1375
		if (L_ECHO(tty))
			process_output('\a', tty);
1376 1377 1378
		return;
	}
	if (L_ECHO(tty)) {
J
Jiri Slaby 已提交
1379
		finish_erasing(ldata);
L
Linus Torvalds 已提交
1380
		if (c == '\n')
J
Jiri Slaby 已提交
1381
			echo_char_raw('\n', ldata);
L
Linus Torvalds 已提交
1382 1383
		else {
			/* Record the column of first canon char. */
1384
			if (ldata->canon_head == ldata->read_head)
J
Jiri Slaby 已提交
1385
				echo_set_canon_col(ldata);
L
Linus Torvalds 已提交
1386 1387
			echo_char(c, tty);
		}
1388
		process_echoes(tty);
L
Linus Torvalds 已提交
1389 1390
	}

1391
	if (parmrk)
J
Jiri Slaby 已提交
1392
		put_tty_queue(c, ldata);
L
Linus Torvalds 已提交
1393

J
Jiri Slaby 已提交
1394
	put_tty_queue(c, ldata);
1395
}
L
Linus Torvalds 已提交
1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408


/**
 *	n_tty_write_wakeup	-	asynchronous I/O notifier
 *	@tty: tty device
 *
 *	Required for the ptys, serial driver etc. since processes
 *	that attach themselves to the master and rely on ASYNC
 *	IO must be woken up
 */

static void n_tty_write_wakeup(struct tty_struct *tty)
{
1409
	if (tty->fasync && test_and_clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags))
L
Linus Torvalds 已提交
1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424
		kill_fasync(&tty->fasync, SIGIO, POLL_OUT);
}

/**
 *	n_tty_receive_buf	-	data receive
 *	@tty: terminal device
 *	@cp: buffer
 *	@fp: flag buffer
 *	@count: characters
 *
 *	Called by the terminal driver when a block of characters has
 *	been received. This function must be called from soft contexts
 *	not from interrupt context. The driver is responsible for making
 *	calls one at a time and in order (or using flush_to_ldisc)
 */
1425

1426 1427
static void __receive_buf(struct tty_struct *tty, const unsigned char *cp,
			  char *fp, int count)
L
Linus Torvalds 已提交
1428
{
1429
	struct n_tty_data *ldata = tty->disc_data;
L
Linus Torvalds 已提交
1430 1431 1432 1433 1434 1435
	const unsigned char *p;
	char *f, flags = TTY_NORMAL;
	int	i;
	char	buf[64];
	unsigned long cpuflags;

1436
	if (ldata->real_raw) {
1437
		raw_spin_lock_irqsave(&ldata->read_lock, cpuflags);
1438
		i = min(N_TTY_BUF_SIZE - read_cnt(ldata),
1439
			N_TTY_BUF_SIZE - ldata->read_head);
L
Linus Torvalds 已提交
1440
		i = min(count, i);
1441 1442 1443
		memcpy(ldata->read_buf + ldata->read_head, cp, i);
		ldata->read_head = (ldata->read_head + i) & (N_TTY_BUF_SIZE-1);
		ldata->read_cnt += i;
L
Linus Torvalds 已提交
1444 1445 1446
		cp += i;
		count -= i;

1447
		i = min(N_TTY_BUF_SIZE - read_cnt(ldata),
1448
			N_TTY_BUF_SIZE - ldata->read_head);
L
Linus Torvalds 已提交
1449
		i = min(count, i);
1450 1451 1452
		memcpy(ldata->read_buf + ldata->read_head, cp, i);
		ldata->read_head = (ldata->read_head + i) & (N_TTY_BUF_SIZE-1);
		ldata->read_cnt += i;
1453
		raw_spin_unlock_irqrestore(&ldata->read_lock, cpuflags);
L
Linus Torvalds 已提交
1454
	} else {
1455
		for (i = count, p = cp, f = fp; i; i--, p++) {
L
Linus Torvalds 已提交
1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472
			if (f)
				flags = *f++;
			switch (flags) {
			case TTY_NORMAL:
				n_tty_receive_char(tty, *p);
				break;
			case TTY_BREAK:
				n_tty_receive_break(tty);
				break;
			case TTY_PARITY:
			case TTY_FRAME:
				n_tty_receive_parity_error(tty, *p);
				break;
			case TTY_OVERRUN:
				n_tty_receive_overrun(tty);
				break;
			default:
1473
				printk(KERN_ERR "%s: unknown flag %d\n",
L
Linus Torvalds 已提交
1474 1475 1476 1477
				       tty_name(tty, buf), flags);
				break;
			}
		}
A
Alan Cox 已提交
1478 1479
		if (tty->ops->flush_chars)
			tty->ops->flush_chars(tty);
L
Linus Torvalds 已提交
1480 1481
	}

1482
	if ((!ldata->icanon && (read_cnt(ldata) >= ldata->minimum_to_wake)) ||
1483
		L_EXTPROC(tty)) {
L
Linus Torvalds 已提交
1484 1485 1486 1487 1488 1489 1490 1491 1492 1493
		kill_fasync(&tty->fasync, SIGIO, POLL_IN);
		if (waitqueue_active(&tty->read_wait))
			wake_up_interruptible(&tty->read_wait);
	}

	/*
	 * Check the remaining room for the input canonicalization
	 * mode.  We don't want to throttle the driver if we're in
	 * canonical mode and don't have a newline yet!
	 */
P
Peter Hurley 已提交
1494 1495
	while (1) {
		tty_set_flow_change(tty, TTY_THROTTLE_SAFE);
1496
		if (receive_room(tty) >= TTY_THRESHOLD_THROTTLE)
P
Peter Hurley 已提交
1497 1498 1499 1500 1501
			break;
		if (!tty_throttle_safe(tty))
			break;
	}
	__tty_set_flow_change(tty, 0);
L
Linus Torvalds 已提交
1502 1503
}

1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525
static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
			      char *fp, int count)
{
	__receive_buf(tty, cp, fp, count);
}

static int n_tty_receive_buf2(struct tty_struct *tty, const unsigned char *cp,
			      char *fp, int count)
{
	struct n_tty_data *ldata = tty->disc_data;
	int room;

	tty->receive_room = room = receive_room(tty);
	if (!room)
		ldata->no_room = 1;
	count = min(count, room);
	if (count)
		__receive_buf(tty, cp, fp, count);

	return count;
}

L
Linus Torvalds 已提交
1526 1527 1528
int is_ignored(int sig)
{
	return (sigismember(&current->blocked, sig) ||
1529
		current->sighand->action[sig-1].sa.sa_handler == SIG_IGN);
L
Linus Torvalds 已提交
1530 1531 1532 1533 1534 1535 1536 1537 1538
}

/**
 *	n_tty_set_termios	-	termios data changed
 *	@tty: terminal
 *	@old: previous data
 *
 *	Called by the tty layer when the user changes termios flags so
 *	that the line discipline can plan ahead. This function cannot sleep
1539
 *	and is protected from re-entry by the tty layer. The user is
L
Linus Torvalds 已提交
1540 1541
 *	guaranteed that this function will not be re-entered or in progress
 *	when the ldisc is closed.
1542 1543
 *
 *	Locking: Caller holds tty->termios_mutex
L
Linus Torvalds 已提交
1544
 */
1545 1546

static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
L
Linus Torvalds 已提交
1547
{
1548
	struct n_tty_data *ldata = tty->disc_data;
1549 1550 1551
	int canon_change = 1;

	if (old)
1552
		canon_change = (old->c_lflag ^ tty->termios.c_lflag) & ICANON;
1553
	if (canon_change) {
1554
		bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
1555 1556
		ldata->canon_head = ldata->read_tail;
		ldata->canon_data = 0;
1557
		ldata->erasing = 0;
1558 1559
	}

1560
	if (canon_change && !L_ICANON(tty) && read_cnt(ldata))
1561
		wake_up_interruptible(&tty->read_wait);
1562

1563
	ldata->icanon = (L_ICANON(tty) != 0);
P
Peter Hurley 已提交
1564

L
Linus Torvalds 已提交
1565 1566 1567 1568
	if (I_ISTRIP(tty) || I_IUCLC(tty) || I_IGNCR(tty) ||
	    I_ICRNL(tty) || I_INLCR(tty) || L_ICANON(tty) ||
	    I_IXON(tty) || L_ISIG(tty) || L_ECHO(tty) ||
	    I_PARMRK(tty)) {
1569
		bitmap_zero(ldata->process_char_map, 256);
L
Linus Torvalds 已提交
1570 1571

		if (I_IGNCR(tty) || I_ICRNL(tty))
1572
			set_bit('\r', ldata->process_char_map);
L
Linus Torvalds 已提交
1573
		if (I_INLCR(tty))
1574
			set_bit('\n', ldata->process_char_map);
L
Linus Torvalds 已提交
1575 1576

		if (L_ICANON(tty)) {
1577 1578 1579 1580 1581
			set_bit(ERASE_CHAR(tty), ldata->process_char_map);
			set_bit(KILL_CHAR(tty), ldata->process_char_map);
			set_bit(EOF_CHAR(tty), ldata->process_char_map);
			set_bit('\n', ldata->process_char_map);
			set_bit(EOL_CHAR(tty), ldata->process_char_map);
L
Linus Torvalds 已提交
1582 1583
			if (L_IEXTEN(tty)) {
				set_bit(WERASE_CHAR(tty),
1584
					ldata->process_char_map);
L
Linus Torvalds 已提交
1585
				set_bit(LNEXT_CHAR(tty),
1586
					ldata->process_char_map);
L
Linus Torvalds 已提交
1587
				set_bit(EOL2_CHAR(tty),
1588
					ldata->process_char_map);
L
Linus Torvalds 已提交
1589 1590
				if (L_ECHO(tty))
					set_bit(REPRINT_CHAR(tty),
1591
						ldata->process_char_map);
L
Linus Torvalds 已提交
1592 1593 1594
			}
		}
		if (I_IXON(tty)) {
1595 1596
			set_bit(START_CHAR(tty), ldata->process_char_map);
			set_bit(STOP_CHAR(tty), ldata->process_char_map);
L
Linus Torvalds 已提交
1597 1598
		}
		if (L_ISIG(tty)) {
1599 1600 1601
			set_bit(INTR_CHAR(tty), ldata->process_char_map);
			set_bit(QUIT_CHAR(tty), ldata->process_char_map);
			set_bit(SUSP_CHAR(tty), ldata->process_char_map);
L
Linus Torvalds 已提交
1602
		}
1603
		clear_bit(__DISABLED_CHAR, ldata->process_char_map);
1604 1605
		ldata->raw = 0;
		ldata->real_raw = 0;
L
Linus Torvalds 已提交
1606
	} else {
1607
		ldata->raw = 1;
L
Linus Torvalds 已提交
1608 1609 1610
		if ((I_IGNBRK(tty) || (!I_BRKINT(tty) && !I_PARMRK(tty))) &&
		    (I_IGNPAR(tty) || !I_INPCK(tty)) &&
		    (tty->driver->flags & TTY_DRIVER_REAL_RAW))
1611
			ldata->real_raw = 1;
L
Linus Torvalds 已提交
1612
		else
1613
			ldata->real_raw = 0;
L
Linus Torvalds 已提交
1614
	}
1615
	n_tty_set_room(tty);
1616 1617 1618 1619 1620 1621 1622 1623
	/*
	 * Fix tty hang when I_IXON(tty) is cleared, but the tty
	 * been stopped by STOP_CHAR(tty) before it.
	 */
	if (!I_IXON(tty) && old && (old->c_iflag & IXON) && !tty->flow_stopped) {
		start_tty(tty);
	}

A
Alan Cox 已提交
1624 1625 1626
	/* The termios change make the tty ready for I/O */
	wake_up_interruptible(&tty->write_wait);
	wake_up_interruptible(&tty->read_wait);
L
Linus Torvalds 已提交
1627 1628 1629 1630 1631 1632
}

/**
 *	n_tty_close		-	close the ldisc for this tty
 *	@tty: device
 *
1633 1634
 *	Called from the terminal layer when this line discipline is
 *	being shut down, either because of a close or becsuse of a
L
Linus Torvalds 已提交
1635 1636 1637
 *	discipline change. The function will not be called while other
 *	ldisc methods are in progress.
 */
1638

L
Linus Torvalds 已提交
1639 1640
static void n_tty_close(struct tty_struct *tty)
{
J
Jiri Slaby 已提交
1641 1642
	struct n_tty_data *ldata = tty->disc_data;

1643 1644 1645
	if (tty->link)
		n_tty_packet_mode_flush(tty);

1646 1647
	kfree(ldata->read_buf);
	kfree(ldata->echo_buf);
J
Jiri Slaby 已提交
1648 1649
	kfree(ldata);
	tty->disc_data = NULL;
L
Linus Torvalds 已提交
1650 1651 1652 1653 1654 1655
}

/**
 *	n_tty_open		-	open an ldisc
 *	@tty: terminal to open
 *
1656
 *	Called when this line discipline is being attached to the
L
Linus Torvalds 已提交
1657 1658 1659 1660 1661 1662 1663
 *	terminal device. Can sleep. Called serialized so that no
 *	other events will occur in parallel. No further open will occur
 *	until a close.
 */

static int n_tty_open(struct tty_struct *tty)
{
J
Jiri Slaby 已提交
1664 1665 1666 1667 1668 1669
	struct n_tty_data *ldata;

	ldata = kzalloc(sizeof(*ldata), GFP_KERNEL);
	if (!ldata)
		goto err;

1670
	ldata->overrun_time = jiffies;
1671 1672 1673
	mutex_init(&ldata->atomic_read_lock);
	mutex_init(&ldata->output_lock);
	mutex_init(&ldata->echo_lock);
1674
	raw_spin_lock_init(&ldata->read_lock);
1675

1676
	/* These are ugly. Currently a malloc failure here can panic */
1677 1678 1679
	ldata->read_buf = kzalloc(N_TTY_BUF_SIZE, GFP_KERNEL);
	ldata->echo_buf = kzalloc(N_TTY_BUF_SIZE, GFP_KERNEL);
	if (!ldata->read_buf || !ldata->echo_buf)
1680
		goto err_free_bufs;
1681

J
Jiri Slaby 已提交
1682
	tty->disc_data = ldata;
1683
	reset_buffer_flags(tty->disc_data);
1684
	ldata->column = 0;
1685
	ldata->minimum_to_wake = 1;
L
Linus Torvalds 已提交
1686
	tty->closing = 0;
1687 1688 1689 1690
	/* indicate buffer work may resume */
	clear_bit(TTY_LDISC_HALTED, &tty->flags);
	n_tty_set_termios(tty, NULL);
	tty_unthrottle(tty);
J
Jiri Slaby 已提交
1691

L
Linus Torvalds 已提交
1692
	return 0;
1693
err_free_bufs:
1694 1695
	kfree(ldata->read_buf);
	kfree(ldata->echo_buf);
J
Jiri Slaby 已提交
1696 1697
	kfree(ldata);
err:
1698
	return -ENOMEM;
L
Linus Torvalds 已提交
1699 1700 1701 1702
}

static inline int input_available_p(struct tty_struct *tty, int amt)
{
1703 1704
	struct n_tty_data *ldata = tty->disc_data;

1705
	tty_flush_to_ldisc(tty);
1706
	if (ldata->icanon && !L_EXTPROC(tty)) {
1707
		if (ldata->canon_data)
L
Linus Torvalds 已提交
1708
			return 1;
1709
	} else if (read_cnt(ldata) >= (amt ? amt : 1))
L
Linus Torvalds 已提交
1710 1711 1712 1713 1714 1715
		return 1;

	return 0;
}

/**
1716
 *	copy_from_read_buf	-	copy read data directly
L
Linus Torvalds 已提交
1717 1718 1719 1720
 *	@tty: terminal device
 *	@b: user data
 *	@nr: size of data
 *
1721
 *	Helper function to speed up n_tty_read.  It is only called when
L
Linus Torvalds 已提交
1722 1723 1724 1725 1726 1727
 *	ICANON is off; it copies characters straight from the tty queue to
 *	user space directly.  It can be profitably called twice; once to
 *	drain the space from the tail pointer to the (physical) end of the
 *	buffer, and once to drain the space from the (physical) beginning of
 *	the buffer to head pointer.
 *
1728
 *	Called under the ldata->atomic_read_lock sem
L
Linus Torvalds 已提交
1729 1730
 *
 */
1731

A
Alan Cox 已提交
1732
static int copy_from_read_buf(struct tty_struct *tty,
L
Linus Torvalds 已提交
1733 1734 1735 1736
				      unsigned char __user **b,
				      size_t *nr)

{
1737
	struct n_tty_data *ldata = tty->disc_data;
L
Linus Torvalds 已提交
1738 1739 1740
	int retval;
	size_t n;
	unsigned long flags;
1741
	bool is_eof;
L
Linus Torvalds 已提交
1742 1743

	retval = 0;
1744
	raw_spin_lock_irqsave(&ldata->read_lock, flags);
1745
	n = min(read_cnt(ldata), N_TTY_BUF_SIZE - ldata->read_tail);
L
Linus Torvalds 已提交
1746
	n = min(*nr, n);
1747
	raw_spin_unlock_irqrestore(&ldata->read_lock, flags);
L
Linus Torvalds 已提交
1748
	if (n) {
1749
		retval = copy_to_user(*b, &ldata->read_buf[ldata->read_tail], n);
L
Linus Torvalds 已提交
1750
		n -= retval;
1751
		is_eof = n == 1 &&
1752 1753
			ldata->read_buf[ldata->read_tail] == EOF_CHAR(tty);
		tty_audit_add_data(tty, &ldata->read_buf[ldata->read_tail], n,
1754
				ldata->icanon);
1755
		raw_spin_lock_irqsave(&ldata->read_lock, flags);
1756 1757
		ldata->read_tail = (ldata->read_tail + n) & (N_TTY_BUF_SIZE-1);
		ldata->read_cnt -= n;
1758
		/* Turn single EOF into zero-length read */
1759
		if (L_EXTPROC(tty) && ldata->icanon && is_eof && !read_cnt(ldata))
1760
			n = 0;
1761
		raw_spin_unlock_irqrestore(&ldata->read_lock, flags);
L
Linus Torvalds 已提交
1762 1763 1764 1765 1766 1767
		*b += n;
		*nr -= n;
	}
	return retval;
}

1768
/**
1769
 *	canon_copy_from_read_buf	-	copy read data in canonical mode
1770 1771 1772 1773 1774
 *	@tty: terminal device
 *	@b: user data
 *	@nr: size of data
 *
 *	Helper function for n_tty_read.  It is only called when ICANON is on;
1775 1776
 *	it copies one line of input up to and including the line-delimiting
 *	character into the user-space buffer.
1777 1778 1779 1780
 *
 *	Called under the atomic_read_lock mutex
 */

1781 1782 1783
static int canon_copy_from_read_buf(struct tty_struct *tty,
				    unsigned char __user **b,
				    size_t *nr)
1784 1785 1786
{
	struct n_tty_data *ldata = tty->disc_data;
	unsigned long flags;
1787 1788 1789
	size_t n, size, more, c;
	unsigned long eol;
	int ret, tail, found = 0;
1790 1791

	/* N.B. avoid overrun if nr == 0 */
1792

1793
	raw_spin_lock_irqsave(&ldata->read_lock, flags);
1794

1795
	n = min(*nr, read_cnt(ldata));
1796
	if (!n) {
1797
		raw_spin_unlock_irqrestore(&ldata->read_lock, flags);
1798 1799
		return 0;
	}
1800

1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852
	tail = ldata->read_tail;
	size = min_t(size_t, tail + n, N_TTY_BUF_SIZE);

	n_tty_trace("%s: nr:%zu tail:%d n:%zu size:%zu\n",
		    __func__, *nr, tail, n, size);

	eol = find_next_bit(ldata->read_flags, size, tail);
	more = n - (size - tail);
	if (eol == N_TTY_BUF_SIZE && more) {
		/* scan wrapped without finding set bit */
		eol = find_next_bit(ldata->read_flags, more, 0);
		if (eol != more)
			found = 1;
	} else if (eol != size)
		found = 1;

	size = N_TTY_BUF_SIZE - tail;
	n = (found + eol + size) & (N_TTY_BUF_SIZE - 1);
	c = n;

	if (found && ldata->read_buf[eol] == __DISABLED_CHAR)
		n--;

	n_tty_trace("%s: eol:%lu found:%d n:%zu c:%zu size:%zu more:%zu\n",
		    __func__, eol, found, n, c, size, more);

	raw_spin_unlock_irqrestore(&ldata->read_lock, flags);

	if (n > size) {
		ret = copy_to_user(*b, &ldata->read_buf[tail], size);
		if (ret)
			return -EFAULT;
		ret = copy_to_user(*b + size, ldata->read_buf, n - size);
	} else
		ret = copy_to_user(*b, &ldata->read_buf[tail], n);

	if (ret)
		return -EFAULT;
	*b += n;
	*nr -= n;

	raw_spin_lock_irqsave(&ldata->read_lock, flags);
	ldata->read_tail = (ldata->read_tail + c) & (N_TTY_BUF_SIZE - 1);
	ldata->read_cnt -= c;
	if (found) {
		__clear_bit(eol, ldata->read_flags);
		/* this test should be redundant:
		 * we shouldn't be reading data if
		 * canon_data is 0
		 */
		if (--ldata->canon_data < 0)
			ldata->canon_data = 0;
1853 1854 1855
	}
	raw_spin_unlock_irqrestore(&ldata->read_lock, flags);

1856 1857
	if (found)
		tty_audit_push(tty);
1858 1859 1860
	return 0;
}

1861
extern ssize_t redirected_tty_write(struct file *, const char __user *,
1862
							size_t, loff_t *);
L
Linus Torvalds 已提交
1863 1864 1865 1866 1867 1868 1869

/**
 *	job_control		-	check job control
 *	@tty: tty
 *	@file: file handle
 *
 *	Perform job control management checks on this file/tty descriptor
1870
 *	and if appropriate send any needed signals and return a negative
L
Linus Torvalds 已提交
1871
 *	error code if action should be taken.
A
Alan Cox 已提交
1872
 *
1873 1874 1875
 *	Locking: redirected write test is safe
 *		 current->signal->tty check is safe
 *		 ctrl_lock to safely reference tty->pgrp
L
Linus Torvalds 已提交
1876
 */
1877

L
Linus Torvalds 已提交
1878 1879 1880 1881 1882 1883 1884
static int job_control(struct tty_struct *tty, struct file *file)
{
	/* Job control check -- must be done at start and after
	   every sleep (POSIX.1 7.1.1.4). */
	/* NOTE: not yet done after every sleep pending a thorough
	   check of the logic of this change. -- jlc */
	/* don't stop on /dev/console */
1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898
	if (file->f_op->write == redirected_tty_write ||
	    current->signal->tty != tty)
		return 0;

	spin_lock_irq(&tty->ctrl_lock);
	if (!tty->pgrp)
		printk(KERN_ERR "n_tty_read: no tty->pgrp!\n");
	else if (task_pgrp(current) != tty->pgrp) {
		spin_unlock_irq(&tty->ctrl_lock);
		if (is_ignored(SIGTTIN) || is_current_pgrp_orphaned())
			return -EIO;
		kill_pgrp(task_pgrp(current), SIGTTIN, 1);
		set_thread_flag(TIF_SIGPENDING);
		return -ERESTARTSYS;
L
Linus Torvalds 已提交
1899
	}
1900
	spin_unlock_irq(&tty->ctrl_lock);
L
Linus Torvalds 已提交
1901 1902
	return 0;
}
1903

L
Linus Torvalds 已提交
1904 1905

/**
1906
 *	n_tty_read		-	read function for tty
L
Linus Torvalds 已提交
1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918
 *	@tty: tty device
 *	@file: file object
 *	@buf: userspace buffer pointer
 *	@nr: size of I/O
 *
 *	Perform reads for the line discipline. We are guaranteed that the
 *	line discipline will not be closed under us but we may get multiple
 *	parallel readers and must handle this ourselves. We may also get
 *	a hangup. Always called in user context, may sleep.
 *
 *	This code must be sure never to sleep through a hangup.
 */
1919

1920
static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,
L
Linus Torvalds 已提交
1921 1922
			 unsigned char __user *buf, size_t nr)
{
1923
	struct n_tty_data *ldata = tty->disc_data;
L
Linus Torvalds 已提交
1924 1925 1926 1927 1928 1929 1930 1931
	unsigned char __user *b = buf;
	DECLARE_WAITQUEUE(wait, current);
	int c;
	int minimum, time;
	ssize_t retval = 0;
	ssize_t size;
	long timeout;
	unsigned long flags;
A
Alan Cox 已提交
1932
	int packet;
L
Linus Torvalds 已提交
1933 1934 1935

do_it_again:
	c = job_control(tty, file);
1936
	if (c < 0)
L
Linus Torvalds 已提交
1937
		return c;
1938

L
Linus Torvalds 已提交
1939 1940
	minimum = time = 0;
	timeout = MAX_SCHEDULE_TIMEOUT;
1941
	if (!ldata->icanon) {
L
Linus Torvalds 已提交
1942 1943
		minimum = MIN_CHAR(tty);
		if (minimum) {
1944
			time = (HZ / 10) * TIME_CHAR(tty);
L
Linus Torvalds 已提交
1945
			if (time)
1946
				ldata->minimum_to_wake = 1;
L
Linus Torvalds 已提交
1947
			else if (!waitqueue_active(&tty->read_wait) ||
1948 1949
				 (ldata->minimum_to_wake > minimum))
				ldata->minimum_to_wake = minimum;
L
Linus Torvalds 已提交
1950
		} else {
1951
			timeout = (HZ / 10) * TIME_CHAR(tty);
1952
			ldata->minimum_to_wake = minimum = 1;
L
Linus Torvalds 已提交
1953 1954 1955 1956 1957 1958 1959
		}
	}

	/*
	 *	Internal serialization of reads.
	 */
	if (file->f_flags & O_NONBLOCK) {
1960
		if (!mutex_trylock(&ldata->atomic_read_lock))
L
Linus Torvalds 已提交
1961
			return -EAGAIN;
1962
	} else {
1963
		if (mutex_lock_interruptible(&ldata->atomic_read_lock))
L
Linus Torvalds 已提交
1964 1965
			return -ERESTARTSYS;
	}
A
Alan Cox 已提交
1966
	packet = tty->packet;
L
Linus Torvalds 已提交
1967 1968 1969 1970

	add_wait_queue(&tty->read_wait, &wait);
	while (nr) {
		/* First test for status change. */
A
Alan Cox 已提交
1971
		if (packet && tty->link->ctrl_status) {
L
Linus Torvalds 已提交
1972 1973 1974
			unsigned char cs;
			if (b != buf)
				break;
A
Alan Cox 已提交
1975
			spin_lock_irqsave(&tty->link->ctrl_lock, flags);
L
Linus Torvalds 已提交
1976 1977
			cs = tty->link->ctrl_status;
			tty->link->ctrl_status = 0;
A
Alan Cox 已提交
1978
			spin_unlock_irqrestore(&tty->link->ctrl_lock, flags);
M
Miloslav Trmac 已提交
1979
			if (tty_put_user(tty, cs, b++)) {
L
Linus Torvalds 已提交
1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990
				retval = -EFAULT;
				b--;
				break;
			}
			nr--;
			break;
		}
		/* This statement must be first before checking for input
		   so that any interrupt will set the state back to
		   TASK_RUNNING. */
		set_current_state(TASK_INTERRUPTIBLE);
1991

1992
		if (((minimum - (b - buf)) < ldata->minimum_to_wake) &&
L
Linus Torvalds 已提交
1993
		    ((minimum - (b - buf)) >= 1))
1994
			ldata->minimum_to_wake = (minimum - (b - buf));
1995

L
Linus Torvalds 已提交
1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012
		if (!input_available_p(tty, 0)) {
			if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) {
				retval = -EIO;
				break;
			}
			if (tty_hung_up_p(file))
				break;
			if (!timeout)
				break;
			if (file->f_flags & O_NONBLOCK) {
				retval = -EAGAIN;
				break;
			}
			if (signal_pending(current)) {
				retval = -ERESTARTSYS;
				break;
			}
2013
			n_tty_set_room(tty);
L
Linus Torvalds 已提交
2014 2015 2016 2017 2018 2019
			timeout = schedule_timeout(timeout);
			continue;
		}
		__set_current_state(TASK_RUNNING);

		/* Deal with packet mode. */
A
Alan Cox 已提交
2020
		if (packet && b == buf) {
M
Miloslav Trmac 已提交
2021
			if (tty_put_user(tty, TIOCPKT_DATA, b++)) {
L
Linus Torvalds 已提交
2022 2023 2024 2025 2026 2027 2028
				retval = -EFAULT;
				b--;
				break;
			}
			nr--;
		}

2029
		if (ldata->icanon && !L_EXTPROC(tty)) {
2030
			retval = canon_copy_from_read_buf(tty, &b, &nr);
L
Linus Torvalds 已提交
2031 2032 2033 2034
			if (retval)
				break;
		} else {
			int uncopied;
A
Alan Cox 已提交
2035 2036
			/* The copy function takes the read lock and handles
			   locking internally for this case */
L
Linus Torvalds 已提交
2037 2038 2039 2040 2041 2042 2043 2044 2045
			uncopied = copy_from_read_buf(tty, &b, &nr);
			uncopied += copy_from_read_buf(tty, &b, &nr);
			if (uncopied) {
				retval = -EFAULT;
				break;
			}
		}

		/* If there is enough space in the read buffer now, let the
2046
		 * low-level driver know. We use chars_in_buffer() to
L
Linus Torvalds 已提交
2047 2048 2049 2050 2051
		 * check the buffer, as it now knows about canonical mode.
		 * Otherwise, if the driver is throttled and the line is
		 * longer than TTY_THRESHOLD_UNTHROTTLE in canonical mode,
		 * we won't get any more characters.
		 */
P
Peter Hurley 已提交
2052 2053
		while (1) {
			tty_set_flow_change(tty, TTY_UNTHROTTLE_SAFE);
2054
			if (chars_in_buffer(tty) > TTY_THRESHOLD_UNTHROTTLE)
P
Peter Hurley 已提交
2055 2056 2057
				break;
			if (!tty->count)
				break;
2058
			n_tty_set_room(tty);
P
Peter Hurley 已提交
2059 2060
			if (!tty_unthrottle_safe(tty))
				break;
2061
		}
P
Peter Hurley 已提交
2062
		__tty_set_flow_change(tty, 0);
L
Linus Torvalds 已提交
2063 2064 2065 2066 2067 2068

		if (b - buf >= minimum)
			break;
		if (time)
			timeout = time;
	}
2069
	mutex_unlock(&ldata->atomic_read_lock);
L
Linus Torvalds 已提交
2070 2071 2072
	remove_wait_queue(&tty->read_wait, &wait);

	if (!waitqueue_active(&tty->read_wait))
2073
		ldata->minimum_to_wake = minimum;
L
Linus Torvalds 已提交
2074 2075 2076 2077 2078 2079

	__set_current_state(TASK_RUNNING);
	size = b - buf;
	if (size) {
		retval = size;
		if (nr)
2080
			clear_bit(TTY_PUSH, &tty->flags);
L
Linus Torvalds 已提交
2081
	} else if (test_and_clear_bit(TTY_PUSH, &tty->flags))
2082
		goto do_it_again;
L
Linus Torvalds 已提交
2083

2084
	n_tty_set_room(tty);
L
Linus Torvalds 已提交
2085 2086 2087 2088
	return retval;
}

/**
2089
 *	n_tty_write		-	write function for tty
L
Linus Torvalds 已提交
2090 2091 2092 2093 2094
 *	@tty: tty device
 *	@file: file object
 *	@buf: userspace buffer pointer
 *	@nr: size of I/O
 *
2095
 *	Write function of the terminal device.  This is serialized with
L
Linus Torvalds 已提交
2096
 *	respect to other write callers but not to termios changes, reads
2097 2098 2099 2100 2101
 *	and other such events.  Since the receive code will echo characters,
 *	thus calling driver write methods, the output_lock is used in
 *	the output processing functions called here as well as in the
 *	echo processing function to protect the column state and space
 *	left in the buffer.
L
Linus Torvalds 已提交
2102 2103
 *
 *	This code must be sure never to sleep through a hangup.
2104 2105 2106 2107
 *
 *	Locking: output_lock to protect column state and space left
 *		 (note that the process_output*() functions take this
 *		  lock themselves)
L
Linus Torvalds 已提交
2108
 */
2109

2110
static ssize_t n_tty_write(struct tty_struct *tty, struct file *file,
2111
			   const unsigned char *buf, size_t nr)
L
Linus Torvalds 已提交
2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124
{
	const unsigned char *b = buf;
	DECLARE_WAITQUEUE(wait, current);
	int c;
	ssize_t retval = 0;

	/* Job control check -- must be done at start (POSIX.1 7.1.1.4). */
	if (L_TOSTOP(tty) && file->f_op->write != redirected_tty_write) {
		retval = tty_check_change(tty);
		if (retval)
			return retval;
	}

2125 2126
	/* Write out any echoed characters that are still pending */
	process_echoes(tty);
A
Alan Cox 已提交
2127

L
Linus Torvalds 已提交
2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138
	add_wait_queue(&tty->write_wait, &wait);
	while (1) {
		set_current_state(TASK_INTERRUPTIBLE);
		if (signal_pending(current)) {
			retval = -ERESTARTSYS;
			break;
		}
		if (tty_hung_up_p(file) || (tty->link && !tty->link->count)) {
			retval = -EIO;
			break;
		}
P
Peter Hurley 已提交
2139
		if (O_OPOST(tty)) {
L
Linus Torvalds 已提交
2140
			while (nr > 0) {
2141
				ssize_t num = process_output_block(tty, b, nr);
L
Linus Torvalds 已提交
2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152
				if (num < 0) {
					if (num == -EAGAIN)
						break;
					retval = num;
					goto break_out;
				}
				b += num;
				nr -= num;
				if (nr == 0)
					break;
				c = *b;
2153
				if (process_output(c, tty) < 0)
L
Linus Torvalds 已提交
2154 2155 2156
					break;
				b++; nr--;
			}
A
Alan Cox 已提交
2157 2158
			if (tty->ops->flush_chars)
				tty->ops->flush_chars(tty);
L
Linus Torvalds 已提交
2159
		} else {
R
Roman Zippel 已提交
2160
			while (nr > 0) {
A
Alan Cox 已提交
2161
				c = tty->ops->write(tty, b, nr);
R
Roman Zippel 已提交
2162 2163 2164 2165 2166 2167 2168 2169
				if (c < 0) {
					retval = c;
					goto break_out;
				}
				if (!c)
					break;
				b += c;
				nr -= c;
L
Linus Torvalds 已提交
2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182
			}
		}
		if (!nr)
			break;
		if (file->f_flags & O_NONBLOCK) {
			retval = -EAGAIN;
			break;
		}
		schedule();
	}
break_out:
	__set_current_state(TASK_RUNNING);
	remove_wait_queue(&tty->write_wait, &wait);
2183 2184
	if (b - buf != nr && tty->fasync)
		set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
L
Linus Torvalds 已提交
2185 2186 2187 2188
	return (b - buf) ? b - buf : retval;
}

/**
2189
 *	n_tty_poll		-	poll method for N_TTY
L
Linus Torvalds 已提交
2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200
 *	@tty: terminal device
 *	@file: file accessing it
 *	@wait: poll table
 *
 *	Called when the line discipline is asked to poll() for data or
 *	for special events. This code is not serialized with respect to
 *	other events save open/close.
 *
 *	This code must be sure never to sleep through a hangup.
 *	Called without the kernel lock held - fine
 */
2201

2202
static unsigned int n_tty_poll(struct tty_struct *tty, struct file *file,
2203
							poll_table *wait)
L
Linus Torvalds 已提交
2204
{
2205
	struct n_tty_data *ldata = tty->disc_data;
L
Linus Torvalds 已提交
2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219
	unsigned int mask = 0;

	poll_wait(file, &tty->read_wait, wait);
	poll_wait(file, &tty->write_wait, wait);
	if (input_available_p(tty, TIME_CHAR(tty) ? 0 : MIN_CHAR(tty)))
		mask |= POLLIN | POLLRDNORM;
	if (tty->packet && tty->link->ctrl_status)
		mask |= POLLPRI | POLLIN | POLLRDNORM;
	if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
		mask |= POLLHUP;
	if (tty_hung_up_p(file))
		mask |= POLLHUP;
	if (!(mask & (POLLHUP | POLLIN | POLLRDNORM))) {
		if (MIN_CHAR(tty) && !TIME_CHAR(tty))
2220
			ldata->minimum_to_wake = MIN_CHAR(tty);
L
Linus Torvalds 已提交
2221
		else
2222
			ldata->minimum_to_wake = 1;
L
Linus Torvalds 已提交
2223
	}
A
Alan Cox 已提交
2224 2225 2226
	if (tty->ops->write && !tty_is_writelocked(tty) &&
			tty_chars_in_buffer(tty) < WAKEUP_CHARS &&
			tty_write_room(tty) > 0)
L
Linus Torvalds 已提交
2227 2228 2229 2230
		mask |= POLLOUT | POLLWRNORM;
	return mask;
}

J
Jiri Slaby 已提交
2231
static unsigned long inq_canon(struct n_tty_data *ldata)
2232 2233 2234
{
	int nr, head, tail;

2235
	if (!ldata->canon_data)
2236
		return 0;
2237 2238
	head = ldata->canon_head;
	tail = ldata->read_tail;
2239 2240 2241
	nr = (head - tail) & (N_TTY_BUF_SIZE-1);
	/* Skip EOF-chars.. */
	while (head != tail) {
2242
		if (test_bit(tail, ldata->read_flags) &&
2243
		    ldata->read_buf[tail] == __DISABLED_CHAR)
2244 2245 2246 2247 2248 2249 2250 2251 2252
			nr--;
		tail = (tail+1) & (N_TTY_BUF_SIZE-1);
	}
	return nr;
}

static int n_tty_ioctl(struct tty_struct *tty, struct file *file,
		       unsigned int cmd, unsigned long arg)
{
2253
	struct n_tty_data *ldata = tty->disc_data;
2254 2255 2256 2257 2258 2259
	int retval;

	switch (cmd) {
	case TIOCOUTQ:
		return put_user(tty_chars_in_buffer(tty), (int __user *) arg);
	case TIOCINQ:
2260
		/* FIXME: Locking */
2261
		retval = read_cnt(ldata);
2262
		if (L_ICANON(tty))
J
Jiri Slaby 已提交
2263
			retval = inq_canon(ldata);
2264 2265 2266 2267 2268 2269
		return put_user(retval, (unsigned int __user *) arg);
	default:
		return n_tty_ioctl_helper(tty, file, cmd, arg);
	}
}

2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281
static void n_tty_fasync(struct tty_struct *tty, int on)
{
	struct n_tty_data *ldata = tty->disc_data;

	if (!waitqueue_active(&tty->read_wait)) {
		if (on)
			ldata->minimum_to_wake = 1;
		else if (!tty->fasync)
			ldata->minimum_to_wake = N_TTY_BUF_SIZE;
	}
}

A
Alan Cox 已提交
2282
struct tty_ldisc_ops tty_ldisc_N_TTY = {
P
Paul Fulghum 已提交
2283 2284 2285 2286 2287 2288
	.magic           = TTY_LDISC_MAGIC,
	.name            = "n_tty",
	.open            = n_tty_open,
	.close           = n_tty_close,
	.flush_buffer    = n_tty_flush_buffer,
	.chars_in_buffer = n_tty_chars_in_buffer,
2289 2290
	.read            = n_tty_read,
	.write           = n_tty_write,
P
Paul Fulghum 已提交
2291 2292
	.ioctl           = n_tty_ioctl,
	.set_termios     = n_tty_set_termios,
2293
	.poll            = n_tty_poll,
P
Paul Fulghum 已提交
2294
	.receive_buf     = n_tty_receive_buf,
2295 2296
	.write_wakeup    = n_tty_write_wakeup,
	.fasync		 = n_tty_fasync,
2297
	.receive_buf2	 = n_tty_receive_buf2,
L
Linus Torvalds 已提交
2298
};
2299 2300 2301 2302 2303

/**
 *	n_tty_inherit_ops	-	inherit N_TTY methods
 *	@ops: struct tty_ldisc_ops where to save N_TTY methods
 *
2304
 *	Enables a 'subclass' line discipline to 'inherit' N_TTY
2305 2306 2307 2308 2309 2310 2311 2312 2313 2314
 *	methods.
 */

void n_tty_inherit_ops(struct tty_ldisc_ops *ops)
{
	*ops = tty_ldisc_N_TTY;
	ops->owner = NULL;
	ops->refcount = ops->flags = 0;
}
EXPORT_SYMBOL_GPL(n_tty_inherit_ops);