blob: a1143238fecabb28e844717346b7aefa88307318 [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
22 * makes for cleaner and more compact code. -TYT, 9/17/92
23 *
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
44 *
45 * 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.
65 * alloc_tty_struct() always uses kmalloc() -- Andrew Morton <andrewm@uow.edu.eu> 17Mar01
66 */
67
68#include <linux/config.h>
69#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>
81#include <linux/console.h>
82#include <linux/timer.h>
83#include <linux/ctype.h>
84#include <linux/kd.h>
85#include <linux/mm.h>
86#include <linux/string.h>
87#include <linux/slab.h>
88#include <linux/poll.h>
89#include <linux/proc_fs.h>
90#include <linux/init.h>
91#include <linux/module.h>
92#include <linux/smp_lock.h>
93#include <linux/device.h>
94#include <linux/idr.h>
95#include <linux/wait.h>
96#include <linux/bitops.h>
Domen Puncerb20f3ae2005-06-25 14:58:42 -070097#include <linux/delay.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070098
99#include <asm/uaccess.h>
100#include <asm/system.h>
101
102#include <linux/kbd_kern.h>
103#include <linux/vt_kern.h>
104#include <linux/selection.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105
106#include <linux/kmod.h>
107
108#undef TTY_DEBUG_HANGUP
109
110#define TTY_PARANOIA_CHECK 1
111#define CHECK_TTY_COUNT 1
112
113struct termios tty_std_termios = { /* for the benefit of tty drivers */
114 .c_iflag = ICRNL | IXON,
115 .c_oflag = OPOST | ONLCR,
116 .c_cflag = B38400 | CS8 | CREAD | HUPCL,
117 .c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK |
118 ECHOCTL | ECHOKE | IEXTEN,
119 .c_cc = INIT_C_CC
120};
121
122EXPORT_SYMBOL(tty_std_termios);
123
124/* This list gets poked at by procfs and various bits of boot up code. This
125 could do with some rationalisation such as pulling the tty proc function
126 into this file */
127
128LIST_HEAD(tty_drivers); /* linked list of tty drivers */
129
130/* Semaphore to protect creating and releasing a tty. This is shared with
131 vt.c for deeply disgusting hack reasons */
Ingo Molnar70522e12006-03-23 03:00:31 -0800132DEFINE_MUTEX(tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700133
134#ifdef CONFIG_UNIX98_PTYS
135extern struct tty_driver *ptm_driver; /* Unix98 pty masters; for /dev/ptmx */
136extern int pty_limit; /* Config limit on Unix98 ptys */
137static DEFINE_IDR(allocated_ptys);
138static DECLARE_MUTEX(allocated_ptys_lock);
139static int ptmx_open(struct inode *, struct file *);
140#endif
141
142extern void disable_early_printk(void);
143
144static 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 *);
148ssize_t redirected_tty_write(struct file *, const char __user *, size_t, loff_t *);
149static unsigned int tty_poll(struct file *, poll_table *);
150static int tty_open(struct inode *, struct file *);
151static int tty_release(struct inode *, struct file *);
152int tty_ioctl(struct inode * inode, struct file * file,
153 unsigned int cmd, unsigned long arg);
154static int tty_fasync(int fd, struct file * filp, int on);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700155static void release_mem(struct tty_struct *tty, int idx);
156
157
158static struct tty_struct *alloc_tty_struct(void)
159{
160 struct tty_struct *tty;
161
162 tty = kmalloc(sizeof(struct tty_struct), GFP_KERNEL);
163 if (tty)
164 memset(tty, 0, sizeof(struct tty_struct));
165 return tty;
166}
167
Alan Cox33f0f882006-01-09 20:54:13 -0800168static void tty_buffer_free_all(struct tty_struct *);
169
Linus Torvalds1da177e2005-04-16 15:20:36 -0700170static inline void free_tty_struct(struct tty_struct *tty)
171{
172 kfree(tty->write_buf);
Alan Cox33f0f882006-01-09 20:54:13 -0800173 tty_buffer_free_all(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700174 kfree(tty);
175}
176
177#define TTY_NUMBER(tty) ((tty)->index + (tty)->driver->name_base)
178
179char *tty_name(struct tty_struct *tty, char *buf)
180{
181 if (!tty) /* Hmm. NULL pointer. That's fun. */
182 strcpy(buf, "NULL tty");
183 else
184 strcpy(buf, tty->name);
185 return buf;
186}
187
188EXPORT_SYMBOL(tty_name);
189
Andrew Mortond769a662005-05-05 16:15:50 -0700190int tty_paranoia_check(struct tty_struct *tty, struct inode *inode,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700191 const char *routine)
192{
193#ifdef TTY_PARANOIA_CHECK
194 if (!tty) {
195 printk(KERN_WARNING
196 "null TTY for (%d:%d) in %s\n",
197 imajor(inode), iminor(inode), routine);
198 return 1;
199 }
200 if (tty->magic != TTY_MAGIC) {
201 printk(KERN_WARNING
202 "bad magic number for tty struct (%d:%d) in %s\n",
203 imajor(inode), iminor(inode), routine);
204 return 1;
205 }
206#endif
207 return 0;
208}
209
210static int check_tty_count(struct tty_struct *tty, const char *routine)
211{
212#ifdef CHECK_TTY_COUNT
213 struct list_head *p;
214 int count = 0;
215
216 file_list_lock();
217 list_for_each(p, &tty->tty_files) {
218 count++;
219 }
220 file_list_unlock();
221 if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
222 tty->driver->subtype == PTY_TYPE_SLAVE &&
223 tty->link && tty->link->count)
224 count++;
225 if (tty->count != count) {
226 printk(KERN_WARNING "Warning: dev (%s) tty->count(%d) "
227 "!= #fd's(%d) in %s\n",
228 tty->name, tty->count, count, routine);
229 return count;
230 }
231#endif
232 return 0;
233}
234
235/*
Alan Cox33f0f882006-01-09 20:54:13 -0800236 * Tty buffer allocation management
237 */
238
239static void tty_buffer_free_all(struct tty_struct *tty)
240{
241 struct tty_buffer *thead;
242 while((thead = tty->buf.head) != NULL) {
243 tty->buf.head = thead->next;
244 kfree(thead);
245 }
246 while((thead = tty->buf.free) != NULL) {
247 tty->buf.free = thead->next;
248 kfree(thead);
249 }
250 tty->buf.tail = NULL;
251}
252
253static void tty_buffer_init(struct tty_struct *tty)
254{
Paul Fulghum808249c2006-02-03 03:04:41 -0800255 spin_lock_init(&tty->buf.lock);
Alan Cox33f0f882006-01-09 20:54:13 -0800256 tty->buf.head = NULL;
257 tty->buf.tail = NULL;
258 tty->buf.free = NULL;
259}
260
261static struct tty_buffer *tty_buffer_alloc(size_t size)
262{
263 struct tty_buffer *p = kmalloc(sizeof(struct tty_buffer) + 2 * size, GFP_ATOMIC);
264 if(p == NULL)
265 return NULL;
266 p->used = 0;
267 p->size = size;
268 p->next = NULL;
Paul Fulghum8977d922006-02-10 01:51:14 -0800269 p->commit = 0;
270 p->read = 0;
Alan Cox33f0f882006-01-09 20:54:13 -0800271 p->char_buf_ptr = (char *)(p->data);
272 p->flag_buf_ptr = (unsigned char *)p->char_buf_ptr + size;
273/* printk("Flip create %p\n", p); */
274 return p;
275}
276
277/* Must be called with the tty_read lock held. This needs to acquire strategy
278 code to decide if we should kfree or relink a given expired buffer */
279
280static void tty_buffer_free(struct tty_struct *tty, struct tty_buffer *b)
281{
282 /* Dumb strategy for now - should keep some stats */
283/* printk("Flip dispose %p\n", b); */
284 if(b->size >= 512)
285 kfree(b);
286 else {
287 b->next = tty->buf.free;
288 tty->buf.free = b;
289 }
290}
291
292static struct tty_buffer *tty_buffer_find(struct tty_struct *tty, size_t size)
293{
294 struct tty_buffer **tbh = &tty->buf.free;
295 while((*tbh) != NULL) {
296 struct tty_buffer *t = *tbh;
297 if(t->size >= size) {
298 *tbh = t->next;
299 t->next = NULL;
300 t->used = 0;
Paul Fulghum8977d922006-02-10 01:51:14 -0800301 t->commit = 0;
302 t->read = 0;
Alan Cox33f0f882006-01-09 20:54:13 -0800303 /* DEBUG ONLY */
Paul Fulghum6af6aab2006-02-28 16:59:15 -0800304/* memset(t->data, '*', size); */
Alan Cox33f0f882006-01-09 20:54:13 -0800305/* printk("Flip recycle %p\n", t); */
306 return t;
307 }
308 tbh = &((*tbh)->next);
309 }
310 /* Round the buffer size out */
311 size = (size + 0xFF) & ~ 0xFF;
312 return tty_buffer_alloc(size);
313 /* Should possibly check if this fails for the largest buffer we
314 have queued and recycle that ? */
315}
316
317int tty_buffer_request_room(struct tty_struct *tty, size_t size)
318{
Paul Fulghum808249c2006-02-03 03:04:41 -0800319 struct tty_buffer *b, *n;
320 int left;
321 unsigned long flags;
322
323 spin_lock_irqsave(&tty->buf.lock, flags);
Alan Cox33f0f882006-01-09 20:54:13 -0800324
325 /* OPTIMISATION: We could keep a per tty "zero" sized buffer to
326 remove this conditional if its worth it. This would be invisible
327 to the callers */
Paul Fulghum33b37a32006-06-28 04:26:49 -0700328 if ((b = tty->buf.tail) != NULL)
Alan Cox33f0f882006-01-09 20:54:13 -0800329 left = b->size - b->used;
Paul Fulghum33b37a32006-06-28 04:26:49 -0700330 else
Paul Fulghum808249c2006-02-03 03:04:41 -0800331 left = 0;
332
333 if (left < size) {
334 /* This is the slow path - looking for new buffers to use */
335 if ((n = tty_buffer_find(tty, size)) != NULL) {
336 if (b != NULL) {
337 b->next = n;
Paul Fulghum8977d922006-02-10 01:51:14 -0800338 b->commit = b->used;
Paul Fulghum808249c2006-02-03 03:04:41 -0800339 } else
340 tty->buf.head = n;
341 tty->buf.tail = n;
Paul Fulghum808249c2006-02-03 03:04:41 -0800342 } else
343 size = left;
344 }
345
346 spin_unlock_irqrestore(&tty->buf.lock, flags);
Alan Cox33f0f882006-01-09 20:54:13 -0800347 return size;
348}
Alan Cox33f0f882006-01-09 20:54:13 -0800349EXPORT_SYMBOL_GPL(tty_buffer_request_room);
350
Andrew Mortone1a25092006-04-10 22:54:05 -0700351int tty_insert_flip_string(struct tty_struct *tty, const unsigned char *chars,
352 size_t size)
Alan Cox33f0f882006-01-09 20:54:13 -0800353{
354 int copied = 0;
355 do {
356 int space = tty_buffer_request_room(tty, size - copied);
357 struct tty_buffer *tb = tty->buf.tail;
358 /* If there is no space then tb may be NULL */
359 if(unlikely(space == 0))
360 break;
361 memcpy(tb->char_buf_ptr + tb->used, chars, space);
362 memset(tb->flag_buf_ptr + tb->used, TTY_NORMAL, space);
363 tb->used += space;
364 copied += space;
365 chars += space;
Alan Cox33f0f882006-01-09 20:54:13 -0800366 }
367 /* There is a small chance that we need to split the data over
368 several buffers. If this is the case we must loop */
369 while (unlikely(size > copied));
370 return copied;
371}
Andrew Mortonee37df72006-03-31 02:30:35 -0800372EXPORT_SYMBOL(tty_insert_flip_string);
Alan Cox33f0f882006-01-09 20:54:13 -0800373
Andrew Mortone1a25092006-04-10 22:54:05 -0700374int tty_insert_flip_string_flags(struct tty_struct *tty,
375 const unsigned char *chars, const char *flags, size_t size)
Alan Cox33f0f882006-01-09 20:54:13 -0800376{
377 int copied = 0;
378 do {
379 int space = tty_buffer_request_room(tty, size - copied);
380 struct tty_buffer *tb = tty->buf.tail;
381 /* If there is no space then tb may be NULL */
382 if(unlikely(space == 0))
383 break;
384 memcpy(tb->char_buf_ptr + tb->used, chars, space);
385 memcpy(tb->flag_buf_ptr + tb->used, flags, space);
386 tb->used += space;
387 copied += space;
388 chars += space;
389 flags += space;
390 }
391 /* There is a small chance that we need to split the data over
392 several buffers. If this is the case we must loop */
393 while (unlikely(size > copied));
394 return copied;
395}
Tobias Powalowskiff4547f2006-05-22 22:35:28 -0700396EXPORT_SYMBOL(tty_insert_flip_string_flags);
Alan Cox33f0f882006-01-09 20:54:13 -0800397
Andrew Mortone1a25092006-04-10 22:54:05 -0700398void tty_schedule_flip(struct tty_struct *tty)
399{
400 unsigned long flags;
401 spin_lock_irqsave(&tty->buf.lock, flags);
Paul Fulghum33b37a32006-06-28 04:26:49 -0700402 if (tty->buf.tail != NULL)
Andrew Mortone1a25092006-04-10 22:54:05 -0700403 tty->buf.tail->commit = tty->buf.tail->used;
Andrew Mortone1a25092006-04-10 22:54:05 -0700404 spin_unlock_irqrestore(&tty->buf.lock, flags);
405 schedule_delayed_work(&tty->buf.work, 1);
406}
407EXPORT_SYMBOL(tty_schedule_flip);
Alan Cox33f0f882006-01-09 20:54:13 -0800408
409/*
410 * Prepare a block of space in the buffer for data. Returns the length
411 * available and buffer pointer to the space which is now allocated and
412 * accounted for as ready for normal characters. This is used for drivers
413 * that need their own block copy routines into the buffer. There is no
414 * guarantee the buffer is a DMA target!
415 */
416
417int tty_prepare_flip_string(struct tty_struct *tty, unsigned char **chars, size_t size)
418{
419 int space = tty_buffer_request_room(tty, size);
Paul Fulghum808249c2006-02-03 03:04:41 -0800420 if (likely(space)) {
421 struct tty_buffer *tb = tty->buf.tail;
422 *chars = tb->char_buf_ptr + tb->used;
423 memset(tb->flag_buf_ptr + tb->used, TTY_NORMAL, space);
424 tb->used += space;
425 }
Alan Cox33f0f882006-01-09 20:54:13 -0800426 return space;
427}
428
429EXPORT_SYMBOL_GPL(tty_prepare_flip_string);
430
431/*
432 * Prepare a block of space in the buffer for data. Returns the length
433 * available and buffer pointer to the space which is now allocated and
434 * accounted for as ready for characters. This is used for drivers
435 * that need their own block copy routines into the buffer. There is no
436 * guarantee the buffer is a DMA target!
437 */
438
439int tty_prepare_flip_string_flags(struct tty_struct *tty, unsigned char **chars, char **flags, size_t size)
440{
441 int space = tty_buffer_request_room(tty, size);
Paul Fulghum808249c2006-02-03 03:04:41 -0800442 if (likely(space)) {
443 struct tty_buffer *tb = tty->buf.tail;
444 *chars = tb->char_buf_ptr + tb->used;
445 *flags = tb->flag_buf_ptr + tb->used;
446 tb->used += space;
447 }
Alan Cox33f0f882006-01-09 20:54:13 -0800448 return space;
449}
450
451EXPORT_SYMBOL_GPL(tty_prepare_flip_string_flags);
452
453
454
455/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700456 * This is probably overkill for real world processors but
457 * they are not on hot paths so a little discipline won't do
458 * any harm.
459 */
460
461static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
462{
463 down(&tty->termios_sem);
464 tty->termios->c_line = num;
465 up(&tty->termios_sem);
466}
467
468/*
469 * This guards the refcounted line discipline lists. The lock
470 * must be taken with irqs off because there are hangup path
471 * callers who will do ldisc lookups and cannot sleep.
472 */
473
474static DEFINE_SPINLOCK(tty_ldisc_lock);
475static DECLARE_WAIT_QUEUE_HEAD(tty_ldisc_wait);
Alexey Dobriyanbfb07592005-06-23 00:10:32 -0700476static struct tty_ldisc tty_ldiscs[NR_LDISCS]; /* line disc dispatch table */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700477
478int tty_register_ldisc(int disc, struct tty_ldisc *new_ldisc)
479{
480 unsigned long flags;
481 int ret = 0;
482
483 if (disc < N_TTY || disc >= NR_LDISCS)
484 return -EINVAL;
485
486 spin_lock_irqsave(&tty_ldisc_lock, flags);
Alexey Dobriyanbfb07592005-06-23 00:10:32 -0700487 tty_ldiscs[disc] = *new_ldisc;
488 tty_ldiscs[disc].num = disc;
489 tty_ldiscs[disc].flags |= LDISC_FLAG_DEFINED;
490 tty_ldiscs[disc].refcount = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700491 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
492
493 return ret;
494}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700495EXPORT_SYMBOL(tty_register_ldisc);
496
Alexey Dobriyanbfb07592005-06-23 00:10:32 -0700497int tty_unregister_ldisc(int disc)
498{
499 unsigned long flags;
500 int ret = 0;
501
502 if (disc < N_TTY || disc >= NR_LDISCS)
503 return -EINVAL;
504
505 spin_lock_irqsave(&tty_ldisc_lock, flags);
506 if (tty_ldiscs[disc].refcount)
507 ret = -EBUSY;
508 else
509 tty_ldiscs[disc].flags &= ~LDISC_FLAG_DEFINED;
510 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
511
512 return ret;
513}
514EXPORT_SYMBOL(tty_unregister_ldisc);
515
Linus Torvalds1da177e2005-04-16 15:20:36 -0700516struct tty_ldisc *tty_ldisc_get(int disc)
517{
518 unsigned long flags;
519 struct tty_ldisc *ld;
520
521 if (disc < N_TTY || disc >= NR_LDISCS)
522 return NULL;
523
524 spin_lock_irqsave(&tty_ldisc_lock, flags);
525
526 ld = &tty_ldiscs[disc];
527 /* Check the entry is defined */
528 if(ld->flags & LDISC_FLAG_DEFINED)
529 {
530 /* If the module is being unloaded we can't use it */
531 if (!try_module_get(ld->owner))
532 ld = NULL;
533 else /* lock it */
534 ld->refcount++;
535 }
536 else
537 ld = NULL;
538 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
539 return ld;
540}
541
542EXPORT_SYMBOL_GPL(tty_ldisc_get);
543
544void tty_ldisc_put(int disc)
545{
546 struct tty_ldisc *ld;
547 unsigned long flags;
548
Eric Sesterhenn56ee4822006-03-26 18:17:21 +0200549 BUG_ON(disc < N_TTY || disc >= NR_LDISCS);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700550
551 spin_lock_irqsave(&tty_ldisc_lock, flags);
552 ld = &tty_ldiscs[disc];
Eric Sesterhenn56ee4822006-03-26 18:17:21 +0200553 BUG_ON(ld->refcount == 0);
554 ld->refcount--;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700555 module_put(ld->owner);
556 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
557}
558
559EXPORT_SYMBOL_GPL(tty_ldisc_put);
560
561static void tty_ldisc_assign(struct tty_struct *tty, struct tty_ldisc *ld)
562{
563 tty->ldisc = *ld;
564 tty->ldisc.refcount = 0;
565}
566
567/**
568 * tty_ldisc_try - internal helper
569 * @tty: the tty
570 *
571 * Make a single attempt to grab and bump the refcount on
572 * the tty ldisc. Return 0 on failure or 1 on success. This is
573 * used to implement both the waiting and non waiting versions
574 * of tty_ldisc_ref
575 */
576
577static int tty_ldisc_try(struct tty_struct *tty)
578{
579 unsigned long flags;
580 struct tty_ldisc *ld;
581 int ret = 0;
582
583 spin_lock_irqsave(&tty_ldisc_lock, flags);
584 ld = &tty->ldisc;
585 if(test_bit(TTY_LDISC, &tty->flags))
586 {
587 ld->refcount++;
588 ret = 1;
589 }
590 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
591 return ret;
592}
593
594/**
595 * tty_ldisc_ref_wait - wait for the tty ldisc
596 * @tty: tty device
597 *
598 * Dereference the line discipline for the terminal and take a
599 * reference to it. If the line discipline is in flux then
600 * wait patiently until it changes.
601 *
602 * Note: Must not be called from an IRQ/timer context. The caller
603 * must also be careful not to hold other locks that will deadlock
604 * against a discipline change, such as an existing ldisc reference
605 * (which we check for)
606 */
607
608struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty)
609{
610 /* wait_event is a macro */
611 wait_event(tty_ldisc_wait, tty_ldisc_try(tty));
612 if(tty->ldisc.refcount == 0)
613 printk(KERN_ERR "tty_ldisc_ref_wait\n");
614 return &tty->ldisc;
615}
616
617EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait);
618
619/**
620 * tty_ldisc_ref - get the tty ldisc
621 * @tty: tty device
622 *
623 * Dereference the line discipline for the terminal and take a
624 * reference to it. If the line discipline is in flux then
625 * return NULL. Can be called from IRQ and timer functions.
626 */
627
628struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty)
629{
630 if(tty_ldisc_try(tty))
631 return &tty->ldisc;
632 return NULL;
633}
634
635EXPORT_SYMBOL_GPL(tty_ldisc_ref);
636
637/**
638 * tty_ldisc_deref - free a tty ldisc reference
639 * @ld: reference to free up
640 *
641 * Undoes the effect of tty_ldisc_ref or tty_ldisc_ref_wait. May
642 * be called in IRQ context.
643 */
644
645void tty_ldisc_deref(struct tty_ldisc *ld)
646{
647 unsigned long flags;
648
Eric Sesterhenn56ee4822006-03-26 18:17:21 +0200649 BUG_ON(ld == NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700650
651 spin_lock_irqsave(&tty_ldisc_lock, flags);
652 if(ld->refcount == 0)
653 printk(KERN_ERR "tty_ldisc_deref: no references.\n");
654 else
655 ld->refcount--;
656 if(ld->refcount == 0)
657 wake_up(&tty_ldisc_wait);
658 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
659}
660
661EXPORT_SYMBOL_GPL(tty_ldisc_deref);
662
663/**
664 * tty_ldisc_enable - allow ldisc use
665 * @tty: terminal to activate ldisc on
666 *
667 * Set the TTY_LDISC flag when the line discipline can be called
668 * again. Do neccessary wakeups for existing sleepers.
669 *
670 * Note: nobody should set this bit except via this function. Clearing
671 * directly is allowed.
672 */
673
674static void tty_ldisc_enable(struct tty_struct *tty)
675{
676 set_bit(TTY_LDISC, &tty->flags);
677 wake_up(&tty_ldisc_wait);
678}
679
680/**
681 * tty_set_ldisc - set line discipline
682 * @tty: the terminal to set
683 * @ldisc: the line discipline
684 *
685 * Set the discipline of a tty line. Must be called from a process
686 * context.
687 */
688
689static int tty_set_ldisc(struct tty_struct *tty, int ldisc)
690{
Jason Baronff55fe22005-09-09 13:01:57 -0700691 int retval = 0;
692 struct tty_ldisc o_ldisc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700693 char buf[64];
694 int work;
695 unsigned long flags;
696 struct tty_ldisc *ld;
Jason Baronff55fe22005-09-09 13:01:57 -0700697 struct tty_struct *o_tty;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700698
699 if ((ldisc < N_TTY) || (ldisc >= NR_LDISCS))
700 return -EINVAL;
701
702restart:
703
Linus Torvalds1da177e2005-04-16 15:20:36 -0700704 ld = tty_ldisc_get(ldisc);
705 /* Eduardo Blanco <ejbs@cs.cs.com.uy> */
706 /* Cyrus Durgin <cider@speakeasy.org> */
707 if (ld == NULL) {
708 request_module("tty-ldisc-%d", ldisc);
709 ld = tty_ldisc_get(ldisc);
710 }
711 if (ld == NULL)
712 return -EINVAL;
713
Alan Cox33f0f882006-01-09 20:54:13 -0800714 /*
715 * No more input please, we are switching. The new ldisc
716 * will update this value in the ldisc open function
717 */
718
719 tty->receive_room = 0;
720
721 /*
722 * Problem: What do we do if this blocks ?
723 */
724
Linus Torvalds1da177e2005-04-16 15:20:36 -0700725 tty_wait_until_sent(tty, 0);
726
Jason Baronff55fe22005-09-09 13:01:57 -0700727 if (tty->ldisc.num == ldisc) {
728 tty_ldisc_put(ldisc);
729 return 0;
730 }
731
732 o_ldisc = tty->ldisc;
733 o_tty = tty->link;
734
Linus Torvalds1da177e2005-04-16 15:20:36 -0700735 /*
736 * Make sure we don't change while someone holds a
737 * reference to the line discipline. The TTY_LDISC bit
738 * prevents anyone taking a reference once it is clear.
739 * We need the lock to avoid racing reference takers.
740 */
Jason Baronff55fe22005-09-09 13:01:57 -0700741
Linus Torvalds1da177e2005-04-16 15:20:36 -0700742 spin_lock_irqsave(&tty_ldisc_lock, flags);
Jason Baronff55fe22005-09-09 13:01:57 -0700743 if (tty->ldisc.refcount || (o_tty && o_tty->ldisc.refcount)) {
744 if(tty->ldisc.refcount) {
745 /* Free the new ldisc we grabbed. Must drop the lock
746 first. */
747 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
748 tty_ldisc_put(ldisc);
749 /*
750 * There are several reasons we may be busy, including
751 * random momentary I/O traffic. We must therefore
752 * retry. We could distinguish between blocking ops
753 * and retries if we made tty_ldisc_wait() smarter. That
754 * is up for discussion.
755 */
756 if (wait_event_interruptible(tty_ldisc_wait, tty->ldisc.refcount == 0) < 0)
757 return -ERESTARTSYS;
758 goto restart;
759 }
760 if(o_tty && o_tty->ldisc.refcount) {
761 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
762 tty_ldisc_put(ldisc);
763 if (wait_event_interruptible(tty_ldisc_wait, o_tty->ldisc.refcount == 0) < 0)
764 return -ERESTARTSYS;
765 goto restart;
766 }
767 }
768
769 /* if the TTY_LDISC bit is set, then we are racing against another ldisc change */
770
771 if (!test_bit(TTY_LDISC, &tty->flags)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700772 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
773 tty_ldisc_put(ldisc);
Jason Baronff55fe22005-09-09 13:01:57 -0700774 ld = tty_ldisc_ref_wait(tty);
775 tty_ldisc_deref(ld);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700776 goto restart;
777 }
Jason Baronff55fe22005-09-09 13:01:57 -0700778
779 clear_bit(TTY_LDISC, &tty->flags);
Paul Fulghum817d6d32006-06-28 04:26:47 -0700780 if (o_tty)
Jason Baronff55fe22005-09-09 13:01:57 -0700781 clear_bit(TTY_LDISC, &o_tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700782 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
Jason Baronff55fe22005-09-09 13:01:57 -0700783
Linus Torvalds1da177e2005-04-16 15:20:36 -0700784 /*
785 * From this point on we know nobody has an ldisc
786 * usage reference, nor can they obtain one until
787 * we say so later on.
788 */
Jason Baronff55fe22005-09-09 13:01:57 -0700789
Alan Cox33f0f882006-01-09 20:54:13 -0800790 work = cancel_delayed_work(&tty->buf.work);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700791 /*
Alan Cox33f0f882006-01-09 20:54:13 -0800792 * Wait for ->hangup_work and ->buf.work handlers to terminate
Linus Torvalds1da177e2005-04-16 15:20:36 -0700793 */
794
795 flush_scheduled_work();
796 /* Shutdown the current discipline. */
797 if (tty->ldisc.close)
798 (tty->ldisc.close)(tty);
799
800 /* Now set up the new line discipline. */
801 tty_ldisc_assign(tty, ld);
802 tty_set_termios_ldisc(tty, ldisc);
803 if (tty->ldisc.open)
804 retval = (tty->ldisc.open)(tty);
805 if (retval < 0) {
806 tty_ldisc_put(ldisc);
807 /* There is an outstanding reference here so this is safe */
808 tty_ldisc_assign(tty, tty_ldisc_get(o_ldisc.num));
809 tty_set_termios_ldisc(tty, tty->ldisc.num);
810 if (tty->ldisc.open && (tty->ldisc.open(tty) < 0)) {
811 tty_ldisc_put(o_ldisc.num);
812 /* This driver is always present */
813 tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
814 tty_set_termios_ldisc(tty, N_TTY);
815 if (tty->ldisc.open) {
816 int r = tty->ldisc.open(tty);
817
818 if (r < 0)
819 panic("Couldn't open N_TTY ldisc for "
820 "%s --- error %d.",
821 tty_name(tty, buf), r);
822 }
823 }
824 }
825 /* At this point we hold a reference to the new ldisc and a
826 a reference to the old ldisc. If we ended up flipping back
827 to the existing ldisc we have two references to it */
828
829 if (tty->ldisc.num != o_ldisc.num && tty->driver->set_ldisc)
830 tty->driver->set_ldisc(tty);
831
832 tty_ldisc_put(o_ldisc.num);
833
834 /*
835 * Allow ldisc referencing to occur as soon as the driver
836 * ldisc callback completes.
837 */
838
839 tty_ldisc_enable(tty);
Jason Baronff55fe22005-09-09 13:01:57 -0700840 if (o_tty)
841 tty_ldisc_enable(o_tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700842
843 /* Restart it in case no characters kick it off. Safe if
844 already running */
Jason Baronff55fe22005-09-09 13:01:57 -0700845 if (work)
Alan Cox33f0f882006-01-09 20:54:13 -0800846 schedule_delayed_work(&tty->buf.work, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700847 return retval;
848}
849
850/*
851 * This routine returns a tty driver structure, given a device number
852 */
853static struct tty_driver *get_tty_driver(dev_t device, int *index)
854{
855 struct tty_driver *p;
856
857 list_for_each_entry(p, &tty_drivers, tty_drivers) {
858 dev_t base = MKDEV(p->major, p->minor_start);
859 if (device < base || device >= base + p->num)
860 continue;
861 *index = device - base;
862 return p;
863 }
864 return NULL;
865}
866
867/*
868 * If we try to write to, or set the state of, a terminal and we're
869 * not in the foreground, send a SIGTTOU. If the signal is blocked or
870 * ignored, go ahead and perform the operation. (POSIX 7.2)
871 */
872int tty_check_change(struct tty_struct * tty)
873{
874 if (current->signal->tty != tty)
875 return 0;
876 if (tty->pgrp <= 0) {
877 printk(KERN_WARNING "tty_check_change: tty->pgrp <= 0!\n");
878 return 0;
879 }
880 if (process_group(current) == tty->pgrp)
881 return 0;
882 if (is_ignored(SIGTTOU))
883 return 0;
884 if (is_orphaned_pgrp(process_group(current)))
885 return -EIO;
886 (void) kill_pg(process_group(current), SIGTTOU, 1);
887 return -ERESTARTSYS;
888}
889
890EXPORT_SYMBOL(tty_check_change);
891
892static ssize_t hung_up_tty_read(struct file * file, char __user * buf,
893 size_t count, loff_t *ppos)
894{
895 return 0;
896}
897
898static ssize_t hung_up_tty_write(struct file * file, const char __user * buf,
899 size_t count, loff_t *ppos)
900{
901 return -EIO;
902}
903
904/* No kernel lock held - none needed ;) */
905static unsigned int hung_up_tty_poll(struct file * filp, poll_table * wait)
906{
907 return POLLIN | POLLOUT | POLLERR | POLLHUP | POLLRDNORM | POLLWRNORM;
908}
909
910static int hung_up_tty_ioctl(struct inode * inode, struct file * file,
911 unsigned int cmd, unsigned long arg)
912{
913 return cmd == TIOCSPGRP ? -ENOTTY : -EIO;
914}
915
916static struct file_operations tty_fops = {
917 .llseek = no_llseek,
918 .read = tty_read,
919 .write = tty_write,
920 .poll = tty_poll,
921 .ioctl = tty_ioctl,
922 .open = tty_open,
923 .release = tty_release,
924 .fasync = tty_fasync,
925};
926
927#ifdef CONFIG_UNIX98_PTYS
928static struct file_operations ptmx_fops = {
929 .llseek = no_llseek,
930 .read = tty_read,
931 .write = tty_write,
932 .poll = tty_poll,
933 .ioctl = tty_ioctl,
934 .open = ptmx_open,
935 .release = tty_release,
936 .fasync = tty_fasync,
937};
938#endif
939
940static struct file_operations console_fops = {
941 .llseek = no_llseek,
942 .read = tty_read,
943 .write = redirected_tty_write,
944 .poll = tty_poll,
945 .ioctl = tty_ioctl,
946 .open = tty_open,
947 .release = tty_release,
948 .fasync = tty_fasync,
949};
950
951static struct file_operations hung_up_tty_fops = {
952 .llseek = no_llseek,
953 .read = hung_up_tty_read,
954 .write = hung_up_tty_write,
955 .poll = hung_up_tty_poll,
956 .ioctl = hung_up_tty_ioctl,
957 .release = tty_release,
958};
959
960static DEFINE_SPINLOCK(redirect_lock);
961static struct file *redirect;
962
963/**
964 * tty_wakeup - request more data
965 * @tty: terminal
966 *
967 * Internal and external helper for wakeups of tty. This function
968 * informs the line discipline if present that the driver is ready
969 * to receive more output data.
970 */
971
972void tty_wakeup(struct tty_struct *tty)
973{
974 struct tty_ldisc *ld;
975
976 if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) {
977 ld = tty_ldisc_ref(tty);
978 if(ld) {
979 if(ld->write_wakeup)
980 ld->write_wakeup(tty);
981 tty_ldisc_deref(ld);
982 }
983 }
984 wake_up_interruptible(&tty->write_wait);
985}
986
987EXPORT_SYMBOL_GPL(tty_wakeup);
988
989/**
990 * tty_ldisc_flush - flush line discipline queue
991 * @tty: tty
992 *
993 * Flush the line discipline queue (if any) for this tty. If there
994 * is no line discipline active this is a no-op.
995 */
996
997void tty_ldisc_flush(struct tty_struct *tty)
998{
999 struct tty_ldisc *ld = tty_ldisc_ref(tty);
1000 if(ld) {
1001 if(ld->flush_buffer)
1002 ld->flush_buffer(tty);
1003 tty_ldisc_deref(ld);
1004 }
1005}
1006
1007EXPORT_SYMBOL_GPL(tty_ldisc_flush);
1008
1009/*
1010 * This can be called by the "eventd" kernel thread. That is process synchronous,
1011 * but doesn't hold any locks, so we need to make sure we have the appropriate
1012 * locks for what we're doing..
1013 */
1014static void do_tty_hangup(void *data)
1015{
1016 struct tty_struct *tty = (struct tty_struct *) data;
1017 struct file * cons_filp = NULL;
1018 struct file *filp, *f = NULL;
1019 struct task_struct *p;
1020 struct tty_ldisc *ld;
1021 int closecount = 0, n;
1022
1023 if (!tty)
1024 return;
1025
1026 /* inuse_filps is protected by the single kernel lock */
1027 lock_kernel();
1028
1029 spin_lock(&redirect_lock);
1030 if (redirect && redirect->private_data == tty) {
1031 f = redirect;
1032 redirect = NULL;
1033 }
1034 spin_unlock(&redirect_lock);
1035
1036 check_tty_count(tty, "do_tty_hangup");
1037 file_list_lock();
1038 /* This breaks for file handles being sent over AF_UNIX sockets ? */
Eric Dumazet2f512012005-10-30 15:02:16 -08001039 list_for_each_entry(filp, &tty->tty_files, f_u.fu_list) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001040 if (filp->f_op->write == redirected_tty_write)
1041 cons_filp = filp;
1042 if (filp->f_op->write != tty_write)
1043 continue;
1044 closecount++;
1045 tty_fasync(-1, filp, 0); /* can't block */
1046 filp->f_op = &hung_up_tty_fops;
1047 }
1048 file_list_unlock();
1049
1050 /* FIXME! What are the locking issues here? This may me overdoing things..
1051 * this question is especially important now that we've removed the irqlock. */
1052
1053 ld = tty_ldisc_ref(tty);
1054 if(ld != NULL) /* We may have no line discipline at this point */
1055 {
1056 if (ld->flush_buffer)
1057 ld->flush_buffer(tty);
1058 if (tty->driver->flush_buffer)
1059 tty->driver->flush_buffer(tty);
1060 if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
1061 ld->write_wakeup)
1062 ld->write_wakeup(tty);
1063 if (ld->hangup)
1064 ld->hangup(tty);
1065 }
1066
1067 /* FIXME: Once we trust the LDISC code better we can wait here for
1068 ldisc completion and fix the driver call race */
1069
1070 wake_up_interruptible(&tty->write_wait);
1071 wake_up_interruptible(&tty->read_wait);
1072
1073 /*
1074 * Shutdown the current line discipline, and reset it to
1075 * N_TTY.
1076 */
1077 if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
1078 {
1079 down(&tty->termios_sem);
1080 *tty->termios = tty->driver->init_termios;
1081 up(&tty->termios_sem);
1082 }
1083
1084 /* Defer ldisc switch */
1085 /* tty_deferred_ldisc_switch(N_TTY);
1086
1087 This should get done automatically when the port closes and
1088 tty_release is called */
1089
1090 read_lock(&tasklist_lock);
1091 if (tty->session > 0) {
1092 do_each_task_pid(tty->session, PIDTYPE_SID, p) {
1093 if (p->signal->tty == tty)
1094 p->signal->tty = NULL;
1095 if (!p->signal->leader)
1096 continue;
Eric W. Biedermanf96a7952006-03-28 16:11:01 -08001097 group_send_sig_info(SIGHUP, SEND_SIG_PRIV, p);
1098 group_send_sig_info(SIGCONT, SEND_SIG_PRIV, p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001099 if (tty->pgrp > 0)
1100 p->signal->tty_old_pgrp = tty->pgrp;
1101 } while_each_task_pid(tty->session, PIDTYPE_SID, p);
1102 }
1103 read_unlock(&tasklist_lock);
1104
1105 tty->flags = 0;
1106 tty->session = 0;
1107 tty->pgrp = -1;
1108 tty->ctrl_status = 0;
1109 /*
1110 * If one of the devices matches a console pointer, we
1111 * cannot just call hangup() because that will cause
1112 * tty->count and state->count to go out of sync.
1113 * So we just call close() the right number of times.
1114 */
1115 if (cons_filp) {
1116 if (tty->driver->close)
1117 for (n = 0; n < closecount; n++)
1118 tty->driver->close(tty, cons_filp);
1119 } else if (tty->driver->hangup)
1120 (tty->driver->hangup)(tty);
1121
1122 /* We don't want to have driver/ldisc interactions beyond
1123 the ones we did here. The driver layer expects no
1124 calls after ->hangup() from the ldisc side. However we
1125 can't yet guarantee all that */
1126
1127 set_bit(TTY_HUPPED, &tty->flags);
1128 if (ld) {
1129 tty_ldisc_enable(tty);
1130 tty_ldisc_deref(ld);
1131 }
1132 unlock_kernel();
1133 if (f)
1134 fput(f);
1135}
1136
1137void tty_hangup(struct tty_struct * tty)
1138{
1139#ifdef TTY_DEBUG_HANGUP
1140 char buf[64];
1141
1142 printk(KERN_DEBUG "%s hangup...\n", tty_name(tty, buf));
1143#endif
1144 schedule_work(&tty->hangup_work);
1145}
1146
1147EXPORT_SYMBOL(tty_hangup);
1148
1149void tty_vhangup(struct tty_struct * tty)
1150{
1151#ifdef TTY_DEBUG_HANGUP
1152 char buf[64];
1153
1154 printk(KERN_DEBUG "%s vhangup...\n", tty_name(tty, buf));
1155#endif
1156 do_tty_hangup((void *) tty);
1157}
1158EXPORT_SYMBOL(tty_vhangup);
1159
1160int tty_hung_up_p(struct file * filp)
1161{
1162 return (filp->f_op == &hung_up_tty_fops);
1163}
1164
1165EXPORT_SYMBOL(tty_hung_up_p);
1166
1167/*
1168 * This function is typically called only by the session leader, when
1169 * it wants to disassociate itself from its controlling tty.
1170 *
1171 * It performs the following functions:
1172 * (1) Sends a SIGHUP and SIGCONT to the foreground process group
1173 * (2) Clears the tty from being controlling the session
1174 * (3) Clears the controlling tty for all processes in the
1175 * session group.
1176 *
1177 * The argument on_exit is set to 1 if called when a process is
1178 * exiting; it is 0 if called by the ioctl TIOCNOTTY.
1179 */
1180void disassociate_ctty(int on_exit)
1181{
1182 struct tty_struct *tty;
1183 struct task_struct *p;
1184 int tty_pgrp = -1;
1185
1186 lock_kernel();
1187
Ingo Molnar70522e12006-03-23 03:00:31 -08001188 mutex_lock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001189 tty = current->signal->tty;
1190 if (tty) {
1191 tty_pgrp = tty->pgrp;
Ingo Molnar70522e12006-03-23 03:00:31 -08001192 mutex_unlock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001193 if (on_exit && tty->driver->type != TTY_DRIVER_TYPE_PTY)
1194 tty_vhangup(tty);
1195 } else {
1196 if (current->signal->tty_old_pgrp) {
1197 kill_pg(current->signal->tty_old_pgrp, SIGHUP, on_exit);
1198 kill_pg(current->signal->tty_old_pgrp, SIGCONT, on_exit);
1199 }
Ingo Molnar70522e12006-03-23 03:00:31 -08001200 mutex_unlock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001201 unlock_kernel();
1202 return;
1203 }
1204 if (tty_pgrp > 0) {
1205 kill_pg(tty_pgrp, SIGHUP, on_exit);
1206 if (!on_exit)
1207 kill_pg(tty_pgrp, SIGCONT, on_exit);
1208 }
1209
1210 /* Must lock changes to tty_old_pgrp */
Ingo Molnar70522e12006-03-23 03:00:31 -08001211 mutex_lock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001212 current->signal->tty_old_pgrp = 0;
1213 tty->session = 0;
1214 tty->pgrp = -1;
1215
1216 /* Now clear signal->tty under the lock */
1217 read_lock(&tasklist_lock);
1218 do_each_task_pid(current->signal->session, PIDTYPE_SID, p) {
1219 p->signal->tty = NULL;
1220 } while_each_task_pid(current->signal->session, PIDTYPE_SID, p);
1221 read_unlock(&tasklist_lock);
Ingo Molnar70522e12006-03-23 03:00:31 -08001222 mutex_unlock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001223 unlock_kernel();
1224}
1225
1226void stop_tty(struct tty_struct *tty)
1227{
1228 if (tty->stopped)
1229 return;
1230 tty->stopped = 1;
1231 if (tty->link && tty->link->packet) {
1232 tty->ctrl_status &= ~TIOCPKT_START;
1233 tty->ctrl_status |= TIOCPKT_STOP;
1234 wake_up_interruptible(&tty->link->read_wait);
1235 }
1236 if (tty->driver->stop)
1237 (tty->driver->stop)(tty);
1238}
1239
1240EXPORT_SYMBOL(stop_tty);
1241
1242void start_tty(struct tty_struct *tty)
1243{
1244 if (!tty->stopped || tty->flow_stopped)
1245 return;
1246 tty->stopped = 0;
1247 if (tty->link && tty->link->packet) {
1248 tty->ctrl_status &= ~TIOCPKT_STOP;
1249 tty->ctrl_status |= TIOCPKT_START;
1250 wake_up_interruptible(&tty->link->read_wait);
1251 }
1252 if (tty->driver->start)
1253 (tty->driver->start)(tty);
1254
1255 /* If we have a running line discipline it may need kicking */
1256 tty_wakeup(tty);
1257 wake_up_interruptible(&tty->write_wait);
1258}
1259
1260EXPORT_SYMBOL(start_tty);
1261
1262static ssize_t tty_read(struct file * file, char __user * buf, size_t count,
1263 loff_t *ppos)
1264{
1265 int i;
1266 struct tty_struct * tty;
1267 struct inode *inode;
1268 struct tty_ldisc *ld;
1269
1270 tty = (struct tty_struct *)file->private_data;
1271 inode = file->f_dentry->d_inode;
1272 if (tty_paranoia_check(tty, inode, "tty_read"))
1273 return -EIO;
1274 if (!tty || (test_bit(TTY_IO_ERROR, &tty->flags)))
1275 return -EIO;
1276
1277 /* We want to wait for the line discipline to sort out in this
1278 situation */
1279 ld = tty_ldisc_ref_wait(tty);
1280 lock_kernel();
1281 if (ld->read)
1282 i = (ld->read)(tty,file,buf,count);
1283 else
1284 i = -EIO;
1285 tty_ldisc_deref(ld);
1286 unlock_kernel();
1287 if (i > 0)
1288 inode->i_atime = current_fs_time(inode->i_sb);
1289 return i;
1290}
1291
1292/*
1293 * Split writes up in sane blocksizes to avoid
1294 * denial-of-service type attacks
1295 */
1296static inline ssize_t do_tty_write(
1297 ssize_t (*write)(struct tty_struct *, struct file *, const unsigned char *, size_t),
1298 struct tty_struct *tty,
1299 struct file *file,
1300 const char __user *buf,
1301 size_t count)
1302{
1303 ssize_t ret = 0, written = 0;
1304 unsigned int chunk;
1305
Ingo Molnar70522e12006-03-23 03:00:31 -08001306 if (mutex_lock_interruptible(&tty->atomic_write_lock)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001307 return -ERESTARTSYS;
1308 }
1309
1310 /*
1311 * We chunk up writes into a temporary buffer. This
1312 * simplifies low-level drivers immensely, since they
1313 * don't have locking issues and user mode accesses.
1314 *
1315 * But if TTY_NO_WRITE_SPLIT is set, we should use a
1316 * big chunk-size..
1317 *
1318 * The default chunk-size is 2kB, because the NTTY
1319 * layer has problems with bigger chunks. It will
1320 * claim to be able to handle more characters than
1321 * it actually does.
1322 */
1323 chunk = 2048;
1324 if (test_bit(TTY_NO_WRITE_SPLIT, &tty->flags))
1325 chunk = 65536;
1326 if (count < chunk)
1327 chunk = count;
1328
Ingo Molnar70522e12006-03-23 03:00:31 -08001329 /* write_buf/write_cnt is protected by the atomic_write_lock mutex */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001330 if (tty->write_cnt < chunk) {
1331 unsigned char *buf;
1332
1333 if (chunk < 1024)
1334 chunk = 1024;
1335
1336 buf = kmalloc(chunk, GFP_KERNEL);
1337 if (!buf) {
Ingo Molnar70522e12006-03-23 03:00:31 -08001338 mutex_unlock(&tty->atomic_write_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001339 return -ENOMEM;
1340 }
1341 kfree(tty->write_buf);
1342 tty->write_cnt = chunk;
1343 tty->write_buf = buf;
1344 }
1345
1346 /* Do the write .. */
1347 for (;;) {
1348 size_t size = count;
1349 if (size > chunk)
1350 size = chunk;
1351 ret = -EFAULT;
1352 if (copy_from_user(tty->write_buf, buf, size))
1353 break;
1354 lock_kernel();
1355 ret = write(tty, file, tty->write_buf, size);
1356 unlock_kernel();
1357 if (ret <= 0)
1358 break;
1359 written += ret;
1360 buf += ret;
1361 count -= ret;
1362 if (!count)
1363 break;
1364 ret = -ERESTARTSYS;
1365 if (signal_pending(current))
1366 break;
1367 cond_resched();
1368 }
1369 if (written) {
1370 struct inode *inode = file->f_dentry->d_inode;
1371 inode->i_mtime = current_fs_time(inode->i_sb);
1372 ret = written;
1373 }
Ingo Molnar70522e12006-03-23 03:00:31 -08001374 mutex_unlock(&tty->atomic_write_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001375 return ret;
1376}
1377
1378
1379static ssize_t tty_write(struct file * file, const char __user * buf, size_t count,
1380 loff_t *ppos)
1381{
1382 struct tty_struct * tty;
1383 struct inode *inode = file->f_dentry->d_inode;
1384 ssize_t ret;
1385 struct tty_ldisc *ld;
1386
1387 tty = (struct tty_struct *)file->private_data;
1388 if (tty_paranoia_check(tty, inode, "tty_write"))
1389 return -EIO;
1390 if (!tty || !tty->driver->write || (test_bit(TTY_IO_ERROR, &tty->flags)))
1391 return -EIO;
1392
1393 ld = tty_ldisc_ref_wait(tty);
1394 if (!ld->write)
1395 ret = -EIO;
1396 else
1397 ret = do_tty_write(ld->write, tty, file, buf, count);
1398 tty_ldisc_deref(ld);
1399 return ret;
1400}
1401
1402ssize_t redirected_tty_write(struct file * file, const char __user * buf, size_t count,
1403 loff_t *ppos)
1404{
1405 struct file *p = NULL;
1406
1407 spin_lock(&redirect_lock);
1408 if (redirect) {
1409 get_file(redirect);
1410 p = redirect;
1411 }
1412 spin_unlock(&redirect_lock);
1413
1414 if (p) {
1415 ssize_t res;
1416 res = vfs_write(p, buf, count, &p->f_pos);
1417 fput(p);
1418 return res;
1419 }
1420
1421 return tty_write(file, buf, count, ppos);
1422}
1423
1424static char ptychar[] = "pqrstuvwxyzabcde";
1425
1426static inline void pty_line_name(struct tty_driver *driver, int index, char *p)
1427{
1428 int i = index + driver->name_base;
1429 /* ->name is initialized to "ttyp", but "tty" is expected */
1430 sprintf(p, "%s%c%x",
1431 driver->subtype == PTY_TYPE_SLAVE ? "tty" : driver->name,
1432 ptychar[i >> 4 & 0xf], i & 0xf);
1433}
1434
1435static inline void tty_line_name(struct tty_driver *driver, int index, char *p)
1436{
1437 sprintf(p, "%s%d", driver->name, index + driver->name_base);
1438}
1439
1440/*
1441 * WSH 06/09/97: Rewritten to remove races and properly clean up after a
Ingo Molnar70522e12006-03-23 03:00:31 -08001442 * failed open. The new code protects the open with a mutex, so it's
1443 * really quite straightforward. The mutex locking can probably be
Linus Torvalds1da177e2005-04-16 15:20:36 -07001444 * relaxed for the (most common) case of reopening a tty.
1445 */
1446static int init_dev(struct tty_driver *driver, int idx,
1447 struct tty_struct **ret_tty)
1448{
1449 struct tty_struct *tty, *o_tty;
1450 struct termios *tp, **tp_loc, *o_tp, **o_tp_loc;
1451 struct termios *ltp, **ltp_loc, *o_ltp, **o_ltp_loc;
1452 int retval=0;
1453
1454 /* check whether we're reopening an existing tty */
1455 if (driver->flags & TTY_DRIVER_DEVPTS_MEM) {
1456 tty = devpts_get_tty(idx);
1457 if (tty && driver->subtype == PTY_TYPE_MASTER)
1458 tty = tty->link;
1459 } else {
1460 tty = driver->ttys[idx];
1461 }
1462 if (tty) goto fast_track;
1463
1464 /*
1465 * First time open is complex, especially for PTY devices.
1466 * This code guarantees that either everything succeeds and the
1467 * TTY is ready for operation, or else the table slots are vacated
1468 * and the allocated memory released. (Except that the termios
1469 * and locked termios may be retained.)
1470 */
1471
1472 if (!try_module_get(driver->owner)) {
1473 retval = -ENODEV;
1474 goto end_init;
1475 }
1476
1477 o_tty = NULL;
1478 tp = o_tp = NULL;
1479 ltp = o_ltp = NULL;
1480
1481 tty = alloc_tty_struct();
1482 if(!tty)
1483 goto fail_no_mem;
1484 initialize_tty_struct(tty);
1485 tty->driver = driver;
1486 tty->index = idx;
1487 tty_line_name(driver, idx, tty->name);
1488
1489 if (driver->flags & TTY_DRIVER_DEVPTS_MEM) {
1490 tp_loc = &tty->termios;
1491 ltp_loc = &tty->termios_locked;
1492 } else {
1493 tp_loc = &driver->termios[idx];
1494 ltp_loc = &driver->termios_locked[idx];
1495 }
1496
1497 if (!*tp_loc) {
1498 tp = (struct termios *) kmalloc(sizeof(struct termios),
1499 GFP_KERNEL);
1500 if (!tp)
1501 goto free_mem_out;
1502 *tp = driver->init_termios;
1503 }
1504
1505 if (!*ltp_loc) {
1506 ltp = (struct termios *) kmalloc(sizeof(struct termios),
1507 GFP_KERNEL);
1508 if (!ltp)
1509 goto free_mem_out;
1510 memset(ltp, 0, sizeof(struct termios));
1511 }
1512
1513 if (driver->type == TTY_DRIVER_TYPE_PTY) {
1514 o_tty = alloc_tty_struct();
1515 if (!o_tty)
1516 goto free_mem_out;
1517 initialize_tty_struct(o_tty);
1518 o_tty->driver = driver->other;
1519 o_tty->index = idx;
1520 tty_line_name(driver->other, idx, o_tty->name);
1521
1522 if (driver->flags & TTY_DRIVER_DEVPTS_MEM) {
1523 o_tp_loc = &o_tty->termios;
1524 o_ltp_loc = &o_tty->termios_locked;
1525 } else {
1526 o_tp_loc = &driver->other->termios[idx];
1527 o_ltp_loc = &driver->other->termios_locked[idx];
1528 }
1529
1530 if (!*o_tp_loc) {
1531 o_tp = (struct termios *)
1532 kmalloc(sizeof(struct termios), GFP_KERNEL);
1533 if (!o_tp)
1534 goto free_mem_out;
1535 *o_tp = driver->other->init_termios;
1536 }
1537
1538 if (!*o_ltp_loc) {
1539 o_ltp = (struct termios *)
1540 kmalloc(sizeof(struct termios), GFP_KERNEL);
1541 if (!o_ltp)
1542 goto free_mem_out;
1543 memset(o_ltp, 0, sizeof(struct termios));
1544 }
1545
1546 /*
1547 * Everything allocated ... set up the o_tty structure.
1548 */
1549 if (!(driver->other->flags & TTY_DRIVER_DEVPTS_MEM)) {
1550 driver->other->ttys[idx] = o_tty;
1551 }
1552 if (!*o_tp_loc)
1553 *o_tp_loc = o_tp;
1554 if (!*o_ltp_loc)
1555 *o_ltp_loc = o_ltp;
1556 o_tty->termios = *o_tp_loc;
1557 o_tty->termios_locked = *o_ltp_loc;
1558 driver->other->refcount++;
1559 if (driver->subtype == PTY_TYPE_MASTER)
1560 o_tty->count++;
1561
1562 /* Establish the links in both directions */
1563 tty->link = o_tty;
1564 o_tty->link = tty;
1565 }
1566
1567 /*
1568 * All structures have been allocated, so now we install them.
1569 * Failures after this point use release_mem to clean up, so
1570 * there's no need to null out the local pointers.
1571 */
1572 if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
1573 driver->ttys[idx] = tty;
1574 }
1575
1576 if (!*tp_loc)
1577 *tp_loc = tp;
1578 if (!*ltp_loc)
1579 *ltp_loc = ltp;
1580 tty->termios = *tp_loc;
1581 tty->termios_locked = *ltp_loc;
1582 driver->refcount++;
1583 tty->count++;
1584
1585 /*
1586 * Structures all installed ... call the ldisc open routines.
1587 * If we fail here just call release_mem to clean up. No need
1588 * to decrement the use counts, as release_mem doesn't care.
1589 */
1590
1591 if (tty->ldisc.open) {
1592 retval = (tty->ldisc.open)(tty);
1593 if (retval)
1594 goto release_mem_out;
1595 }
1596 if (o_tty && o_tty->ldisc.open) {
1597 retval = (o_tty->ldisc.open)(o_tty);
1598 if (retval) {
1599 if (tty->ldisc.close)
1600 (tty->ldisc.close)(tty);
1601 goto release_mem_out;
1602 }
1603 tty_ldisc_enable(o_tty);
1604 }
1605 tty_ldisc_enable(tty);
1606 goto success;
1607
1608 /*
1609 * This fast open can be used if the tty is already open.
1610 * No memory is allocated, and the only failures are from
1611 * attempting to open a closing tty or attempting multiple
1612 * opens on a pty master.
1613 */
1614fast_track:
1615 if (test_bit(TTY_CLOSING, &tty->flags)) {
1616 retval = -EIO;
1617 goto end_init;
1618 }
1619 if (driver->type == TTY_DRIVER_TYPE_PTY &&
1620 driver->subtype == PTY_TYPE_MASTER) {
1621 /*
1622 * special case for PTY masters: only one open permitted,
1623 * and the slave side open count is incremented as well.
1624 */
1625 if (tty->count) {
1626 retval = -EIO;
1627 goto end_init;
1628 }
1629 tty->link->count++;
1630 }
1631 tty->count++;
1632 tty->driver = driver; /* N.B. why do this every time?? */
1633
1634 /* FIXME */
1635 if(!test_bit(TTY_LDISC, &tty->flags))
1636 printk(KERN_ERR "init_dev but no ldisc\n");
1637success:
1638 *ret_tty = tty;
1639
Ingo Molnar70522e12006-03-23 03:00:31 -08001640 /* All paths come through here to release the mutex */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001641end_init:
1642 return retval;
1643
1644 /* Release locally allocated memory ... nothing placed in slots */
1645free_mem_out:
Jesper Juhl735d5662005-11-07 01:01:29 -08001646 kfree(o_tp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001647 if (o_tty)
1648 free_tty_struct(o_tty);
Jesper Juhl735d5662005-11-07 01:01:29 -08001649 kfree(ltp);
1650 kfree(tp);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001651 free_tty_struct(tty);
1652
1653fail_no_mem:
1654 module_put(driver->owner);
1655 retval = -ENOMEM;
1656 goto end_init;
1657
1658 /* call the tty release_mem routine to clean out this slot */
1659release_mem_out:
1660 printk(KERN_INFO "init_dev: ldisc open failed, "
1661 "clearing slot %d\n", idx);
1662 release_mem(tty, idx);
1663 goto end_init;
1664}
1665
1666/*
1667 * Releases memory associated with a tty structure, and clears out the
1668 * driver table slots.
1669 */
1670static void release_mem(struct tty_struct *tty, int idx)
1671{
1672 struct tty_struct *o_tty;
1673 struct termios *tp;
1674 int devpts = tty->driver->flags & TTY_DRIVER_DEVPTS_MEM;
1675
1676 if ((o_tty = tty->link) != NULL) {
1677 if (!devpts)
1678 o_tty->driver->ttys[idx] = NULL;
1679 if (o_tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
1680 tp = o_tty->termios;
1681 if (!devpts)
1682 o_tty->driver->termios[idx] = NULL;
1683 kfree(tp);
1684
1685 tp = o_tty->termios_locked;
1686 if (!devpts)
1687 o_tty->driver->termios_locked[idx] = NULL;
1688 kfree(tp);
1689 }
1690 o_tty->magic = 0;
1691 o_tty->driver->refcount--;
1692 file_list_lock();
1693 list_del_init(&o_tty->tty_files);
1694 file_list_unlock();
1695 free_tty_struct(o_tty);
1696 }
1697
1698 if (!devpts)
1699 tty->driver->ttys[idx] = NULL;
1700 if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
1701 tp = tty->termios;
1702 if (!devpts)
1703 tty->driver->termios[idx] = NULL;
1704 kfree(tp);
1705
1706 tp = tty->termios_locked;
1707 if (!devpts)
1708 tty->driver->termios_locked[idx] = NULL;
1709 kfree(tp);
1710 }
1711
1712 tty->magic = 0;
1713 tty->driver->refcount--;
1714 file_list_lock();
1715 list_del_init(&tty->tty_files);
1716 file_list_unlock();
1717 module_put(tty->driver->owner);
1718 free_tty_struct(tty);
1719}
1720
1721/*
1722 * Even releasing the tty structures is a tricky business.. We have
1723 * to be very careful that the structures are all released at the
1724 * same time, as interrupts might otherwise get the wrong pointers.
1725 *
1726 * WSH 09/09/97: rewritten to avoid some nasty race conditions that could
1727 * lead to double frees or releasing memory still in use.
1728 */
1729static void release_dev(struct file * filp)
1730{
1731 struct tty_struct *tty, *o_tty;
1732 int pty_master, tty_closing, o_tty_closing, do_sleep;
Paul Fulghum14a62832006-04-10 22:54:19 -07001733 int devpts;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001734 int idx;
1735 char buf[64];
1736 unsigned long flags;
1737
1738 tty = (struct tty_struct *)filp->private_data;
1739 if (tty_paranoia_check(tty, filp->f_dentry->d_inode, "release_dev"))
1740 return;
1741
1742 check_tty_count(tty, "release_dev");
1743
1744 tty_fasync(-1, filp, 0);
1745
1746 idx = tty->index;
1747 pty_master = (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
1748 tty->driver->subtype == PTY_TYPE_MASTER);
1749 devpts = (tty->driver->flags & TTY_DRIVER_DEVPTS_MEM) != 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001750 o_tty = tty->link;
1751
1752#ifdef TTY_PARANOIA_CHECK
1753 if (idx < 0 || idx >= tty->driver->num) {
1754 printk(KERN_DEBUG "release_dev: bad idx when trying to "
1755 "free (%s)\n", tty->name);
1756 return;
1757 }
1758 if (!(tty->driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
1759 if (tty != tty->driver->ttys[idx]) {
1760 printk(KERN_DEBUG "release_dev: driver.table[%d] not tty "
1761 "for (%s)\n", idx, tty->name);
1762 return;
1763 }
1764 if (tty->termios != tty->driver->termios[idx]) {
1765 printk(KERN_DEBUG "release_dev: driver.termios[%d] not termios "
1766 "for (%s)\n",
1767 idx, tty->name);
1768 return;
1769 }
1770 if (tty->termios_locked != tty->driver->termios_locked[idx]) {
1771 printk(KERN_DEBUG "release_dev: driver.termios_locked[%d] not "
1772 "termios_locked for (%s)\n",
1773 idx, tty->name);
1774 return;
1775 }
1776 }
1777#endif
1778
1779#ifdef TTY_DEBUG_HANGUP
1780 printk(KERN_DEBUG "release_dev of %s (tty count=%d)...",
1781 tty_name(tty, buf), tty->count);
1782#endif
1783
1784#ifdef TTY_PARANOIA_CHECK
1785 if (tty->driver->other &&
1786 !(tty->driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
1787 if (o_tty != tty->driver->other->ttys[idx]) {
1788 printk(KERN_DEBUG "release_dev: other->table[%d] "
1789 "not o_tty for (%s)\n",
1790 idx, tty->name);
1791 return;
1792 }
1793 if (o_tty->termios != tty->driver->other->termios[idx]) {
1794 printk(KERN_DEBUG "release_dev: other->termios[%d] "
1795 "not o_termios for (%s)\n",
1796 idx, tty->name);
1797 return;
1798 }
1799 if (o_tty->termios_locked !=
1800 tty->driver->other->termios_locked[idx]) {
1801 printk(KERN_DEBUG "release_dev: other->termios_locked["
1802 "%d] not o_termios_locked for (%s)\n",
1803 idx, tty->name);
1804 return;
1805 }
1806 if (o_tty->link != tty) {
1807 printk(KERN_DEBUG "release_dev: bad pty pointers\n");
1808 return;
1809 }
1810 }
1811#endif
1812 if (tty->driver->close)
1813 tty->driver->close(tty, filp);
1814
1815 /*
1816 * Sanity check: if tty->count is going to zero, there shouldn't be
1817 * any waiters on tty->read_wait or tty->write_wait. We test the
1818 * wait queues and kick everyone out _before_ actually starting to
1819 * close. This ensures that we won't block while releasing the tty
1820 * structure.
1821 *
1822 * The test for the o_tty closing is necessary, since the master and
1823 * slave sides may close in any order. If the slave side closes out
1824 * first, its count will be one, since the master side holds an open.
1825 * Thus this test wouldn't be triggered at the time the slave closes,
1826 * so we do it now.
1827 *
1828 * Note that it's possible for the tty to be opened again while we're
1829 * flushing out waiters. By recalculating the closing flags before
1830 * each iteration we avoid any problems.
1831 */
1832 while (1) {
1833 /* Guard against races with tty->count changes elsewhere and
1834 opens on /dev/tty */
1835
Ingo Molnar70522e12006-03-23 03:00:31 -08001836 mutex_lock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001837 tty_closing = tty->count <= 1;
1838 o_tty_closing = o_tty &&
1839 (o_tty->count <= (pty_master ? 1 : 0));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001840 do_sleep = 0;
1841
1842 if (tty_closing) {
1843 if (waitqueue_active(&tty->read_wait)) {
1844 wake_up(&tty->read_wait);
1845 do_sleep++;
1846 }
1847 if (waitqueue_active(&tty->write_wait)) {
1848 wake_up(&tty->write_wait);
1849 do_sleep++;
1850 }
1851 }
1852 if (o_tty_closing) {
1853 if (waitqueue_active(&o_tty->read_wait)) {
1854 wake_up(&o_tty->read_wait);
1855 do_sleep++;
1856 }
1857 if (waitqueue_active(&o_tty->write_wait)) {
1858 wake_up(&o_tty->write_wait);
1859 do_sleep++;
1860 }
1861 }
1862 if (!do_sleep)
1863 break;
1864
1865 printk(KERN_WARNING "release_dev: %s: read/write wait queue "
1866 "active!\n", tty_name(tty, buf));
Ingo Molnar70522e12006-03-23 03:00:31 -08001867 mutex_unlock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001868 schedule();
1869 }
1870
1871 /*
1872 * The closing flags are now consistent with the open counts on
1873 * both sides, and we've completed the last operation that could
1874 * block, so it's safe to proceed with closing.
1875 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001876 if (pty_master) {
1877 if (--o_tty->count < 0) {
1878 printk(KERN_WARNING "release_dev: bad pty slave count "
1879 "(%d) for %s\n",
1880 o_tty->count, tty_name(o_tty, buf));
1881 o_tty->count = 0;
1882 }
1883 }
1884 if (--tty->count < 0) {
1885 printk(KERN_WARNING "release_dev: bad tty->count (%d) for %s\n",
1886 tty->count, tty_name(tty, buf));
1887 tty->count = 0;
1888 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001889
1890 /*
1891 * We've decremented tty->count, so we need to remove this file
1892 * descriptor off the tty->tty_files list; this serves two
1893 * purposes:
1894 * - check_tty_count sees the correct number of file descriptors
1895 * associated with this tty.
1896 * - do_tty_hangup no longer sees this file descriptor as
1897 * something that needs to be handled for hangups.
1898 */
1899 file_kill(filp);
1900 filp->private_data = NULL;
1901
1902 /*
1903 * Perform some housekeeping before deciding whether to return.
1904 *
1905 * Set the TTY_CLOSING flag if this was the last open. In the
1906 * case of a pty we may have to wait around for the other side
1907 * to close, and TTY_CLOSING makes sure we can't be reopened.
1908 */
1909 if(tty_closing)
1910 set_bit(TTY_CLOSING, &tty->flags);
1911 if(o_tty_closing)
1912 set_bit(TTY_CLOSING, &o_tty->flags);
1913
1914 /*
1915 * If _either_ side is closing, make sure there aren't any
1916 * processes that still think tty or o_tty is their controlling
1917 * tty.
1918 */
1919 if (tty_closing || o_tty_closing) {
1920 struct task_struct *p;
1921
1922 read_lock(&tasklist_lock);
1923 do_each_task_pid(tty->session, PIDTYPE_SID, p) {
1924 p->signal->tty = NULL;
1925 } while_each_task_pid(tty->session, PIDTYPE_SID, p);
1926 if (o_tty)
1927 do_each_task_pid(o_tty->session, PIDTYPE_SID, p) {
1928 p->signal->tty = NULL;
1929 } while_each_task_pid(o_tty->session, PIDTYPE_SID, p);
1930 read_unlock(&tasklist_lock);
1931 }
1932
Ingo Molnar70522e12006-03-23 03:00:31 -08001933 mutex_unlock(&tty_mutex);
Paul Fulghumda965822006-02-14 13:53:00 -08001934
Linus Torvalds1da177e2005-04-16 15:20:36 -07001935 /* check whether both sides are closing ... */
1936 if (!tty_closing || (o_tty && !o_tty_closing))
1937 return;
1938
1939#ifdef TTY_DEBUG_HANGUP
1940 printk(KERN_DEBUG "freeing tty structure...");
1941#endif
1942 /*
1943 * Prevent flush_to_ldisc() from rescheduling the work for later. Then
1944 * kill any delayed work. As this is the final close it does not
1945 * race with the set_ldisc code path.
1946 */
1947 clear_bit(TTY_LDISC, &tty->flags);
Alan Cox33f0f882006-01-09 20:54:13 -08001948 cancel_delayed_work(&tty->buf.work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001949
1950 /*
Alan Cox33f0f882006-01-09 20:54:13 -08001951 * Wait for ->hangup_work and ->buf.work handlers to terminate
Linus Torvalds1da177e2005-04-16 15:20:36 -07001952 */
1953
1954 flush_scheduled_work();
1955
1956 /*
1957 * Wait for any short term users (we know they are just driver
1958 * side waiters as the file is closing so user count on the file
1959 * side is zero.
1960 */
1961 spin_lock_irqsave(&tty_ldisc_lock, flags);
1962 while(tty->ldisc.refcount)
1963 {
1964 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
1965 wait_event(tty_ldisc_wait, tty->ldisc.refcount == 0);
1966 spin_lock_irqsave(&tty_ldisc_lock, flags);
1967 }
1968 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
1969 /*
1970 * Shutdown the current line discipline, and reset it to N_TTY.
1971 * N.B. why reset ldisc when we're releasing the memory??
1972 *
1973 * FIXME: this MUST get fixed for the new reflocking
1974 */
1975 if (tty->ldisc.close)
1976 (tty->ldisc.close)(tty);
1977 tty_ldisc_put(tty->ldisc.num);
1978
1979 /*
1980 * Switch the line discipline back
1981 */
1982 tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
1983 tty_set_termios_ldisc(tty,N_TTY);
1984 if (o_tty) {
1985 /* FIXME: could o_tty be in setldisc here ? */
1986 clear_bit(TTY_LDISC, &o_tty->flags);
1987 if (o_tty->ldisc.close)
1988 (o_tty->ldisc.close)(o_tty);
1989 tty_ldisc_put(o_tty->ldisc.num);
1990 tty_ldisc_assign(o_tty, tty_ldisc_get(N_TTY));
1991 tty_set_termios_ldisc(o_tty,N_TTY);
1992 }
1993 /*
1994 * The release_mem function takes care of the details of clearing
1995 * the slots and preserving the termios structure.
1996 */
1997 release_mem(tty, idx);
1998
1999#ifdef CONFIG_UNIX98_PTYS
2000 /* Make this pty number available for reallocation */
2001 if (devpts) {
2002 down(&allocated_ptys_lock);
2003 idr_remove(&allocated_ptys, idx);
2004 up(&allocated_ptys_lock);
2005 }
2006#endif
2007
2008}
2009
2010/*
2011 * tty_open and tty_release keep up the tty count that contains the
2012 * number of opens done on a tty. We cannot use the inode-count, as
2013 * different inodes might point to the same tty.
2014 *
2015 * Open-counting is needed for pty masters, as well as for keeping
2016 * track of serial lines: DTR is dropped when the last close happens.
2017 * (This is not done solely through tty->count, now. - Ted 1/27/92)
2018 *
2019 * The termios state of a pty is reset on first open so that
2020 * settings don't persist across reuse.
2021 */
2022static int tty_open(struct inode * inode, struct file * filp)
2023{
2024 struct tty_struct *tty;
2025 int noctty, retval;
2026 struct tty_driver *driver;
2027 int index;
2028 dev_t device = inode->i_rdev;
2029 unsigned short saved_flags = filp->f_flags;
2030
2031 nonseekable_open(inode, filp);
2032
2033retry_open:
2034 noctty = filp->f_flags & O_NOCTTY;
2035 index = -1;
2036 retval = 0;
2037
Ingo Molnar70522e12006-03-23 03:00:31 -08002038 mutex_lock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002039
2040 if (device == MKDEV(TTYAUX_MAJOR,0)) {
2041 if (!current->signal->tty) {
Ingo Molnar70522e12006-03-23 03:00:31 -08002042 mutex_unlock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002043 return -ENXIO;
2044 }
2045 driver = current->signal->tty->driver;
2046 index = current->signal->tty->index;
2047 filp->f_flags |= O_NONBLOCK; /* Don't let /dev/tty block */
2048 /* noctty = 1; */
2049 goto got_driver;
2050 }
2051#ifdef CONFIG_VT
2052 if (device == MKDEV(TTY_MAJOR,0)) {
2053 extern struct tty_driver *console_driver;
2054 driver = console_driver;
2055 index = fg_console;
2056 noctty = 1;
2057 goto got_driver;
2058 }
2059#endif
2060 if (device == MKDEV(TTYAUX_MAJOR,1)) {
2061 driver = console_device(&index);
2062 if (driver) {
2063 /* Don't let /dev/console block */
2064 filp->f_flags |= O_NONBLOCK;
2065 noctty = 1;
2066 goto got_driver;
2067 }
Ingo Molnar70522e12006-03-23 03:00:31 -08002068 mutex_unlock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002069 return -ENODEV;
2070 }
2071
2072 driver = get_tty_driver(device, &index);
2073 if (!driver) {
Ingo Molnar70522e12006-03-23 03:00:31 -08002074 mutex_unlock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002075 return -ENODEV;
2076 }
2077got_driver:
2078 retval = init_dev(driver, index, &tty);
Ingo Molnar70522e12006-03-23 03:00:31 -08002079 mutex_unlock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002080 if (retval)
2081 return retval;
2082
2083 filp->private_data = tty;
2084 file_move(filp, &tty->tty_files);
2085 check_tty_count(tty, "tty_open");
2086 if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
2087 tty->driver->subtype == PTY_TYPE_MASTER)
2088 noctty = 1;
2089#ifdef TTY_DEBUG_HANGUP
2090 printk(KERN_DEBUG "opening %s...", tty->name);
2091#endif
2092 if (!retval) {
2093 if (tty->driver->open)
2094 retval = tty->driver->open(tty, filp);
2095 else
2096 retval = -ENODEV;
2097 }
2098 filp->f_flags = saved_flags;
2099
2100 if (!retval && test_bit(TTY_EXCLUSIVE, &tty->flags) && !capable(CAP_SYS_ADMIN))
2101 retval = -EBUSY;
2102
2103 if (retval) {
2104#ifdef TTY_DEBUG_HANGUP
2105 printk(KERN_DEBUG "error %d in opening %s...", retval,
2106 tty->name);
2107#endif
2108 release_dev(filp);
2109 if (retval != -ERESTARTSYS)
2110 return retval;
2111 if (signal_pending(current))
2112 return retval;
2113 schedule();
2114 /*
2115 * Need to reset f_op in case a hangup happened.
2116 */
2117 if (filp->f_op == &hung_up_tty_fops)
2118 filp->f_op = &tty_fops;
2119 goto retry_open;
2120 }
2121 if (!noctty &&
2122 current->signal->leader &&
2123 !current->signal->tty &&
2124 tty->session == 0) {
2125 task_lock(current);
2126 current->signal->tty = tty;
2127 task_unlock(current);
2128 current->signal->tty_old_pgrp = 0;
2129 tty->session = current->signal->session;
2130 tty->pgrp = process_group(current);
2131 }
2132 return 0;
2133}
2134
2135#ifdef CONFIG_UNIX98_PTYS
2136static int ptmx_open(struct inode * inode, struct file * filp)
2137{
2138 struct tty_struct *tty;
2139 int retval;
2140 int index;
2141 int idr_ret;
2142
2143 nonseekable_open(inode, filp);
2144
2145 /* find a device that is not in use. */
2146 down(&allocated_ptys_lock);
2147 if (!idr_pre_get(&allocated_ptys, GFP_KERNEL)) {
2148 up(&allocated_ptys_lock);
2149 return -ENOMEM;
2150 }
2151 idr_ret = idr_get_new(&allocated_ptys, NULL, &index);
2152 if (idr_ret < 0) {
2153 up(&allocated_ptys_lock);
2154 if (idr_ret == -EAGAIN)
2155 return -ENOMEM;
2156 return -EIO;
2157 }
2158 if (index >= pty_limit) {
2159 idr_remove(&allocated_ptys, index);
2160 up(&allocated_ptys_lock);
2161 return -EIO;
2162 }
2163 up(&allocated_ptys_lock);
2164
Ingo Molnar70522e12006-03-23 03:00:31 -08002165 mutex_lock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002166 retval = init_dev(ptm_driver, index, &tty);
Ingo Molnar70522e12006-03-23 03:00:31 -08002167 mutex_unlock(&tty_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002168
2169 if (retval)
2170 goto out;
2171
2172 set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */
2173 filp->private_data = tty;
2174 file_move(filp, &tty->tty_files);
2175
2176 retval = -ENOMEM;
2177 if (devpts_pty_new(tty->link))
2178 goto out1;
2179
2180 check_tty_count(tty, "tty_open");
2181 retval = ptm_driver->open(tty, filp);
2182 if (!retval)
2183 return 0;
2184out1:
2185 release_dev(filp);
Paul Fulghum9453a5a2006-04-10 22:54:18 -07002186 return retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002187out:
2188 down(&allocated_ptys_lock);
2189 idr_remove(&allocated_ptys, index);
2190 up(&allocated_ptys_lock);
2191 return retval;
2192}
2193#endif
2194
2195static int tty_release(struct inode * inode, struct file * filp)
2196{
2197 lock_kernel();
2198 release_dev(filp);
2199 unlock_kernel();
2200 return 0;
2201}
2202
2203/* No kernel lock held - fine */
2204static unsigned int tty_poll(struct file * filp, poll_table * wait)
2205{
2206 struct tty_struct * tty;
2207 struct tty_ldisc *ld;
2208 int ret = 0;
2209
2210 tty = (struct tty_struct *)filp->private_data;
2211 if (tty_paranoia_check(tty, filp->f_dentry->d_inode, "tty_poll"))
2212 return 0;
2213
2214 ld = tty_ldisc_ref_wait(tty);
2215 if (ld->poll)
2216 ret = (ld->poll)(tty, filp, wait);
2217 tty_ldisc_deref(ld);
2218 return ret;
2219}
2220
2221static int tty_fasync(int fd, struct file * filp, int on)
2222{
2223 struct tty_struct * tty;
2224 int retval;
2225
2226 tty = (struct tty_struct *)filp->private_data;
2227 if (tty_paranoia_check(tty, filp->f_dentry->d_inode, "tty_fasync"))
2228 return 0;
2229
2230 retval = fasync_helper(fd, filp, on, &tty->fasync);
2231 if (retval <= 0)
2232 return retval;
2233
2234 if (on) {
2235 if (!waitqueue_active(&tty->read_wait))
2236 tty->minimum_to_wake = 1;
2237 retval = f_setown(filp, (-tty->pgrp) ? : current->pid, 0);
2238 if (retval)
2239 return retval;
2240 } else {
2241 if (!tty->fasync && !waitqueue_active(&tty->read_wait))
2242 tty->minimum_to_wake = N_TTY_BUF_SIZE;
2243 }
2244 return 0;
2245}
2246
2247static int tiocsti(struct tty_struct *tty, char __user *p)
2248{
2249 char ch, mbz = 0;
2250 struct tty_ldisc *ld;
2251
2252 if ((current->signal->tty != tty) && !capable(CAP_SYS_ADMIN))
2253 return -EPERM;
2254 if (get_user(ch, p))
2255 return -EFAULT;
2256 ld = tty_ldisc_ref_wait(tty);
2257 ld->receive_buf(tty, &ch, &mbz, 1);
2258 tty_ldisc_deref(ld);
2259 return 0;
2260}
2261
2262static int tiocgwinsz(struct tty_struct *tty, struct winsize __user * arg)
2263{
2264 if (copy_to_user(arg, &tty->winsize, sizeof(*arg)))
2265 return -EFAULT;
2266 return 0;
2267}
2268
2269static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty,
2270 struct winsize __user * arg)
2271{
2272 struct winsize tmp_ws;
2273
2274 if (copy_from_user(&tmp_ws, arg, sizeof(*arg)))
2275 return -EFAULT;
2276 if (!memcmp(&tmp_ws, &tty->winsize, sizeof(*arg)))
2277 return 0;
2278#ifdef CONFIG_VT
2279 if (tty->driver->type == TTY_DRIVER_TYPE_CONSOLE) {
2280 int rc;
2281
2282 acquire_console_sem();
2283 rc = vc_resize(tty->driver_data, tmp_ws.ws_col, tmp_ws.ws_row);
2284 release_console_sem();
2285 if (rc)
2286 return -ENXIO;
2287 }
2288#endif
2289 if (tty->pgrp > 0)
2290 kill_pg(tty->pgrp, SIGWINCH, 1);
2291 if ((real_tty->pgrp != tty->pgrp) && (real_tty->pgrp > 0))
2292 kill_pg(real_tty->pgrp, SIGWINCH, 1);
2293 tty->winsize = tmp_ws;
2294 real_tty->winsize = tmp_ws;
2295 return 0;
2296}
2297
2298static int tioccons(struct file *file)
2299{
2300 if (!capable(CAP_SYS_ADMIN))
2301 return -EPERM;
2302 if (file->f_op->write == redirected_tty_write) {
2303 struct file *f;
2304 spin_lock(&redirect_lock);
2305 f = redirect;
2306 redirect = NULL;
2307 spin_unlock(&redirect_lock);
2308 if (f)
2309 fput(f);
2310 return 0;
2311 }
2312 spin_lock(&redirect_lock);
2313 if (redirect) {
2314 spin_unlock(&redirect_lock);
2315 return -EBUSY;
2316 }
2317 get_file(file);
2318 redirect = file;
2319 spin_unlock(&redirect_lock);
2320 return 0;
2321}
2322
2323
2324static int fionbio(struct file *file, int __user *p)
2325{
2326 int nonblock;
2327
2328 if (get_user(nonblock, p))
2329 return -EFAULT;
2330
2331 if (nonblock)
2332 file->f_flags |= O_NONBLOCK;
2333 else
2334 file->f_flags &= ~O_NONBLOCK;
2335 return 0;
2336}
2337
2338static int tiocsctty(struct tty_struct *tty, int arg)
2339{
2340 task_t *p;
2341
2342 if (current->signal->leader &&
2343 (current->signal->session == tty->session))
2344 return 0;
2345 /*
2346 * The process must be a session leader and
2347 * not have a controlling tty already.
2348 */
2349 if (!current->signal->leader || current->signal->tty)
2350 return -EPERM;
2351 if (tty->session > 0) {
2352 /*
2353 * This tty is already the controlling
2354 * tty for another session group!
2355 */
2356 if ((arg == 1) && capable(CAP_SYS_ADMIN)) {
2357 /*
2358 * Steal it away
2359 */
2360
2361 read_lock(&tasklist_lock);
2362 do_each_task_pid(tty->session, PIDTYPE_SID, p) {
2363 p->signal->tty = NULL;
2364 } while_each_task_pid(tty->session, PIDTYPE_SID, p);
2365 read_unlock(&tasklist_lock);
2366 } else
2367 return -EPERM;
2368 }
2369 task_lock(current);
2370 current->signal->tty = tty;
2371 task_unlock(current);
2372 current->signal->tty_old_pgrp = 0;
2373 tty->session = current->signal->session;
2374 tty->pgrp = process_group(current);
2375 return 0;
2376}
2377
2378static int tiocgpgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
2379{
2380 /*
2381 * (tty == real_tty) is a cheap way of
2382 * testing if the tty is NOT a master pty.
2383 */
2384 if (tty == real_tty && current->signal->tty != real_tty)
2385 return -ENOTTY;
2386 return put_user(real_tty->pgrp, p);
2387}
2388
2389static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
2390{
2391 pid_t pgrp;
2392 int retval = tty_check_change(real_tty);
2393
2394 if (retval == -EIO)
2395 return -ENOTTY;
2396 if (retval)
2397 return retval;
2398 if (!current->signal->tty ||
2399 (current->signal->tty != real_tty) ||
2400 (real_tty->session != current->signal->session))
2401 return -ENOTTY;
2402 if (get_user(pgrp, p))
2403 return -EFAULT;
2404 if (pgrp < 0)
2405 return -EINVAL;
2406 if (session_of_pgrp(pgrp) != current->signal->session)
2407 return -EPERM;
2408 real_tty->pgrp = pgrp;
2409 return 0;
2410}
2411
2412static int tiocgsid(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
2413{
2414 /*
2415 * (tty == real_tty) is a cheap way of
2416 * testing if the tty is NOT a master pty.
2417 */
2418 if (tty == real_tty && current->signal->tty != real_tty)
2419 return -ENOTTY;
2420 if (real_tty->session <= 0)
2421 return -ENOTTY;
2422 return put_user(real_tty->session, p);
2423}
2424
2425static int tiocsetd(struct tty_struct *tty, int __user *p)
2426{
2427 int ldisc;
2428
2429 if (get_user(ldisc, p))
2430 return -EFAULT;
2431 return tty_set_ldisc(tty, ldisc);
2432}
2433
Domen Puncerb20f3ae2005-06-25 14:58:42 -07002434static int send_break(struct tty_struct *tty, unsigned int duration)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002435{
2436 tty->driver->break_ctl(tty, -1);
2437 if (!signal_pending(current)) {
Domen Puncerb20f3ae2005-06-25 14:58:42 -07002438 msleep_interruptible(duration);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002439 }
2440 tty->driver->break_ctl(tty, 0);
2441 if (signal_pending(current))
2442 return -EINTR;
2443 return 0;
2444}
2445
2446static int
2447tty_tiocmget(struct tty_struct *tty, struct file *file, int __user *p)
2448{
2449 int retval = -EINVAL;
2450
2451 if (tty->driver->tiocmget) {
2452 retval = tty->driver->tiocmget(tty, file);
2453
2454 if (retval >= 0)
2455 retval = put_user(retval, p);
2456 }
2457 return retval;
2458}
2459
2460static int
2461tty_tiocmset(struct tty_struct *tty, struct file *file, unsigned int cmd,
2462 unsigned __user *p)
2463{
2464 int retval = -EINVAL;
2465
2466 if (tty->driver->tiocmset) {
2467 unsigned int set, clear, val;
2468
2469 retval = get_user(val, p);
2470 if (retval)
2471 return retval;
2472
2473 set = clear = 0;
2474 switch (cmd) {
2475 case TIOCMBIS:
2476 set = val;
2477 break;
2478 case TIOCMBIC:
2479 clear = val;
2480 break;
2481 case TIOCMSET:
2482 set = val;
2483 clear = ~val;
2484 break;
2485 }
2486
2487 set &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP;
2488 clear &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP;
2489
2490 retval = tty->driver->tiocmset(tty, file, set, clear);
2491 }
2492 return retval;
2493}
2494
2495/*
2496 * Split this up, as gcc can choke on it otherwise..
2497 */
2498int tty_ioctl(struct inode * inode, struct file * file,
2499 unsigned int cmd, unsigned long arg)
2500{
2501 struct tty_struct *tty, *real_tty;
2502 void __user *p = (void __user *)arg;
2503 int retval;
2504 struct tty_ldisc *ld;
2505
2506 tty = (struct tty_struct *)file->private_data;
2507 if (tty_paranoia_check(tty, inode, "tty_ioctl"))
2508 return -EINVAL;
2509
2510 real_tty = tty;
2511 if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
2512 tty->driver->subtype == PTY_TYPE_MASTER)
2513 real_tty = tty->link;
2514
2515 /*
2516 * Break handling by driver
2517 */
2518 if (!tty->driver->break_ctl) {
2519 switch(cmd) {
2520 case TIOCSBRK:
2521 case TIOCCBRK:
2522 if (tty->driver->ioctl)
2523 return tty->driver->ioctl(tty, file, cmd, arg);
2524 return -EINVAL;
2525
2526 /* These two ioctl's always return success; even if */
2527 /* the driver doesn't support them. */
2528 case TCSBRK:
2529 case TCSBRKP:
2530 if (!tty->driver->ioctl)
2531 return 0;
2532 retval = tty->driver->ioctl(tty, file, cmd, arg);
2533 if (retval == -ENOIOCTLCMD)
2534 retval = 0;
2535 return retval;
2536 }
2537 }
2538
2539 /*
2540 * Factor out some common prep work
2541 */
2542 switch (cmd) {
2543 case TIOCSETD:
2544 case TIOCSBRK:
2545 case TIOCCBRK:
2546 case TCSBRK:
2547 case TCSBRKP:
2548 retval = tty_check_change(tty);
2549 if (retval)
2550 return retval;
2551 if (cmd != TIOCCBRK) {
2552 tty_wait_until_sent(tty, 0);
2553 if (signal_pending(current))
2554 return -EINTR;
2555 }
2556 break;
2557 }
2558
2559 switch (cmd) {
2560 case TIOCSTI:
2561 return tiocsti(tty, p);
2562 case TIOCGWINSZ:
2563 return tiocgwinsz(tty, p);
2564 case TIOCSWINSZ:
2565 return tiocswinsz(tty, real_tty, p);
2566 case TIOCCONS:
2567 return real_tty!=tty ? -EINVAL : tioccons(file);
2568 case FIONBIO:
2569 return fionbio(file, p);
2570 case TIOCEXCL:
2571 set_bit(TTY_EXCLUSIVE, &tty->flags);
2572 return 0;
2573 case TIOCNXCL:
2574 clear_bit(TTY_EXCLUSIVE, &tty->flags);
2575 return 0;
2576 case TIOCNOTTY:
2577 if (current->signal->tty != tty)
2578 return -ENOTTY;
2579 if (current->signal->leader)
2580 disassociate_ctty(0);
2581 task_lock(current);
2582 current->signal->tty = NULL;
2583 task_unlock(current);
2584 return 0;
2585 case TIOCSCTTY:
2586 return tiocsctty(tty, arg);
2587 case TIOCGPGRP:
2588 return tiocgpgrp(tty, real_tty, p);
2589 case TIOCSPGRP:
2590 return tiocspgrp(tty, real_tty, p);
2591 case TIOCGSID:
2592 return tiocgsid(tty, real_tty, p);
2593 case TIOCGETD:
2594 /* FIXME: check this is ok */
2595 return put_user(tty->ldisc.num, (int __user *)p);
2596 case TIOCSETD:
2597 return tiocsetd(tty, p);
2598#ifdef CONFIG_VT
2599 case TIOCLINUX:
2600 return tioclinux(tty, arg);
2601#endif
2602 /*
2603 * Break handling
2604 */
2605 case TIOCSBRK: /* Turn break on, unconditionally */
2606 tty->driver->break_ctl(tty, -1);
2607 return 0;
2608
2609 case TIOCCBRK: /* Turn break off, unconditionally */
2610 tty->driver->break_ctl(tty, 0);
2611 return 0;
2612 case TCSBRK: /* SVID version: non-zero arg --> no break */
Paul Fulghum283fef52006-06-27 02:54:00 -07002613 /* non-zero arg means wait for all output data
2614 * to be sent (performed above) but don't send break.
2615 * This is used by the tcdrain() termios function.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002616 */
2617 if (!arg)
Domen Puncerb20f3ae2005-06-25 14:58:42 -07002618 return send_break(tty, 250);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002619 return 0;
2620 case TCSBRKP: /* support for POSIX tcsendbreak() */
Domen Puncerb20f3ae2005-06-25 14:58:42 -07002621 return send_break(tty, arg ? arg*100 : 250);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002622
2623 case TIOCMGET:
2624 return tty_tiocmget(tty, file, p);
2625
2626 case TIOCMSET:
2627 case TIOCMBIC:
2628 case TIOCMBIS:
2629 return tty_tiocmset(tty, file, cmd, p);
2630 }
2631 if (tty->driver->ioctl) {
2632 retval = (tty->driver->ioctl)(tty, file, cmd, arg);
2633 if (retval != -ENOIOCTLCMD)
2634 return retval;
2635 }
2636 ld = tty_ldisc_ref_wait(tty);
2637 retval = -EINVAL;
2638 if (ld->ioctl) {
2639 retval = ld->ioctl(tty, file, cmd, arg);
2640 if (retval == -ENOIOCTLCMD)
2641 retval = -EINVAL;
2642 }
2643 tty_ldisc_deref(ld);
2644 return retval;
2645}
2646
2647
2648/*
2649 * This implements the "Secure Attention Key" --- the idea is to
2650 * prevent trojan horses by killing all processes associated with this
2651 * tty when the user hits the "Secure Attention Key". Required for
2652 * super-paranoid applications --- see the Orange Book for more details.
2653 *
2654 * This code could be nicer; ideally it should send a HUP, wait a few
2655 * seconds, then send a INT, and then a KILL signal. But you then
2656 * have to coordinate with the init process, since all processes associated
2657 * with the current tty must be dead before the new getty is allowed
2658 * to spawn.
2659 *
2660 * Now, if it would be correct ;-/ The current code has a nasty hole -
2661 * it doesn't catch files in flight. We may send the descriptor to ourselves
2662 * via AF_UNIX socket, close it and later fetch from socket. FIXME.
2663 *
2664 * Nasty bug: do_SAK is being called in interrupt context. This can
2665 * deadlock. We punt it up to process context. AKPM - 16Mar2001
2666 */
2667static void __do_SAK(void *arg)
2668{
2669#ifdef TTY_SOFT_SAK
2670 tty_hangup(tty);
2671#else
2672 struct tty_struct *tty = arg;
Eric W. Biederman652486f2006-03-28 16:11:02 -08002673 struct task_struct *g, *p;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002674 int session;
2675 int i;
2676 struct file *filp;
2677 struct tty_ldisc *disc;
Dipankar Sarmabadf1662005-09-09 13:04:10 -07002678 struct fdtable *fdt;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002679
2680 if (!tty)
2681 return;
2682 session = tty->session;
2683
2684 /* We don't want an ldisc switch during this */
2685 disc = tty_ldisc_ref(tty);
2686 if (disc && disc->flush_buffer)
2687 disc->flush_buffer(tty);
2688 tty_ldisc_deref(disc);
2689
2690 if (tty->driver->flush_buffer)
2691 tty->driver->flush_buffer(tty);
2692
2693 read_lock(&tasklist_lock);
Eric W. Biederman652486f2006-03-28 16:11:02 -08002694 /* Kill the entire session */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002695 do_each_task_pid(session, PIDTYPE_SID, p) {
Eric W. Biederman652486f2006-03-28 16:11:02 -08002696 printk(KERN_NOTICE "SAK: killed process %d"
2697 " (%s): p->signal->session==tty->session\n",
2698 p->pid, p->comm);
2699 send_sig(SIGKILL, p, 1);
2700 } while_each_task_pid(session, PIDTYPE_SID, p);
2701 /* Now kill any processes that happen to have the
2702 * tty open.
2703 */
2704 do_each_thread(g, p) {
2705 if (p->signal->tty == tty) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002706 printk(KERN_NOTICE "SAK: killed process %d"
2707 " (%s): p->signal->session==tty->session\n",
2708 p->pid, p->comm);
2709 send_sig(SIGKILL, p, 1);
2710 continue;
2711 }
2712 task_lock(p);
2713 if (p->files) {
Dipankar Sarmaca99c1d2006-04-18 22:21:46 -07002714 /*
2715 * We don't take a ref to the file, so we must
2716 * hold ->file_lock instead.
2717 */
2718 spin_lock(&p->files->file_lock);
Dipankar Sarmabadf1662005-09-09 13:04:10 -07002719 fdt = files_fdtable(p->files);
2720 for (i=0; i < fdt->max_fds; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002721 filp = fcheck_files(p->files, i);
2722 if (!filp)
2723 continue;
2724 if (filp->f_op->read == tty_read &&
2725 filp->private_data == tty) {
2726 printk(KERN_NOTICE "SAK: killed process %d"
2727 " (%s): fd#%d opened to the tty\n",
2728 p->pid, p->comm, i);
Eric W. Biederman20ac9432006-04-13 04:49:07 -06002729 force_sig(SIGKILL, p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002730 break;
2731 }
2732 }
Dipankar Sarmaca99c1d2006-04-18 22:21:46 -07002733 spin_unlock(&p->files->file_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002734 }
2735 task_unlock(p);
Eric W. Biederman652486f2006-03-28 16:11:02 -08002736 } while_each_thread(g, p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002737 read_unlock(&tasklist_lock);
2738#endif
2739}
2740
2741/*
2742 * The tq handling here is a little racy - tty->SAK_work may already be queued.
2743 * Fortunately we don't need to worry, because if ->SAK_work is already queued,
2744 * the values which we write to it will be identical to the values which it
2745 * already has. --akpm
2746 */
2747void do_SAK(struct tty_struct *tty)
2748{
2749 if (!tty)
2750 return;
2751 PREPARE_WORK(&tty->SAK_work, __do_SAK, tty);
2752 schedule_work(&tty->SAK_work);
2753}
2754
2755EXPORT_SYMBOL(do_SAK);
2756
2757/*
2758 * This routine is called out of the software interrupt to flush data
Alan Cox33f0f882006-01-09 20:54:13 -08002759 * from the buffer chain to the line discipline.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002760 */
2761
2762static void flush_to_ldisc(void *private_)
2763{
2764 struct tty_struct *tty = (struct tty_struct *) private_;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002765 unsigned long flags;
2766 struct tty_ldisc *disc;
Paul Fulghum2c3bb202006-06-28 04:26:48 -07002767 struct tty_buffer *tbuf, *head;
Paul Fulghum8977d922006-02-10 01:51:14 -08002768 char *char_buf;
2769 unsigned char *flag_buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002770
2771 disc = tty_ldisc_ref(tty);
2772 if (disc == NULL) /* !TTY_LDISC */
2773 return;
2774
Paul Fulghum808249c2006-02-03 03:04:41 -08002775 spin_lock_irqsave(&tty->buf.lock, flags);
Paul Fulghum2c3bb202006-06-28 04:26:48 -07002776 head = tty->buf.head;
2777 if (head != NULL) {
2778 tty->buf.head = NULL;
2779 for (;;) {
2780 int count = head->commit - head->read;
2781 if (!count) {
2782 if (head->next == NULL)
2783 break;
2784 tbuf = head;
2785 head = head->next;
2786 tty_buffer_free(tty, tbuf);
2787 continue;
2788 }
2789 if (!tty->receive_room) {
2790 schedule_delayed_work(&tty->buf.work, 1);
2791 break;
2792 }
2793 if (count > tty->receive_room)
2794 count = tty->receive_room;
2795 char_buf = head->char_buf_ptr + head->read;
2796 flag_buf = head->flag_buf_ptr + head->read;
2797 head->read += count;
Paul Fulghum8977d922006-02-10 01:51:14 -08002798 spin_unlock_irqrestore(&tty->buf.lock, flags);
2799 disc->receive_buf(tty, char_buf, flag_buf, count);
2800 spin_lock_irqsave(&tty->buf.lock, flags);
2801 }
Paul Fulghum2c3bb202006-06-28 04:26:48 -07002802 tty->buf.head = head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002803 }
Paul Fulghum808249c2006-02-03 03:04:41 -08002804 spin_unlock_irqrestore(&tty->buf.lock, flags);
Paul Fulghum817d6d32006-06-28 04:26:47 -07002805
Linus Torvalds1da177e2005-04-16 15:20:36 -07002806 tty_ldisc_deref(disc);
2807}
2808
2809/*
2810 * Routine which returns the baud rate of the tty
2811 *
2812 * Note that the baud_table needs to be kept in sync with the
2813 * include/asm/termbits.h file.
2814 */
2815static int baud_table[] = {
2816 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
2817 9600, 19200, 38400, 57600, 115200, 230400, 460800,
2818#ifdef __sparc__
2819 76800, 153600, 307200, 614400, 921600
2820#else
2821 500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000,
2822 2500000, 3000000, 3500000, 4000000
2823#endif
2824};
2825
2826static int n_baud_table = ARRAY_SIZE(baud_table);
2827
2828/**
2829 * tty_termios_baud_rate
2830 * @termios: termios structure
2831 *
2832 * Convert termios baud rate data into a speed. This should be called
2833 * with the termios lock held if this termios is a terminal termios
2834 * structure. May change the termios data.
2835 */
2836
2837int tty_termios_baud_rate(struct termios *termios)
2838{
2839 unsigned int cbaud;
2840
2841 cbaud = termios->c_cflag & CBAUD;
2842
2843 if (cbaud & CBAUDEX) {
2844 cbaud &= ~CBAUDEX;
2845
2846 if (cbaud < 1 || cbaud + 15 > n_baud_table)
2847 termios->c_cflag &= ~CBAUDEX;
2848 else
2849 cbaud += 15;
2850 }
2851 return baud_table[cbaud];
2852}
2853
2854EXPORT_SYMBOL(tty_termios_baud_rate);
2855
2856/**
2857 * tty_get_baud_rate - get tty bit rates
2858 * @tty: tty to query
2859 *
2860 * Returns the baud rate as an integer for this terminal. The
2861 * termios lock must be held by the caller and the terminal bit
2862 * flags may be updated.
2863 */
2864
2865int tty_get_baud_rate(struct tty_struct *tty)
2866{
2867 int baud = tty_termios_baud_rate(tty->termios);
2868
2869 if (baud == 38400 && tty->alt_speed) {
2870 if (!tty->warned) {
2871 printk(KERN_WARNING "Use of setserial/setrocket to "
2872 "set SPD_* flags is deprecated\n");
2873 tty->warned = 1;
2874 }
2875 baud = tty->alt_speed;
2876 }
2877
2878 return baud;
2879}
2880
2881EXPORT_SYMBOL(tty_get_baud_rate);
2882
2883/**
2884 * tty_flip_buffer_push - terminal
2885 * @tty: tty to push
2886 *
2887 * Queue a push of the terminal flip buffers to the line discipline. This
2888 * function must not be called from IRQ context if tty->low_latency is set.
2889 *
2890 * In the event of the queue being busy for flipping the work will be
2891 * held off and retried later.
2892 */
2893
2894void tty_flip_buffer_push(struct tty_struct *tty)
2895{
Paul Fulghum808249c2006-02-03 03:04:41 -08002896 unsigned long flags;
2897 spin_lock_irqsave(&tty->buf.lock, flags);
Paul Fulghum33b37a32006-06-28 04:26:49 -07002898 if (tty->buf.tail != NULL)
Paul Fulghum8977d922006-02-10 01:51:14 -08002899 tty->buf.tail->commit = tty->buf.tail->used;
Paul Fulghum808249c2006-02-03 03:04:41 -08002900 spin_unlock_irqrestore(&tty->buf.lock, flags);
2901
Linus Torvalds1da177e2005-04-16 15:20:36 -07002902 if (tty->low_latency)
2903 flush_to_ldisc((void *) tty);
2904 else
Alan Cox33f0f882006-01-09 20:54:13 -08002905 schedule_delayed_work(&tty->buf.work, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002906}
2907
2908EXPORT_SYMBOL(tty_flip_buffer_push);
2909
Alan Cox33f0f882006-01-09 20:54:13 -08002910
Linus Torvalds1da177e2005-04-16 15:20:36 -07002911/*
2912 * This subroutine initializes a tty structure.
2913 */
2914static void initialize_tty_struct(struct tty_struct *tty)
2915{
2916 memset(tty, 0, sizeof(struct tty_struct));
2917 tty->magic = TTY_MAGIC;
2918 tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
2919 tty->pgrp = -1;
2920 tty->overrun_time = jiffies;
Alan Cox33f0f882006-01-09 20:54:13 -08002921 tty->buf.head = tty->buf.tail = NULL;
2922 tty_buffer_init(tty);
2923 INIT_WORK(&tty->buf.work, flush_to_ldisc, tty);
2924 init_MUTEX(&tty->buf.pty_sem);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002925 init_MUTEX(&tty->termios_sem);
2926 init_waitqueue_head(&tty->write_wait);
2927 init_waitqueue_head(&tty->read_wait);
2928 INIT_WORK(&tty->hangup_work, do_tty_hangup, tty);
Ingo Molnar70522e12006-03-23 03:00:31 -08002929 mutex_init(&tty->atomic_read_lock);
2930 mutex_init(&tty->atomic_write_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002931 spin_lock_init(&tty->read_lock);
2932 INIT_LIST_HEAD(&tty->tty_files);
2933 INIT_WORK(&tty->SAK_work, NULL, NULL);
2934}
2935
2936/*
2937 * The default put_char routine if the driver did not define one.
2938 */
2939static void tty_default_put_char(struct tty_struct *tty, unsigned char ch)
2940{
2941 tty->driver->write(tty, &ch, 1);
2942}
2943
gregkh@suse.de7fe845d2005-03-15 14:23:15 -08002944static struct class *tty_class;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002945
2946/**
2947 * tty_register_device - register a tty device
2948 * @driver: the tty driver that describes the tty device
2949 * @index: the index in the tty driver for this tty device
2950 * @device: a struct device that is associated with this tty device.
2951 * This field is optional, if there is no known struct device for this
2952 * tty device it can be set to NULL safely.
2953 *
Hansjoerg Lipp1cdcb6b2006-04-22 18:36:53 +02002954 * Returns a pointer to the class device (or ERR_PTR(-EFOO) on error).
2955 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07002956 * This call is required to be made to register an individual tty device if
Greg Kroah-Hartman331b8312005-06-20 21:15:16 -07002957 * the tty driver's flags have the TTY_DRIVER_DYNAMIC_DEV bit set. If that
2958 * bit is not set, this function should not be called by a tty driver.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002959 */
Hansjoerg Lipp1cdcb6b2006-04-22 18:36:53 +02002960struct class_device *tty_register_device(struct tty_driver *driver,
2961 unsigned index, struct device *device)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002962{
2963 char name[64];
2964 dev_t dev = MKDEV(driver->major, driver->minor_start) + index;
2965
2966 if (index >= driver->num) {
2967 printk(KERN_ERR "Attempt to register invalid tty line number "
2968 " (%d).\n", index);
Hansjoerg Lipp1cdcb6b2006-04-22 18:36:53 +02002969 return ERR_PTR(-EINVAL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002970 }
2971
Linus Torvalds1da177e2005-04-16 15:20:36 -07002972 if (driver->type == TTY_DRIVER_TYPE_PTY)
2973 pty_line_name(driver, index, name);
2974 else
2975 tty_line_name(driver, index, name);
Hansjoerg Lipp1cdcb6b2006-04-22 18:36:53 +02002976
2977 return class_device_create(tty_class, NULL, dev, device, "%s", name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002978}
2979
2980/**
2981 * tty_unregister_device - unregister a tty device
2982 * @driver: the tty driver that describes the tty device
2983 * @index: the index in the tty driver for this tty device
2984 *
2985 * If a tty device is registered with a call to tty_register_device() then
2986 * this function must be made when the tty device is gone.
2987 */
2988void tty_unregister_device(struct tty_driver *driver, unsigned index)
2989{
gregkh@suse.de7fe845d2005-03-15 14:23:15 -08002990 class_device_destroy(tty_class, MKDEV(driver->major, driver->minor_start) + index);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002991}
2992
2993EXPORT_SYMBOL(tty_register_device);
2994EXPORT_SYMBOL(tty_unregister_device);
2995
2996struct tty_driver *alloc_tty_driver(int lines)
2997{
2998 struct tty_driver *driver;
2999
3000 driver = kmalloc(sizeof(struct tty_driver), GFP_KERNEL);
3001 if (driver) {
3002 memset(driver, 0, sizeof(struct tty_driver));
3003 driver->magic = TTY_DRIVER_MAGIC;
3004 driver->num = lines;
3005 /* later we'll move allocation of tables here */
3006 }
3007 return driver;
3008}
3009
3010void put_tty_driver(struct tty_driver *driver)
3011{
3012 kfree(driver);
3013}
3014
3015void tty_set_operations(struct tty_driver *driver, struct tty_operations *op)
3016{
3017 driver->open = op->open;
3018 driver->close = op->close;
3019 driver->write = op->write;
3020 driver->put_char = op->put_char;
3021 driver->flush_chars = op->flush_chars;
3022 driver->write_room = op->write_room;
3023 driver->chars_in_buffer = op->chars_in_buffer;
3024 driver->ioctl = op->ioctl;
3025 driver->set_termios = op->set_termios;
3026 driver->throttle = op->throttle;
3027 driver->unthrottle = op->unthrottle;
3028 driver->stop = op->stop;
3029 driver->start = op->start;
3030 driver->hangup = op->hangup;
3031 driver->break_ctl = op->break_ctl;
3032 driver->flush_buffer = op->flush_buffer;
3033 driver->set_ldisc = op->set_ldisc;
3034 driver->wait_until_sent = op->wait_until_sent;
3035 driver->send_xchar = op->send_xchar;
3036 driver->read_proc = op->read_proc;
3037 driver->write_proc = op->write_proc;
3038 driver->tiocmget = op->tiocmget;
3039 driver->tiocmset = op->tiocmset;
3040}
3041
3042
3043EXPORT_SYMBOL(alloc_tty_driver);
3044EXPORT_SYMBOL(put_tty_driver);
3045EXPORT_SYMBOL(tty_set_operations);
3046
3047/*
3048 * Called by a tty driver to register itself.
3049 */
3050int tty_register_driver(struct tty_driver *driver)
3051{
3052 int error;
3053 int i;
3054 dev_t dev;
3055 void **p = NULL;
3056
3057 if (driver->flags & TTY_DRIVER_INSTALLED)
3058 return 0;
3059
3060 if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
3061 p = kmalloc(driver->num * 3 * sizeof(void *), GFP_KERNEL);
3062 if (!p)
3063 return -ENOMEM;
3064 memset(p, 0, driver->num * 3 * sizeof(void *));
3065 }
3066
3067 if (!driver->major) {
3068 error = alloc_chrdev_region(&dev, driver->minor_start, driver->num,
3069 (char*)driver->name);
3070 if (!error) {
3071 driver->major = MAJOR(dev);
3072 driver->minor_start = MINOR(dev);
3073 }
3074 } else {
3075 dev = MKDEV(driver->major, driver->minor_start);
3076 error = register_chrdev_region(dev, driver->num,
3077 (char*)driver->name);
3078 }
3079 if (error < 0) {
3080 kfree(p);
3081 return error;
3082 }
3083
3084 if (p) {
3085 driver->ttys = (struct tty_struct **)p;
3086 driver->termios = (struct termios **)(p + driver->num);
3087 driver->termios_locked = (struct termios **)(p + driver->num * 2);
3088 } else {
3089 driver->ttys = NULL;
3090 driver->termios = NULL;
3091 driver->termios_locked = NULL;
3092 }
3093
3094 cdev_init(&driver->cdev, &tty_fops);
3095 driver->cdev.owner = driver->owner;
3096 error = cdev_add(&driver->cdev, dev, driver->num);
3097 if (error) {
3098 cdev_del(&driver->cdev);
3099 unregister_chrdev_region(dev, driver->num);
3100 driver->ttys = NULL;
3101 driver->termios = driver->termios_locked = NULL;
3102 kfree(p);
3103 return error;
3104 }
3105
3106 if (!driver->put_char)
3107 driver->put_char = tty_default_put_char;
3108
3109 list_add(&driver->tty_drivers, &tty_drivers);
3110
Greg Kroah-Hartman331b8312005-06-20 21:15:16 -07003111 if ( !(driver->flags & TTY_DRIVER_DYNAMIC_DEV) ) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003112 for(i = 0; i < driver->num; i++)
3113 tty_register_device(driver, i, NULL);
3114 }
3115 proc_tty_register_driver(driver);
3116 return 0;
3117}
3118
3119EXPORT_SYMBOL(tty_register_driver);
3120
3121/*
3122 * Called by a tty driver to unregister itself.
3123 */
3124int tty_unregister_driver(struct tty_driver *driver)
3125{
3126 int i;
3127 struct termios *tp;
3128 void *p;
3129
3130 if (driver->refcount)
3131 return -EBUSY;
3132
3133 unregister_chrdev_region(MKDEV(driver->major, driver->minor_start),
3134 driver->num);
3135
3136 list_del(&driver->tty_drivers);
3137
3138 /*
3139 * Free the termios and termios_locked structures because
3140 * we don't want to get memory leaks when modular tty
3141 * drivers are removed from the kernel.
3142 */
3143 for (i = 0; i < driver->num; i++) {
3144 tp = driver->termios[i];
3145 if (tp) {
3146 driver->termios[i] = NULL;
3147 kfree(tp);
3148 }
3149 tp = driver->termios_locked[i];
3150 if (tp) {
3151 driver->termios_locked[i] = NULL;
3152 kfree(tp);
3153 }
Greg Kroah-Hartman331b8312005-06-20 21:15:16 -07003154 if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV))
Linus Torvalds1da177e2005-04-16 15:20:36 -07003155 tty_unregister_device(driver, i);
3156 }
3157 p = driver->ttys;
3158 proc_tty_unregister_driver(driver);
3159 driver->ttys = NULL;
3160 driver->termios = driver->termios_locked = NULL;
3161 kfree(p);
3162 cdev_del(&driver->cdev);
3163 return 0;
3164}
3165
3166EXPORT_SYMBOL(tty_unregister_driver);
3167
3168
3169/*
3170 * Initialize the console device. This is called *early*, so
3171 * we can't necessarily depend on lots of kernel help here.
3172 * Just do some early initializations, and do the complex setup
3173 * later.
3174 */
3175void __init console_init(void)
3176{
3177 initcall_t *call;
3178
3179 /* Setup the default TTY line discipline. */
3180 (void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);
3181
3182 /*
3183 * set up the console device so that later boot sequences can
3184 * inform about problems etc..
3185 */
3186#ifdef CONFIG_EARLY_PRINTK
3187 disable_early_printk();
3188#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003189 call = __con_initcall_start;
3190 while (call < __con_initcall_end) {
3191 (*call)();
3192 call++;
3193 }
3194}
3195
3196#ifdef CONFIG_VT
3197extern int vty_init(void);
3198#endif
3199
3200static int __init tty_class_init(void)
3201{
gregkh@suse.de7fe845d2005-03-15 14:23:15 -08003202 tty_class = class_create(THIS_MODULE, "tty");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003203 if (IS_ERR(tty_class))
3204 return PTR_ERR(tty_class);
3205 return 0;
3206}
3207
3208postcore_initcall(tty_class_init);
3209
3210/* 3/2004 jmc: why do these devices exist? */
3211
3212static struct cdev tty_cdev, console_cdev;
3213#ifdef CONFIG_UNIX98_PTYS
3214static struct cdev ptmx_cdev;
3215#endif
3216#ifdef CONFIG_VT
3217static struct cdev vc0_cdev;
3218#endif
3219
3220/*
3221 * Ok, now we can initialize the rest of the tty devices and can count
3222 * on memory allocations, interrupts etc..
3223 */
3224static int __init tty_init(void)
3225{
3226 cdev_init(&tty_cdev, &tty_fops);
3227 if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) ||
3228 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)
3229 panic("Couldn't register /dev/tty driver\n");
Greg Kroah-Hartman53f46542005-10-27 22:25:43 -07003230 class_device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 0), NULL, "tty");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003231
3232 cdev_init(&console_cdev, &console_fops);
3233 if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) ||
3234 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)
3235 panic("Couldn't register /dev/console driver\n");
Greg Kroah-Hartman53f46542005-10-27 22:25:43 -07003236 class_device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 1), NULL, "console");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003237
3238#ifdef CONFIG_UNIX98_PTYS
3239 cdev_init(&ptmx_cdev, &ptmx_fops);
3240 if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) ||
3241 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0)
3242 panic("Couldn't register /dev/ptmx driver\n");
Greg Kroah-Hartman53f46542005-10-27 22:25:43 -07003243 class_device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003244#endif
3245
3246#ifdef CONFIG_VT
3247 cdev_init(&vc0_cdev, &console_fops);
3248 if (cdev_add(&vc0_cdev, MKDEV(TTY_MAJOR, 0), 1) ||
3249 register_chrdev_region(MKDEV(TTY_MAJOR, 0), 1, "/dev/vc/0") < 0)
3250 panic("Couldn't register /dev/tty0 driver\n");
Greg Kroah-Hartman53f46542005-10-27 22:25:43 -07003251 class_device_create(tty_class, NULL, MKDEV(TTY_MAJOR, 0), NULL, "tty0");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003252
3253 vty_init();
3254#endif
3255 return 0;
3256}
3257module_init(tty_init);