xref: /linux/drivers/tty/tty_ioctl.c (revision f2ee442115c9b6219083c019939a9cc0c9abb2f8)
1 /*
2  *  Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds
3  *
4  * Modified by Fred N. van Kempen, 01/29/93, to add line disciplines
5  * which can be dynamically activated and de-activated by the line
6  * discipline handling modules (like SLIP).
7  */
8 
9 #include <linux/types.h>
10 #include <linux/termios.h>
11 #include <linux/errno.h>
12 #include <linux/sched.h>
13 #include <linux/kernel.h>
14 #include <linux/major.h>
15 #include <linux/tty.h>
16 #include <linux/fcntl.h>
17 #include <linux/string.h>
18 #include <linux/mm.h>
19 #include <linux/module.h>
20 #include <linux/bitops.h>
21 #include <linux/mutex.h>
22 #include <linux/compat.h>
23 
24 #include <asm/io.h>
25 #include <asm/uaccess.h>
26 #include <asm/system.h>
27 
28 #undef TTY_DEBUG_WAIT_UNTIL_SENT
29 
30 #undef	DEBUG
31 
32 /*
33  * Internal flag options for termios setting behavior
34  */
35 #define TERMIOS_FLUSH	1
36 #define TERMIOS_WAIT	2
37 #define TERMIOS_TERMIO	4
38 #define TERMIOS_OLD	8
39 
40 
41 /**
42  *	tty_chars_in_buffer	-	characters pending
43  *	@tty: terminal
44  *
45  *	Return the number of bytes of data in the device private
46  *	output queue. If no private method is supplied there is assumed
47  *	to be no queue on the device.
48  */
49 
50 int tty_chars_in_buffer(struct tty_struct *tty)
51 {
52 	if (tty->ops->chars_in_buffer)
53 		return tty->ops->chars_in_buffer(tty);
54 	else
55 		return 0;
56 }
57 EXPORT_SYMBOL(tty_chars_in_buffer);
58 
59 /**
60  *	tty_write_room		-	write queue space
61  *	@tty: terminal
62  *
63  *	Return the number of bytes that can be queued to this device
64  *	at the present time. The result should be treated as a guarantee
65  *	and the driver cannot offer a value it later shrinks by more than
66  *	the number of bytes written. If no method is provided 2K is always
67  *	returned and data may be lost as there will be no flow control.
68  */
69 
70 int tty_write_room(struct tty_struct *tty)
71 {
72 	if (tty->ops->write_room)
73 		return tty->ops->write_room(tty);
74 	return 2048;
75 }
76 EXPORT_SYMBOL(tty_write_room);
77 
78 /**
79  *	tty_driver_flush_buffer	-	discard internal buffer
80  *	@tty: terminal
81  *
82  *	Discard the internal output buffer for this device. If no method
83  *	is provided then either the buffer cannot be hardware flushed or
84  *	there is no buffer driver side.
85  */
86 void tty_driver_flush_buffer(struct tty_struct *tty)
87 {
88 	if (tty->ops->flush_buffer)
89 		tty->ops->flush_buffer(tty);
90 }
91 EXPORT_SYMBOL(tty_driver_flush_buffer);
92 
93 /**
94  *	tty_throttle		-	flow control
95  *	@tty: terminal
96  *
97  *	Indicate that a tty should stop transmitting data down the stack.
98  *	Takes the termios mutex to protect against parallel throttle/unthrottle
99  *	and also to ensure the driver can consistently reference its own
100  *	termios data at this point when implementing software flow control.
101  */
102 
103 void tty_throttle(struct tty_struct *tty)
104 {
105 	mutex_lock(&tty->termios_mutex);
106 	/* check TTY_THROTTLED first so it indicates our state */
107 	if (!test_and_set_bit(TTY_THROTTLED, &tty->flags) &&
108 	    tty->ops->throttle)
109 		tty->ops->throttle(tty);
110 	mutex_unlock(&tty->termios_mutex);
111 }
112 EXPORT_SYMBOL(tty_throttle);
113 
114 /**
115  *	tty_unthrottle		-	flow control
116  *	@tty: terminal
117  *
118  *	Indicate that a tty may continue transmitting data down the stack.
119  *	Takes the termios mutex to protect against parallel throttle/unthrottle
120  *	and also to ensure the driver can consistently reference its own
121  *	termios data at this point when implementing software flow control.
122  *
123  *	Drivers should however remember that the stack can issue a throttle,
124  *	then change flow control method, then unthrottle.
125  */
126 
127 void tty_unthrottle(struct tty_struct *tty)
128 {
129 	mutex_lock(&tty->termios_mutex);
130 	if (test_and_clear_bit(TTY_THROTTLED, &tty->flags) &&
131 	    tty->ops->unthrottle)
132 		tty->ops->unthrottle(tty);
133 	mutex_unlock(&tty->termios_mutex);
134 }
135 EXPORT_SYMBOL(tty_unthrottle);
136 
137 /**
138  *	tty_wait_until_sent	-	wait for I/O to finish
139  *	@tty: tty we are waiting for
140  *	@timeout: how long we will wait
141  *
142  *	Wait for characters pending in a tty driver to hit the wire, or
143  *	for a timeout to occur (eg due to flow control)
144  *
145  *	Locking: none
146  */
147 
148 void tty_wait_until_sent(struct tty_struct *tty, long timeout)
149 {
150 #ifdef TTY_DEBUG_WAIT_UNTIL_SENT
151 	char buf[64];
152 
153 	printk(KERN_DEBUG "%s wait until sent...\n", tty_name(tty, buf));
154 #endif
155 	if (!timeout)
156 		timeout = MAX_SCHEDULE_TIMEOUT;
157 	if (wait_event_interruptible_timeout(tty->write_wait,
158 			!tty_chars_in_buffer(tty), timeout) >= 0) {
159 		if (tty->ops->wait_until_sent)
160 			tty->ops->wait_until_sent(tty, timeout);
161 	}
162 }
163 EXPORT_SYMBOL(tty_wait_until_sent);
164 
165 
166 /*
167  *		Termios Helper Methods
168  */
169 
170 static void unset_locked_termios(struct ktermios *termios,
171 				 struct ktermios *old,
172 				 struct ktermios *locked)
173 {
174 	int	i;
175 
176 #define NOSET_MASK(x, y, z) (x = ((x) & ~(z)) | ((y) & (z)))
177 
178 	if (!locked) {
179 		printk(KERN_WARNING "Warning?!? termios_locked is NULL.\n");
180 		return;
181 	}
182 
183 	NOSET_MASK(termios->c_iflag, old->c_iflag, locked->c_iflag);
184 	NOSET_MASK(termios->c_oflag, old->c_oflag, locked->c_oflag);
185 	NOSET_MASK(termios->c_cflag, old->c_cflag, locked->c_cflag);
186 	NOSET_MASK(termios->c_lflag, old->c_lflag, locked->c_lflag);
187 	termios->c_line = locked->c_line ? old->c_line : termios->c_line;
188 	for (i = 0; i < NCCS; i++)
189 		termios->c_cc[i] = locked->c_cc[i] ?
190 			old->c_cc[i] : termios->c_cc[i];
191 	/* FIXME: What should we do for i/ospeed */
192 }
193 
194 /*
195  * Routine which returns the baud rate of the tty
196  *
197  * Note that the baud_table needs to be kept in sync with the
198  * include/asm/termbits.h file.
199  */
200 static const speed_t baud_table[] = {
201 	0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
202 	9600, 19200, 38400, 57600, 115200, 230400, 460800,
203 #ifdef __sparc__
204 	76800, 153600, 307200, 614400, 921600
205 #else
206 	500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000,
207 	2500000, 3000000, 3500000, 4000000
208 #endif
209 };
210 
211 #ifndef __sparc__
212 static const tcflag_t baud_bits[] = {
213 	B0, B50, B75, B110, B134, B150, B200, B300, B600,
214 	B1200, B1800, B2400, B4800, B9600, B19200, B38400,
215 	B57600, B115200, B230400, B460800, B500000, B576000,
216 	B921600, B1000000, B1152000, B1500000, B2000000, B2500000,
217 	B3000000, B3500000, B4000000
218 };
219 #else
220 static const tcflag_t baud_bits[] = {
221 	B0, B50, B75, B110, B134, B150, B200, B300, B600,
222 	B1200, B1800, B2400, B4800, B9600, B19200, B38400,
223 	B57600, B115200, B230400, B460800, B76800, B153600,
224 	B307200, B614400, B921600
225 };
226 #endif
227 
228 static int n_baud_table = ARRAY_SIZE(baud_table);
229 
230 /**
231  *	tty_termios_baud_rate
232  *	@termios: termios structure
233  *
234  *	Convert termios baud rate data into a speed. This should be called
235  *	with the termios lock held if this termios is a terminal termios
236  *	structure. May change the termios data. Device drivers can call this
237  *	function but should use ->c_[io]speed directly as they are updated.
238  *
239  *	Locking: none
240  */
241 
242 speed_t tty_termios_baud_rate(struct ktermios *termios)
243 {
244 	unsigned int cbaud;
245 
246 	cbaud = termios->c_cflag & CBAUD;
247 
248 #ifdef BOTHER
249 	/* Magic token for arbitrary speed via c_ispeed/c_ospeed */
250 	if (cbaud == BOTHER)
251 		return termios->c_ospeed;
252 #endif
253 	if (cbaud & CBAUDEX) {
254 		cbaud &= ~CBAUDEX;
255 
256 		if (cbaud < 1 || cbaud + 15 > n_baud_table)
257 			termios->c_cflag &= ~CBAUDEX;
258 		else
259 			cbaud += 15;
260 	}
261 	return baud_table[cbaud];
262 }
263 EXPORT_SYMBOL(tty_termios_baud_rate);
264 
265 /**
266  *	tty_termios_input_baud_rate
267  *	@termios: termios structure
268  *
269  *	Convert termios baud rate data into a speed. This should be called
270  *	with the termios lock held if this termios is a terminal termios
271  *	structure. May change the termios data. Device drivers can call this
272  *	function but should use ->c_[io]speed directly as they are updated.
273  *
274  *	Locking: none
275  */
276 
277 speed_t tty_termios_input_baud_rate(struct ktermios *termios)
278 {
279 #ifdef IBSHIFT
280 	unsigned int cbaud = (termios->c_cflag >> IBSHIFT) & CBAUD;
281 
282 	if (cbaud == B0)
283 		return tty_termios_baud_rate(termios);
284 
285 	/* Magic token for arbitrary speed via c_ispeed*/
286 	if (cbaud == BOTHER)
287 		return termios->c_ispeed;
288 
289 	if (cbaud & CBAUDEX) {
290 		cbaud &= ~CBAUDEX;
291 
292 		if (cbaud < 1 || cbaud + 15 > n_baud_table)
293 			termios->c_cflag &= ~(CBAUDEX << IBSHIFT);
294 		else
295 			cbaud += 15;
296 	}
297 	return baud_table[cbaud];
298 #else
299 	return tty_termios_baud_rate(termios);
300 #endif
301 }
302 EXPORT_SYMBOL(tty_termios_input_baud_rate);
303 
304 /**
305  *	tty_termios_encode_baud_rate
306  *	@termios: ktermios structure holding user requested state
307  *	@ispeed: input speed
308  *	@ospeed: output speed
309  *
310  *	Encode the speeds set into the passed termios structure. This is
311  *	used as a library helper for drivers so that they can report back
312  *	the actual speed selected when it differs from the speed requested
313  *
314  *	For maximal back compatibility with legacy SYS5/POSIX *nix behaviour
315  *	we need to carefully set the bits when the user does not get the
316  *	desired speed. We allow small margins and preserve as much of possible
317  *	of the input intent to keep compatibility.
318  *
319  *	Locking: Caller should hold termios lock. This is already held
320  *	when calling this function from the driver termios handler.
321  *
322  *	The ifdefs deal with platforms whose owners have yet to update them
323  *	and will all go away once this is done.
324  */
325 
326 void tty_termios_encode_baud_rate(struct ktermios *termios,
327 				  speed_t ibaud, speed_t obaud)
328 {
329 	int i = 0;
330 	int ifound = -1, ofound = -1;
331 	int iclose = ibaud/50, oclose = obaud/50;
332 	int ibinput = 0;
333 
334 	if (obaud == 0)			/* CD dropped 		  */
335 		ibaud = 0;		/* Clear ibaud to be sure */
336 
337 	termios->c_ispeed = ibaud;
338 	termios->c_ospeed = obaud;
339 
340 #ifdef BOTHER
341 	/* If the user asked for a precise weird speed give a precise weird
342 	   answer. If they asked for a Bfoo speed they many have problems
343 	   digesting non-exact replies so fuzz a bit */
344 
345 	if ((termios->c_cflag & CBAUD) == BOTHER)
346 		oclose = 0;
347 	if (((termios->c_cflag >> IBSHIFT) & CBAUD) == BOTHER)
348 		iclose = 0;
349 	if ((termios->c_cflag >> IBSHIFT) & CBAUD)
350 		ibinput = 1;	/* An input speed was specified */
351 #endif
352 	termios->c_cflag &= ~CBAUD;
353 
354 	/*
355 	 *	Our goal is to find a close match to the standard baud rate
356 	 *	returned. Walk the baud rate table and if we get a very close
357 	 *	match then report back the speed as a POSIX Bxxxx value by
358 	 *	preference
359 	 */
360 
361 	do {
362 		if (obaud - oclose <= baud_table[i] &&
363 		    obaud + oclose >= baud_table[i]) {
364 			termios->c_cflag |= baud_bits[i];
365 			ofound = i;
366 		}
367 		if (ibaud - iclose <= baud_table[i] &&
368 		    ibaud + iclose >= baud_table[i]) {
369 			/* For the case input == output don't set IBAUD bits
370 			   if the user didn't do so */
371 			if (ofound == i && !ibinput)
372 				ifound  = i;
373 #ifdef IBSHIFT
374 			else {
375 				ifound = i;
376 				termios->c_cflag |= (baud_bits[i] << IBSHIFT);
377 			}
378 #endif
379 		}
380 	} while (++i < n_baud_table);
381 
382 	/*
383 	 *	If we found no match then use BOTHER if provided or warn
384 	 *	the user their platform maintainer needs to wake up if not.
385 	 */
386 #ifdef BOTHER
387 	if (ofound == -1)
388 		termios->c_cflag |= BOTHER;
389 	/* Set exact input bits only if the input and output differ or the
390 	   user already did */
391 	if (ifound == -1 && (ibaud != obaud || ibinput))
392 		termios->c_cflag |= (BOTHER << IBSHIFT);
393 #else
394 	if (ifound == -1 || ofound == -1) {
395 		printk_once(KERN_WARNING "tty: Unable to return correct "
396 			  "speed data as your architecture needs updating.\n");
397 	}
398 #endif
399 }
400 EXPORT_SYMBOL_GPL(tty_termios_encode_baud_rate);
401 
402 /**
403  *	tty_encode_baud_rate		-	set baud rate of the tty
404  *	@ibaud: input baud rate
405  *	@obad: output baud rate
406  *
407  *	Update the current termios data for the tty with the new speed
408  *	settings. The caller must hold the termios_mutex for the tty in
409  *	question.
410  */
411 
412 void tty_encode_baud_rate(struct tty_struct *tty, speed_t ibaud, speed_t obaud)
413 {
414 	tty_termios_encode_baud_rate(tty->termios, ibaud, obaud);
415 }
416 EXPORT_SYMBOL_GPL(tty_encode_baud_rate);
417 
418 /**
419  *	tty_get_baud_rate	-	get tty bit rates
420  *	@tty: tty to query
421  *
422  *	Returns the baud rate as an integer for this terminal. The
423  *	termios lock must be held by the caller and the terminal bit
424  *	flags may be updated.
425  *
426  *	Locking: none
427  */
428 
429 speed_t tty_get_baud_rate(struct tty_struct *tty)
430 {
431 	speed_t baud = tty_termios_baud_rate(tty->termios);
432 
433 	if (baud == 38400 && tty->alt_speed) {
434 		if (!tty->warned) {
435 			printk(KERN_WARNING "Use of setserial/setrocket to "
436 					    "set SPD_* flags is deprecated\n");
437 			tty->warned = 1;
438 		}
439 		baud = tty->alt_speed;
440 	}
441 
442 	return baud;
443 }
444 EXPORT_SYMBOL(tty_get_baud_rate);
445 
446 /**
447  *	tty_termios_copy_hw	-	copy hardware settings
448  *	@new: New termios
449  *	@old: Old termios
450  *
451  *	Propagate the hardware specific terminal setting bits from
452  *	the old termios structure to the new one. This is used in cases
453  *	where the hardware does not support reconfiguration or as a helper
454  *	in some cases where only minimal reconfiguration is supported
455  */
456 
457 void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old)
458 {
459 	/* The bits a dumb device handles in software. Smart devices need
460 	   to always provide a set_termios method */
461 	new->c_cflag &= HUPCL | CREAD | CLOCAL;
462 	new->c_cflag |= old->c_cflag & ~(HUPCL | CREAD | CLOCAL);
463 	new->c_ispeed = old->c_ispeed;
464 	new->c_ospeed = old->c_ospeed;
465 }
466 EXPORT_SYMBOL(tty_termios_copy_hw);
467 
468 /**
469  *	tty_termios_hw_change	-	check for setting change
470  *	@a: termios
471  *	@b: termios to compare
472  *
473  *	Check if any of the bits that affect a dumb device have changed
474  *	between the two termios structures, or a speed change is needed.
475  */
476 
477 int tty_termios_hw_change(struct ktermios *a, struct ktermios *b)
478 {
479 	if (a->c_ispeed != b->c_ispeed || a->c_ospeed != b->c_ospeed)
480 		return 1;
481 	if ((a->c_cflag ^ b->c_cflag) & ~(HUPCL | CREAD | CLOCAL))
482 		return 1;
483 	return 0;
484 }
485 EXPORT_SYMBOL(tty_termios_hw_change);
486 
487 /**
488  *	tty_set_termios		-	update termios values
489  *	@tty: tty to update
490  *	@new_termios: desired new value
491  *
492  *	Perform updates to the termios values set on this terminal. There
493  *	is a bit of layering violation here with n_tty in terms of the
494  *	internal knowledge of this function.
495  *
496  *	Locking: termios_mutex
497  */
498 
499 int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios)
500 {
501 	struct ktermios old_termios;
502 	struct tty_ldisc *ld;
503 	unsigned long flags;
504 
505 	/*
506 	 *	Perform the actual termios internal changes under lock.
507 	 */
508 
509 
510 	/* FIXME: we need to decide on some locking/ordering semantics
511 	   for the set_termios notification eventually */
512 	mutex_lock(&tty->termios_mutex);
513 	old_termios = *tty->termios;
514 	*tty->termios = *new_termios;
515 	unset_locked_termios(tty->termios, &old_termios, tty->termios_locked);
516 
517 	/* See if packet mode change of state. */
518 	if (tty->link && tty->link->packet) {
519 		int extproc = (old_termios.c_lflag & EXTPROC) |
520 				(tty->termios->c_lflag & EXTPROC);
521 		int old_flow = ((old_termios.c_iflag & IXON) &&
522 				(old_termios.c_cc[VSTOP] == '\023') &&
523 				(old_termios.c_cc[VSTART] == '\021'));
524 		int new_flow = (I_IXON(tty) &&
525 				STOP_CHAR(tty) == '\023' &&
526 				START_CHAR(tty) == '\021');
527 		if ((old_flow != new_flow) || extproc) {
528 			spin_lock_irqsave(&tty->ctrl_lock, flags);
529 			if (old_flow != new_flow) {
530 				tty->ctrl_status &= ~(TIOCPKT_DOSTOP | TIOCPKT_NOSTOP);
531 				if (new_flow)
532 					tty->ctrl_status |= TIOCPKT_DOSTOP;
533 				else
534 					tty->ctrl_status |= TIOCPKT_NOSTOP;
535 			}
536 			if (extproc)
537 				tty->ctrl_status |= TIOCPKT_IOCTL;
538 			spin_unlock_irqrestore(&tty->ctrl_lock, flags);
539 			wake_up_interruptible(&tty->link->read_wait);
540 		}
541 	}
542 
543 	if (tty->ops->set_termios)
544 		(*tty->ops->set_termios)(tty, &old_termios);
545 	else
546 		tty_termios_copy_hw(tty->termios, &old_termios);
547 
548 	ld = tty_ldisc_ref(tty);
549 	if (ld != NULL) {
550 		if (ld->ops->set_termios)
551 			(ld->ops->set_termios)(tty, &old_termios);
552 		tty_ldisc_deref(ld);
553 	}
554 	mutex_unlock(&tty->termios_mutex);
555 	return 0;
556 }
557 EXPORT_SYMBOL_GPL(tty_set_termios);
558 
559 /**
560  *	set_termios		-	set termios values for a tty
561  *	@tty: terminal device
562  *	@arg: user data
563  *	@opt: option information
564  *
565  *	Helper function to prepare termios data and run necessary other
566  *	functions before using tty_set_termios to do the actual changes.
567  *
568  *	Locking:
569  *		Called functions take ldisc and termios_mutex locks
570  */
571 
572 static int set_termios(struct tty_struct *tty, void __user *arg, int opt)
573 {
574 	struct ktermios tmp_termios;
575 	struct tty_ldisc *ld;
576 	int retval = tty_check_change(tty);
577 
578 	if (retval)
579 		return retval;
580 
581 	mutex_lock(&tty->termios_mutex);
582 	memcpy(&tmp_termios, tty->termios, sizeof(struct ktermios));
583 	mutex_unlock(&tty->termios_mutex);
584 
585 	if (opt & TERMIOS_TERMIO) {
586 		if (user_termio_to_kernel_termios(&tmp_termios,
587 						(struct termio __user *)arg))
588 			return -EFAULT;
589 #ifdef TCGETS2
590 	} else if (opt & TERMIOS_OLD) {
591 		if (user_termios_to_kernel_termios_1(&tmp_termios,
592 						(struct termios __user *)arg))
593 			return -EFAULT;
594 	} else {
595 		if (user_termios_to_kernel_termios(&tmp_termios,
596 						(struct termios2 __user *)arg))
597 			return -EFAULT;
598 	}
599 #else
600 	} else if (user_termios_to_kernel_termios(&tmp_termios,
601 					(struct termios __user *)arg))
602 		return -EFAULT;
603 #endif
604 
605 	/* If old style Bfoo values are used then load c_ispeed/c_ospeed
606 	 * with the real speed so its unconditionally usable */
607 	tmp_termios.c_ispeed = tty_termios_input_baud_rate(&tmp_termios);
608 	tmp_termios.c_ospeed = tty_termios_baud_rate(&tmp_termios);
609 
610 	ld = tty_ldisc_ref(tty);
611 
612 	if (ld != NULL) {
613 		if ((opt & TERMIOS_FLUSH) && ld->ops->flush_buffer)
614 			ld->ops->flush_buffer(tty);
615 		tty_ldisc_deref(ld);
616 	}
617 
618 	if (opt & TERMIOS_WAIT) {
619 		tty_wait_until_sent(tty, 0);
620 		if (signal_pending(current))
621 			return -EINTR;
622 	}
623 
624 	tty_set_termios(tty, &tmp_termios);
625 
626 	/* FIXME: Arguably if tmp_termios == tty->termios AND the
627 	   actual requested termios was not tmp_termios then we may
628 	   want to return an error as no user requested change has
629 	   succeeded */
630 	return 0;
631 }
632 
633 static void copy_termios(struct tty_struct *tty, struct ktermios *kterm)
634 {
635 	mutex_lock(&tty->termios_mutex);
636 	memcpy(kterm, tty->termios, sizeof(struct ktermios));
637 	mutex_unlock(&tty->termios_mutex);
638 }
639 
640 static void copy_termios_locked(struct tty_struct *tty, struct ktermios *kterm)
641 {
642 	mutex_lock(&tty->termios_mutex);
643 	memcpy(kterm, tty->termios_locked, sizeof(struct ktermios));
644 	mutex_unlock(&tty->termios_mutex);
645 }
646 
647 static int get_termio(struct tty_struct *tty, struct termio __user *termio)
648 {
649 	struct ktermios kterm;
650 	copy_termios(tty, &kterm);
651 	if (kernel_termios_to_user_termio(termio, &kterm))
652 		return -EFAULT;
653 	return 0;
654 }
655 
656 
657 #ifdef TCGETX
658 
659 /**
660  *	set_termiox	-	set termiox fields if possible
661  *	@tty: terminal
662  *	@arg: termiox structure from user
663  *	@opt: option flags for ioctl type
664  *
665  *	Implement the device calling points for the SYS5 termiox ioctl
666  *	interface in Linux
667  */
668 
669 static int set_termiox(struct tty_struct *tty, void __user *arg, int opt)
670 {
671 	struct termiox tnew;
672 	struct tty_ldisc *ld;
673 
674 	if (tty->termiox == NULL)
675 		return -EINVAL;
676 	if (copy_from_user(&tnew, arg, sizeof(struct termiox)))
677 		return -EFAULT;
678 
679 	ld = tty_ldisc_ref(tty);
680 	if (ld != NULL) {
681 		if ((opt & TERMIOS_FLUSH) && ld->ops->flush_buffer)
682 			ld->ops->flush_buffer(tty);
683 		tty_ldisc_deref(ld);
684 	}
685 	if (opt & TERMIOS_WAIT) {
686 		tty_wait_until_sent(tty, 0);
687 		if (signal_pending(current))
688 			return -EINTR;
689 	}
690 
691 	mutex_lock(&tty->termios_mutex);
692 	if (tty->ops->set_termiox)
693 		tty->ops->set_termiox(tty, &tnew);
694 	mutex_unlock(&tty->termios_mutex);
695 	return 0;
696 }
697 
698 #endif
699 
700 
701 #ifdef TIOCGETP
702 /*
703  * These are deprecated, but there is limited support..
704  *
705  * The "sg_flags" translation is a joke..
706  */
707 static int get_sgflags(struct tty_struct *tty)
708 {
709 	int flags = 0;
710 
711 	if (!(tty->termios->c_lflag & ICANON)) {
712 		if (tty->termios->c_lflag & ISIG)
713 			flags |= 0x02;		/* cbreak */
714 		else
715 			flags |= 0x20;		/* raw */
716 	}
717 	if (tty->termios->c_lflag & ECHO)
718 		flags |= 0x08;			/* echo */
719 	if (tty->termios->c_oflag & OPOST)
720 		if (tty->termios->c_oflag & ONLCR)
721 			flags |= 0x10;		/* crmod */
722 	return flags;
723 }
724 
725 static int get_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb)
726 {
727 	struct sgttyb tmp;
728 
729 	mutex_lock(&tty->termios_mutex);
730 	tmp.sg_ispeed = tty->termios->c_ispeed;
731 	tmp.sg_ospeed = tty->termios->c_ospeed;
732 	tmp.sg_erase = tty->termios->c_cc[VERASE];
733 	tmp.sg_kill = tty->termios->c_cc[VKILL];
734 	tmp.sg_flags = get_sgflags(tty);
735 	mutex_unlock(&tty->termios_mutex);
736 
737 	return copy_to_user(sgttyb, &tmp, sizeof(tmp)) ? -EFAULT : 0;
738 }
739 
740 static void set_sgflags(struct ktermios *termios, int flags)
741 {
742 	termios->c_iflag = ICRNL | IXON;
743 	termios->c_oflag = 0;
744 	termios->c_lflag = ISIG | ICANON;
745 	if (flags & 0x02) {	/* cbreak */
746 		termios->c_iflag = 0;
747 		termios->c_lflag &= ~ICANON;
748 	}
749 	if (flags & 0x08) {		/* echo */
750 		termios->c_lflag |= ECHO | ECHOE | ECHOK |
751 				    ECHOCTL | ECHOKE | IEXTEN;
752 	}
753 	if (flags & 0x10) {		/* crmod */
754 		termios->c_oflag |= OPOST | ONLCR;
755 	}
756 	if (flags & 0x20) {	/* raw */
757 		termios->c_iflag = 0;
758 		termios->c_lflag &= ~(ISIG | ICANON);
759 	}
760 	if (!(termios->c_lflag & ICANON)) {
761 		termios->c_cc[VMIN] = 1;
762 		termios->c_cc[VTIME] = 0;
763 	}
764 }
765 
766 /**
767  *	set_sgttyb		-	set legacy terminal values
768  *	@tty: tty structure
769  *	@sgttyb: pointer to old style terminal structure
770  *
771  *	Updates a terminal from the legacy BSD style terminal information
772  *	structure.
773  *
774  *	Locking: termios_mutex
775  */
776 
777 static int set_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb)
778 {
779 	int retval;
780 	struct sgttyb tmp;
781 	struct ktermios termios;
782 
783 	retval = tty_check_change(tty);
784 	if (retval)
785 		return retval;
786 
787 	if (copy_from_user(&tmp, sgttyb, sizeof(tmp)))
788 		return -EFAULT;
789 
790 	mutex_lock(&tty->termios_mutex);
791 	termios = *tty->termios;
792 	termios.c_cc[VERASE] = tmp.sg_erase;
793 	termios.c_cc[VKILL] = tmp.sg_kill;
794 	set_sgflags(&termios, tmp.sg_flags);
795 	/* Try and encode into Bfoo format */
796 #ifdef BOTHER
797 	tty_termios_encode_baud_rate(&termios, termios.c_ispeed,
798 						termios.c_ospeed);
799 #endif
800 	mutex_unlock(&tty->termios_mutex);
801 	tty_set_termios(tty, &termios);
802 	return 0;
803 }
804 #endif
805 
806 #ifdef TIOCGETC
807 static int get_tchars(struct tty_struct *tty, struct tchars __user *tchars)
808 {
809 	struct tchars tmp;
810 
811 	mutex_lock(&tty->termios_mutex);
812 	tmp.t_intrc = tty->termios->c_cc[VINTR];
813 	tmp.t_quitc = tty->termios->c_cc[VQUIT];
814 	tmp.t_startc = tty->termios->c_cc[VSTART];
815 	tmp.t_stopc = tty->termios->c_cc[VSTOP];
816 	tmp.t_eofc = tty->termios->c_cc[VEOF];
817 	tmp.t_brkc = tty->termios->c_cc[VEOL2];	/* what is brkc anyway? */
818 	mutex_unlock(&tty->termios_mutex);
819 	return copy_to_user(tchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
820 }
821 
822 static int set_tchars(struct tty_struct *tty, struct tchars __user *tchars)
823 {
824 	struct tchars tmp;
825 
826 	if (copy_from_user(&tmp, tchars, sizeof(tmp)))
827 		return -EFAULT;
828 	mutex_lock(&tty->termios_mutex);
829 	tty->termios->c_cc[VINTR] = tmp.t_intrc;
830 	tty->termios->c_cc[VQUIT] = tmp.t_quitc;
831 	tty->termios->c_cc[VSTART] = tmp.t_startc;
832 	tty->termios->c_cc[VSTOP] = tmp.t_stopc;
833 	tty->termios->c_cc[VEOF] = tmp.t_eofc;
834 	tty->termios->c_cc[VEOL2] = tmp.t_brkc;	/* what is brkc anyway? */
835 	mutex_unlock(&tty->termios_mutex);
836 	return 0;
837 }
838 #endif
839 
840 #ifdef TIOCGLTC
841 static int get_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
842 {
843 	struct ltchars tmp;
844 
845 	mutex_lock(&tty->termios_mutex);
846 	tmp.t_suspc = tty->termios->c_cc[VSUSP];
847 	/* what is dsuspc anyway? */
848 	tmp.t_dsuspc = tty->termios->c_cc[VSUSP];
849 	tmp.t_rprntc = tty->termios->c_cc[VREPRINT];
850 	/* what is flushc anyway? */
851 	tmp.t_flushc = tty->termios->c_cc[VEOL2];
852 	tmp.t_werasc = tty->termios->c_cc[VWERASE];
853 	tmp.t_lnextc = tty->termios->c_cc[VLNEXT];
854 	mutex_unlock(&tty->termios_mutex);
855 	return copy_to_user(ltchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
856 }
857 
858 static int set_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
859 {
860 	struct ltchars tmp;
861 
862 	if (copy_from_user(&tmp, ltchars, sizeof(tmp)))
863 		return -EFAULT;
864 
865 	mutex_lock(&tty->termios_mutex);
866 	tty->termios->c_cc[VSUSP] = tmp.t_suspc;
867 	/* what is dsuspc anyway? */
868 	tty->termios->c_cc[VEOL2] = tmp.t_dsuspc;
869 	tty->termios->c_cc[VREPRINT] = tmp.t_rprntc;
870 	/* what is flushc anyway? */
871 	tty->termios->c_cc[VEOL2] = tmp.t_flushc;
872 	tty->termios->c_cc[VWERASE] = tmp.t_werasc;
873 	tty->termios->c_cc[VLNEXT] = tmp.t_lnextc;
874 	mutex_unlock(&tty->termios_mutex);
875 	return 0;
876 }
877 #endif
878 
879 /**
880  *	send_prio_char		-	send priority character
881  *
882  *	Send a high priority character to the tty even if stopped
883  *
884  *	Locking: none for xchar method, write ordering for write method.
885  */
886 
887 static int send_prio_char(struct tty_struct *tty, char ch)
888 {
889 	int	was_stopped = tty->stopped;
890 
891 	if (tty->ops->send_xchar) {
892 		tty->ops->send_xchar(tty, ch);
893 		return 0;
894 	}
895 
896 	if (tty_write_lock(tty, 0) < 0)
897 		return -ERESTARTSYS;
898 
899 	if (was_stopped)
900 		start_tty(tty);
901 	tty->ops->write(tty, &ch, 1);
902 	if (was_stopped)
903 		stop_tty(tty);
904 	tty_write_unlock(tty);
905 	return 0;
906 }
907 
908 /**
909  *	tty_change_softcar	-	carrier change ioctl helper
910  *	@tty: tty to update
911  *	@arg: enable/disable CLOCAL
912  *
913  *	Perform a change to the CLOCAL state and call into the driver
914  *	layer to make it visible. All done with the termios mutex
915  */
916 
917 static int tty_change_softcar(struct tty_struct *tty, int arg)
918 {
919 	int ret = 0;
920 	int bit = arg ? CLOCAL : 0;
921 	struct ktermios old;
922 
923 	mutex_lock(&tty->termios_mutex);
924 	old = *tty->termios;
925 	tty->termios->c_cflag &= ~CLOCAL;
926 	tty->termios->c_cflag |= bit;
927 	if (tty->ops->set_termios)
928 		tty->ops->set_termios(tty, &old);
929 	if ((tty->termios->c_cflag & CLOCAL) != bit)
930 		ret = -EINVAL;
931 	mutex_unlock(&tty->termios_mutex);
932 	return ret;
933 }
934 
935 /**
936  *	tty_mode_ioctl		-	mode related ioctls
937  *	@tty: tty for the ioctl
938  *	@file: file pointer for the tty
939  *	@cmd: command
940  *	@arg: ioctl argument
941  *
942  *	Perform non line discipline specific mode control ioctls. This
943  *	is designed to be called by line disciplines to ensure they provide
944  *	consistent mode setting.
945  */
946 
947 int tty_mode_ioctl(struct tty_struct *tty, struct file *file,
948 			unsigned int cmd, unsigned long arg)
949 {
950 	struct tty_struct *real_tty;
951 	void __user *p = (void __user *)arg;
952 	int ret = 0;
953 	struct ktermios kterm;
954 
955 	BUG_ON(file == NULL);
956 
957 	if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
958 	    tty->driver->subtype == PTY_TYPE_MASTER)
959 		real_tty = tty->link;
960 	else
961 		real_tty = tty;
962 
963 	switch (cmd) {
964 #ifdef TIOCGETP
965 	case TIOCGETP:
966 		return get_sgttyb(real_tty, (struct sgttyb __user *) arg);
967 	case TIOCSETP:
968 	case TIOCSETN:
969 		return set_sgttyb(real_tty, (struct sgttyb __user *) arg);
970 #endif
971 #ifdef TIOCGETC
972 	case TIOCGETC:
973 		return get_tchars(real_tty, p);
974 	case TIOCSETC:
975 		return set_tchars(real_tty, p);
976 #endif
977 #ifdef TIOCGLTC
978 	case TIOCGLTC:
979 		return get_ltchars(real_tty, p);
980 	case TIOCSLTC:
981 		return set_ltchars(real_tty, p);
982 #endif
983 	case TCSETSF:
984 		return set_termios(real_tty, p,  TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_OLD);
985 	case TCSETSW:
986 		return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_OLD);
987 	case TCSETS:
988 		return set_termios(real_tty, p, TERMIOS_OLD);
989 #ifndef TCGETS2
990 	case TCGETS:
991 		copy_termios(real_tty, &kterm);
992 		if (kernel_termios_to_user_termios((struct termios __user *)arg, &kterm))
993 			ret = -EFAULT;
994 		return ret;
995 #else
996 	case TCGETS:
997 		copy_termios(real_tty, &kterm);
998 		if (kernel_termios_to_user_termios_1((struct termios __user *)arg, &kterm))
999 			ret = -EFAULT;
1000 		return ret;
1001 	case TCGETS2:
1002 		copy_termios(real_tty, &kterm);
1003 		if (kernel_termios_to_user_termios((struct termios2 __user *)arg, &kterm))
1004 			ret = -EFAULT;
1005 		return ret;
1006 	case TCSETSF2:
1007 		return set_termios(real_tty, p,  TERMIOS_FLUSH | TERMIOS_WAIT);
1008 	case TCSETSW2:
1009 		return set_termios(real_tty, p, TERMIOS_WAIT);
1010 	case TCSETS2:
1011 		return set_termios(real_tty, p, 0);
1012 #endif
1013 	case TCGETA:
1014 		return get_termio(real_tty, p);
1015 	case TCSETAF:
1016 		return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_TERMIO);
1017 	case TCSETAW:
1018 		return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_TERMIO);
1019 	case TCSETA:
1020 		return set_termios(real_tty, p, TERMIOS_TERMIO);
1021 #ifndef TCGETS2
1022 	case TIOCGLCKTRMIOS:
1023 		copy_termios_locked(real_tty, &kterm);
1024 		if (kernel_termios_to_user_termios((struct termios __user *)arg, &kterm))
1025 			ret = -EFAULT;
1026 		return ret;
1027 	case TIOCSLCKTRMIOS:
1028 		if (!capable(CAP_SYS_ADMIN))
1029 			return -EPERM;
1030 		copy_termios_locked(real_tty, &kterm);
1031 		if (user_termios_to_kernel_termios(&kterm,
1032 					       (struct termios __user *) arg))
1033 			return -EFAULT;
1034 		mutex_lock(&real_tty->termios_mutex);
1035 		memcpy(real_tty->termios_locked, &kterm, sizeof(struct ktermios));
1036 		mutex_unlock(&real_tty->termios_mutex);
1037 		return 0;
1038 #else
1039 	case TIOCGLCKTRMIOS:
1040 		copy_termios_locked(real_tty, &kterm);
1041 		if (kernel_termios_to_user_termios_1((struct termios __user *)arg, &kterm))
1042 			ret = -EFAULT;
1043 		return ret;
1044 	case TIOCSLCKTRMIOS:
1045 		if (!capable(CAP_SYS_ADMIN))
1046 			return -EPERM;
1047 		copy_termios_locked(real_tty, &kterm);
1048 		if (user_termios_to_kernel_termios_1(&kterm,
1049 					       (struct termios __user *) arg))
1050 			return -EFAULT;
1051 		mutex_lock(&real_tty->termios_mutex);
1052 		memcpy(real_tty->termios_locked, &kterm, sizeof(struct ktermios));
1053 		mutex_unlock(&real_tty->termios_mutex);
1054 		return ret;
1055 #endif
1056 #ifdef TCGETX
1057 	case TCGETX: {
1058 		struct termiox ktermx;
1059 		if (real_tty->termiox == NULL)
1060 			return -EINVAL;
1061 		mutex_lock(&real_tty->termios_mutex);
1062 		memcpy(&ktermx, real_tty->termiox, sizeof(struct termiox));
1063 		mutex_unlock(&real_tty->termios_mutex);
1064 		if (copy_to_user(p, &ktermx, sizeof(struct termiox)))
1065 			ret = -EFAULT;
1066 		return ret;
1067 	}
1068 	case TCSETX:
1069 		return set_termiox(real_tty, p, 0);
1070 	case TCSETXW:
1071 		return set_termiox(real_tty, p, TERMIOS_WAIT);
1072 	case TCSETXF:
1073 		return set_termiox(real_tty, p, TERMIOS_FLUSH);
1074 #endif
1075 	case TIOCGSOFTCAR:
1076 		copy_termios(real_tty, &kterm);
1077 		ret = put_user((kterm.c_cflag & CLOCAL) ? 1 : 0,
1078 						(int __user *)arg);
1079 		return ret;
1080 	case TIOCSSOFTCAR:
1081 		if (get_user(arg, (unsigned int __user *) arg))
1082 			return -EFAULT;
1083 		return tty_change_softcar(real_tty, arg);
1084 	default:
1085 		return -ENOIOCTLCMD;
1086 	}
1087 }
1088 EXPORT_SYMBOL_GPL(tty_mode_ioctl);
1089 
1090 int tty_perform_flush(struct tty_struct *tty, unsigned long arg)
1091 {
1092 	struct tty_ldisc *ld;
1093 	int retval = tty_check_change(tty);
1094 	if (retval)
1095 		return retval;
1096 
1097 	ld = tty_ldisc_ref_wait(tty);
1098 	switch (arg) {
1099 	case TCIFLUSH:
1100 		if (ld && ld->ops->flush_buffer)
1101 			ld->ops->flush_buffer(tty);
1102 		break;
1103 	case TCIOFLUSH:
1104 		if (ld && ld->ops->flush_buffer)
1105 			ld->ops->flush_buffer(tty);
1106 		/* fall through */
1107 	case TCOFLUSH:
1108 		tty_driver_flush_buffer(tty);
1109 		break;
1110 	default:
1111 		tty_ldisc_deref(ld);
1112 		return -EINVAL;
1113 	}
1114 	tty_ldisc_deref(ld);
1115 	return 0;
1116 }
1117 EXPORT_SYMBOL_GPL(tty_perform_flush);
1118 
1119 int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file,
1120 		       unsigned int cmd, unsigned long arg)
1121 {
1122 	unsigned long flags;
1123 	int retval;
1124 
1125 	switch (cmd) {
1126 	case TCXONC:
1127 		retval = tty_check_change(tty);
1128 		if (retval)
1129 			return retval;
1130 		switch (arg) {
1131 		case TCOOFF:
1132 			if (!tty->flow_stopped) {
1133 				tty->flow_stopped = 1;
1134 				stop_tty(tty);
1135 			}
1136 			break;
1137 		case TCOON:
1138 			if (tty->flow_stopped) {
1139 				tty->flow_stopped = 0;
1140 				start_tty(tty);
1141 			}
1142 			break;
1143 		case TCIOFF:
1144 			if (STOP_CHAR(tty) != __DISABLED_CHAR)
1145 				return send_prio_char(tty, STOP_CHAR(tty));
1146 			break;
1147 		case TCION:
1148 			if (START_CHAR(tty) != __DISABLED_CHAR)
1149 				return send_prio_char(tty, START_CHAR(tty));
1150 			break;
1151 		default:
1152 			return -EINVAL;
1153 		}
1154 		return 0;
1155 	case TCFLSH:
1156 		return tty_perform_flush(tty, arg);
1157 	case TIOCPKT:
1158 	{
1159 		int pktmode;
1160 
1161 		if (tty->driver->type != TTY_DRIVER_TYPE_PTY ||
1162 		    tty->driver->subtype != PTY_TYPE_MASTER)
1163 			return -ENOTTY;
1164 		if (get_user(pktmode, (int __user *) arg))
1165 			return -EFAULT;
1166 		spin_lock_irqsave(&tty->ctrl_lock, flags);
1167 		if (pktmode) {
1168 			if (!tty->packet) {
1169 				tty->packet = 1;
1170 				tty->link->ctrl_status = 0;
1171 			}
1172 		} else
1173 			tty->packet = 0;
1174 		spin_unlock_irqrestore(&tty->ctrl_lock, flags);
1175 		return 0;
1176 	}
1177 	default:
1178 		/* Try the mode commands */
1179 		return tty_mode_ioctl(tty, file, cmd, arg);
1180 	}
1181 }
1182 EXPORT_SYMBOL(n_tty_ioctl_helper);
1183 
1184 #ifdef CONFIG_COMPAT
1185 long n_tty_compat_ioctl_helper(struct tty_struct *tty, struct file *file,
1186 					unsigned int cmd, unsigned long arg)
1187 {
1188 	switch (cmd) {
1189 	case TIOCGLCKTRMIOS:
1190 	case TIOCSLCKTRMIOS:
1191 		return tty_mode_ioctl(tty, file, cmd, (unsigned long) compat_ptr(arg));
1192 	default:
1193 		return -ENOIOCTLCMD;
1194 	}
1195 }
1196 EXPORT_SYMBOL(n_tty_compat_ioctl_helper);
1197 #endif
1198 
1199