blob: d27a08b374d050da20be594e332ffe026191b506 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * linux/drivers/char/tty_io.c
3 *
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 */
6
7/*
8 * 'tty_io.c' gives an orthogonal feeling to tty's, be they consoles
9 * or rs-channels. It also implements echoing, cooked mode etc.
10 *
11 * Kill-line thanks to John T Kohl, who also corrected VMIN = VTIME = 0.
12 *
13 * Modified by Theodore Ts'o, 9/14/92, to dynamically allocate the
14 * tty_struct and tty_queue structures. Previously there was an array
15 * of 256 tty_struct's which was statically allocated, and the
16 * tty_queue structures were allocated at boot time. Both are now
17 * dynamically allocated only when the tty is open.
18 *
19 * Also restructured routines so that there is more of a separation
20 * between the high-level tty routines (tty_io.c and tty_ioctl.c) and
21 * the low-level tty routines (serial.c, pty.c, console.c). This
Alan Cox37bdfb02008-02-08 04:18:47 -080022 * makes for cleaner and more compact code. -TYT, 9/17/92
Linus Torvalds1da177e2005-04-16 15:20:36 -070023 *
24 * Modified by Fred N. van Kempen, 01/29/93, to add line disciplines
25 * which can be dynamically activated and de-activated by the line
26 * discipline handling modules (like SLIP).
27 *
28 * NOTE: pay no attention to the line discipline code (yet); its
29 * interface is still subject to change in this version...
30 * -- TYT, 1/31/92
31 *
32 * Added functionality to the OPOST tty handling. No delays, but all
33 * other bits should be there.
34 * -- Nick Holloway <alfie@dcs.warwick.ac.uk>, 27th May 1993.
35 *
36 * Rewrote canonical mode and added more termios flags.
37 * -- julian@uhunix.uhcc.hawaii.edu (J. Cowley), 13Jan94
38 *
39 * Reorganized FASYNC support so mouse code can share it.
40 * -- ctm@ardi.com, 9Sep95
41 *
42 * New TIOCLINUX variants added.
43 * -- mj@k332.feld.cvut.cz, 19-Nov-95
Alan Cox37bdfb02008-02-08 04:18:47 -080044 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070045 * Restrict vt switching via ioctl()
46 * -- grif@cs.ucr.edu, 5-Dec-95
47 *
48 * Move console and virtual terminal code to more appropriate files,
49 * implement CONFIG_VT and generalize console device interface.
50 * -- Marko Kohtala <Marko.Kohtala@hut.fi>, March 97
51 *
52 * Rewrote init_dev and release_dev to eliminate races.
53 * -- Bill Hawes <whawes@star.net>, June 97
54 *
55 * Added devfs support.
56 * -- C. Scott Ananian <cananian@alumni.princeton.edu>, 13-Jan-1998
57 *
58 * Added support for a Unix98-style ptmx device.
59 * -- C. Scott Ananian <cananian@alumni.princeton.edu>, 14-Jan-1998
60 *
61 * Reduced memory usage for older ARM systems
62 * -- Russell King <rmk@arm.linux.org.uk>
63 *
64 * Move do_SAK() into process context. Less stack use in devfs functions.
Alan Cox37bdfb02008-02-08 04:18:47 -080065 * alloc_tty_struct() always uses kmalloc()
66 * -- Andrew Morton <andrewm@uow.edu.eu> 17Mar01
Linus Torvalds1da177e2005-04-16 15:20:36 -070067 */
68
Linus Torvalds1da177e2005-04-16 15:20:36 -070069#include <linux/types.h>
70#include <linux/major.h>
71#include <linux/errno.h>
72#include <linux/signal.h>
73#include <linux/fcntl.h>
74#include <linux/sched.h>
75#include <linux/interrupt.h>
76#include <linux/tty.h>
77#include <linux/tty_driver.h>
78#include <linux/tty_flip.h>
79#include <linux/devpts_fs.h>
80#include <linux/file.h>
Al Viro9f3acc32008-04-24 07:44:08 -040081#include <linux/fdtable.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070082#include <linux/console.h>
83#include <linux/timer.h>
84#include <linux/ctype.h>
85#include <linux/kd.h>
86#include <linux/mm.h>
87#include <linux/string.h>
88#include <linux/slab.h>
89#include <linux/poll.h>
90#include <linux/proc_fs.h>
91#include <linux/init.h>
92#include <linux/module.h>
93#include <linux/smp_lock.h>
94#include <linux/device.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070095#include <linux/wait.h>
96#include <linux/bitops.h>
Domen Puncerb20f3ae2005-06-25 14:58:42 -070097#include <linux/delay.h>
Alan Coxa352def2008-07-16 21:53:12 +010098#include <linux/seq_file.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070099
Alan Coxa352def2008-07-16 21:53:12 +0100100#include <linux/uaccess.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700101#include <asm/system.h>
102
103#include <linux/kbd_kern.h>
104#include <linux/vt_kern.h>
105#include <linux/selection.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700106
107#include <linux/kmod.h>
Pavel Emelyanovb4888932007-10-18 23:40:14 -0700108#include <linux/nsproxy.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700109
110#undef TTY_DEBUG_HANGUP
111
112#define TTY_PARANOIA_CHECK 1
113#define CHECK_TTY_COUNT 1
114
Alan Coxedc6afc2006-12-08 02:38:44 -0800115struct ktermios tty_std_termios = { /* for the benefit of tty drivers */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116 .c_iflag = ICRNL | IXON,
117 .c_oflag = OPOST | ONLCR,
118 .c_cflag = B38400 | CS8 | CREAD | HUPCL,
119 .c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK |
120 ECHOCTL | ECHOKE | IEXTEN,
Alan Coxedc6afc2006-12-08 02:38:44 -0800121 .c_cc = INIT_C_CC,
122 .c_ispeed = 38400,
123 .c_ospeed = 38400
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124};
125
126EXPORT_SYMBOL(tty_std_termios);
127
128/* This list gets poked at by procfs and various bits of boot up code. This
129 could do with some rationalisation such as pulling the tty proc function
130 into this file */
Alan Cox37bdfb02008-02-08 04:18:47 -0800131
Linus Torvalds1da177e2005-04-16 15:20:36 -0700132LIST_HEAD(tty_drivers); /* linked list of tty drivers */
133
Peter Zijlstra24ec8392006-12-08 02:36:04 -0800134/* Mutex to protect creating and releasing a tty. This is shared with
Linus Torvalds1da177e2005-04-16 15:20:36 -0700135 vt.c for deeply disgusting hack reasons */
Ingo Molnar70522e12006-03-23 03:00:31 -0800136DEFINE_MUTEX(tty_mutex);
Alan Coxde2a84f2006-09-29 02:00:57 -0700137EXPORT_SYMBOL(tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700138
139#ifdef CONFIG_UNIX98_PTYS
140extern struct tty_driver *ptm_driver; /* Unix98 pty masters; for /dev/ptmx */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700141static int ptmx_open(struct inode *, struct file *);
142#endif
143
Linus Torvalds1da177e2005-04-16 15:20:36 -0700144static void initialize_tty_struct(struct tty_struct *tty);
145
146static ssize_t tty_read(struct file *, char __user *, size_t, loff_t *);
147static ssize_t tty_write(struct file *, const char __user *, size_t, loff_t *);
Alan Cox37bdfb02008-02-08 04:18:47 -0800148ssize_t redirected_tty_write(struct file *, const char __user *,
149 size_t, loff_t *);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700150static unsigned int tty_poll(struct file *, poll_table *);
151static int tty_open(struct inode *, struct file *);
152static int tty_release(struct inode *, struct file *);
Alan Cox04f378b2008-04-30 00:53:29 -0700153long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
Paul Fulghume10cc1d2007-05-10 22:22:50 -0700154#ifdef CONFIG_COMPAT
Alan Cox37bdfb02008-02-08 04:18:47 -0800155static long tty_compat_ioctl(struct file *file, unsigned int cmd,
Paul Fulghume10cc1d2007-05-10 22:22:50 -0700156 unsigned long arg);
157#else
158#define tty_compat_ioctl NULL
159#endif
Alan Cox37bdfb02008-02-08 04:18:47 -0800160static int tty_fasync(int fd, struct file *filp, int on);
Christoph Hellwigd5698c22007-02-10 01:46:46 -0800161static void release_tty(struct tty_struct *tty, int idx);
Eric W. Biederman2a65f1d2007-05-08 00:26:53 -0700162static void __proc_set_tty(struct task_struct *tsk, struct tty_struct *tty);
Eric W. Biederman98a27ba2007-05-08 00:26:56 -0700163static void proc_set_tty(struct task_struct *tsk, struct tty_struct *tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700164
Alan Coxaf9b8972006-08-27 01:24:01 -0700165/**
166 * alloc_tty_struct - allocate a tty object
167 *
168 * Return a new empty tty structure. The data fields have not
169 * been initialized in any way but has been zeroed
170 *
171 * Locking: none
Alan Coxaf9b8972006-08-27 01:24:01 -0700172 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700173
174static struct tty_struct *alloc_tty_struct(void)
175{
Alan Cox1266b1e2006-09-29 02:00:40 -0700176 return kzalloc(sizeof(struct tty_struct), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700177}
178
Alan Cox33f0f882006-01-09 20:54:13 -0800179static void tty_buffer_free_all(struct tty_struct *);
180
Alan Coxaf9b8972006-08-27 01:24:01 -0700181/**
182 * free_tty_struct - free a disused tty
183 * @tty: tty struct to free
184 *
185 * Free the write buffers, tty queue and tty memory itself.
186 *
187 * Locking: none. Must be called after tty is definitely unused
188 */
189
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190static inline void free_tty_struct(struct tty_struct *tty)
191{
192 kfree(tty->write_buf);
Alan Cox33f0f882006-01-09 20:54:13 -0800193 tty_buffer_free_all(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700194 kfree(tty);
195}
196
197#define TTY_NUMBER(tty) ((tty)->index + (tty)->driver->name_base)
198
Alan Coxaf9b8972006-08-27 01:24:01 -0700199/**
200 * tty_name - return tty naming
201 * @tty: tty structure
202 * @buf: buffer for output
203 *
204 * Convert a tty structure into a name. The name reflects the kernel
205 * naming policy and if udev is in use may not reflect user space
206 *
207 * Locking: none
208 */
209
Linus Torvalds1da177e2005-04-16 15:20:36 -0700210char *tty_name(struct tty_struct *tty, char *buf)
211{
212 if (!tty) /* Hmm. NULL pointer. That's fun. */
213 strcpy(buf, "NULL tty");
214 else
215 strcpy(buf, tty->name);
216 return buf;
217}
218
219EXPORT_SYMBOL(tty_name);
220
Andrew Mortond769a662005-05-05 16:15:50 -0700221int tty_paranoia_check(struct tty_struct *tty, struct inode *inode,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700222 const char *routine)
223{
224#ifdef TTY_PARANOIA_CHECK
225 if (!tty) {
226 printk(KERN_WARNING
227 "null TTY for (%d:%d) in %s\n",
228 imajor(inode), iminor(inode), routine);
229 return 1;
230 }
231 if (tty->magic != TTY_MAGIC) {
232 printk(KERN_WARNING
233 "bad magic number for tty struct (%d:%d) in %s\n",
234 imajor(inode), iminor(inode), routine);
235 return 1;
236 }
237#endif
238 return 0;
239}
240
241static int check_tty_count(struct tty_struct *tty, const char *routine)
242{
243#ifdef CHECK_TTY_COUNT
244 struct list_head *p;
245 int count = 0;
Alan Cox37bdfb02008-02-08 04:18:47 -0800246
Linus Torvalds1da177e2005-04-16 15:20:36 -0700247 file_list_lock();
248 list_for_each(p, &tty->tty_files) {
249 count++;
250 }
251 file_list_unlock();
252 if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
253 tty->driver->subtype == PTY_TYPE_SLAVE &&
254 tty->link && tty->link->count)
255 count++;
256 if (tty->count != count) {
257 printk(KERN_WARNING "Warning: dev (%s) tty->count(%d) "
258 "!= #fd's(%d) in %s\n",
259 tty->name, tty->count, count, routine);
260 return count;
Peter Zijlstra24ec8392006-12-08 02:36:04 -0800261 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700262#endif
263 return 0;
264}
265
266/*
Alan Cox33f0f882006-01-09 20:54:13 -0800267 * Tty buffer allocation management
268 */
269
Alan Cox01da5fd2006-08-27 01:24:02 -0700270/**
271 * tty_buffer_free_all - free buffers used by a tty
272 * @tty: tty to free from
273 *
274 * Remove all the buffers pending on a tty whether queued with data
275 * or in the free ring. Must be called when the tty is no longer in use
276 *
277 * Locking: none
278 */
279
Alan Cox33f0f882006-01-09 20:54:13 -0800280static void tty_buffer_free_all(struct tty_struct *tty)
281{
282 struct tty_buffer *thead;
Alan Cox37bdfb02008-02-08 04:18:47 -0800283 while ((thead = tty->buf.head) != NULL) {
Alan Cox33f0f882006-01-09 20:54:13 -0800284 tty->buf.head = thead->next;
285 kfree(thead);
286 }
Alan Cox37bdfb02008-02-08 04:18:47 -0800287 while ((thead = tty->buf.free) != NULL) {
Alan Cox33f0f882006-01-09 20:54:13 -0800288 tty->buf.free = thead->next;
289 kfree(thead);
290 }
291 tty->buf.tail = NULL;
Alan Cox01da5fd2006-08-27 01:24:02 -0700292 tty->buf.memory_used = 0;
Alan Cox33f0f882006-01-09 20:54:13 -0800293}
294
Alan Cox01da5fd2006-08-27 01:24:02 -0700295/**
296 * tty_buffer_init - prepare a tty buffer structure
297 * @tty: tty to initialise
298 *
299 * Set up the initial state of the buffer management for a tty device.
300 * Must be called before the other tty buffer functions are used.
301 *
302 * Locking: none
303 */
304
Alan Cox33f0f882006-01-09 20:54:13 -0800305static void tty_buffer_init(struct tty_struct *tty)
306{
Paul Fulghum808249c2006-02-03 03:04:41 -0800307 spin_lock_init(&tty->buf.lock);
Alan Cox33f0f882006-01-09 20:54:13 -0800308 tty->buf.head = NULL;
309 tty->buf.tail = NULL;
310 tty->buf.free = NULL;
Alan Cox01da5fd2006-08-27 01:24:02 -0700311 tty->buf.memory_used = 0;
Alan Cox33f0f882006-01-09 20:54:13 -0800312}
313
Alan Cox01da5fd2006-08-27 01:24:02 -0700314/**
315 * tty_buffer_alloc - allocate a tty buffer
316 * @tty: tty device
317 * @size: desired size (characters)
318 *
319 * Allocate a new tty buffer to hold the desired number of characters.
320 * Return NULL if out of memory or the allocation would exceed the
321 * per device queue
322 *
323 * Locking: Caller must hold tty->buf.lock
324 */
325
326static struct tty_buffer *tty_buffer_alloc(struct tty_struct *tty, size_t size)
Alan Cox33f0f882006-01-09 20:54:13 -0800327{
Alan Cox01da5fd2006-08-27 01:24:02 -0700328 struct tty_buffer *p;
329
330 if (tty->buf.memory_used + size > 65536)
331 return NULL;
332 p = kmalloc(sizeof(struct tty_buffer) + 2 * size, GFP_ATOMIC);
Alan Cox37bdfb02008-02-08 04:18:47 -0800333 if (p == NULL)
Alan Cox33f0f882006-01-09 20:54:13 -0800334 return NULL;
335 p->used = 0;
336 p->size = size;
337 p->next = NULL;
Paul Fulghum8977d922006-02-10 01:51:14 -0800338 p->commit = 0;
339 p->read = 0;
Alan Cox33f0f882006-01-09 20:54:13 -0800340 p->char_buf_ptr = (char *)(p->data);
341 p->flag_buf_ptr = (unsigned char *)p->char_buf_ptr + size;
Alan Cox01da5fd2006-08-27 01:24:02 -0700342 tty->buf.memory_used += size;
Alan Cox33f0f882006-01-09 20:54:13 -0800343 return p;
344}
345
Alan Cox01da5fd2006-08-27 01:24:02 -0700346/**
347 * tty_buffer_free - free a tty buffer
348 * @tty: tty owning the buffer
349 * @b: the buffer to free
350 *
351 * Free a tty buffer, or add it to the free list according to our
352 * internal strategy
353 *
354 * Locking: Caller must hold tty->buf.lock
355 */
Alan Cox33f0f882006-01-09 20:54:13 -0800356
357static void tty_buffer_free(struct tty_struct *tty, struct tty_buffer *b)
358{
359 /* Dumb strategy for now - should keep some stats */
Alan Cox01da5fd2006-08-27 01:24:02 -0700360 tty->buf.memory_used -= b->size;
361 WARN_ON(tty->buf.memory_used < 0);
362
Alan Cox37bdfb02008-02-08 04:18:47 -0800363 if (b->size >= 512)
Alan Cox33f0f882006-01-09 20:54:13 -0800364 kfree(b);
365 else {
366 b->next = tty->buf.free;
367 tty->buf.free = b;
368 }
369}
370
Alan Cox01da5fd2006-08-27 01:24:02 -0700371/**
Alan Cox42fd5522007-08-10 13:01:05 -0700372 * __tty_buffer_flush - flush full tty buffers
373 * @tty: tty to flush
374 *
375 * flush all the buffers containing receive data. Caller must
376 * hold the buffer lock and must have ensured no parallel flush to
377 * ldisc is running.
378 *
379 * Locking: Caller must hold tty->buf.lock
380 */
381
382static void __tty_buffer_flush(struct tty_struct *tty)
383{
384 struct tty_buffer *thead;
385
Alan Cox37bdfb02008-02-08 04:18:47 -0800386 while ((thead = tty->buf.head) != NULL) {
Alan Cox42fd5522007-08-10 13:01:05 -0700387 tty->buf.head = thead->next;
388 tty_buffer_free(tty, thead);
389 }
390 tty->buf.tail = NULL;
391}
392
393/**
Paul Fulghumc5c34d42007-05-12 10:36:55 -0700394 * tty_buffer_flush - flush full tty buffers
395 * @tty: tty to flush
396 *
Alan Cox42fd5522007-08-10 13:01:05 -0700397 * flush all the buffers containing receive data. If the buffer is
398 * being processed by flush_to_ldisc then we defer the processing
399 * to that function
Paul Fulghumc5c34d42007-05-12 10:36:55 -0700400 *
401 * Locking: none
402 */
403
404static void tty_buffer_flush(struct tty_struct *tty)
405{
Paul Fulghumc5c34d42007-05-12 10:36:55 -0700406 unsigned long flags;
Paul Fulghumc5c34d42007-05-12 10:36:55 -0700407 spin_lock_irqsave(&tty->buf.lock, flags);
Alan Cox42fd5522007-08-10 13:01:05 -0700408
409 /* If the data is being pushed to the tty layer then we can't
410 process it here. Instead set a flag and the flush_to_ldisc
411 path will process the flush request before it exits */
412 if (test_bit(TTY_FLUSHING, &tty->flags)) {
413 set_bit(TTY_FLUSHPENDING, &tty->flags);
414 spin_unlock_irqrestore(&tty->buf.lock, flags);
415 wait_event(tty->read_wait,
416 test_bit(TTY_FLUSHPENDING, &tty->flags) == 0);
417 return;
418 } else
419 __tty_buffer_flush(tty);
Paul Fulghumc5c34d42007-05-12 10:36:55 -0700420 spin_unlock_irqrestore(&tty->buf.lock, flags);
421}
422
423/**
Alan Cox01da5fd2006-08-27 01:24:02 -0700424 * tty_buffer_find - find a free tty buffer
425 * @tty: tty owning the buffer
426 * @size: characters wanted
427 *
428 * Locate an existing suitable tty buffer or if we are lacking one then
429 * allocate a new one. We round our buffers off in 256 character chunks
430 * to get better allocation behaviour.
431 *
432 * Locking: Caller must hold tty->buf.lock
433 */
434
Alan Cox33f0f882006-01-09 20:54:13 -0800435static struct tty_buffer *tty_buffer_find(struct tty_struct *tty, size_t size)
436{
437 struct tty_buffer **tbh = &tty->buf.free;
Alan Cox37bdfb02008-02-08 04:18:47 -0800438 while ((*tbh) != NULL) {
Alan Cox33f0f882006-01-09 20:54:13 -0800439 struct tty_buffer *t = *tbh;
Alan Cox37bdfb02008-02-08 04:18:47 -0800440 if (t->size >= size) {
Alan Cox33f0f882006-01-09 20:54:13 -0800441 *tbh = t->next;
442 t->next = NULL;
443 t->used = 0;
Paul Fulghum8977d922006-02-10 01:51:14 -0800444 t->commit = 0;
445 t->read = 0;
Alan Cox01da5fd2006-08-27 01:24:02 -0700446 tty->buf.memory_used += t->size;
Alan Cox33f0f882006-01-09 20:54:13 -0800447 return t;
448 }
449 tbh = &((*tbh)->next);
450 }
451 /* Round the buffer size out */
Alan Cox37bdfb02008-02-08 04:18:47 -0800452 size = (size + 0xFF) & ~0xFF;
Alan Cox01da5fd2006-08-27 01:24:02 -0700453 return tty_buffer_alloc(tty, size);
Alan Cox33f0f882006-01-09 20:54:13 -0800454 /* Should possibly check if this fails for the largest buffer we
455 have queued and recycle that ? */
456}
457
Alan Cox01da5fd2006-08-27 01:24:02 -0700458/**
459 * tty_buffer_request_room - grow tty buffer if needed
460 * @tty: tty structure
461 * @size: size desired
462 *
463 * Make at least size bytes of linear space available for the tty
464 * buffer. If we fail return the size we managed to find.
465 *
466 * Locking: Takes tty->buf.lock
467 */
Alan Cox33f0f882006-01-09 20:54:13 -0800468int tty_buffer_request_room(struct tty_struct *tty, size_t size)
469{
Paul Fulghum808249c2006-02-03 03:04:41 -0800470 struct tty_buffer *b, *n;
471 int left;
472 unsigned long flags;
473
474 spin_lock_irqsave(&tty->buf.lock, flags);
Alan Cox33f0f882006-01-09 20:54:13 -0800475
476 /* OPTIMISATION: We could keep a per tty "zero" sized buffer to
477 remove this conditional if its worth it. This would be invisible
478 to the callers */
Paul Fulghum33b37a32006-06-28 04:26:49 -0700479 if ((b = tty->buf.tail) != NULL)
Alan Cox33f0f882006-01-09 20:54:13 -0800480 left = b->size - b->used;
Paul Fulghum33b37a32006-06-28 04:26:49 -0700481 else
Paul Fulghum808249c2006-02-03 03:04:41 -0800482 left = 0;
483
484 if (left < size) {
485 /* This is the slow path - looking for new buffers to use */
486 if ((n = tty_buffer_find(tty, size)) != NULL) {
487 if (b != NULL) {
488 b->next = n;
Paul Fulghum8977d922006-02-10 01:51:14 -0800489 b->commit = b->used;
Paul Fulghum808249c2006-02-03 03:04:41 -0800490 } else
491 tty->buf.head = n;
492 tty->buf.tail = n;
Paul Fulghum808249c2006-02-03 03:04:41 -0800493 } else
494 size = left;
495 }
496
497 spin_unlock_irqrestore(&tty->buf.lock, flags);
Alan Cox33f0f882006-01-09 20:54:13 -0800498 return size;
499}
Alan Cox33f0f882006-01-09 20:54:13 -0800500EXPORT_SYMBOL_GPL(tty_buffer_request_room);
501
Alan Coxaf9b8972006-08-27 01:24:01 -0700502/**
503 * tty_insert_flip_string - Add characters to the tty buffer
504 * @tty: tty structure
505 * @chars: characters
506 * @size: size
507 *
508 * Queue a series of bytes to the tty buffering. All the characters
509 * passed are marked as without error. Returns the number added.
510 *
511 * Locking: Called functions may take tty->buf.lock
512 */
513
Andrew Mortone1a25092006-04-10 22:54:05 -0700514int tty_insert_flip_string(struct tty_struct *tty, const unsigned char *chars,
515 size_t size)
Alan Cox33f0f882006-01-09 20:54:13 -0800516{
517 int copied = 0;
518 do {
519 int space = tty_buffer_request_room(tty, size - copied);
520 struct tty_buffer *tb = tty->buf.tail;
521 /* If there is no space then tb may be NULL */
Alan Cox37bdfb02008-02-08 04:18:47 -0800522 if (unlikely(space == 0))
Alan Cox33f0f882006-01-09 20:54:13 -0800523 break;
524 memcpy(tb->char_buf_ptr + tb->used, chars, space);
525 memset(tb->flag_buf_ptr + tb->used, TTY_NORMAL, space);
526 tb->used += space;
527 copied += space;
528 chars += space;
Alexey Dobriyan527063b2006-09-29 01:59:50 -0700529 /* There is a small chance that we need to split the data over
530 several buffers. If this is the case we must loop */
531 } while (unlikely(size > copied));
Alan Cox33f0f882006-01-09 20:54:13 -0800532 return copied;
533}
Andrew Mortonee37df72006-03-31 02:30:35 -0800534EXPORT_SYMBOL(tty_insert_flip_string);
Alan Cox33f0f882006-01-09 20:54:13 -0800535
Alan Coxaf9b8972006-08-27 01:24:01 -0700536/**
537 * tty_insert_flip_string_flags - Add characters to the tty buffer
538 * @tty: tty structure
539 * @chars: characters
540 * @flags: flag bytes
541 * @size: size
542 *
543 * Queue a series of bytes to the tty buffering. For each character
544 * the flags array indicates the status of the character. Returns the
545 * number added.
546 *
547 * Locking: Called functions may take tty->buf.lock
548 */
549
Andrew Mortone1a25092006-04-10 22:54:05 -0700550int tty_insert_flip_string_flags(struct tty_struct *tty,
551 const unsigned char *chars, const char *flags, size_t size)
Alan Cox33f0f882006-01-09 20:54:13 -0800552{
553 int copied = 0;
554 do {
555 int space = tty_buffer_request_room(tty, size - copied);
556 struct tty_buffer *tb = tty->buf.tail;
557 /* If there is no space then tb may be NULL */
Alan Cox37bdfb02008-02-08 04:18:47 -0800558 if (unlikely(space == 0))
Alan Cox33f0f882006-01-09 20:54:13 -0800559 break;
560 memcpy(tb->char_buf_ptr + tb->used, chars, space);
561 memcpy(tb->flag_buf_ptr + tb->used, flags, space);
562 tb->used += space;
563 copied += space;
564 chars += space;
565 flags += space;
Alexey Dobriyan527063b2006-09-29 01:59:50 -0700566 /* There is a small chance that we need to split the data over
567 several buffers. If this is the case we must loop */
568 } while (unlikely(size > copied));
Alan Cox33f0f882006-01-09 20:54:13 -0800569 return copied;
570}
Tobias Powalowskiff4547f2006-05-22 22:35:28 -0700571EXPORT_SYMBOL(tty_insert_flip_string_flags);
Alan Cox33f0f882006-01-09 20:54:13 -0800572
Alan Coxaf9b8972006-08-27 01:24:01 -0700573/**
574 * tty_schedule_flip - push characters to ldisc
575 * @tty: tty to push from
576 *
577 * Takes any pending buffers and transfers their ownership to the
578 * ldisc side of the queue. It then schedules those characters for
579 * processing by the line discipline.
580 *
581 * Locking: Takes tty->buf.lock
582 */
583
Andrew Mortone1a25092006-04-10 22:54:05 -0700584void tty_schedule_flip(struct tty_struct *tty)
585{
586 unsigned long flags;
587 spin_lock_irqsave(&tty->buf.lock, flags);
Paul Fulghum33b37a32006-06-28 04:26:49 -0700588 if (tty->buf.tail != NULL)
Andrew Mortone1a25092006-04-10 22:54:05 -0700589 tty->buf.tail->commit = tty->buf.tail->used;
Andrew Mortone1a25092006-04-10 22:54:05 -0700590 spin_unlock_irqrestore(&tty->buf.lock, flags);
591 schedule_delayed_work(&tty->buf.work, 1);
592}
593EXPORT_SYMBOL(tty_schedule_flip);
Alan Cox33f0f882006-01-09 20:54:13 -0800594
Alan Coxaf9b8972006-08-27 01:24:01 -0700595/**
596 * tty_prepare_flip_string - make room for characters
597 * @tty: tty
598 * @chars: return pointer for character write area
599 * @size: desired size
600 *
Alan Cox33f0f882006-01-09 20:54:13 -0800601 * Prepare a block of space in the buffer for data. Returns the length
602 * available and buffer pointer to the space which is now allocated and
603 * accounted for as ready for normal characters. This is used for drivers
604 * that need their own block copy routines into the buffer. There is no
605 * guarantee the buffer is a DMA target!
Alan Coxaf9b8972006-08-27 01:24:01 -0700606 *
607 * Locking: May call functions taking tty->buf.lock
Alan Cox33f0f882006-01-09 20:54:13 -0800608 */
609
Alan Cox37bdfb02008-02-08 04:18:47 -0800610int tty_prepare_flip_string(struct tty_struct *tty, unsigned char **chars,
611 size_t size)
Alan Cox33f0f882006-01-09 20:54:13 -0800612{
613 int space = tty_buffer_request_room(tty, size);
Paul Fulghum808249c2006-02-03 03:04:41 -0800614 if (likely(space)) {
615 struct tty_buffer *tb = tty->buf.tail;
616 *chars = tb->char_buf_ptr + tb->used;
617 memset(tb->flag_buf_ptr + tb->used, TTY_NORMAL, space);
618 tb->used += space;
619 }
Alan Cox33f0f882006-01-09 20:54:13 -0800620 return space;
621}
622
623EXPORT_SYMBOL_GPL(tty_prepare_flip_string);
624
Alan Coxaf9b8972006-08-27 01:24:01 -0700625/**
626 * tty_prepare_flip_string_flags - make room for characters
627 * @tty: tty
628 * @chars: return pointer for character write area
629 * @flags: return pointer for status flag write area
630 * @size: desired size
631 *
Alan Cox33f0f882006-01-09 20:54:13 -0800632 * Prepare a block of space in the buffer for data. Returns the length
633 * available and buffer pointer to the space which is now allocated and
634 * accounted for as ready for characters. This is used for drivers
635 * that need their own block copy routines into the buffer. There is no
636 * guarantee the buffer is a DMA target!
Alan Coxaf9b8972006-08-27 01:24:01 -0700637 *
638 * Locking: May call functions taking tty->buf.lock
Alan Cox33f0f882006-01-09 20:54:13 -0800639 */
640
Alan Cox37bdfb02008-02-08 04:18:47 -0800641int tty_prepare_flip_string_flags(struct tty_struct *tty,
642 unsigned char **chars, char **flags, size_t size)
Alan Cox33f0f882006-01-09 20:54:13 -0800643{
644 int space = tty_buffer_request_room(tty, size);
Paul Fulghum808249c2006-02-03 03:04:41 -0800645 if (likely(space)) {
646 struct tty_buffer *tb = tty->buf.tail;
647 *chars = tb->char_buf_ptr + tb->used;
648 *flags = tb->flag_buf_ptr + tb->used;
649 tb->used += space;
650 }
Alan Cox33f0f882006-01-09 20:54:13 -0800651 return space;
652}
653
654EXPORT_SYMBOL_GPL(tty_prepare_flip_string_flags);
655
656
657
Alan Coxaf9b8972006-08-27 01:24:01 -0700658/**
Alan Coxaf9b8972006-08-27 01:24:01 -0700659 * get_tty_driver - find device of a tty
660 * @dev_t: device identifier
661 * @index: returns the index of the tty
662 *
663 * This routine returns a tty driver structure, given a device number
664 * and also passes back the index number.
665 *
666 * Locking: caller must hold tty_mutex
Linus Torvalds1da177e2005-04-16 15:20:36 -0700667 */
Alan Coxaf9b8972006-08-27 01:24:01 -0700668
Linus Torvalds1da177e2005-04-16 15:20:36 -0700669static struct tty_driver *get_tty_driver(dev_t device, int *index)
670{
671 struct tty_driver *p;
672
673 list_for_each_entry(p, &tty_drivers, tty_drivers) {
674 dev_t base = MKDEV(p->major, p->minor_start);
675 if (device < base || device >= base + p->num)
676 continue;
677 *index = device - base;
678 return p;
679 }
680 return NULL;
681}
682
Jason Wesself2d937f2008-04-17 20:05:37 +0200683#ifdef CONFIG_CONSOLE_POLL
684
685/**
686 * tty_find_polling_driver - find device of a polled tty
687 * @name: name string to match
688 * @line: pointer to resulting tty line nr
689 *
690 * This routine returns a tty driver structure, given a name
691 * and the condition that the tty driver is capable of polled
692 * operation.
693 */
694struct tty_driver *tty_find_polling_driver(char *name, int *line)
695{
696 struct tty_driver *p, *res = NULL;
697 int tty_line = 0;
698 char *str;
699
700 mutex_lock(&tty_mutex);
701 /* Search through the tty devices to look for a match */
702 list_for_each_entry(p, &tty_drivers, tty_drivers) {
703 str = name + strlen(p->name);
704 tty_line = simple_strtoul(str, &str, 10);
705 if (*str == ',')
706 str++;
707 if (*str == '\0')
Harvey Harrison8da56302008-04-28 14:13:20 -0700708 str = NULL;
Jason Wesself2d937f2008-04-17 20:05:37 +0200709
Alan Coxf34d7a52008-04-30 00:54:13 -0700710 if (tty_line >= 0 && tty_line <= p->num && p->ops &&
711 p->ops->poll_init && !p->ops->poll_init(p, tty_line, str)) {
Jason Wesself2d937f2008-04-17 20:05:37 +0200712 res = p;
713 *line = tty_line;
714 break;
715 }
716 }
717 mutex_unlock(&tty_mutex);
718
719 return res;
720}
721EXPORT_SYMBOL_GPL(tty_find_polling_driver);
722#endif
723
Alan Coxaf9b8972006-08-27 01:24:01 -0700724/**
725 * tty_check_change - check for POSIX terminal changes
726 * @tty: tty to check
727 *
728 * If we try to write to, or set the state of, a terminal and we're
729 * not in the foreground, send a SIGTTOU. If the signal is blocked or
730 * ignored, go ahead and perform the operation. (POSIX 7.2)
731 *
Alan Cox978e5952008-04-30 00:53:59 -0700732 * Locking: ctrl_lock
Linus Torvalds1da177e2005-04-16 15:20:36 -0700733 */
Alan Coxaf9b8972006-08-27 01:24:01 -0700734
Alan Cox37bdfb02008-02-08 04:18:47 -0800735int tty_check_change(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700736{
Alan Cox47f86832008-04-30 00:53:30 -0700737 unsigned long flags;
738 int ret = 0;
739
Linus Torvalds1da177e2005-04-16 15:20:36 -0700740 if (current->signal->tty != tty)
741 return 0;
Alan Cox47f86832008-04-30 00:53:30 -0700742
743 spin_lock_irqsave(&tty->ctrl_lock, flags);
744
Eric W. Biedermanab521dc2007-02-12 00:53:00 -0800745 if (!tty->pgrp) {
746 printk(KERN_WARNING "tty_check_change: tty->pgrp == NULL!\n");
Andrew Morton9ffee4c2008-05-14 16:05:58 -0700747 goto out_unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700748 }
Eric W. Biedermanab521dc2007-02-12 00:53:00 -0800749 if (task_pgrp(current) == tty->pgrp)
Andrew Morton9ffee4c2008-05-14 16:05:58 -0700750 goto out_unlock;
751 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700752 if (is_ignored(SIGTTOU))
Alan Cox47f86832008-04-30 00:53:30 -0700753 goto out;
754 if (is_current_pgrp_orphaned()) {
755 ret = -EIO;
756 goto out;
757 }
Oleg Nesterov040b6362007-06-01 00:46:53 -0700758 kill_pgrp(task_pgrp(current), SIGTTOU, 1);
759 set_thread_flag(TIF_SIGPENDING);
Alan Cox47f86832008-04-30 00:53:30 -0700760 ret = -ERESTARTSYS;
761out:
Andrew Morton9ffee4c2008-05-14 16:05:58 -0700762 return ret;
763out_unlock:
Alan Cox47f86832008-04-30 00:53:30 -0700764 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
765 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700766}
767
768EXPORT_SYMBOL(tty_check_change);
769
Alan Cox37bdfb02008-02-08 04:18:47 -0800770static ssize_t hung_up_tty_read(struct file *file, char __user *buf,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700771 size_t count, loff_t *ppos)
772{
773 return 0;
774}
775
Alan Cox37bdfb02008-02-08 04:18:47 -0800776static ssize_t hung_up_tty_write(struct file *file, const char __user *buf,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700777 size_t count, loff_t *ppos)
778{
779 return -EIO;
780}
781
782/* No kernel lock held - none needed ;) */
Alan Cox37bdfb02008-02-08 04:18:47 -0800783static unsigned int hung_up_tty_poll(struct file *filp, poll_table *wait)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700784{
785 return POLLIN | POLLOUT | POLLERR | POLLHUP | POLLRDNORM | POLLWRNORM;
786}
787
Alan Cox04f378b2008-04-30 00:53:29 -0700788static long hung_up_tty_ioctl(struct file *file, unsigned int cmd,
789 unsigned long arg)
Paul Fulghum38ad2ed2007-06-16 10:15:55 -0700790{
791 return cmd == TIOCSPGRP ? -ENOTTY : -EIO;
792}
793
Alan Cox37bdfb02008-02-08 04:18:47 -0800794static long hung_up_tty_compat_ioctl(struct file *file,
Paul Fulghum38ad2ed2007-06-16 10:15:55 -0700795 unsigned int cmd, unsigned long arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700796{
797 return cmd == TIOCSPGRP ? -ENOTTY : -EIO;
798}
799
Arjan van de Ven62322d22006-07-03 00:24:21 -0700800static const struct file_operations tty_fops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700801 .llseek = no_llseek,
802 .read = tty_read,
803 .write = tty_write,
804 .poll = tty_poll,
Alan Cox04f378b2008-04-30 00:53:29 -0700805 .unlocked_ioctl = tty_ioctl,
Paul Fulghume10cc1d2007-05-10 22:22:50 -0700806 .compat_ioctl = tty_compat_ioctl,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700807 .open = tty_open,
808 .release = tty_release,
809 .fasync = tty_fasync,
810};
811
812#ifdef CONFIG_UNIX98_PTYS
Arjan van de Ven62322d22006-07-03 00:24:21 -0700813static const struct file_operations ptmx_fops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700814 .llseek = no_llseek,
815 .read = tty_read,
816 .write = tty_write,
817 .poll = tty_poll,
Alan Cox04f378b2008-04-30 00:53:29 -0700818 .unlocked_ioctl = tty_ioctl,
Paul Fulghume10cc1d2007-05-10 22:22:50 -0700819 .compat_ioctl = tty_compat_ioctl,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700820 .open = ptmx_open,
821 .release = tty_release,
822 .fasync = tty_fasync,
823};
824#endif
825
Arjan van de Ven62322d22006-07-03 00:24:21 -0700826static const struct file_operations console_fops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700827 .llseek = no_llseek,
828 .read = tty_read,
829 .write = redirected_tty_write,
830 .poll = tty_poll,
Alan Cox04f378b2008-04-30 00:53:29 -0700831 .unlocked_ioctl = tty_ioctl,
Paul Fulghume10cc1d2007-05-10 22:22:50 -0700832 .compat_ioctl = tty_compat_ioctl,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700833 .open = tty_open,
834 .release = tty_release,
835 .fasync = tty_fasync,
836};
837
Arjan van de Ven62322d22006-07-03 00:24:21 -0700838static const struct file_operations hung_up_tty_fops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700839 .llseek = no_llseek,
840 .read = hung_up_tty_read,
841 .write = hung_up_tty_write,
842 .poll = hung_up_tty_poll,
Alan Cox04f378b2008-04-30 00:53:29 -0700843 .unlocked_ioctl = hung_up_tty_ioctl,
Paul Fulghum38ad2ed2007-06-16 10:15:55 -0700844 .compat_ioctl = hung_up_tty_compat_ioctl,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700845 .release = tty_release,
846};
847
848static DEFINE_SPINLOCK(redirect_lock);
849static struct file *redirect;
850
851/**
852 * tty_wakeup - request more data
853 * @tty: terminal
854 *
855 * Internal and external helper for wakeups of tty. This function
856 * informs the line discipline if present that the driver is ready
857 * to receive more output data.
858 */
Alan Cox37bdfb02008-02-08 04:18:47 -0800859
Linus Torvalds1da177e2005-04-16 15:20:36 -0700860void tty_wakeup(struct tty_struct *tty)
861{
862 struct tty_ldisc *ld;
Alan Cox37bdfb02008-02-08 04:18:47 -0800863
Linus Torvalds1da177e2005-04-16 15:20:36 -0700864 if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) {
865 ld = tty_ldisc_ref(tty);
Alan Cox37bdfb02008-02-08 04:18:47 -0800866 if (ld) {
Alan Coxa352def2008-07-16 21:53:12 +0100867 if (ld->ops->write_wakeup)
868 ld->ops->write_wakeup(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700869 tty_ldisc_deref(ld);
870 }
871 }
872 wake_up_interruptible(&tty->write_wait);
873}
874
875EXPORT_SYMBOL_GPL(tty_wakeup);
876
877/**
878 * tty_ldisc_flush - flush line discipline queue
879 * @tty: tty
880 *
881 * Flush the line discipline queue (if any) for this tty. If there
882 * is no line discipline active this is a no-op.
883 */
Alan Cox37bdfb02008-02-08 04:18:47 -0800884
Linus Torvalds1da177e2005-04-16 15:20:36 -0700885void tty_ldisc_flush(struct tty_struct *tty)
886{
887 struct tty_ldisc *ld = tty_ldisc_ref(tty);
Alan Cox37bdfb02008-02-08 04:18:47 -0800888 if (ld) {
Alan Coxa352def2008-07-16 21:53:12 +0100889 if (ld->ops->flush_buffer)
890 ld->ops->flush_buffer(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700891 tty_ldisc_deref(ld);
892 }
Paul Fulghumc5c34d42007-05-12 10:36:55 -0700893 tty_buffer_flush(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700894}
895
896EXPORT_SYMBOL_GPL(tty_ldisc_flush);
Alan Coxedc6afc2006-12-08 02:38:44 -0800897
898/**
899 * tty_reset_termios - reset terminal state
900 * @tty: tty to reset
901 *
902 * Restore a terminal to the driver default state
903 */
904
905static void tty_reset_termios(struct tty_struct *tty)
906{
907 mutex_lock(&tty->termios_mutex);
908 *tty->termios = tty->driver->init_termios;
909 tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios);
910 tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios);
911 mutex_unlock(&tty->termios_mutex);
912}
Alan Cox37bdfb02008-02-08 04:18:47 -0800913
Alan Coxaf9b8972006-08-27 01:24:01 -0700914/**
915 * do_tty_hangup - actual handler for hangup events
David Howells65f27f32006-11-22 14:55:48 +0000916 * @work: tty device
Alan Coxaf9b8972006-08-27 01:24:01 -0700917 *
Alan Coxa352def2008-07-16 21:53:12 +0100918k * This can be called by the "eventd" kernel thread. That is process
Alan Coxaf9b8972006-08-27 01:24:01 -0700919 * synchronous but doesn't hold any locks, so we need to make sure we
920 * have the appropriate locks for what we're doing.
921 *
922 * The hangup event clears any pending redirections onto the hung up
923 * device. It ensures future writes will error and it does the needed
924 * line discipline hangup and signal delivery. The tty object itself
925 * remains intact.
926 *
927 * Locking:
928 * BKL
Peter Zijlstra24ec8392006-12-08 02:36:04 -0800929 * redirect lock for undoing redirection
930 * file list lock for manipulating list of ttys
931 * tty_ldisc_lock from called functions
932 * termios_mutex resetting termios data
933 * tasklist_lock to walk task list for hangup event
934 * ->siglock to protect ->signal/->sighand
Linus Torvalds1da177e2005-04-16 15:20:36 -0700935 */
David Howells65f27f32006-11-22 14:55:48 +0000936static void do_tty_hangup(struct work_struct *work)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700937{
David Howells65f27f32006-11-22 14:55:48 +0000938 struct tty_struct *tty =
939 container_of(work, struct tty_struct, hangup_work);
Alan Cox37bdfb02008-02-08 04:18:47 -0800940 struct file *cons_filp = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700941 struct file *filp, *f = NULL;
942 struct task_struct *p;
943 struct tty_ldisc *ld;
944 int closecount = 0, n;
Alan Cox47f86832008-04-30 00:53:30 -0700945 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700946
947 if (!tty)
948 return;
949
950 /* inuse_filps is protected by the single kernel lock */
951 lock_kernel();
952
953 spin_lock(&redirect_lock);
954 if (redirect && redirect->private_data == tty) {
955 f = redirect;
956 redirect = NULL;
957 }
958 spin_unlock(&redirect_lock);
Alan Cox37bdfb02008-02-08 04:18:47 -0800959
Linus Torvalds1da177e2005-04-16 15:20:36 -0700960 check_tty_count(tty, "do_tty_hangup");
961 file_list_lock();
962 /* This breaks for file handles being sent over AF_UNIX sockets ? */
Eric Dumazet2f512012005-10-30 15:02:16 -0800963 list_for_each_entry(filp, &tty->tty_files, f_u.fu_list) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700964 if (filp->f_op->write == redirected_tty_write)
965 cons_filp = filp;
966 if (filp->f_op->write != tty_write)
967 continue;
968 closecount++;
969 tty_fasync(-1, filp, 0); /* can't block */
970 filp->f_op = &hung_up_tty_fops;
971 }
972 file_list_unlock();
Alan Cox37bdfb02008-02-08 04:18:47 -0800973 /*
974 * FIXME! What are the locking issues here? This may me overdoing
975 * things... This question is especially important now that we've
976 * removed the irqlock.
977 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700978 ld = tty_ldisc_ref(tty);
Alan Cox37bdfb02008-02-08 04:18:47 -0800979 if (ld != NULL) {
980 /* We may have no line discipline at this point */
Alan Coxa352def2008-07-16 21:53:12 +0100981 if (ld->ops->flush_buffer)
982 ld->ops->flush_buffer(tty);
Alan Coxf34d7a52008-04-30 00:54:13 -0700983 tty_driver_flush_buffer(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700984 if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
Alan Coxa352def2008-07-16 21:53:12 +0100985 ld->ops->write_wakeup)
986 ld->ops->write_wakeup(tty);
987 if (ld->ops->hangup)
988 ld->ops->hangup(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700989 }
Alan Cox37bdfb02008-02-08 04:18:47 -0800990 /*
991 * FIXME: Once we trust the LDISC code better we can wait here for
992 * ldisc completion and fix the driver call race
993 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700994 wake_up_interruptible(&tty->write_wait);
995 wake_up_interruptible(&tty->read_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700996 /*
997 * Shutdown the current line discipline, and reset it to
998 * N_TTY.
999 */
1000 if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
Alan Coxedc6afc2006-12-08 02:38:44 -08001001 tty_reset_termios(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001002 /* Defer ldisc switch */
1003 /* tty_deferred_ldisc_switch(N_TTY);
Alan Cox37bdfb02008-02-08 04:18:47 -08001004
Linus Torvalds1da177e2005-04-16 15:20:36 -07001005 This should get done automatically when the port closes and
1006 tty_release is called */
Alan Cox37bdfb02008-02-08 04:18:47 -08001007
Linus Torvalds1da177e2005-04-16 15:20:36 -07001008 read_lock(&tasklist_lock);
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001009 if (tty->session) {
1010 do_each_pid_task(tty->session, PIDTYPE_SID, p) {
Peter Zijlstra24ec8392006-12-08 02:36:04 -08001011 spin_lock_irq(&p->sighand->siglock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001012 if (p->signal->tty == tty)
1013 p->signal->tty = NULL;
Peter Zijlstra24ec8392006-12-08 02:36:04 -08001014 if (!p->signal->leader) {
1015 spin_unlock_irq(&p->sighand->siglock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001016 continue;
Peter Zijlstra24ec8392006-12-08 02:36:04 -08001017 }
1018 __group_send_sig_info(SIGHUP, SEND_SIG_PRIV, p);
1019 __group_send_sig_info(SIGCONT, SEND_SIG_PRIV, p);
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001020 put_pid(p->signal->tty_old_pgrp); /* A noop */
Alan Cox47f86832008-04-30 00:53:30 -07001021 spin_lock_irqsave(&tty->ctrl_lock, flags);
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001022 if (tty->pgrp)
1023 p->signal->tty_old_pgrp = get_pid(tty->pgrp);
Alan Cox47f86832008-04-30 00:53:30 -07001024 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
Peter Zijlstra24ec8392006-12-08 02:36:04 -08001025 spin_unlock_irq(&p->sighand->siglock);
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001026 } while_each_pid_task(tty->session, PIDTYPE_SID, p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001027 }
1028 read_unlock(&tasklist_lock);
1029
Alan Cox47f86832008-04-30 00:53:30 -07001030 spin_lock_irqsave(&tty->ctrl_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001031 tty->flags = 0;
Eric W. Biedermand9c1e9a2007-03-18 12:45:44 -06001032 put_pid(tty->session);
1033 put_pid(tty->pgrp);
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001034 tty->session = NULL;
1035 tty->pgrp = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001036 tty->ctrl_status = 0;
Alan Cox47f86832008-04-30 00:53:30 -07001037 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
1038
Linus Torvalds1da177e2005-04-16 15:20:36 -07001039 /*
Alan Cox37bdfb02008-02-08 04:18:47 -08001040 * If one of the devices matches a console pointer, we
1041 * cannot just call hangup() because that will cause
1042 * tty->count and state->count to go out of sync.
1043 * So we just call close() the right number of times.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001044 */
1045 if (cons_filp) {
Alan Coxf34d7a52008-04-30 00:54:13 -07001046 if (tty->ops->close)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001047 for (n = 0; n < closecount; n++)
Alan Coxf34d7a52008-04-30 00:54:13 -07001048 tty->ops->close(tty, cons_filp);
1049 } else if (tty->ops->hangup)
1050 (tty->ops->hangup)(tty);
Alan Cox37bdfb02008-02-08 04:18:47 -08001051 /*
1052 * We don't want to have driver/ldisc interactions beyond
1053 * the ones we did here. The driver layer expects no
1054 * calls after ->hangup() from the ldisc side. However we
1055 * can't yet guarantee all that.
1056 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001057 set_bit(TTY_HUPPED, &tty->flags);
1058 if (ld) {
1059 tty_ldisc_enable(tty);
1060 tty_ldisc_deref(ld);
1061 }
1062 unlock_kernel();
1063 if (f)
1064 fput(f);
1065}
1066
Alan Coxaf9b8972006-08-27 01:24:01 -07001067/**
1068 * tty_hangup - trigger a hangup event
1069 * @tty: tty to hangup
1070 *
1071 * A carrier loss (virtual or otherwise) has occurred on this like
1072 * schedule a hangup sequence to run after this event.
1073 */
1074
Alan Cox37bdfb02008-02-08 04:18:47 -08001075void tty_hangup(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001076{
1077#ifdef TTY_DEBUG_HANGUP
1078 char buf[64];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001079 printk(KERN_DEBUG "%s hangup...\n", tty_name(tty, buf));
1080#endif
1081 schedule_work(&tty->hangup_work);
1082}
1083
1084EXPORT_SYMBOL(tty_hangup);
1085
Alan Coxaf9b8972006-08-27 01:24:01 -07001086/**
1087 * tty_vhangup - process vhangup
1088 * @tty: tty to hangup
1089 *
1090 * The user has asked via system call for the terminal to be hung up.
1091 * We do this synchronously so that when the syscall returns the process
Robert P. J. Day3a4fa0a2007-10-19 23:10:43 +02001092 * is complete. That guarantee is necessary for security reasons.
Alan Coxaf9b8972006-08-27 01:24:01 -07001093 */
1094
Alan Cox37bdfb02008-02-08 04:18:47 -08001095void tty_vhangup(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001096{
1097#ifdef TTY_DEBUG_HANGUP
1098 char buf[64];
1099
1100 printk(KERN_DEBUG "%s vhangup...\n", tty_name(tty, buf));
1101#endif
David Howells65f27f32006-11-22 14:55:48 +00001102 do_tty_hangup(&tty->hangup_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001103}
Alan Cox37bdfb02008-02-08 04:18:47 -08001104
Linus Torvalds1da177e2005-04-16 15:20:36 -07001105EXPORT_SYMBOL(tty_vhangup);
1106
Alan Coxaf9b8972006-08-27 01:24:01 -07001107/**
1108 * tty_hung_up_p - was tty hung up
1109 * @filp: file pointer of tty
1110 *
1111 * Return true if the tty has been subject to a vhangup or a carrier
1112 * loss
1113 */
1114
Alan Cox37bdfb02008-02-08 04:18:47 -08001115int tty_hung_up_p(struct file *filp)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001116{
1117 return (filp->f_op == &hung_up_tty_fops);
1118}
1119
1120EXPORT_SYMBOL(tty_hung_up_p);
1121
Miloslav Trmac522ed772007-07-15 23:40:56 -07001122/**
Alan Cox37bdfb02008-02-08 04:18:47 -08001123 * is_tty - checker whether file is a TTY
1124 * @filp: file handle that may be a tty
1125 *
1126 * Check if the file handle is a tty handle.
Miloslav Trmac522ed772007-07-15 23:40:56 -07001127 */
Alan Cox37bdfb02008-02-08 04:18:47 -08001128
Miloslav Trmac522ed772007-07-15 23:40:56 -07001129int is_tty(struct file *filp)
1130{
1131 return filp->f_op->read == tty_read
1132 || filp->f_op->read == hung_up_tty_read;
1133}
1134
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001135static void session_clear_tty(struct pid *session)
Peter Zijlstra24ec8392006-12-08 02:36:04 -08001136{
1137 struct task_struct *p;
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001138 do_each_pid_task(session, PIDTYPE_SID, p) {
Peter Zijlstra24ec8392006-12-08 02:36:04 -08001139 proc_clear_tty(p);
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001140 } while_each_pid_task(session, PIDTYPE_SID, p);
Peter Zijlstra24ec8392006-12-08 02:36:04 -08001141}
1142
Alan Coxaf9b8972006-08-27 01:24:01 -07001143/**
1144 * disassociate_ctty - disconnect controlling tty
1145 * @on_exit: true if exiting so need to "hang up" the session
Linus Torvalds1da177e2005-04-16 15:20:36 -07001146 *
Alan Coxaf9b8972006-08-27 01:24:01 -07001147 * This function is typically called only by the session leader, when
1148 * it wants to disassociate itself from its controlling tty.
1149 *
1150 * It performs the following functions:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001151 * (1) Sends a SIGHUP and SIGCONT to the foreground process group
1152 * (2) Clears the tty from being controlling the session
1153 * (3) Clears the controlling tty for all processes in the
1154 * session group.
1155 *
Alan Coxaf9b8972006-08-27 01:24:01 -07001156 * The argument on_exit is set to 1 if called when a process is
1157 * exiting; it is 0 if called by the ioctl TIOCNOTTY.
1158 *
Peter Zijlstra24ec8392006-12-08 02:36:04 -08001159 * Locking:
Alan Coxaf9b8972006-08-27 01:24:01 -07001160 * BKL is taken for hysterical raisins
Peter Zijlstra24ec8392006-12-08 02:36:04 -08001161 * tty_mutex is taken to protect tty
1162 * ->siglock is taken to protect ->signal/->sighand
1163 * tasklist_lock is taken to walk process list for sessions
1164 * ->siglock is taken to protect ->signal/->sighand
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165 */
Alan Coxaf9b8972006-08-27 01:24:01 -07001166
Linus Torvalds1da177e2005-04-16 15:20:36 -07001167void disassociate_ctty(int on_exit)
1168{
1169 struct tty_struct *tty;
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001170 struct pid *tty_pgrp = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001171
Linus Torvalds1da177e2005-04-16 15:20:36 -07001172
Ingo Molnar70522e12006-03-23 03:00:31 -08001173 mutex_lock(&tty_mutex);
Peter Zijlstra24ec8392006-12-08 02:36:04 -08001174 tty = get_current_tty();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001175 if (tty) {
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001176 tty_pgrp = get_pid(tty->pgrp);
Ingo Molnar70522e12006-03-23 03:00:31 -08001177 mutex_unlock(&tty_mutex);
Alan Cox04f378b2008-04-30 00:53:29 -07001178 lock_kernel();
Peter Zijlstra24ec8392006-12-08 02:36:04 -08001179 /* XXX: here we race, there is nothing protecting tty */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180 if (on_exit && tty->driver->type != TTY_DRIVER_TYPE_PTY)
1181 tty_vhangup(tty);
Alan Cox04f378b2008-04-30 00:53:29 -07001182 unlock_kernel();
Eric W. Biederman680a9672007-02-12 00:52:52 -08001183 } else if (on_exit) {
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001184 struct pid *old_pgrp;
Eric W. Biederman680a9672007-02-12 00:52:52 -08001185 spin_lock_irq(&current->sighand->siglock);
1186 old_pgrp = current->signal->tty_old_pgrp;
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001187 current->signal->tty_old_pgrp = NULL;
Eric W. Biederman680a9672007-02-12 00:52:52 -08001188 spin_unlock_irq(&current->sighand->siglock);
Peter Zijlstra24ec8392006-12-08 02:36:04 -08001189 if (old_pgrp) {
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001190 kill_pgrp(old_pgrp, SIGHUP, on_exit);
1191 kill_pgrp(old_pgrp, SIGCONT, on_exit);
1192 put_pid(old_pgrp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001193 }
Ingo Molnar70522e12006-03-23 03:00:31 -08001194 mutex_unlock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001195 return;
1196 }
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001197 if (tty_pgrp) {
1198 kill_pgrp(tty_pgrp, SIGHUP, on_exit);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001199 if (!on_exit)
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001200 kill_pgrp(tty_pgrp, SIGCONT, on_exit);
1201 put_pid(tty_pgrp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202 }
1203
Peter Zijlstra24ec8392006-12-08 02:36:04 -08001204 spin_lock_irq(&current->sighand->siglock);
Eric W. Biederman2a65f1d2007-05-08 00:26:53 -07001205 put_pid(current->signal->tty_old_pgrp);
Randy Dunlap23cac8d2007-02-20 13:58:05 -08001206 current->signal->tty_old_pgrp = NULL;
Peter Zijlstra24ec8392006-12-08 02:36:04 -08001207 spin_unlock_irq(&current->sighand->siglock);
1208
1209 mutex_lock(&tty_mutex);
1210 /* It is possible that do_tty_hangup has free'd this tty */
1211 tty = get_current_tty();
1212 if (tty) {
Alan Cox47f86832008-04-30 00:53:30 -07001213 unsigned long flags;
1214 spin_lock_irqsave(&tty->ctrl_lock, flags);
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001215 put_pid(tty->session);
1216 put_pid(tty->pgrp);
1217 tty->session = NULL;
1218 tty->pgrp = NULL;
Alan Cox47f86832008-04-30 00:53:30 -07001219 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
Peter Zijlstra24ec8392006-12-08 02:36:04 -08001220 } else {
1221#ifdef TTY_DEBUG_HANGUP
1222 printk(KERN_DEBUG "error attempted to write to tty [0x%p]"
1223 " = NULL", tty);
1224#endif
1225 }
1226 mutex_unlock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001227
1228 /* Now clear signal->tty under the lock */
1229 read_lock(&tasklist_lock);
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08001230 session_clear_tty(task_session(current));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001231 read_unlock(&tasklist_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001232}
1233
Eric W. Biederman98a27ba2007-05-08 00:26:56 -07001234/**
1235 *
1236 * no_tty - Ensure the current process does not have a controlling tty
1237 */
1238void no_tty(void)
1239{
1240 struct task_struct *tsk = current;
Alan Cox04f378b2008-04-30 00:53:29 -07001241 lock_kernel();
Eric W. Biederman98a27ba2007-05-08 00:26:56 -07001242 if (tsk->signal->leader)
1243 disassociate_ctty(0);
Alan Cox04f378b2008-04-30 00:53:29 -07001244 unlock_kernel();
Eric W. Biederman98a27ba2007-05-08 00:26:56 -07001245 proc_clear_tty(tsk);
1246}
1247
Alan Coxaf9b8972006-08-27 01:24:01 -07001248
1249/**
Robert P. J. Daybeb7dd82007-05-09 07:14:03 +02001250 * stop_tty - propagate flow control
Alan Coxaf9b8972006-08-27 01:24:01 -07001251 * @tty: tty to stop
1252 *
1253 * Perform flow control to the driver. For PTY/TTY pairs we
Robert P. J. Daybeb7dd82007-05-09 07:14:03 +02001254 * must also propagate the TIOCKPKT status. May be called
Alan Coxaf9b8972006-08-27 01:24:01 -07001255 * on an already stopped device and will not re-call the driver
1256 * method.
1257 *
1258 * This functionality is used by both the line disciplines for
1259 * halting incoming flow and by the driver. It may therefore be
1260 * called from any context, may be under the tty atomic_write_lock
1261 * but not always.
1262 *
1263 * Locking:
Alan Cox04f378b2008-04-30 00:53:29 -07001264 * Uses the tty control lock internally
Alan Coxaf9b8972006-08-27 01:24:01 -07001265 */
1266
Linus Torvalds1da177e2005-04-16 15:20:36 -07001267void stop_tty(struct tty_struct *tty)
1268{
Alan Cox04f378b2008-04-30 00:53:29 -07001269 unsigned long flags;
1270 spin_lock_irqsave(&tty->ctrl_lock, flags);
1271 if (tty->stopped) {
1272 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001273 return;
Alan Cox04f378b2008-04-30 00:53:29 -07001274 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001275 tty->stopped = 1;
1276 if (tty->link && tty->link->packet) {
1277 tty->ctrl_status &= ~TIOCPKT_START;
1278 tty->ctrl_status |= TIOCPKT_STOP;
1279 wake_up_interruptible(&tty->link->read_wait);
1280 }
Alan Cox04f378b2008-04-30 00:53:29 -07001281 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
Alan Coxf34d7a52008-04-30 00:54:13 -07001282 if (tty->ops->stop)
1283 (tty->ops->stop)(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001284}
1285
1286EXPORT_SYMBOL(stop_tty);
1287
Alan Coxaf9b8972006-08-27 01:24:01 -07001288/**
Robert P. J. Daybeb7dd82007-05-09 07:14:03 +02001289 * start_tty - propagate flow control
Alan Coxaf9b8972006-08-27 01:24:01 -07001290 * @tty: tty to start
1291 *
1292 * Start a tty that has been stopped if at all possible. Perform
Robert P. J. Day3a4fa0a2007-10-19 23:10:43 +02001293 * any necessary wakeups and propagate the TIOCPKT status. If this
Alan Coxaf9b8972006-08-27 01:24:01 -07001294 * is the tty was previous stopped and is being started then the
1295 * driver start method is invoked and the line discipline woken.
1296 *
1297 * Locking:
Alan Cox04f378b2008-04-30 00:53:29 -07001298 * ctrl_lock
Alan Coxaf9b8972006-08-27 01:24:01 -07001299 */
1300
Linus Torvalds1da177e2005-04-16 15:20:36 -07001301void start_tty(struct tty_struct *tty)
1302{
Alan Cox04f378b2008-04-30 00:53:29 -07001303 unsigned long flags;
1304 spin_lock_irqsave(&tty->ctrl_lock, flags);
1305 if (!tty->stopped || tty->flow_stopped) {
1306 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001307 return;
Alan Cox04f378b2008-04-30 00:53:29 -07001308 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001309 tty->stopped = 0;
1310 if (tty->link && tty->link->packet) {
1311 tty->ctrl_status &= ~TIOCPKT_STOP;
1312 tty->ctrl_status |= TIOCPKT_START;
1313 wake_up_interruptible(&tty->link->read_wait);
1314 }
Alan Cox04f378b2008-04-30 00:53:29 -07001315 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
Alan Coxf34d7a52008-04-30 00:54:13 -07001316 if (tty->ops->start)
1317 (tty->ops->start)(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001318 /* If we have a running line discipline it may need kicking */
1319 tty_wakeup(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001320}
1321
1322EXPORT_SYMBOL(start_tty);
1323
Alan Coxaf9b8972006-08-27 01:24:01 -07001324/**
1325 * tty_read - read method for tty device files
1326 * @file: pointer to tty file
1327 * @buf: user buffer
1328 * @count: size of user buffer
1329 * @ppos: unused
1330 *
1331 * Perform the read system call function on this terminal device. Checks
1332 * for hung up devices before calling the line discipline method.
1333 *
1334 * Locking:
Alan Cox47f86832008-04-30 00:53:30 -07001335 * Locks the line discipline internally while needed. Multiple
1336 * read calls may be outstanding in parallel.
Alan Coxaf9b8972006-08-27 01:24:01 -07001337 */
1338
Alan Cox37bdfb02008-02-08 04:18:47 -08001339static ssize_t tty_read(struct file *file, char __user *buf, size_t count,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001340 loff_t *ppos)
1341{
1342 int i;
Alan Cox37bdfb02008-02-08 04:18:47 -08001343 struct tty_struct *tty;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001344 struct inode *inode;
1345 struct tty_ldisc *ld;
1346
1347 tty = (struct tty_struct *)file->private_data;
Josef Sipeka7113a92006-12-08 02:36:55 -08001348 inode = file->f_path.dentry->d_inode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001349 if (tty_paranoia_check(tty, inode, "tty_read"))
1350 return -EIO;
1351 if (!tty || (test_bit(TTY_IO_ERROR, &tty->flags)))
1352 return -EIO;
1353
1354 /* We want to wait for the line discipline to sort out in this
1355 situation */
1356 ld = tty_ldisc_ref_wait(tty);
Alan Coxa352def2008-07-16 21:53:12 +01001357 if (ld->ops->read)
1358 i = (ld->ops->read)(tty, file, buf, count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359 else
1360 i = -EIO;
1361 tty_ldisc_deref(ld);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001362 if (i > 0)
1363 inode->i_atime = current_fs_time(inode->i_sb);
1364 return i;
1365}
1366
Alan Cox9c1729d2007-07-15 23:39:43 -07001367void tty_write_unlock(struct tty_struct *tty)
1368{
1369 mutex_unlock(&tty->atomic_write_lock);
1370 wake_up_interruptible(&tty->write_wait);
1371}
1372
1373int tty_write_lock(struct tty_struct *tty, int ndelay)
1374{
1375 if (!mutex_trylock(&tty->atomic_write_lock)) {
1376 if (ndelay)
1377 return -EAGAIN;
1378 if (mutex_lock_interruptible(&tty->atomic_write_lock))
1379 return -ERESTARTSYS;
1380 }
1381 return 0;
1382}
1383
Linus Torvalds1da177e2005-04-16 15:20:36 -07001384/*
1385 * Split writes up in sane blocksizes to avoid
1386 * denial-of-service type attacks
1387 */
1388static inline ssize_t do_tty_write(
1389 ssize_t (*write)(struct tty_struct *, struct file *, const unsigned char *, size_t),
1390 struct tty_struct *tty,
1391 struct file *file,
1392 const char __user *buf,
1393 size_t count)
1394{
Alan Cox9c1729d2007-07-15 23:39:43 -07001395 ssize_t ret, written = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001396 unsigned int chunk;
Alan Cox37bdfb02008-02-08 04:18:47 -08001397
Alan Cox9c1729d2007-07-15 23:39:43 -07001398 ret = tty_write_lock(tty, file->f_flags & O_NDELAY);
1399 if (ret < 0)
1400 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001401
1402 /*
1403 * We chunk up writes into a temporary buffer. This
1404 * simplifies low-level drivers immensely, since they
1405 * don't have locking issues and user mode accesses.
1406 *
1407 * But if TTY_NO_WRITE_SPLIT is set, we should use a
1408 * big chunk-size..
1409 *
1410 * The default chunk-size is 2kB, because the NTTY
1411 * layer has problems with bigger chunks. It will
1412 * claim to be able to handle more characters than
1413 * it actually does.
Alan Coxaf9b8972006-08-27 01:24:01 -07001414 *
1415 * FIXME: This can probably go away now except that 64K chunks
1416 * are too likely to fail unless switched to vmalloc...
Linus Torvalds1da177e2005-04-16 15:20:36 -07001417 */
1418 chunk = 2048;
1419 if (test_bit(TTY_NO_WRITE_SPLIT, &tty->flags))
1420 chunk = 65536;
1421 if (count < chunk)
1422 chunk = count;
1423
Ingo Molnar70522e12006-03-23 03:00:31 -08001424 /* write_buf/write_cnt is protected by the atomic_write_lock mutex */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001425 if (tty->write_cnt < chunk) {
1426 unsigned char *buf;
1427
1428 if (chunk < 1024)
1429 chunk = 1024;
1430
1431 buf = kmalloc(chunk, GFP_KERNEL);
1432 if (!buf) {
Alan Cox9c1729d2007-07-15 23:39:43 -07001433 ret = -ENOMEM;
1434 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001435 }
1436 kfree(tty->write_buf);
1437 tty->write_cnt = chunk;
1438 tty->write_buf = buf;
1439 }
1440
1441 /* Do the write .. */
1442 for (;;) {
1443 size_t size = count;
1444 if (size > chunk)
1445 size = chunk;
1446 ret = -EFAULT;
1447 if (copy_from_user(tty->write_buf, buf, size))
1448 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001449 ret = write(tty, file, tty->write_buf, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001450 if (ret <= 0)
1451 break;
1452 written += ret;
1453 buf += ret;
1454 count -= ret;
1455 if (!count)
1456 break;
1457 ret = -ERESTARTSYS;
1458 if (signal_pending(current))
1459 break;
1460 cond_resched();
1461 }
1462 if (written) {
Josef Sipeka7113a92006-12-08 02:36:55 -08001463 struct inode *inode = file->f_path.dentry->d_inode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001464 inode->i_mtime = current_fs_time(inode->i_sb);
1465 ret = written;
1466 }
Alan Cox9c1729d2007-07-15 23:39:43 -07001467out:
1468 tty_write_unlock(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001469 return ret;
1470}
1471
1472
Alan Coxaf9b8972006-08-27 01:24:01 -07001473/**
1474 * tty_write - write method for tty device file
1475 * @file: tty file pointer
1476 * @buf: user data to write
1477 * @count: bytes to write
1478 * @ppos: unused
1479 *
1480 * Write data to a tty device via the line discipline.
1481 *
1482 * Locking:
1483 * Locks the line discipline as required
1484 * Writes to the tty driver are serialized by the atomic_write_lock
1485 * and are then processed in chunks to the device. The line discipline
1486 * write method will not be involked in parallel for each device
1487 * The line discipline write method is called under the big
1488 * kernel lock for historical reasons. New code should not rely on this.
1489 */
1490
Alan Cox37bdfb02008-02-08 04:18:47 -08001491static ssize_t tty_write(struct file *file, const char __user *buf,
1492 size_t count, loff_t *ppos)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001493{
Alan Cox37bdfb02008-02-08 04:18:47 -08001494 struct tty_struct *tty;
Josef Sipeka7113a92006-12-08 02:36:55 -08001495 struct inode *inode = file->f_path.dentry->d_inode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001496 ssize_t ret;
1497 struct tty_ldisc *ld;
Alan Cox37bdfb02008-02-08 04:18:47 -08001498
Linus Torvalds1da177e2005-04-16 15:20:36 -07001499 tty = (struct tty_struct *)file->private_data;
1500 if (tty_paranoia_check(tty, inode, "tty_write"))
1501 return -EIO;
Alan Coxf34d7a52008-04-30 00:54:13 -07001502 if (!tty || !tty->ops->write ||
Alan Cox37bdfb02008-02-08 04:18:47 -08001503 (test_bit(TTY_IO_ERROR, &tty->flags)))
1504 return -EIO;
Alan Coxf34d7a52008-04-30 00:54:13 -07001505 /* Short term debug to catch buggy drivers */
1506 if (tty->ops->write_room == NULL)
1507 printk(KERN_ERR "tty driver %s lacks a write_room method.\n",
1508 tty->driver->name);
Alan Cox37bdfb02008-02-08 04:18:47 -08001509 ld = tty_ldisc_ref_wait(tty);
Alan Coxa352def2008-07-16 21:53:12 +01001510 if (!ld->ops->write)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001511 ret = -EIO;
1512 else
Alan Coxa352def2008-07-16 21:53:12 +01001513 ret = do_tty_write(ld->ops->write, tty, file, buf, count);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001514 tty_ldisc_deref(ld);
1515 return ret;
1516}
1517
Alan Cox37bdfb02008-02-08 04:18:47 -08001518ssize_t redirected_tty_write(struct file *file, const char __user *buf,
1519 size_t count, loff_t *ppos)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001520{
1521 struct file *p = NULL;
1522
1523 spin_lock(&redirect_lock);
1524 if (redirect) {
1525 get_file(redirect);
1526 p = redirect;
1527 }
1528 spin_unlock(&redirect_lock);
1529
1530 if (p) {
1531 ssize_t res;
1532 res = vfs_write(p, buf, count, &p->f_pos);
1533 fput(p);
1534 return res;
1535 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001536 return tty_write(file, buf, count, ppos);
1537}
1538
Alan Cox6f670482008-07-16 21:53:41 +01001539void tty_port_init(struct tty_port *port)
1540{
1541 memset(port, 0, sizeof(*port));
1542 init_waitqueue_head(&port->open_wait);
1543 init_waitqueue_head(&port->close_wait);
1544 mutex_init(&port->mutex);
Alan Cox44b7d1b2008-07-16 21:57:18 +01001545 port->close_delay = (50 * HZ) / 100;
1546 port->closing_wait = (3000 * HZ) / 100;
Alan Cox6f670482008-07-16 21:53:41 +01001547}
1548EXPORT_SYMBOL(tty_port_init);
1549
1550int tty_port_alloc_xmit_buf(struct tty_port *port)
1551{
1552 /* We may sleep in get_zeroed_page() */
1553 mutex_lock(&port->mutex);
1554 if (port->xmit_buf == NULL)
1555 port->xmit_buf = (unsigned char *)get_zeroed_page(GFP_KERNEL);
1556 mutex_unlock(&port->mutex);
1557 if (port->xmit_buf == NULL)
1558 return -ENOMEM;
1559 return 0;
1560}
1561EXPORT_SYMBOL(tty_port_alloc_xmit_buf);
1562
1563void tty_port_free_xmit_buf(struct tty_port *port)
1564{
1565 mutex_lock(&port->mutex);
1566 if (port->xmit_buf != NULL) {
1567 free_page((unsigned long)port->xmit_buf);
1568 port->xmit_buf = NULL;
1569 }
1570 mutex_unlock(&port->mutex);
1571}
1572EXPORT_SYMBOL(tty_port_free_xmit_buf);
1573
1574
Linus Torvalds1da177e2005-04-16 15:20:36 -07001575static char ptychar[] = "pqrstuvwxyzabcde";
1576
Alan Coxaf9b8972006-08-27 01:24:01 -07001577/**
1578 * pty_line_name - generate name for a pty
1579 * @driver: the tty driver in use
1580 * @index: the minor number
1581 * @p: output buffer of at least 6 bytes
1582 *
1583 * Generate a name from a driver reference and write it to the output
1584 * buffer.
1585 *
1586 * Locking: None
1587 */
1588static void pty_line_name(struct tty_driver *driver, int index, char *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001589{
1590 int i = index + driver->name_base;
1591 /* ->name is initialized to "ttyp", but "tty" is expected */
1592 sprintf(p, "%s%c%x",
Alan Cox37bdfb02008-02-08 04:18:47 -08001593 driver->subtype == PTY_TYPE_SLAVE ? "tty" : driver->name,
1594 ptychar[i >> 4 & 0xf], i & 0xf);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001595}
1596
Alan Coxaf9b8972006-08-27 01:24:01 -07001597/**
1598 * pty_line_name - generate name for a tty
1599 * @driver: the tty driver in use
1600 * @index: the minor number
1601 * @p: output buffer of at least 7 bytes
1602 *
1603 * Generate a name from a driver reference and write it to the output
1604 * buffer.
1605 *
1606 * Locking: None
1607 */
1608static void tty_line_name(struct tty_driver *driver, int index, char *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001609{
1610 sprintf(p, "%s%d", driver->name, index + driver->name_base);
1611}
1612
Alan Coxaf9b8972006-08-27 01:24:01 -07001613/**
1614 * init_dev - initialise a tty device
1615 * @driver: tty driver we are opening a device on
1616 * @idx: device index
1617 * @tty: returned tty structure
1618 *
1619 * Prepare a tty device. This may not be a "new" clean device but
1620 * could also be an active device. The pty drivers require special
1621 * handling because of this.
1622 *
1623 * Locking:
1624 * The function is called under the tty_mutex, which
1625 * protects us from the tty struct or driver itself going away.
1626 *
1627 * On exit the tty device has the line discipline attached and
1628 * a reference count of 1. If a pair was created for pty/tty use
1629 * and the other was a pty master then it too has a reference count of 1.
1630 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001631 * WSH 06/09/97: Rewritten to remove races and properly clean up after a
Ingo Molnar70522e12006-03-23 03:00:31 -08001632 * failed open. The new code protects the open with a mutex, so it's
1633 * really quite straightforward. The mutex locking can probably be
Linus Torvalds1da177e2005-04-16 15:20:36 -07001634 * relaxed for the (most common) case of reopening a tty.
1635 */
Alan Coxaf9b8972006-08-27 01:24:01 -07001636
Linus Torvalds1da177e2005-04-16 15:20:36 -07001637static int init_dev(struct tty_driver *driver, int idx,
1638 struct tty_struct **ret_tty)
1639{
1640 struct tty_struct *tty, *o_tty;
Alan Coxedc6afc2006-12-08 02:38:44 -08001641 struct ktermios *tp, **tp_loc, *o_tp, **o_tp_loc;
1642 struct ktermios *ltp, **ltp_loc, *o_ltp, **o_ltp_loc;
Alan Coxaf9b8972006-08-27 01:24:01 -07001643 int retval = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001644
1645 /* check whether we're reopening an existing tty */
1646 if (driver->flags & TTY_DRIVER_DEVPTS_MEM) {
1647 tty = devpts_get_tty(idx);
Aristeu Sergio Rozanski Filho5a39e8c2007-02-28 20:13:53 -08001648 /*
1649 * If we don't have a tty here on a slave open, it's because
1650 * the master already started the close process and there's
1651 * no relation between devpts file and tty anymore.
1652 */
1653 if (!tty && driver->subtype == PTY_TYPE_SLAVE) {
1654 retval = -EIO;
1655 goto end_init;
1656 }
1657 /*
1658 * It's safe from now on because init_dev() is called with
1659 * tty_mutex held and release_dev() won't change tty->count
1660 * or tty->flags without having to grab tty_mutex
1661 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001662 if (tty && driver->subtype == PTY_TYPE_MASTER)
1663 tty = tty->link;
1664 } else {
1665 tty = driver->ttys[idx];
1666 }
1667 if (tty) goto fast_track;
1668
1669 /*
1670 * First time open is complex, especially for PTY devices.
1671 * This code guarantees that either everything succeeds and the
1672 * TTY is ready for operation, or else the table slots are vacated
Alan Cox37bdfb02008-02-08 04:18:47 -08001673 * and the allocated memory released. (Except that the termios
Linus Torvalds1da177e2005-04-16 15:20:36 -07001674 * and locked termios may be retained.)
1675 */
1676
1677 if (!try_module_get(driver->owner)) {
1678 retval = -ENODEV;
1679 goto end_init;
1680 }
1681
1682 o_tty = NULL;
1683 tp = o_tp = NULL;
1684 ltp = o_ltp = NULL;
1685
1686 tty = alloc_tty_struct();
Alan Cox37bdfb02008-02-08 04:18:47 -08001687 if (!tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001688 goto fail_no_mem;
1689 initialize_tty_struct(tty);
1690 tty->driver = driver;
Alan Coxf34d7a52008-04-30 00:54:13 -07001691 tty->ops = driver->ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001692 tty->index = idx;
1693 tty_line_name(driver, idx, tty->name);
1694
1695 if (driver->flags & TTY_DRIVER_DEVPTS_MEM) {
1696 tp_loc = &tty->termios;
1697 ltp_loc = &tty->termios_locked;
1698 } else {
1699 tp_loc = &driver->termios[idx];
1700 ltp_loc = &driver->termios_locked[idx];
1701 }
1702
1703 if (!*tp_loc) {
Jesper Juhlabcb1ff32007-08-24 02:28:42 +02001704 tp = kmalloc(sizeof(struct ktermios), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001705 if (!tp)
1706 goto free_mem_out;
1707 *tp = driver->init_termios;
1708 }
1709
1710 if (!*ltp_loc) {
Jean Delvare506eb992007-07-15 23:40:14 -07001711 ltp = kzalloc(sizeof(struct ktermios), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001712 if (!ltp)
1713 goto free_mem_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001714 }
1715
1716 if (driver->type == TTY_DRIVER_TYPE_PTY) {
1717 o_tty = alloc_tty_struct();
1718 if (!o_tty)
1719 goto free_mem_out;
1720 initialize_tty_struct(o_tty);
1721 o_tty->driver = driver->other;
Alan Coxf34d7a52008-04-30 00:54:13 -07001722 o_tty->ops = driver->ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001723 o_tty->index = idx;
1724 tty_line_name(driver->other, idx, o_tty->name);
1725
1726 if (driver->flags & TTY_DRIVER_DEVPTS_MEM) {
1727 o_tp_loc = &o_tty->termios;
1728 o_ltp_loc = &o_tty->termios_locked;
1729 } else {
1730 o_tp_loc = &driver->other->termios[idx];
1731 o_ltp_loc = &driver->other->termios_locked[idx];
1732 }
1733
1734 if (!*o_tp_loc) {
Jesper Juhlabcb1ff32007-08-24 02:28:42 +02001735 o_tp = kmalloc(sizeof(struct ktermios), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001736 if (!o_tp)
1737 goto free_mem_out;
1738 *o_tp = driver->other->init_termios;
1739 }
1740
1741 if (!*o_ltp_loc) {
Jean Delvare506eb992007-07-15 23:40:14 -07001742 o_ltp = kzalloc(sizeof(struct ktermios), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001743 if (!o_ltp)
1744 goto free_mem_out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001745 }
1746
1747 /*
1748 * Everything allocated ... set up the o_tty structure.
1749 */
Alan Cox37bdfb02008-02-08 04:18:47 -08001750 if (!(driver->other->flags & TTY_DRIVER_DEVPTS_MEM))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001751 driver->other->ttys[idx] = o_tty;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001752 if (!*o_tp_loc)
1753 *o_tp_loc = o_tp;
1754 if (!*o_ltp_loc)
1755 *o_ltp_loc = o_ltp;
1756 o_tty->termios = *o_tp_loc;
1757 o_tty->termios_locked = *o_ltp_loc;
1758 driver->other->refcount++;
1759 if (driver->subtype == PTY_TYPE_MASTER)
1760 o_tty->count++;
1761
1762 /* Establish the links in both directions */
1763 tty->link = o_tty;
1764 o_tty->link = tty;
1765 }
1766
Alan Cox37bdfb02008-02-08 04:18:47 -08001767 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001768 * All structures have been allocated, so now we install them.
Christoph Hellwigd5698c22007-02-10 01:46:46 -08001769 * Failures after this point use release_tty to clean up, so
Linus Torvalds1da177e2005-04-16 15:20:36 -07001770 * there's no need to null out the local pointers.
1771 */
Alan Cox37bdfb02008-02-08 04:18:47 -08001772 if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001773 driver->ttys[idx] = tty;
Alan Cox37bdfb02008-02-08 04:18:47 -08001774
Linus Torvalds1da177e2005-04-16 15:20:36 -07001775 if (!*tp_loc)
1776 *tp_loc = tp;
1777 if (!*ltp_loc)
1778 *ltp_loc = ltp;
1779 tty->termios = *tp_loc;
1780 tty->termios_locked = *ltp_loc;
Alan Coxedc6afc2006-12-08 02:38:44 -08001781 /* Compatibility until drivers always set this */
1782 tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios);
1783 tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001784 driver->refcount++;
1785 tty->count++;
1786
Alan Cox37bdfb02008-02-08 04:18:47 -08001787 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001788 * Structures all installed ... call the ldisc open routines.
Christoph Hellwigd5698c22007-02-10 01:46:46 -08001789 * If we fail here just call release_tty to clean up. No need
1790 * to decrement the use counts, as release_tty doesn't care.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001791 */
1792
Alan Cox01e1abb2008-07-22 11:16:55 +01001793 retval = tty_ldisc_setup(tty, o_tty);
1794
1795 if (retval)
1796 goto release_mem_out;
1797 goto success;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001798
1799 /*
1800 * This fast open can be used if the tty is already open.
1801 * No memory is allocated, and the only failures are from
1802 * attempting to open a closing tty or attempting multiple
1803 * opens on a pty master.
1804 */
1805fast_track:
1806 if (test_bit(TTY_CLOSING, &tty->flags)) {
1807 retval = -EIO;
1808 goto end_init;
1809 }
1810 if (driver->type == TTY_DRIVER_TYPE_PTY &&
1811 driver->subtype == PTY_TYPE_MASTER) {
1812 /*
Alan Cox37bdfb02008-02-08 04:18:47 -08001813 * special case for PTY masters: only one open permitted,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001814 * and the slave side open count is incremented as well.
1815 */
1816 if (tty->count) {
1817 retval = -EIO;
1818 goto end_init;
1819 }
1820 tty->link->count++;
1821 }
1822 tty->count++;
1823 tty->driver = driver; /* N.B. why do this every time?? */
1824
1825 /* FIXME */
Alan Cox37bdfb02008-02-08 04:18:47 -08001826 if (!test_bit(TTY_LDISC, &tty->flags))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001827 printk(KERN_ERR "init_dev but no ldisc\n");
1828success:
1829 *ret_tty = tty;
Alan Cox37bdfb02008-02-08 04:18:47 -08001830
Ingo Molnar70522e12006-03-23 03:00:31 -08001831 /* All paths come through here to release the mutex */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001832end_init:
1833 return retval;
1834
1835 /* Release locally allocated memory ... nothing placed in slots */
1836free_mem_out:
Jesper Juhl735d5662005-11-07 01:01:29 -08001837 kfree(o_tp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001838 if (o_tty)
1839 free_tty_struct(o_tty);
Jesper Juhl735d5662005-11-07 01:01:29 -08001840 kfree(ltp);
1841 kfree(tp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001842 free_tty_struct(tty);
1843
1844fail_no_mem:
1845 module_put(driver->owner);
1846 retval = -ENOMEM;
1847 goto end_init;
1848
Christoph Hellwigd5698c22007-02-10 01:46:46 -08001849 /* call the tty release_tty routine to clean out this slot */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001850release_mem_out:
Akinobu Mita40509142006-09-29 02:01:27 -07001851 if (printk_ratelimit())
1852 printk(KERN_INFO "init_dev: ldisc open failed, "
1853 "clearing slot %d\n", idx);
Christoph Hellwigd5698c22007-02-10 01:46:46 -08001854 release_tty(tty, idx);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001855 goto end_init;
1856}
1857
Alan Coxaf9b8972006-08-27 01:24:01 -07001858/**
Christoph Hellwigd5698c22007-02-10 01:46:46 -08001859 * release_one_tty - release tty structure memory
Alan Coxaf9b8972006-08-27 01:24:01 -07001860 *
1861 * Releases memory associated with a tty structure, and clears out the
1862 * driver table slots. This function is called when a device is no longer
1863 * in use. It also gets called when setup of a device fails.
1864 *
1865 * Locking:
1866 * tty_mutex - sometimes only
1867 * takes the file list lock internally when working on the list
1868 * of ttys that the driver keeps.
1869 * FIXME: should we require tty_mutex is held here ??
Linus Torvalds1da177e2005-04-16 15:20:36 -07001870 */
Christoph Hellwigd5698c22007-02-10 01:46:46 -08001871static void release_one_tty(struct tty_struct *tty, int idx)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001872{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001873 int devpts = tty->driver->flags & TTY_DRIVER_DEVPTS_MEM;
Christoph Hellwigd5698c22007-02-10 01:46:46 -08001874 struct ktermios *tp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001875
1876 if (!devpts)
1877 tty->driver->ttys[idx] = NULL;
Christoph Hellwigd5698c22007-02-10 01:46:46 -08001878
Linus Torvalds1da177e2005-04-16 15:20:36 -07001879 if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
1880 tp = tty->termios;
1881 if (!devpts)
1882 tty->driver->termios[idx] = NULL;
1883 kfree(tp);
1884
1885 tp = tty->termios_locked;
1886 if (!devpts)
1887 tty->driver->termios_locked[idx] = NULL;
1888 kfree(tp);
1889 }
1890
Christoph Hellwigd5698c22007-02-10 01:46:46 -08001891
Linus Torvalds1da177e2005-04-16 15:20:36 -07001892 tty->magic = 0;
1893 tty->driver->refcount--;
Christoph Hellwigd5698c22007-02-10 01:46:46 -08001894
Linus Torvalds1da177e2005-04-16 15:20:36 -07001895 file_list_lock();
1896 list_del_init(&tty->tty_files);
1897 file_list_unlock();
Christoph Hellwigd5698c22007-02-10 01:46:46 -08001898
Linus Torvalds1da177e2005-04-16 15:20:36 -07001899 free_tty_struct(tty);
1900}
1901
Christoph Hellwigd5698c22007-02-10 01:46:46 -08001902/**
1903 * release_tty - release tty structure memory
1904 *
1905 * Release both @tty and a possible linked partner (think pty pair),
1906 * and decrement the refcount of the backing module.
1907 *
1908 * Locking:
1909 * tty_mutex - sometimes only
1910 * takes the file list lock internally when working on the list
1911 * of ttys that the driver keeps.
1912 * FIXME: should we require tty_mutex is held here ??
1913 */
1914static void release_tty(struct tty_struct *tty, int idx)
1915{
1916 struct tty_driver *driver = tty->driver;
1917
1918 if (tty->link)
1919 release_one_tty(tty->link, idx);
1920 release_one_tty(tty, idx);
1921 module_put(driver->owner);
1922}
1923
Linus Torvalds1da177e2005-04-16 15:20:36 -07001924/*
1925 * Even releasing the tty structures is a tricky business.. We have
1926 * to be very careful that the structures are all released at the
1927 * same time, as interrupts might otherwise get the wrong pointers.
1928 *
1929 * WSH 09/09/97: rewritten to avoid some nasty race conditions that could
1930 * lead to double frees or releasing memory still in use.
1931 */
Alan Cox37bdfb02008-02-08 04:18:47 -08001932static void release_dev(struct file *filp)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001933{
1934 struct tty_struct *tty, *o_tty;
1935 int pty_master, tty_closing, o_tty_closing, do_sleep;
Paul Fulghum14a62832006-04-10 22:54:19 -07001936 int devpts;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001937 int idx;
1938 char buf[64];
Alan Cox37bdfb02008-02-08 04:18:47 -08001939
Linus Torvalds1da177e2005-04-16 15:20:36 -07001940 tty = (struct tty_struct *)filp->private_data;
Alan Cox37bdfb02008-02-08 04:18:47 -08001941 if (tty_paranoia_check(tty, filp->f_path.dentry->d_inode,
1942 "release_dev"))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001943 return;
1944
1945 check_tty_count(tty, "release_dev");
1946
1947 tty_fasync(-1, filp, 0);
1948
1949 idx = tty->index;
1950 pty_master = (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
1951 tty->driver->subtype == PTY_TYPE_MASTER);
1952 devpts = (tty->driver->flags & TTY_DRIVER_DEVPTS_MEM) != 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001953 o_tty = tty->link;
1954
1955#ifdef TTY_PARANOIA_CHECK
1956 if (idx < 0 || idx >= tty->driver->num) {
1957 printk(KERN_DEBUG "release_dev: bad idx when trying to "
1958 "free (%s)\n", tty->name);
1959 return;
1960 }
1961 if (!(tty->driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
1962 if (tty != tty->driver->ttys[idx]) {
1963 printk(KERN_DEBUG "release_dev: driver.table[%d] not tty "
1964 "for (%s)\n", idx, tty->name);
1965 return;
1966 }
1967 if (tty->termios != tty->driver->termios[idx]) {
1968 printk(KERN_DEBUG "release_dev: driver.termios[%d] not termios "
1969 "for (%s)\n",
1970 idx, tty->name);
1971 return;
1972 }
1973 if (tty->termios_locked != tty->driver->termios_locked[idx]) {
1974 printk(KERN_DEBUG "release_dev: driver.termios_locked[%d] not "
1975 "termios_locked for (%s)\n",
1976 idx, tty->name);
1977 return;
1978 }
1979 }
1980#endif
1981
1982#ifdef TTY_DEBUG_HANGUP
1983 printk(KERN_DEBUG "release_dev of %s (tty count=%d)...",
1984 tty_name(tty, buf), tty->count);
1985#endif
1986
1987#ifdef TTY_PARANOIA_CHECK
1988 if (tty->driver->other &&
1989 !(tty->driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
1990 if (o_tty != tty->driver->other->ttys[idx]) {
1991 printk(KERN_DEBUG "release_dev: other->table[%d] "
1992 "not o_tty for (%s)\n",
1993 idx, tty->name);
1994 return;
1995 }
1996 if (o_tty->termios != tty->driver->other->termios[idx]) {
1997 printk(KERN_DEBUG "release_dev: other->termios[%d] "
1998 "not o_termios for (%s)\n",
1999 idx, tty->name);
2000 return;
2001 }
Alan Cox37bdfb02008-02-08 04:18:47 -08002002 if (o_tty->termios_locked !=
Linus Torvalds1da177e2005-04-16 15:20:36 -07002003 tty->driver->other->termios_locked[idx]) {
2004 printk(KERN_DEBUG "release_dev: other->termios_locked["
2005 "%d] not o_termios_locked for (%s)\n",
2006 idx, tty->name);
2007 return;
2008 }
2009 if (o_tty->link != tty) {
2010 printk(KERN_DEBUG "release_dev: bad pty pointers\n");
2011 return;
2012 }
2013 }
2014#endif
Alan Coxf34d7a52008-04-30 00:54:13 -07002015 if (tty->ops->close)
2016 tty->ops->close(tty, filp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002017
2018 /*
2019 * Sanity check: if tty->count is going to zero, there shouldn't be
2020 * any waiters on tty->read_wait or tty->write_wait. We test the
2021 * wait queues and kick everyone out _before_ actually starting to
2022 * close. This ensures that we won't block while releasing the tty
2023 * structure.
2024 *
2025 * The test for the o_tty closing is necessary, since the master and
2026 * slave sides may close in any order. If the slave side closes out
2027 * first, its count will be one, since the master side holds an open.
2028 * Thus this test wouldn't be triggered at the time the slave closes,
2029 * so we do it now.
2030 *
2031 * Note that it's possible for the tty to be opened again while we're
2032 * flushing out waiters. By recalculating the closing flags before
2033 * each iteration we avoid any problems.
2034 */
2035 while (1) {
2036 /* Guard against races with tty->count changes elsewhere and
2037 opens on /dev/tty */
Alan Cox37bdfb02008-02-08 04:18:47 -08002038
Ingo Molnar70522e12006-03-23 03:00:31 -08002039 mutex_lock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002040 tty_closing = tty->count <= 1;
2041 o_tty_closing = o_tty &&
2042 (o_tty->count <= (pty_master ? 1 : 0));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002043 do_sleep = 0;
2044
2045 if (tty_closing) {
2046 if (waitqueue_active(&tty->read_wait)) {
2047 wake_up(&tty->read_wait);
2048 do_sleep++;
2049 }
2050 if (waitqueue_active(&tty->write_wait)) {
2051 wake_up(&tty->write_wait);
2052 do_sleep++;
2053 }
2054 }
2055 if (o_tty_closing) {
2056 if (waitqueue_active(&o_tty->read_wait)) {
2057 wake_up(&o_tty->read_wait);
2058 do_sleep++;
2059 }
2060 if (waitqueue_active(&o_tty->write_wait)) {
2061 wake_up(&o_tty->write_wait);
2062 do_sleep++;
2063 }
2064 }
2065 if (!do_sleep)
2066 break;
2067
2068 printk(KERN_WARNING "release_dev: %s: read/write wait queue "
2069 "active!\n", tty_name(tty, buf));
Ingo Molnar70522e12006-03-23 03:00:31 -08002070 mutex_unlock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002071 schedule();
Alan Cox37bdfb02008-02-08 04:18:47 -08002072 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002073
2074 /*
Alan Cox37bdfb02008-02-08 04:18:47 -08002075 * The closing flags are now consistent with the open counts on
2076 * both sides, and we've completed the last operation that could
Linus Torvalds1da177e2005-04-16 15:20:36 -07002077 * block, so it's safe to proceed with closing.
2078 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002079 if (pty_master) {
2080 if (--o_tty->count < 0) {
2081 printk(KERN_WARNING "release_dev: bad pty slave count "
2082 "(%d) for %s\n",
2083 o_tty->count, tty_name(o_tty, buf));
2084 o_tty->count = 0;
2085 }
2086 }
2087 if (--tty->count < 0) {
2088 printk(KERN_WARNING "release_dev: bad tty->count (%d) for %s\n",
2089 tty->count, tty_name(tty, buf));
2090 tty->count = 0;
2091 }
Alan Cox37bdfb02008-02-08 04:18:47 -08002092
Linus Torvalds1da177e2005-04-16 15:20:36 -07002093 /*
2094 * We've decremented tty->count, so we need to remove this file
2095 * descriptor off the tty->tty_files list; this serves two
2096 * purposes:
2097 * - check_tty_count sees the correct number of file descriptors
2098 * associated with this tty.
2099 * - do_tty_hangup no longer sees this file descriptor as
2100 * something that needs to be handled for hangups.
2101 */
2102 file_kill(filp);
2103 filp->private_data = NULL;
2104
2105 /*
2106 * Perform some housekeeping before deciding whether to return.
2107 *
2108 * Set the TTY_CLOSING flag if this was the last open. In the
2109 * case of a pty we may have to wait around for the other side
2110 * to close, and TTY_CLOSING makes sure we can't be reopened.
2111 */
Alan Cox37bdfb02008-02-08 04:18:47 -08002112 if (tty_closing)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002113 set_bit(TTY_CLOSING, &tty->flags);
Alan Cox37bdfb02008-02-08 04:18:47 -08002114 if (o_tty_closing)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002115 set_bit(TTY_CLOSING, &o_tty->flags);
2116
2117 /*
2118 * If _either_ side is closing, make sure there aren't any
2119 * processes that still think tty or o_tty is their controlling
2120 * tty.
2121 */
2122 if (tty_closing || o_tty_closing) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002123 read_lock(&tasklist_lock);
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002124 session_clear_tty(tty->session);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002125 if (o_tty)
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002126 session_clear_tty(o_tty->session);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002127 read_unlock(&tasklist_lock);
2128 }
2129
Ingo Molnar70522e12006-03-23 03:00:31 -08002130 mutex_unlock(&tty_mutex);
Paul Fulghumda965822006-02-14 13:53:00 -08002131
Linus Torvalds1da177e2005-04-16 15:20:36 -07002132 /* check whether both sides are closing ... */
2133 if (!tty_closing || (o_tty && !o_tty_closing))
2134 return;
Alan Cox37bdfb02008-02-08 04:18:47 -08002135
Linus Torvalds1da177e2005-04-16 15:20:36 -07002136#ifdef TTY_DEBUG_HANGUP
2137 printk(KERN_DEBUG "freeing tty structure...");
2138#endif
2139 /*
Alan Cox01e1abb2008-07-22 11:16:55 +01002140 * Ask the line discipline code to release its structures
Linus Torvalds1da177e2005-04-16 15:20:36 -07002141 */
Alan Cox01e1abb2008-07-22 11:16:55 +01002142 tty_ldisc_release(tty, o_tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002143 /*
Christoph Hellwigd5698c22007-02-10 01:46:46 -08002144 * The release_tty function takes care of the details of clearing
Linus Torvalds1da177e2005-04-16 15:20:36 -07002145 * the slots and preserving the termios structure.
2146 */
Christoph Hellwigd5698c22007-02-10 01:46:46 -08002147 release_tty(tty, idx);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002148
Linus Torvalds1da177e2005-04-16 15:20:36 -07002149 /* Make this pty number available for reallocation */
Sukadev Bhattiprolu718a9162008-04-30 00:54:21 -07002150 if (devpts)
2151 devpts_kill_index(idx);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002152}
2153
Alan Coxaf9b8972006-08-27 01:24:01 -07002154/**
2155 * tty_open - open a tty device
2156 * @inode: inode of device file
2157 * @filp: file pointer to tty
Linus Torvalds1da177e2005-04-16 15:20:36 -07002158 *
Alan Coxaf9b8972006-08-27 01:24:01 -07002159 * tty_open and tty_release keep up the tty count that contains the
2160 * number of opens done on a tty. We cannot use the inode-count, as
2161 * different inodes might point to the same tty.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002162 *
Alan Coxaf9b8972006-08-27 01:24:01 -07002163 * Open-counting is needed for pty masters, as well as for keeping
2164 * track of serial lines: DTR is dropped when the last close happens.
2165 * (This is not done solely through tty->count, now. - Ted 1/27/92)
2166 *
2167 * The termios state of a pty is reset on first open so that
2168 * settings don't persist across reuse.
2169 *
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002170 * Locking: tty_mutex protects tty, get_tty_driver and init_dev work.
2171 * tty->count should protect the rest.
2172 * ->siglock protects ->signal/->sighand
Linus Torvalds1da177e2005-04-16 15:20:36 -07002173 */
Alan Coxaf9b8972006-08-27 01:24:01 -07002174
Jonathan Corbet39d95b92008-05-16 09:10:50 -06002175static int __tty_open(struct inode *inode, struct file *filp)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002176{
2177 struct tty_struct *tty;
2178 int noctty, retval;
2179 struct tty_driver *driver;
2180 int index;
2181 dev_t device = inode->i_rdev;
2182 unsigned short saved_flags = filp->f_flags;
2183
2184 nonseekable_open(inode, filp);
Alan Cox37bdfb02008-02-08 04:18:47 -08002185
Linus Torvalds1da177e2005-04-16 15:20:36 -07002186retry_open:
2187 noctty = filp->f_flags & O_NOCTTY;
2188 index = -1;
2189 retval = 0;
Alan Cox37bdfb02008-02-08 04:18:47 -08002190
Ingo Molnar70522e12006-03-23 03:00:31 -08002191 mutex_lock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002192
Alan Cox37bdfb02008-02-08 04:18:47 -08002193 if (device == MKDEV(TTYAUX_MAJOR, 0)) {
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002194 tty = get_current_tty();
2195 if (!tty) {
Ingo Molnar70522e12006-03-23 03:00:31 -08002196 mutex_unlock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002197 return -ENXIO;
2198 }
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002199 driver = tty->driver;
2200 index = tty->index;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002201 filp->f_flags |= O_NONBLOCK; /* Don't let /dev/tty block */
2202 /* noctty = 1; */
2203 goto got_driver;
2204 }
2205#ifdef CONFIG_VT
Alan Cox37bdfb02008-02-08 04:18:47 -08002206 if (device == MKDEV(TTY_MAJOR, 0)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002207 extern struct tty_driver *console_driver;
2208 driver = console_driver;
2209 index = fg_console;
2210 noctty = 1;
2211 goto got_driver;
2212 }
2213#endif
Alan Cox37bdfb02008-02-08 04:18:47 -08002214 if (device == MKDEV(TTYAUX_MAJOR, 1)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002215 driver = console_device(&index);
2216 if (driver) {
2217 /* Don't let /dev/console block */
2218 filp->f_flags |= O_NONBLOCK;
2219 noctty = 1;
2220 goto got_driver;
2221 }
Ingo Molnar70522e12006-03-23 03:00:31 -08002222 mutex_unlock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002223 return -ENODEV;
2224 }
2225
2226 driver = get_tty_driver(device, &index);
2227 if (!driver) {
Ingo Molnar70522e12006-03-23 03:00:31 -08002228 mutex_unlock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002229 return -ENODEV;
2230 }
2231got_driver:
2232 retval = init_dev(driver, index, &tty);
Ingo Molnar70522e12006-03-23 03:00:31 -08002233 mutex_unlock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002234 if (retval)
2235 return retval;
2236
2237 filp->private_data = tty;
2238 file_move(filp, &tty->tty_files);
2239 check_tty_count(tty, "tty_open");
2240 if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
2241 tty->driver->subtype == PTY_TYPE_MASTER)
2242 noctty = 1;
2243#ifdef TTY_DEBUG_HANGUP
2244 printk(KERN_DEBUG "opening %s...", tty->name);
2245#endif
2246 if (!retval) {
Alan Coxf34d7a52008-04-30 00:54:13 -07002247 if (tty->ops->open)
2248 retval = tty->ops->open(tty, filp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002249 else
2250 retval = -ENODEV;
2251 }
2252 filp->f_flags = saved_flags;
2253
Alan Cox37bdfb02008-02-08 04:18:47 -08002254 if (!retval && test_bit(TTY_EXCLUSIVE, &tty->flags) &&
2255 !capable(CAP_SYS_ADMIN))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002256 retval = -EBUSY;
2257
2258 if (retval) {
2259#ifdef TTY_DEBUG_HANGUP
2260 printk(KERN_DEBUG "error %d in opening %s...", retval,
2261 tty->name);
2262#endif
2263 release_dev(filp);
2264 if (retval != -ERESTARTSYS)
2265 return retval;
2266 if (signal_pending(current))
2267 return retval;
2268 schedule();
2269 /*
2270 * Need to reset f_op in case a hangup happened.
2271 */
2272 if (filp->f_op == &hung_up_tty_fops)
2273 filp->f_op = &tty_fops;
2274 goto retry_open;
2275 }
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002276
2277 mutex_lock(&tty_mutex);
2278 spin_lock_irq(&current->sighand->siglock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002279 if (!noctty &&
2280 current->signal->leader &&
2281 !current->signal->tty &&
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08002282 tty->session == NULL)
Eric W. Biederman2a65f1d2007-05-08 00:26:53 -07002283 __proc_set_tty(current, tty);
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002284 spin_unlock_irq(&current->sighand->siglock);
2285 mutex_unlock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002286 return 0;
2287}
2288
Jonathan Corbet39d95b92008-05-16 09:10:50 -06002289/* BKL pushdown: scary code avoidance wrapper */
2290static int tty_open(struct inode *inode, struct file *filp)
2291{
2292 int ret;
2293
2294 lock_kernel();
2295 ret = __tty_open(inode, filp);
2296 unlock_kernel();
2297 return ret;
2298}
2299
2300
2301
Linus Torvalds1da177e2005-04-16 15:20:36 -07002302#ifdef CONFIG_UNIX98_PTYS
Alan Coxaf9b8972006-08-27 01:24:01 -07002303/**
2304 * ptmx_open - open a unix 98 pty master
2305 * @inode: inode of device file
2306 * @filp: file pointer to tty
2307 *
2308 * Allocate a unix98 pty master device from the ptmx driver.
2309 *
2310 * Locking: tty_mutex protects theinit_dev work. tty->count should
Alan Cox37bdfb02008-02-08 04:18:47 -08002311 * protect the rest.
Alan Coxaf9b8972006-08-27 01:24:01 -07002312 * allocated_ptys_lock handles the list of free pty numbers
2313 */
2314
Jonathan Corbet39d95b92008-05-16 09:10:50 -06002315static int __ptmx_open(struct inode *inode, struct file *filp)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002316{
2317 struct tty_struct *tty;
2318 int retval;
2319 int index;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002320
2321 nonseekable_open(inode, filp);
2322
2323 /* find a device that is not in use. */
Sukadev Bhattiprolu718a9162008-04-30 00:54:21 -07002324 index = devpts_new_index();
2325 if (index < 0)
2326 return index;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002327
Ingo Molnar70522e12006-03-23 03:00:31 -08002328 mutex_lock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002329 retval = init_dev(ptm_driver, index, &tty);
Ingo Molnar70522e12006-03-23 03:00:31 -08002330 mutex_unlock(&tty_mutex);
Alan Cox37bdfb02008-02-08 04:18:47 -08002331
Linus Torvalds1da177e2005-04-16 15:20:36 -07002332 if (retval)
2333 goto out;
2334
2335 set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */
2336 filp->private_data = tty;
2337 file_move(filp, &tty->tty_files);
2338
Sukadev Bhattiprolu4f8f9d62008-04-30 00:54:20 -07002339 retval = devpts_pty_new(tty->link);
2340 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002341 goto out1;
2342
Hiroshi Shimamoto86a96532008-04-30 00:54:20 -07002343 check_tty_count(tty, "ptmx_open");
Alan Coxf34d7a52008-04-30 00:54:13 -07002344 retval = ptm_driver->ops->open(tty, filp);
Miloslav Trmac41126222008-04-18 13:30:14 -07002345 if (!retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002346 return 0;
2347out1:
2348 release_dev(filp);
Paul Fulghum9453a5a2006-04-10 22:54:18 -07002349 return retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002350out:
Sukadev Bhattiprolu718a9162008-04-30 00:54:21 -07002351 devpts_kill_index(index);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002352 return retval;
2353}
Jonathan Corbet39d95b92008-05-16 09:10:50 -06002354
2355static int ptmx_open(struct inode *inode, struct file *filp)
2356{
2357 int ret;
2358
2359 lock_kernel();
2360 ret = __ptmx_open(inode, filp);
2361 unlock_kernel();
2362 return ret;
2363}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002364#endif
2365
Alan Coxaf9b8972006-08-27 01:24:01 -07002366/**
2367 * tty_release - vfs callback for close
2368 * @inode: inode of tty
2369 * @filp: file pointer for handle to tty
2370 *
2371 * Called the last time each file handle is closed that references
2372 * this tty. There may however be several such references.
2373 *
2374 * Locking:
2375 * Takes bkl. See release_dev
2376 */
2377
Alan Cox37bdfb02008-02-08 04:18:47 -08002378static int tty_release(struct inode *inode, struct file *filp)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002379{
2380 lock_kernel();
2381 release_dev(filp);
2382 unlock_kernel();
2383 return 0;
2384}
2385
Alan Coxaf9b8972006-08-27 01:24:01 -07002386/**
2387 * tty_poll - check tty status
2388 * @filp: file being polled
2389 * @wait: poll wait structures to update
2390 *
2391 * Call the line discipline polling method to obtain the poll
2392 * status of the device.
2393 *
2394 * Locking: locks called line discipline but ldisc poll method
2395 * may be re-entered freely by other callers.
2396 */
2397
Alan Cox37bdfb02008-02-08 04:18:47 -08002398static unsigned int tty_poll(struct file *filp, poll_table *wait)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002399{
Alan Cox37bdfb02008-02-08 04:18:47 -08002400 struct tty_struct *tty;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002401 struct tty_ldisc *ld;
2402 int ret = 0;
2403
2404 tty = (struct tty_struct *)filp->private_data;
Josef Sipeka7113a92006-12-08 02:36:55 -08002405 if (tty_paranoia_check(tty, filp->f_path.dentry->d_inode, "tty_poll"))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002406 return 0;
Alan Cox37bdfb02008-02-08 04:18:47 -08002407
Linus Torvalds1da177e2005-04-16 15:20:36 -07002408 ld = tty_ldisc_ref_wait(tty);
Alan Coxa352def2008-07-16 21:53:12 +01002409 if (ld->ops->poll)
2410 ret = (ld->ops->poll)(tty, filp, wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002411 tty_ldisc_deref(ld);
2412 return ret;
2413}
2414
Alan Cox37bdfb02008-02-08 04:18:47 -08002415static int tty_fasync(int fd, struct file *filp, int on)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002416{
Alan Cox37bdfb02008-02-08 04:18:47 -08002417 struct tty_struct *tty;
Alan Cox47f86832008-04-30 00:53:30 -07002418 unsigned long flags;
Jonathan Corbet5d1e3232008-06-19 16:04:53 -06002419 int retval = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002420
Jonathan Corbet5d1e3232008-06-19 16:04:53 -06002421 lock_kernel();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002422 tty = (struct tty_struct *)filp->private_data;
Josef Sipeka7113a92006-12-08 02:36:55 -08002423 if (tty_paranoia_check(tty, filp->f_path.dentry->d_inode, "tty_fasync"))
Jonathan Corbet5d1e3232008-06-19 16:04:53 -06002424 goto out;
Alan Cox37bdfb02008-02-08 04:18:47 -08002425
Linus Torvalds1da177e2005-04-16 15:20:36 -07002426 retval = fasync_helper(fd, filp, on, &tty->fasync);
2427 if (retval <= 0)
Jonathan Corbet5d1e3232008-06-19 16:04:53 -06002428 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002429
2430 if (on) {
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08002431 enum pid_type type;
2432 struct pid *pid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002433 if (!waitqueue_active(&tty->read_wait))
2434 tty->minimum_to_wake = 1;
Alan Cox47f86832008-04-30 00:53:30 -07002435 spin_lock_irqsave(&tty->ctrl_lock, flags);
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08002436 if (tty->pgrp) {
2437 pid = tty->pgrp;
2438 type = PIDTYPE_PGID;
2439 } else {
2440 pid = task_pid(current);
2441 type = PIDTYPE_PID;
2442 }
Alan Cox47f86832008-04-30 00:53:30 -07002443 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08002444 retval = __f_setown(filp, pid, type, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002445 if (retval)
Jonathan Corbet5d1e3232008-06-19 16:04:53 -06002446 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002447 } else {
2448 if (!tty->fasync && !waitqueue_active(&tty->read_wait))
2449 tty->minimum_to_wake = N_TTY_BUF_SIZE;
2450 }
Jonathan Corbet5d1e3232008-06-19 16:04:53 -06002451 retval = 0;
2452out:
2453 unlock_kernel();
2454 return retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002455}
2456
Alan Coxaf9b8972006-08-27 01:24:01 -07002457/**
2458 * tiocsti - fake input character
2459 * @tty: tty to fake input into
2460 * @p: pointer to character
2461 *
Robert P. J. Day3a4fa0a2007-10-19 23:10:43 +02002462 * Fake input to a tty device. Does the necessary locking and
Alan Coxaf9b8972006-08-27 01:24:01 -07002463 * input management.
2464 *
2465 * FIXME: does not honour flow control ??
2466 *
2467 * Locking:
2468 * Called functions take tty_ldisc_lock
2469 * current->signal->tty check is safe without locks
Alan Cox28298232006-09-29 02:00:58 -07002470 *
2471 * FIXME: may race normal receive processing
Alan Coxaf9b8972006-08-27 01:24:01 -07002472 */
2473
Linus Torvalds1da177e2005-04-16 15:20:36 -07002474static int tiocsti(struct tty_struct *tty, char __user *p)
2475{
2476 char ch, mbz = 0;
2477 struct tty_ldisc *ld;
Alan Cox37bdfb02008-02-08 04:18:47 -08002478
Linus Torvalds1da177e2005-04-16 15:20:36 -07002479 if ((current->signal->tty != tty) && !capable(CAP_SYS_ADMIN))
2480 return -EPERM;
2481 if (get_user(ch, p))
2482 return -EFAULT;
2483 ld = tty_ldisc_ref_wait(tty);
Alan Coxa352def2008-07-16 21:53:12 +01002484 ld->ops->receive_buf(tty, &ch, &mbz, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002485 tty_ldisc_deref(ld);
2486 return 0;
2487}
2488
Alan Coxaf9b8972006-08-27 01:24:01 -07002489/**
2490 * tiocgwinsz - implement window query ioctl
2491 * @tty; tty
2492 * @arg: user buffer for result
2493 *
Alan Cox808a0d32006-09-29 02:00:40 -07002494 * Copies the kernel idea of the window size into the user buffer.
Alan Coxaf9b8972006-08-27 01:24:01 -07002495 *
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002496 * Locking: tty->termios_mutex is taken to ensure the winsize data
Alan Cox808a0d32006-09-29 02:00:40 -07002497 * is consistent.
Alan Coxaf9b8972006-08-27 01:24:01 -07002498 */
2499
Alan Cox37bdfb02008-02-08 04:18:47 -08002500static int tiocgwinsz(struct tty_struct *tty, struct winsize __user *arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002501{
Alan Cox808a0d32006-09-29 02:00:40 -07002502 int err;
2503
Arjan van de Ven5785c952006-09-29 02:00:43 -07002504 mutex_lock(&tty->termios_mutex);
Alan Cox808a0d32006-09-29 02:00:40 -07002505 err = copy_to_user(arg, &tty->winsize, sizeof(*arg));
Arjan van de Ven5785c952006-09-29 02:00:43 -07002506 mutex_unlock(&tty->termios_mutex);
Alan Cox808a0d32006-09-29 02:00:40 -07002507
2508 return err ? -EFAULT: 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002509}
2510
Alan Coxaf9b8972006-08-27 01:24:01 -07002511/**
2512 * tiocswinsz - implement window size set ioctl
2513 * @tty; tty
2514 * @arg: user buffer for result
2515 *
2516 * Copies the user idea of the window size to the kernel. Traditionally
2517 * this is just advisory information but for the Linux console it
2518 * actually has driver level meaning and triggers a VC resize.
2519 *
2520 * Locking:
Alan Coxca9bda02006-09-29 02:00:03 -07002521 * Called function use the console_sem is used to ensure we do
2522 * not try and resize the console twice at once.
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002523 * The tty->termios_mutex is used to ensure we don't double
2524 * resize and get confused. Lock order - tty->termios_mutex before
Alan Coxca9bda02006-09-29 02:00:03 -07002525 * console sem
Alan Coxaf9b8972006-08-27 01:24:01 -07002526 */
2527
Linus Torvalds1da177e2005-04-16 15:20:36 -07002528static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty,
Alan Cox37bdfb02008-02-08 04:18:47 -08002529 struct winsize __user *arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002530{
2531 struct winsize tmp_ws;
Alan Cox47f86832008-04-30 00:53:30 -07002532 struct pid *pgrp, *rpgrp;
2533 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002534
2535 if (copy_from_user(&tmp_ws, arg, sizeof(*arg)))
2536 return -EFAULT;
Alan Coxca9bda02006-09-29 02:00:03 -07002537
Arjan van de Ven5785c952006-09-29 02:00:43 -07002538 mutex_lock(&tty->termios_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002539 if (!memcmp(&tmp_ws, &tty->winsize, sizeof(*arg)))
Alan Coxca9bda02006-09-29 02:00:03 -07002540 goto done;
2541
Linus Torvalds1da177e2005-04-16 15:20:36 -07002542#ifdef CONFIG_VT
2543 if (tty->driver->type == TTY_DRIVER_TYPE_CONSOLE) {
Arjan van de Ven5785c952006-09-29 02:00:43 -07002544 if (vc_lock_resize(tty->driver_data, tmp_ws.ws_col,
2545 tmp_ws.ws_row)) {
2546 mutex_unlock(&tty->termios_mutex);
Alan Cox37bdfb02008-02-08 04:18:47 -08002547 return -ENXIO;
Alan Coxca9bda02006-09-29 02:00:03 -07002548 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002549 }
2550#endif
Alan Cox47f86832008-04-30 00:53:30 -07002551 /* Get the PID values and reference them so we can
2552 avoid holding the tty ctrl lock while sending signals */
2553 spin_lock_irqsave(&tty->ctrl_lock, flags);
2554 pgrp = get_pid(tty->pgrp);
2555 rpgrp = get_pid(real_tty->pgrp);
2556 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
2557
2558 if (pgrp)
2559 kill_pgrp(pgrp, SIGWINCH, 1);
2560 if (rpgrp != pgrp && rpgrp)
2561 kill_pgrp(rpgrp, SIGWINCH, 1);
2562
2563 put_pid(pgrp);
2564 put_pid(rpgrp);
2565
Linus Torvalds1da177e2005-04-16 15:20:36 -07002566 tty->winsize = tmp_ws;
2567 real_tty->winsize = tmp_ws;
Alan Coxca9bda02006-09-29 02:00:03 -07002568done:
Arjan van de Ven5785c952006-09-29 02:00:43 -07002569 mutex_unlock(&tty->termios_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002570 return 0;
2571}
2572
Alan Coxaf9b8972006-08-27 01:24:01 -07002573/**
2574 * tioccons - allow admin to move logical console
2575 * @file: the file to become console
2576 *
2577 * Allow the adminstrator to move the redirected console device
2578 *
2579 * Locking: uses redirect_lock to guard the redirect information
2580 */
2581
Linus Torvalds1da177e2005-04-16 15:20:36 -07002582static int tioccons(struct file *file)
2583{
2584 if (!capable(CAP_SYS_ADMIN))
2585 return -EPERM;
2586 if (file->f_op->write == redirected_tty_write) {
2587 struct file *f;
2588 spin_lock(&redirect_lock);
2589 f = redirect;
2590 redirect = NULL;
2591 spin_unlock(&redirect_lock);
2592 if (f)
2593 fput(f);
2594 return 0;
2595 }
2596 spin_lock(&redirect_lock);
2597 if (redirect) {
2598 spin_unlock(&redirect_lock);
2599 return -EBUSY;
2600 }
2601 get_file(file);
2602 redirect = file;
2603 spin_unlock(&redirect_lock);
2604 return 0;
2605}
2606
Alan Coxaf9b8972006-08-27 01:24:01 -07002607/**
2608 * fionbio - non blocking ioctl
2609 * @file: file to set blocking value
2610 * @p: user parameter
2611 *
2612 * Historical tty interfaces had a blocking control ioctl before
2613 * the generic functionality existed. This piece of history is preserved
2614 * in the expected tty API of posix OS's.
2615 *
2616 * Locking: none, the open fle handle ensures it won't go away.
2617 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002618
2619static int fionbio(struct file *file, int __user *p)
2620{
2621 int nonblock;
2622
2623 if (get_user(nonblock, p))
2624 return -EFAULT;
2625
Alan Cox04f378b2008-04-30 00:53:29 -07002626 /* file->f_flags is still BKL protected in the fs layer - vomit */
2627 lock_kernel();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002628 if (nonblock)
2629 file->f_flags |= O_NONBLOCK;
2630 else
2631 file->f_flags &= ~O_NONBLOCK;
Alan Cox04f378b2008-04-30 00:53:29 -07002632 unlock_kernel();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002633 return 0;
2634}
2635
Alan Coxaf9b8972006-08-27 01:24:01 -07002636/**
2637 * tiocsctty - set controlling tty
2638 * @tty: tty structure
2639 * @arg: user argument
2640 *
2641 * This ioctl is used to manage job control. It permits a session
2642 * leader to set this tty as the controlling tty for the session.
2643 *
2644 * Locking:
Alan Cox28298232006-09-29 02:00:58 -07002645 * Takes tty_mutex() to protect tty instance
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002646 * Takes tasklist_lock internally to walk sessions
2647 * Takes ->siglock() when updating signal->tty
Alan Coxaf9b8972006-08-27 01:24:01 -07002648 */
2649
Linus Torvalds1da177e2005-04-16 15:20:36 -07002650static int tiocsctty(struct tty_struct *tty, int arg)
2651{
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002652 int ret = 0;
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08002653 if (current->signal->leader && (task_session(current) == tty->session))
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002654 return ret;
2655
2656 mutex_lock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002657 /*
2658 * The process must be a session leader and
2659 * not have a controlling tty already.
2660 */
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002661 if (!current->signal->leader || current->signal->tty) {
2662 ret = -EPERM;
2663 goto unlock;
2664 }
2665
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08002666 if (tty->session) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002667 /*
2668 * This tty is already the controlling
2669 * tty for another session group!
2670 */
Alan Cox37bdfb02008-02-08 04:18:47 -08002671 if (arg == 1 && capable(CAP_SYS_ADMIN)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002672 /*
2673 * Steal it away
2674 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002675 read_lock(&tasklist_lock);
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002676 session_clear_tty(tty->session);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002677 read_unlock(&tasklist_lock);
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002678 } else {
2679 ret = -EPERM;
2680 goto unlock;
2681 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002682 }
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002683 proc_set_tty(current, tty);
2684unlock:
Alan Cox28298232006-09-29 02:00:58 -07002685 mutex_unlock(&tty_mutex);
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002686 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002687}
2688
Alan Coxaf9b8972006-08-27 01:24:01 -07002689/**
Alan Cox5d0fdf12008-04-30 00:53:31 -07002690 * tty_get_pgrp - return a ref counted pgrp pid
2691 * @tty: tty to read
2692 *
2693 * Returns a refcounted instance of the pid struct for the process
2694 * group controlling the tty.
2695 */
2696
2697struct pid *tty_get_pgrp(struct tty_struct *tty)
2698{
2699 unsigned long flags;
2700 struct pid *pgrp;
2701
2702 spin_lock_irqsave(&tty->ctrl_lock, flags);
2703 pgrp = get_pid(tty->pgrp);
2704 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
2705
2706 return pgrp;
2707}
2708EXPORT_SYMBOL_GPL(tty_get_pgrp);
2709
2710/**
Alan Coxaf9b8972006-08-27 01:24:01 -07002711 * tiocgpgrp - get process group
2712 * @tty: tty passed by user
2713 * @real_tty: tty side of the tty pased by the user if a pty else the tty
2714 * @p: returned pid
2715 *
2716 * Obtain the process group of the tty. If there is no process group
2717 * return an error.
2718 *
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002719 * Locking: none. Reference to current->signal->tty is safe.
Alan Coxaf9b8972006-08-27 01:24:01 -07002720 */
2721
Linus Torvalds1da177e2005-04-16 15:20:36 -07002722static int tiocgpgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
2723{
Alan Cox5d0fdf12008-04-30 00:53:31 -07002724 struct pid *pid;
2725 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002726 /*
2727 * (tty == real_tty) is a cheap way of
2728 * testing if the tty is NOT a master pty.
2729 */
2730 if (tty == real_tty && current->signal->tty != real_tty)
2731 return -ENOTTY;
Alan Cox5d0fdf12008-04-30 00:53:31 -07002732 pid = tty_get_pgrp(real_tty);
2733 ret = put_user(pid_vnr(pid), p);
2734 put_pid(pid);
2735 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002736}
2737
Alan Coxaf9b8972006-08-27 01:24:01 -07002738/**
2739 * tiocspgrp - attempt to set process group
2740 * @tty: tty passed by user
2741 * @real_tty: tty side device matching tty passed by user
2742 * @p: pid pointer
2743 *
2744 * Set the process group of the tty to the session passed. Only
2745 * permitted where the tty session is our session.
2746 *
Alan Cox47f86832008-04-30 00:53:30 -07002747 * Locking: RCU, ctrl lock
Alan Coxaf9b8972006-08-27 01:24:01 -07002748 */
2749
Linus Torvalds1da177e2005-04-16 15:20:36 -07002750static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
2751{
Eric W. Biederman04a2e6a2007-02-12 00:52:56 -08002752 struct pid *pgrp;
2753 pid_t pgrp_nr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002754 int retval = tty_check_change(real_tty);
Alan Cox47f86832008-04-30 00:53:30 -07002755 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002756
2757 if (retval == -EIO)
2758 return -ENOTTY;
2759 if (retval)
2760 return retval;
2761 if (!current->signal->tty ||
2762 (current->signal->tty != real_tty) ||
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08002763 (real_tty->session != task_session(current)))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002764 return -ENOTTY;
Eric W. Biederman04a2e6a2007-02-12 00:52:56 -08002765 if (get_user(pgrp_nr, p))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002766 return -EFAULT;
Eric W. Biederman04a2e6a2007-02-12 00:52:56 -08002767 if (pgrp_nr < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002768 return -EINVAL;
Eric W. Biederman04a2e6a2007-02-12 00:52:56 -08002769 rcu_read_lock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07002770 pgrp = find_vpid(pgrp_nr);
Eric W. Biederman04a2e6a2007-02-12 00:52:56 -08002771 retval = -ESRCH;
2772 if (!pgrp)
2773 goto out_unlock;
2774 retval = -EPERM;
2775 if (session_of_pgrp(pgrp) != task_session(current))
2776 goto out_unlock;
2777 retval = 0;
Alan Cox47f86832008-04-30 00:53:30 -07002778 spin_lock_irqsave(&tty->ctrl_lock, flags);
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08002779 put_pid(real_tty->pgrp);
2780 real_tty->pgrp = get_pid(pgrp);
Alan Cox47f86832008-04-30 00:53:30 -07002781 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
Eric W. Biederman04a2e6a2007-02-12 00:52:56 -08002782out_unlock:
2783 rcu_read_unlock();
2784 return retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002785}
2786
Alan Coxaf9b8972006-08-27 01:24:01 -07002787/**
2788 * tiocgsid - get session id
2789 * @tty: tty passed by user
2790 * @real_tty: tty side of the tty pased by the user if a pty else the tty
2791 * @p: pointer to returned session id
2792 *
2793 * Obtain the session id of the tty. If there is no session
2794 * return an error.
2795 *
Peter Zijlstra24ec8392006-12-08 02:36:04 -08002796 * Locking: none. Reference to current->signal->tty is safe.
Alan Coxaf9b8972006-08-27 01:24:01 -07002797 */
2798
Linus Torvalds1da177e2005-04-16 15:20:36 -07002799static int tiocgsid(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
2800{
2801 /*
2802 * (tty == real_tty) is a cheap way of
2803 * testing if the tty is NOT a master pty.
2804 */
2805 if (tty == real_tty && current->signal->tty != real_tty)
2806 return -ENOTTY;
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08002807 if (!real_tty->session)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002808 return -ENOTTY;
Pavel Emelyanovb4888932007-10-18 23:40:14 -07002809 return put_user(pid_vnr(real_tty->session), p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002810}
2811
Alan Coxaf9b8972006-08-27 01:24:01 -07002812/**
2813 * tiocsetd - set line discipline
2814 * @tty: tty device
2815 * @p: pointer to user data
2816 *
2817 * Set the line discipline according to user request.
2818 *
2819 * Locking: see tty_set_ldisc, this function is just a helper
2820 */
2821
Linus Torvalds1da177e2005-04-16 15:20:36 -07002822static int tiocsetd(struct tty_struct *tty, int __user *p)
2823{
2824 int ldisc;
Alan Cox04f378b2008-04-30 00:53:29 -07002825 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002826
2827 if (get_user(ldisc, p))
2828 return -EFAULT;
Alan Cox04f378b2008-04-30 00:53:29 -07002829
2830 lock_kernel();
2831 ret = tty_set_ldisc(tty, ldisc);
2832 unlock_kernel();
2833
2834 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002835}
2836
Alan Coxaf9b8972006-08-27 01:24:01 -07002837/**
2838 * send_break - performed time break
2839 * @tty: device to break on
2840 * @duration: timeout in mS
2841 *
2842 * Perform a timed break on hardware that lacks its own driver level
2843 * timed break functionality.
2844 *
2845 * Locking:
Alan Cox28298232006-09-29 02:00:58 -07002846 * atomic_write_lock serializes
Alan Coxaf9b8972006-08-27 01:24:01 -07002847 *
Alan Coxaf9b8972006-08-27 01:24:01 -07002848 */
2849
Domen Puncerb20f3ae2005-06-25 14:58:42 -07002850static int send_break(struct tty_struct *tty, unsigned int duration)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002851{
Alan Cox9c1729d2007-07-15 23:39:43 -07002852 if (tty_write_lock(tty, 0) < 0)
Alan Coxf34d7a52008-04-30 00:54:13 -07002853 return -EINTR;
2854 tty->ops->break_ctl(tty, -1);
Alan Cox9c1729d2007-07-15 23:39:43 -07002855 if (!signal_pending(current))
Domen Puncerb20f3ae2005-06-25 14:58:42 -07002856 msleep_interruptible(duration);
Alan Coxf34d7a52008-04-30 00:54:13 -07002857 tty->ops->break_ctl(tty, 0);
Alan Cox9c1729d2007-07-15 23:39:43 -07002858 tty_write_unlock(tty);
Alan Cox3e2a0782008-06-30 17:40:08 +01002859 if (signal_pending(current))
Alan Coxf34d7a52008-04-30 00:54:13 -07002860 return -EINTR;
2861 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002862}
2863
Alan Coxaf9b8972006-08-27 01:24:01 -07002864/**
Alan Coxf34d7a52008-04-30 00:54:13 -07002865 * tty_tiocmget - get modem status
Alan Coxaf9b8972006-08-27 01:24:01 -07002866 * @tty: tty device
2867 * @file: user file pointer
2868 * @p: pointer to result
2869 *
2870 * Obtain the modem status bits from the tty driver if the feature
2871 * is supported. Return -EINVAL if it is not available.
2872 *
2873 * Locking: none (up to the driver)
2874 */
2875
2876static int tty_tiocmget(struct tty_struct *tty, struct file *file, int __user *p)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002877{
2878 int retval = -EINVAL;
2879
Alan Coxf34d7a52008-04-30 00:54:13 -07002880 if (tty->ops->tiocmget) {
2881 retval = tty->ops->tiocmget(tty, file);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002882
2883 if (retval >= 0)
2884 retval = put_user(retval, p);
2885 }
2886 return retval;
2887}
2888
Alan Coxaf9b8972006-08-27 01:24:01 -07002889/**
Alan Coxf34d7a52008-04-30 00:54:13 -07002890 * tty_tiocmset - set modem status
Alan Coxaf9b8972006-08-27 01:24:01 -07002891 * @tty: tty device
2892 * @file: user file pointer
2893 * @cmd: command - clear bits, set bits or set all
2894 * @p: pointer to desired bits
2895 *
2896 * Set the modem status bits from the tty driver if the feature
2897 * is supported. Return -EINVAL if it is not available.
2898 *
2899 * Locking: none (up to the driver)
2900 */
2901
2902static int tty_tiocmset(struct tty_struct *tty, struct file *file, unsigned int cmd,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002903 unsigned __user *p)
2904{
Alan Coxae677512008-07-16 21:56:54 +01002905 int retval;
2906 unsigned int set, clear, val;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002907
Alan Coxae677512008-07-16 21:56:54 +01002908 if (tty->ops->tiocmset == NULL)
2909 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002910
Alan Coxae677512008-07-16 21:56:54 +01002911 retval = get_user(val, p);
2912 if (retval)
2913 return retval;
2914 set = clear = 0;
2915 switch (cmd) {
2916 case TIOCMBIS:
2917 set = val;
2918 break;
2919 case TIOCMBIC:
2920 clear = val;
2921 break;
2922 case TIOCMSET:
2923 set = val;
2924 clear = ~val;
2925 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002926 }
Alan Coxae677512008-07-16 21:56:54 +01002927 set &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP;
2928 clear &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP;
2929 return tty->ops->tiocmset(tty, file, set, clear);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002930}
2931
2932/*
2933 * Split this up, as gcc can choke on it otherwise..
2934 */
Alan Cox04f378b2008-04-30 00:53:29 -07002935long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002936{
2937 struct tty_struct *tty, *real_tty;
2938 void __user *p = (void __user *)arg;
2939 int retval;
2940 struct tty_ldisc *ld;
Alan Cox04f378b2008-04-30 00:53:29 -07002941 struct inode *inode = file->f_dentry->d_inode;
Alan Cox37bdfb02008-02-08 04:18:47 -08002942
Linus Torvalds1da177e2005-04-16 15:20:36 -07002943 tty = (struct tty_struct *)file->private_data;
2944 if (tty_paranoia_check(tty, inode, "tty_ioctl"))
2945 return -EINVAL;
2946
2947 real_tty = tty;
2948 if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
2949 tty->driver->subtype == PTY_TYPE_MASTER)
2950 real_tty = tty->link;
2951
2952 /*
2953 * Break handling by driver
2954 */
Alan Cox04f378b2008-04-30 00:53:29 -07002955
2956 retval = -EINVAL;
2957
Alan Coxf34d7a52008-04-30 00:54:13 -07002958 if (!tty->ops->break_ctl) {
Alan Cox37bdfb02008-02-08 04:18:47 -08002959 switch (cmd) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002960 case TIOCSBRK:
2961 case TIOCCBRK:
Alan Coxf34d7a52008-04-30 00:54:13 -07002962 if (tty->ops->ioctl)
2963 retval = tty->ops->ioctl(tty, file, cmd, arg);
2964 if (retval != -EINVAL && retval != -ENOIOCTLCMD)
2965 printk(KERN_WARNING "tty: driver %s needs updating to use break_ctl\n", tty->driver->name);
Alan Cox04f378b2008-04-30 00:53:29 -07002966 return retval;
Alan Cox37bdfb02008-02-08 04:18:47 -08002967
Linus Torvalds1da177e2005-04-16 15:20:36 -07002968 /* These two ioctl's always return success; even if */
2969 /* the driver doesn't support them. */
2970 case TCSBRK:
2971 case TCSBRKP:
Alan Coxf34d7a52008-04-30 00:54:13 -07002972 if (!tty->ops->ioctl)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002973 return 0;
Alan Coxf34d7a52008-04-30 00:54:13 -07002974 retval = tty->ops->ioctl(tty, file, cmd, arg);
2975 if (retval != -EINVAL && retval != -ENOIOCTLCMD)
2976 printk(KERN_WARNING "tty: driver %s needs updating to use break_ctl\n", tty->driver->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002977 if (retval == -ENOIOCTLCMD)
2978 retval = 0;
2979 return retval;
2980 }
2981 }
2982
2983 /*
2984 * Factor out some common prep work
2985 */
2986 switch (cmd) {
2987 case TIOCSETD:
2988 case TIOCSBRK:
2989 case TIOCCBRK:
2990 case TCSBRK:
Alan Cox37bdfb02008-02-08 04:18:47 -08002991 case TCSBRKP:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002992 retval = tty_check_change(tty);
2993 if (retval)
2994 return retval;
2995 if (cmd != TIOCCBRK) {
2996 tty_wait_until_sent(tty, 0);
2997 if (signal_pending(current))
2998 return -EINTR;
2999 }
3000 break;
3001 }
3002
3003 switch (cmd) {
Alan Cox37bdfb02008-02-08 04:18:47 -08003004 case TIOCSTI:
3005 return tiocsti(tty, p);
3006 case TIOCGWINSZ:
3007 return tiocgwinsz(tty, p);
3008 case TIOCSWINSZ:
3009 return tiocswinsz(tty, real_tty, p);
3010 case TIOCCONS:
3011 return real_tty != tty ? -EINVAL : tioccons(file);
3012 case FIONBIO:
3013 return fionbio(file, p);
3014 case TIOCEXCL:
3015 set_bit(TTY_EXCLUSIVE, &tty->flags);
3016 return 0;
3017 case TIOCNXCL:
3018 clear_bit(TTY_EXCLUSIVE, &tty->flags);
3019 return 0;
3020 case TIOCNOTTY:
3021 if (current->signal->tty != tty)
3022 return -ENOTTY;
3023 no_tty();
3024 return 0;
3025 case TIOCSCTTY:
3026 return tiocsctty(tty, arg);
3027 case TIOCGPGRP:
3028 return tiocgpgrp(tty, real_tty, p);
3029 case TIOCSPGRP:
3030 return tiocspgrp(tty, real_tty, p);
3031 case TIOCGSID:
3032 return tiocgsid(tty, real_tty, p);
3033 case TIOCGETD:
Alan Coxa352def2008-07-16 21:53:12 +01003034 return put_user(tty->ldisc.ops->num, (int __user *)p);
Alan Cox37bdfb02008-02-08 04:18:47 -08003035 case TIOCSETD:
3036 return tiocsetd(tty, p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003037#ifdef CONFIG_VT
Alan Cox37bdfb02008-02-08 04:18:47 -08003038 case TIOCLINUX:
3039 return tioclinux(tty, arg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003040#endif
Alan Cox37bdfb02008-02-08 04:18:47 -08003041 /*
3042 * Break handling
3043 */
3044 case TIOCSBRK: /* Turn break on, unconditionally */
Alan Coxf34d7a52008-04-30 00:54:13 -07003045 if (tty->ops->break_ctl)
3046 tty->ops->break_ctl(tty, -1);
Alan Cox37bdfb02008-02-08 04:18:47 -08003047 return 0;
3048
3049 case TIOCCBRK: /* Turn break off, unconditionally */
Alan Coxf34d7a52008-04-30 00:54:13 -07003050 if (tty->ops->break_ctl)
3051 tty->ops->break_ctl(tty, 0);
Alan Cox37bdfb02008-02-08 04:18:47 -08003052 return 0;
3053 case TCSBRK: /* SVID version: non-zero arg --> no break */
3054 /* non-zero arg means wait for all output data
3055 * to be sent (performed above) but don't send break.
3056 * This is used by the tcdrain() termios function.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003057 */
Alan Cox37bdfb02008-02-08 04:18:47 -08003058 if (!arg)
3059 return send_break(tty, 250);
3060 return 0;
3061 case TCSBRKP: /* support for POSIX tcsendbreak() */
3062 return send_break(tty, arg ? arg*100 : 250);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003063
Alan Cox37bdfb02008-02-08 04:18:47 -08003064 case TIOCMGET:
3065 return tty_tiocmget(tty, file, p);
3066 case TIOCMSET:
3067 case TIOCMBIC:
3068 case TIOCMBIS:
3069 return tty_tiocmset(tty, file, cmd, p);
3070 case TCFLSH:
3071 switch (arg) {
3072 case TCIFLUSH:
3073 case TCIOFLUSH:
3074 /* flush tty buffer and allow ldisc to process ioctl */
3075 tty_buffer_flush(tty);
Paul Fulghumc5c34d42007-05-12 10:36:55 -07003076 break;
Alan Cox37bdfb02008-02-08 04:18:47 -08003077 }
3078 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003079 }
Alan Coxf34d7a52008-04-30 00:54:13 -07003080 if (tty->ops->ioctl) {
3081 retval = (tty->ops->ioctl)(tty, file, cmd, arg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003082 if (retval != -ENOIOCTLCMD)
3083 return retval;
3084 }
3085 ld = tty_ldisc_ref_wait(tty);
3086 retval = -EINVAL;
Alan Coxa352def2008-07-16 21:53:12 +01003087 if (ld->ops->ioctl) {
3088 retval = ld->ops->ioctl(tty, file, cmd, arg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003089 if (retval == -ENOIOCTLCMD)
3090 retval = -EINVAL;
3091 }
3092 tty_ldisc_deref(ld);
3093 return retval;
3094}
3095
Paul Fulghume10cc1d2007-05-10 22:22:50 -07003096#ifdef CONFIG_COMPAT
Alan Cox37bdfb02008-02-08 04:18:47 -08003097static long tty_compat_ioctl(struct file *file, unsigned int cmd,
Paul Fulghume10cc1d2007-05-10 22:22:50 -07003098 unsigned long arg)
3099{
3100 struct inode *inode = file->f_dentry->d_inode;
3101 struct tty_struct *tty = file->private_data;
3102 struct tty_ldisc *ld;
3103 int retval = -ENOIOCTLCMD;
3104
3105 if (tty_paranoia_check(tty, inode, "tty_ioctl"))
3106 return -EINVAL;
3107
Alan Coxf34d7a52008-04-30 00:54:13 -07003108 if (tty->ops->compat_ioctl) {
3109 retval = (tty->ops->compat_ioctl)(tty, file, cmd, arg);
Paul Fulghume10cc1d2007-05-10 22:22:50 -07003110 if (retval != -ENOIOCTLCMD)
3111 return retval;
3112 }
3113
3114 ld = tty_ldisc_ref_wait(tty);
Alan Coxa352def2008-07-16 21:53:12 +01003115 if (ld->ops->compat_ioctl)
3116 retval = ld->ops->compat_ioctl(tty, file, cmd, arg);
Paul Fulghume10cc1d2007-05-10 22:22:50 -07003117 tty_ldisc_deref(ld);
3118
3119 return retval;
3120}
3121#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003122
3123/*
3124 * This implements the "Secure Attention Key" --- the idea is to
3125 * prevent trojan horses by killing all processes associated with this
3126 * tty when the user hits the "Secure Attention Key". Required for
3127 * super-paranoid applications --- see the Orange Book for more details.
Alan Cox37bdfb02008-02-08 04:18:47 -08003128 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07003129 * This code could be nicer; ideally it should send a HUP, wait a few
3130 * seconds, then send a INT, and then a KILL signal. But you then
3131 * have to coordinate with the init process, since all processes associated
3132 * with the current tty must be dead before the new getty is allowed
3133 * to spawn.
3134 *
3135 * Now, if it would be correct ;-/ The current code has a nasty hole -
3136 * it doesn't catch files in flight. We may send the descriptor to ourselves
3137 * via AF_UNIX socket, close it and later fetch from socket. FIXME.
3138 *
3139 * Nasty bug: do_SAK is being called in interrupt context. This can
3140 * deadlock. We punt it up to process context. AKPM - 16Mar2001
3141 */
Eric W. Biederman8b6312f2007-02-10 01:44:34 -08003142void __do_SAK(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003143{
3144#ifdef TTY_SOFT_SAK
3145 tty_hangup(tty);
3146#else
Eric W. Biederman652486f2006-03-28 16:11:02 -08003147 struct task_struct *g, *p;
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08003148 struct pid *session;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003149 int i;
3150 struct file *filp;
Dipankar Sarmabadf1662005-09-09 13:04:10 -07003151 struct fdtable *fdt;
Alan Cox37bdfb02008-02-08 04:18:47 -08003152
Linus Torvalds1da177e2005-04-16 15:20:36 -07003153 if (!tty)
3154 return;
Peter Zijlstra24ec8392006-12-08 02:36:04 -08003155 session = tty->session;
Alan Cox37bdfb02008-02-08 04:18:47 -08003156
Dan Carpenterb3f13de2006-12-13 00:35:09 -08003157 tty_ldisc_flush(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003158
Alan Coxf34d7a52008-04-30 00:54:13 -07003159 tty_driver_flush_buffer(tty);
Alan Cox37bdfb02008-02-08 04:18:47 -08003160
Linus Torvalds1da177e2005-04-16 15:20:36 -07003161 read_lock(&tasklist_lock);
Eric W. Biederman652486f2006-03-28 16:11:02 -08003162 /* Kill the entire session */
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08003163 do_each_pid_task(session, PIDTYPE_SID, p) {
Eric W. Biederman652486f2006-03-28 16:11:02 -08003164 printk(KERN_NOTICE "SAK: killed process %d"
Pavel Emelianova47afb02007-10-18 23:39:46 -07003165 " (%s): task_session_nr(p)==tty->session\n",
Pavel Emelyanovba25f9d2007-10-18 23:40:40 -07003166 task_pid_nr(p), p->comm);
Eric W. Biederman652486f2006-03-28 16:11:02 -08003167 send_sig(SIGKILL, p, 1);
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08003168 } while_each_pid_task(session, PIDTYPE_SID, p);
Eric W. Biederman652486f2006-03-28 16:11:02 -08003169 /* Now kill any processes that happen to have the
3170 * tty open.
3171 */
3172 do_each_thread(g, p) {
3173 if (p->signal->tty == tty) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003174 printk(KERN_NOTICE "SAK: killed process %d"
Pavel Emelianova47afb02007-10-18 23:39:46 -07003175 " (%s): task_session_nr(p)==tty->session\n",
Pavel Emelyanovba25f9d2007-10-18 23:40:40 -07003176 task_pid_nr(p), p->comm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003177 send_sig(SIGKILL, p, 1);
3178 continue;
3179 }
3180 task_lock(p);
3181 if (p->files) {
Dipankar Sarmaca99c1d2006-04-18 22:21:46 -07003182 /*
3183 * We don't take a ref to the file, so we must
3184 * hold ->file_lock instead.
3185 */
3186 spin_lock(&p->files->file_lock);
Dipankar Sarmabadf1662005-09-09 13:04:10 -07003187 fdt = files_fdtable(p->files);
Alan Cox37bdfb02008-02-08 04:18:47 -08003188 for (i = 0; i < fdt->max_fds; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003189 filp = fcheck_files(p->files, i);
3190 if (!filp)
3191 continue;
3192 if (filp->f_op->read == tty_read &&
3193 filp->private_data == tty) {
3194 printk(KERN_NOTICE "SAK: killed process %d"
3195 " (%s): fd#%d opened to the tty\n",
Pavel Emelyanovba25f9d2007-10-18 23:40:40 -07003196 task_pid_nr(p), p->comm, i);
Eric W. Biederman20ac9432006-04-13 04:49:07 -06003197 force_sig(SIGKILL, p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003198 break;
3199 }
3200 }
Dipankar Sarmaca99c1d2006-04-18 22:21:46 -07003201 spin_unlock(&p->files->file_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003202 }
3203 task_unlock(p);
Eric W. Biederman652486f2006-03-28 16:11:02 -08003204 } while_each_thread(g, p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003205 read_unlock(&tasklist_lock);
3206#endif
3207}
3208
Eric W. Biederman8b6312f2007-02-10 01:44:34 -08003209static void do_SAK_work(struct work_struct *work)
3210{
3211 struct tty_struct *tty =
3212 container_of(work, struct tty_struct, SAK_work);
3213 __do_SAK(tty);
3214}
3215
Linus Torvalds1da177e2005-04-16 15:20:36 -07003216/*
3217 * The tq handling here is a little racy - tty->SAK_work may already be queued.
3218 * Fortunately we don't need to worry, because if ->SAK_work is already queued,
3219 * the values which we write to it will be identical to the values which it
3220 * already has. --akpm
3221 */
3222void do_SAK(struct tty_struct *tty)
3223{
3224 if (!tty)
3225 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003226 schedule_work(&tty->SAK_work);
3227}
3228
3229EXPORT_SYMBOL(do_SAK);
3230
Alan Coxaf9b8972006-08-27 01:24:01 -07003231/**
3232 * flush_to_ldisc
David Howells65f27f32006-11-22 14:55:48 +00003233 * @work: tty structure passed from work queue.
Alan Coxaf9b8972006-08-27 01:24:01 -07003234 *
3235 * This routine is called out of the software interrupt to flush data
3236 * from the buffer chain to the line discipline.
3237 *
3238 * Locking: holds tty->buf.lock to guard buffer list. Drops the lock
3239 * while invoking the line discipline receive_buf method. The
3240 * receive_buf method is single threaded for each tty instance.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003241 */
Alan Cox37bdfb02008-02-08 04:18:47 -08003242
David Howells65f27f32006-11-22 14:55:48 +00003243static void flush_to_ldisc(struct work_struct *work)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003244{
David Howells65f27f32006-11-22 14:55:48 +00003245 struct tty_struct *tty =
3246 container_of(work, struct tty_struct, buf.work.work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003247 unsigned long flags;
3248 struct tty_ldisc *disc;
Paul Fulghum2c3bb202006-06-28 04:26:48 -07003249 struct tty_buffer *tbuf, *head;
Paul Fulghum8977d922006-02-10 01:51:14 -08003250 char *char_buf;
3251 unsigned char *flag_buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003252
3253 disc = tty_ldisc_ref(tty);
3254 if (disc == NULL) /* !TTY_LDISC */
3255 return;
3256
Paul Fulghum808249c2006-02-03 03:04:41 -08003257 spin_lock_irqsave(&tty->buf.lock, flags);
Alan Cox37bdfb02008-02-08 04:18:47 -08003258 /* So we know a flush is running */
3259 set_bit(TTY_FLUSHING, &tty->flags);
Paul Fulghum2c3bb202006-06-28 04:26:48 -07003260 head = tty->buf.head;
3261 if (head != NULL) {
3262 tty->buf.head = NULL;
3263 for (;;) {
3264 int count = head->commit - head->read;
3265 if (!count) {
3266 if (head->next == NULL)
3267 break;
3268 tbuf = head;
3269 head = head->next;
3270 tty_buffer_free(tty, tbuf);
3271 continue;
3272 }
Alan Cox42fd5522007-08-10 13:01:05 -07003273 /* Ldisc or user is trying to flush the buffers
3274 we are feeding to the ldisc, stop feeding the
3275 line discipline as we want to empty the queue */
3276 if (test_bit(TTY_FLUSHPENDING, &tty->flags))
3277 break;
Paul Fulghum2c3bb202006-06-28 04:26:48 -07003278 if (!tty->receive_room) {
3279 schedule_delayed_work(&tty->buf.work, 1);
3280 break;
3281 }
3282 if (count > tty->receive_room)
3283 count = tty->receive_room;
3284 char_buf = head->char_buf_ptr + head->read;
3285 flag_buf = head->flag_buf_ptr + head->read;
3286 head->read += count;
Paul Fulghum8977d922006-02-10 01:51:14 -08003287 spin_unlock_irqrestore(&tty->buf.lock, flags);
Alan Coxa352def2008-07-16 21:53:12 +01003288 disc->ops->receive_buf(tty, char_buf,
3289 flag_buf, count);
Paul Fulghum8977d922006-02-10 01:51:14 -08003290 spin_lock_irqsave(&tty->buf.lock, flags);
3291 }
Alan Cox42fd5522007-08-10 13:01:05 -07003292 /* Restore the queue head */
Paul Fulghum2c3bb202006-06-28 04:26:48 -07003293 tty->buf.head = head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003294 }
Alan Cox42fd5522007-08-10 13:01:05 -07003295 /* We may have a deferred request to flush the input buffer,
3296 if so pull the chain under the lock and empty the queue */
3297 if (test_bit(TTY_FLUSHPENDING, &tty->flags)) {
3298 __tty_buffer_flush(tty);
3299 clear_bit(TTY_FLUSHPENDING, &tty->flags);
3300 wake_up(&tty->read_wait);
3301 }
3302 clear_bit(TTY_FLUSHING, &tty->flags);
Paul Fulghum808249c2006-02-03 03:04:41 -08003303 spin_unlock_irqrestore(&tty->buf.lock, flags);
Paul Fulghum817d6d32006-06-28 04:26:47 -07003304
Linus Torvalds1da177e2005-04-16 15:20:36 -07003305 tty_ldisc_deref(disc);
3306}
3307
Linus Torvalds1da177e2005-04-16 15:20:36 -07003308/**
3309 * tty_flip_buffer_push - terminal
3310 * @tty: tty to push
3311 *
3312 * Queue a push of the terminal flip buffers to the line discipline. This
3313 * function must not be called from IRQ context if tty->low_latency is set.
3314 *
3315 * In the event of the queue being busy for flipping the work will be
3316 * held off and retried later.
Alan Coxaf9b8972006-08-27 01:24:01 -07003317 *
3318 * Locking: tty buffer lock. Driver locks in low latency mode.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003319 */
3320
3321void tty_flip_buffer_push(struct tty_struct *tty)
3322{
Paul Fulghum808249c2006-02-03 03:04:41 -08003323 unsigned long flags;
3324 spin_lock_irqsave(&tty->buf.lock, flags);
Paul Fulghum33b37a32006-06-28 04:26:49 -07003325 if (tty->buf.tail != NULL)
Paul Fulghum8977d922006-02-10 01:51:14 -08003326 tty->buf.tail->commit = tty->buf.tail->used;
Paul Fulghum808249c2006-02-03 03:04:41 -08003327 spin_unlock_irqrestore(&tty->buf.lock, flags);
3328
Linus Torvalds1da177e2005-04-16 15:20:36 -07003329 if (tty->low_latency)
David Howells65f27f32006-11-22 14:55:48 +00003330 flush_to_ldisc(&tty->buf.work.work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003331 else
Alan Cox33f0f882006-01-09 20:54:13 -08003332 schedule_delayed_work(&tty->buf.work, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003333}
3334
3335EXPORT_SYMBOL(tty_flip_buffer_push);
3336
Alan Cox33f0f882006-01-09 20:54:13 -08003337
Alan Coxaf9b8972006-08-27 01:24:01 -07003338/**
3339 * initialize_tty_struct
3340 * @tty: tty to initialize
3341 *
3342 * This subroutine initializes a tty structure that has been newly
3343 * allocated.
3344 *
3345 * Locking: none - tty in question must not be exposed at this point
Linus Torvalds1da177e2005-04-16 15:20:36 -07003346 */
Alan Coxaf9b8972006-08-27 01:24:01 -07003347
Linus Torvalds1da177e2005-04-16 15:20:36 -07003348static void initialize_tty_struct(struct tty_struct *tty)
3349{
3350 memset(tty, 0, sizeof(struct tty_struct));
3351 tty->magic = TTY_MAGIC;
Alan Cox01e1abb2008-07-22 11:16:55 +01003352 tty_ldisc_init(tty);
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08003353 tty->session = NULL;
3354 tty->pgrp = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003355 tty->overrun_time = jiffies;
Alan Cox33f0f882006-01-09 20:54:13 -08003356 tty->buf.head = tty->buf.tail = NULL;
3357 tty_buffer_init(tty);
David Howells65f27f32006-11-22 14:55:48 +00003358 INIT_DELAYED_WORK(&tty->buf.work, flush_to_ldisc);
Arjan van de Ven5785c952006-09-29 02:00:43 -07003359 mutex_init(&tty->termios_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003360 init_waitqueue_head(&tty->write_wait);
3361 init_waitqueue_head(&tty->read_wait);
David Howells65f27f32006-11-22 14:55:48 +00003362 INIT_WORK(&tty->hangup_work, do_tty_hangup);
Ingo Molnar70522e12006-03-23 03:00:31 -08003363 mutex_init(&tty->atomic_read_lock);
3364 mutex_init(&tty->atomic_write_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003365 spin_lock_init(&tty->read_lock);
Alan Cox04f378b2008-04-30 00:53:29 -07003366 spin_lock_init(&tty->ctrl_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003367 INIT_LIST_HEAD(&tty->tty_files);
Eric W. Biederman7f1f86a2007-02-13 14:38:58 -07003368 INIT_WORK(&tty->SAK_work, do_SAK_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003369}
3370
Alan Coxf34d7a52008-04-30 00:54:13 -07003371/**
3372 * tty_put_char - write one character to a tty
3373 * @tty: tty
3374 * @ch: character
3375 *
3376 * Write one byte to the tty using the provided put_char method
3377 * if present. Returns the number of characters successfully output.
3378 *
3379 * Note: the specific put_char operation in the driver layer may go
3380 * away soon. Don't call it directly, use this method
Linus Torvalds1da177e2005-04-16 15:20:36 -07003381 */
Alan Coxaf9b8972006-08-27 01:24:01 -07003382
Alan Coxf34d7a52008-04-30 00:54:13 -07003383int tty_put_char(struct tty_struct *tty, unsigned char ch)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003384{
Alan Coxf34d7a52008-04-30 00:54:13 -07003385 if (tty->ops->put_char)
3386 return tty->ops->put_char(tty, ch);
3387 return tty->ops->write(tty, &ch, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003388}
3389
Alan Coxf34d7a52008-04-30 00:54:13 -07003390EXPORT_SYMBOL_GPL(tty_put_char);
3391
gregkh@suse.de7fe845d2005-03-15 14:23:15 -08003392static struct class *tty_class;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003393
3394/**
Alan Coxaf9b8972006-08-27 01:24:01 -07003395 * tty_register_device - register a tty device
3396 * @driver: the tty driver that describes the tty device
3397 * @index: the index in the tty driver for this tty device
3398 * @device: a struct device that is associated with this tty device.
3399 * This field is optional, if there is no known struct device
3400 * for this tty device it can be set to NULL safely.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003401 *
Greg Kroah-Hartman01107d32006-08-07 22:19:37 -07003402 * Returns a pointer to the struct device for this tty device
3403 * (or ERR_PTR(-EFOO) on error).
Hansjoerg Lipp1cdcb6b2006-04-22 18:36:53 +02003404 *
Alan Coxaf9b8972006-08-27 01:24:01 -07003405 * This call is required to be made to register an individual tty device
3406 * if the tty driver's flags have the TTY_DRIVER_DYNAMIC_DEV bit set. If
3407 * that bit is not set, this function should not be called by a tty
3408 * driver.
3409 *
3410 * Locking: ??
Linus Torvalds1da177e2005-04-16 15:20:36 -07003411 */
Alan Coxaf9b8972006-08-27 01:24:01 -07003412
Greg Kroah-Hartman01107d32006-08-07 22:19:37 -07003413struct device *tty_register_device(struct tty_driver *driver, unsigned index,
3414 struct device *device)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003415{
3416 char name[64];
3417 dev_t dev = MKDEV(driver->major, driver->minor_start) + index;
3418
3419 if (index >= driver->num) {
3420 printk(KERN_ERR "Attempt to register invalid tty line number "
3421 " (%d).\n", index);
Hansjoerg Lipp1cdcb6b2006-04-22 18:36:53 +02003422 return ERR_PTR(-EINVAL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003423 }
3424
Linus Torvalds1da177e2005-04-16 15:20:36 -07003425 if (driver->type == TTY_DRIVER_TYPE_PTY)
3426 pty_line_name(driver, index, name);
3427 else
3428 tty_line_name(driver, index, name);
Hansjoerg Lipp1cdcb6b2006-04-22 18:36:53 +02003429
Greg Kroah-Hartman01107d32006-08-07 22:19:37 -07003430 return device_create(tty_class, device, dev, name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003431}
3432
3433/**
Alan Coxaf9b8972006-08-27 01:24:01 -07003434 * tty_unregister_device - unregister a tty device
3435 * @driver: the tty driver that describes the tty device
3436 * @index: the index in the tty driver for this tty device
Linus Torvalds1da177e2005-04-16 15:20:36 -07003437 *
Alan Coxaf9b8972006-08-27 01:24:01 -07003438 * If a tty device is registered with a call to tty_register_device() then
3439 * this function must be called when the tty device is gone.
3440 *
3441 * Locking: ??
Linus Torvalds1da177e2005-04-16 15:20:36 -07003442 */
Alan Coxaf9b8972006-08-27 01:24:01 -07003443
Linus Torvalds1da177e2005-04-16 15:20:36 -07003444void tty_unregister_device(struct tty_driver *driver, unsigned index)
3445{
Alan Cox37bdfb02008-02-08 04:18:47 -08003446 device_destroy(tty_class,
3447 MKDEV(driver->major, driver->minor_start) + index);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003448}
3449
3450EXPORT_SYMBOL(tty_register_device);
3451EXPORT_SYMBOL(tty_unregister_device);
3452
3453struct tty_driver *alloc_tty_driver(int lines)
3454{
3455 struct tty_driver *driver;
3456
Jean Delvare506eb992007-07-15 23:40:14 -07003457 driver = kzalloc(sizeof(struct tty_driver), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003458 if (driver) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003459 driver->magic = TTY_DRIVER_MAGIC;
3460 driver->num = lines;
3461 /* later we'll move allocation of tables here */
3462 }
3463 return driver;
3464}
3465
3466void put_tty_driver(struct tty_driver *driver)
3467{
3468 kfree(driver);
3469}
3470
Jeff Dikeb68e31d2006-10-02 02:17:18 -07003471void tty_set_operations(struct tty_driver *driver,
3472 const struct tty_operations *op)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003473{
Alan Coxf34d7a52008-04-30 00:54:13 -07003474 driver->ops = op;
3475};
Linus Torvalds1da177e2005-04-16 15:20:36 -07003476
3477EXPORT_SYMBOL(alloc_tty_driver);
3478EXPORT_SYMBOL(put_tty_driver);
3479EXPORT_SYMBOL(tty_set_operations);
3480
3481/*
3482 * Called by a tty driver to register itself.
3483 */
3484int tty_register_driver(struct tty_driver *driver)
3485{
3486 int error;
Alan Cox37bdfb02008-02-08 04:18:47 -08003487 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003488 dev_t dev;
3489 void **p = NULL;
3490
3491 if (driver->flags & TTY_DRIVER_INSTALLED)
3492 return 0;
3493
Andy Whitcroft543691a62007-05-06 14:49:33 -07003494 if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM) && driver->num) {
3495 p = kzalloc(driver->num * 3 * sizeof(void *), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003496 if (!p)
3497 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003498 }
3499
3500 if (!driver->major) {
Alan Cox37bdfb02008-02-08 04:18:47 -08003501 error = alloc_chrdev_region(&dev, driver->minor_start,
3502 driver->num, driver->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003503 if (!error) {
3504 driver->major = MAJOR(dev);
3505 driver->minor_start = MINOR(dev);
3506 }
3507 } else {
3508 dev = MKDEV(driver->major, driver->minor_start);
Geert Uytterhoevene5717c42007-02-20 15:45:21 +01003509 error = register_chrdev_region(dev, driver->num, driver->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003510 }
3511 if (error < 0) {
3512 kfree(p);
3513 return error;
3514 }
3515
3516 if (p) {
3517 driver->ttys = (struct tty_struct **)p;
Alan Coxedc6afc2006-12-08 02:38:44 -08003518 driver->termios = (struct ktermios **)(p + driver->num);
Alan Cox37bdfb02008-02-08 04:18:47 -08003519 driver->termios_locked = (struct ktermios **)
3520 (p + driver->num * 2);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003521 } else {
3522 driver->ttys = NULL;
3523 driver->termios = NULL;
3524 driver->termios_locked = NULL;
3525 }
3526
3527 cdev_init(&driver->cdev, &tty_fops);
3528 driver->cdev.owner = driver->owner;
3529 error = cdev_add(&driver->cdev, dev, driver->num);
3530 if (error) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003531 unregister_chrdev_region(dev, driver->num);
3532 driver->ttys = NULL;
3533 driver->termios = driver->termios_locked = NULL;
3534 kfree(p);
3535 return error;
3536 }
3537
Alexey Dobriyanca509f62007-05-08 00:27:12 -07003538 mutex_lock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003539 list_add(&driver->tty_drivers, &tty_drivers);
Alexey Dobriyanca509f62007-05-08 00:27:12 -07003540 mutex_unlock(&tty_mutex);
Alan Cox37bdfb02008-02-08 04:18:47 -08003541
3542 if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV)) {
3543 for (i = 0; i < driver->num; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003544 tty_register_device(driver, i, NULL);
3545 }
3546 proc_tty_register_driver(driver);
3547 return 0;
3548}
3549
3550EXPORT_SYMBOL(tty_register_driver);
3551
3552/*
3553 * Called by a tty driver to unregister itself.
3554 */
3555int tty_unregister_driver(struct tty_driver *driver)
3556{
3557 int i;
Alan Coxedc6afc2006-12-08 02:38:44 -08003558 struct ktermios *tp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003559 void *p;
3560
3561 if (driver->refcount)
3562 return -EBUSY;
3563
3564 unregister_chrdev_region(MKDEV(driver->major, driver->minor_start),
3565 driver->num);
Alexey Dobriyanca509f62007-05-08 00:27:12 -07003566 mutex_lock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003567 list_del(&driver->tty_drivers);
Alexey Dobriyanca509f62007-05-08 00:27:12 -07003568 mutex_unlock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003569
3570 /*
3571 * Free the termios and termios_locked structures because
3572 * we don't want to get memory leaks when modular tty
3573 * drivers are removed from the kernel.
3574 */
3575 for (i = 0; i < driver->num; i++) {
3576 tp = driver->termios[i];
3577 if (tp) {
3578 driver->termios[i] = NULL;
3579 kfree(tp);
3580 }
3581 tp = driver->termios_locked[i];
3582 if (tp) {
3583 driver->termios_locked[i] = NULL;
3584 kfree(tp);
3585 }
Greg Kroah-Hartman331b8312005-06-20 21:15:16 -07003586 if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV))
Linus Torvalds1da177e2005-04-16 15:20:36 -07003587 tty_unregister_device(driver, i);
3588 }
3589 p = driver->ttys;
3590 proc_tty_unregister_driver(driver);
3591 driver->ttys = NULL;
3592 driver->termios = driver->termios_locked = NULL;
3593 kfree(p);
3594 cdev_del(&driver->cdev);
3595 return 0;
3596}
Linus Torvalds1da177e2005-04-16 15:20:36 -07003597EXPORT_SYMBOL(tty_unregister_driver);
3598
Peter Zijlstra24ec8392006-12-08 02:36:04 -08003599dev_t tty_devnum(struct tty_struct *tty)
3600{
3601 return MKDEV(tty->driver->major, tty->driver->minor_start) + tty->index;
3602}
3603EXPORT_SYMBOL(tty_devnum);
3604
3605void proc_clear_tty(struct task_struct *p)
3606{
3607 spin_lock_irq(&p->sighand->siglock);
3608 p->signal->tty = NULL;
3609 spin_unlock_irq(&p->sighand->siglock);
3610}
David S. Miller7cac4ce2007-05-11 14:30:57 -07003611EXPORT_SYMBOL(proc_clear_tty);
Peter Zijlstra24ec8392006-12-08 02:36:04 -08003612
Alan Cox47f86832008-04-30 00:53:30 -07003613/* Called under the sighand lock */
3614
Eric W. Biederman2a65f1d2007-05-08 00:26:53 -07003615static void __proc_set_tty(struct task_struct *tsk, struct tty_struct *tty)
Peter Zijlstra24ec8392006-12-08 02:36:04 -08003616{
3617 if (tty) {
Alan Cox47f86832008-04-30 00:53:30 -07003618 unsigned long flags;
3619 /* We should not have a session or pgrp to put here but.... */
3620 spin_lock_irqsave(&tty->ctrl_lock, flags);
Eric W. Biedermand9c1e9a2007-03-18 12:45:44 -06003621 put_pid(tty->session);
3622 put_pid(tty->pgrp);
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08003623 tty->pgrp = get_pid(task_pgrp(tsk));
Alan Cox47f86832008-04-30 00:53:30 -07003624 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
3625 tty->session = get_pid(task_session(tsk));
Peter Zijlstra24ec8392006-12-08 02:36:04 -08003626 }
Eric W. Biederman2a65f1d2007-05-08 00:26:53 -07003627 put_pid(tsk->signal->tty_old_pgrp);
Peter Zijlstra24ec8392006-12-08 02:36:04 -08003628 tsk->signal->tty = tty;
Eric W. Biedermanab521dc2007-02-12 00:53:00 -08003629 tsk->signal->tty_old_pgrp = NULL;
Peter Zijlstra24ec8392006-12-08 02:36:04 -08003630}
3631
Eric W. Biederman98a27ba2007-05-08 00:26:56 -07003632static void proc_set_tty(struct task_struct *tsk, struct tty_struct *tty)
Peter Zijlstra24ec8392006-12-08 02:36:04 -08003633{
3634 spin_lock_irq(&tsk->sighand->siglock);
Eric W. Biederman2a65f1d2007-05-08 00:26:53 -07003635 __proc_set_tty(tsk, tty);
Peter Zijlstra24ec8392006-12-08 02:36:04 -08003636 spin_unlock_irq(&tsk->sighand->siglock);
3637}
3638
3639struct tty_struct *get_current_tty(void)
3640{
3641 struct tty_struct *tty;
3642 WARN_ON_ONCE(!mutex_is_locked(&tty_mutex));
3643 tty = current->signal->tty;
3644 /*
3645 * session->tty can be changed/cleared from under us, make sure we
3646 * issue the load. The obtained pointer, when not NULL, is valid as
3647 * long as we hold tty_mutex.
3648 */
3649 barrier();
3650 return tty;
3651}
Heiko Carstensa311f742006-12-13 00:33:41 -08003652EXPORT_SYMBOL_GPL(get_current_tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003653
3654/*
3655 * Initialize the console device. This is called *early*, so
3656 * we can't necessarily depend on lots of kernel help here.
3657 * Just do some early initializations, and do the complex setup
3658 * later.
3659 */
3660void __init console_init(void)
3661{
3662 initcall_t *call;
3663
3664 /* Setup the default TTY line discipline. */
Alan Cox01e1abb2008-07-22 11:16:55 +01003665 tty_ldisc_begin();
Linus Torvalds1da177e2005-04-16 15:20:36 -07003666
3667 /*
Alan Cox37bdfb02008-02-08 04:18:47 -08003668 * set up the console device so that later boot sequences can
Linus Torvalds1da177e2005-04-16 15:20:36 -07003669 * inform about problems etc..
3670 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003671 call = __con_initcall_start;
3672 while (call < __con_initcall_end) {
3673 (*call)();
3674 call++;
3675 }
3676}
3677
Linus Torvalds1da177e2005-04-16 15:20:36 -07003678static int __init tty_class_init(void)
3679{
gregkh@suse.de7fe845d2005-03-15 14:23:15 -08003680 tty_class = class_create(THIS_MODULE, "tty");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003681 if (IS_ERR(tty_class))
3682 return PTR_ERR(tty_class);
3683 return 0;
3684}
3685
3686postcore_initcall(tty_class_init);
3687
3688/* 3/2004 jmc: why do these devices exist? */
3689
3690static struct cdev tty_cdev, console_cdev;
3691#ifdef CONFIG_UNIX98_PTYS
3692static struct cdev ptmx_cdev;
3693#endif
3694#ifdef CONFIG_VT
3695static struct cdev vc0_cdev;
3696#endif
3697
3698/*
3699 * Ok, now we can initialize the rest of the tty devices and can count
3700 * on memory allocations, interrupts etc..
3701 */
3702static int __init tty_init(void)
3703{
3704 cdev_init(&tty_cdev, &tty_fops);
3705 if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) ||
3706 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)
3707 panic("Couldn't register /dev/tty driver\n");
Greg Kroah-Hartman01107d32006-08-07 22:19:37 -07003708 device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 0), "tty");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003709
3710 cdev_init(&console_cdev, &console_fops);
3711 if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) ||
3712 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)
3713 panic("Couldn't register /dev/console driver\n");
Greg Kroah-Hartman01107d32006-08-07 22:19:37 -07003714 device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 1), "console");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003715
3716#ifdef CONFIG_UNIX98_PTYS
3717 cdev_init(&ptmx_cdev, &ptmx_fops);
3718 if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) ||
3719 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0)
3720 panic("Couldn't register /dev/ptmx driver\n");
Greg Kroah-Hartman01107d32006-08-07 22:19:37 -07003721 device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 2), "ptmx");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003722#endif
3723
3724#ifdef CONFIG_VT
3725 cdev_init(&vc0_cdev, &console_fops);
3726 if (cdev_add(&vc0_cdev, MKDEV(TTY_MAJOR, 0), 1) ||
3727 register_chrdev_region(MKDEV(TTY_MAJOR, 0), 1, "/dev/vc/0") < 0)
3728 panic("Couldn't register /dev/tty0 driver\n");
Greg Kroah-Hartman01107d32006-08-07 22:19:37 -07003729 device_create(tty_class, NULL, MKDEV(TTY_MAJOR, 0), "tty0");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003730
3731 vty_init();
3732#endif
3733 return 0;
3734}
3735module_init(tty_init);