1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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>
97
98#include <asm/uaccess.h>
99#include <asm/system.h>
100
101#include <linux/kbd_kern.h>
102#include <linux/vt_kern.h>
103#include <linux/selection.h>
104#include <linux/devfs_fs_kernel.h>
105
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 = {
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
125
126
127
128LIST_HEAD(tty_drivers);
129
130
131
132DECLARE_MUTEX(tty_sem);
133
134#ifdef CONFIG_UNIX98_PTYS
135extern struct tty_driver *ptm_driver;
136extern int pty_limit;
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);
155extern void rs_360_init(void);
156static void release_mem(struct tty_struct *tty, int idx);
157
158
159static struct tty_struct *alloc_tty_struct(void)
160{
161 struct tty_struct *tty;
162
163 tty = kmalloc(sizeof(struct tty_struct), GFP_KERNEL);
164 if (tty)
165 memset(tty, 0, sizeof(struct tty_struct));
166 return tty;
167}
168
169static inline void free_tty_struct(struct tty_struct *tty)
170{
171 kfree(tty->write_buf);
172 kfree(tty);
173}
174
175#define TTY_NUMBER(tty) ((tty)->index + (tty)->driver->name_base)
176
177char *tty_name(struct tty_struct *tty, char *buf)
178{
179 if (!tty)
180 strcpy(buf, "NULL tty");
181 else
182 strcpy(buf, tty->name);
183 return buf;
184}
185
186EXPORT_SYMBOL(tty_name);
187
188inline int tty_paranoia_check(struct tty_struct *tty, struct inode *inode,
189 const char *routine)
190{
191#ifdef TTY_PARANOIA_CHECK
192 if (!tty) {
193 printk(KERN_WARNING
194 "null TTY for (%d:%d) in %s\n",
195 imajor(inode), iminor(inode), routine);
196 return 1;
197 }
198 if (tty->magic != TTY_MAGIC) {
199 printk(KERN_WARNING
200 "bad magic number for tty struct (%d:%d) in %s\n",
201 imajor(inode), iminor(inode), routine);
202 return 1;
203 }
204#endif
205 return 0;
206}
207
208static int check_tty_count(struct tty_struct *tty, const char *routine)
209{
210#ifdef CHECK_TTY_COUNT
211 struct list_head *p;
212 int count = 0;
213
214 file_list_lock();
215 list_for_each(p, &tty->tty_files) {
216 count++;
217 }
218 file_list_unlock();
219 if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
220 tty->driver->subtype == PTY_TYPE_SLAVE &&
221 tty->link && tty->link->count)
222 count++;
223 if (tty->count != count) {
224 printk(KERN_WARNING "Warning: dev (%s) tty->count(%d) "
225 "!= #fd's(%d) in %s\n",
226 tty->name, tty->count, count, routine);
227 return count;
228 }
229#endif
230 return 0;
231}
232
233
234
235
236
237
238
239static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
240{
241 down(&tty->termios_sem);
242 tty->termios->c_line = num;
243 up(&tty->termios_sem);
244}
245
246
247
248
249
250
251
252static spinlock_t tty_ldisc_lock = SPIN_LOCK_UNLOCKED;
253static DECLARE_WAIT_QUEUE_HEAD(tty_ldisc_wait);
254static struct tty_ldisc tty_ldiscs[NR_LDISCS];
255
256int tty_register_ldisc(int disc, struct tty_ldisc *new_ldisc)
257{
258 unsigned long flags;
259 int ret = 0;
260
261 if (disc < N_TTY || disc >= NR_LDISCS)
262 return -EINVAL;
263
264 spin_lock_irqsave(&tty_ldisc_lock, flags);
265 if (new_ldisc) {
266 tty_ldiscs[disc] = *new_ldisc;
267 tty_ldiscs[disc].num = disc;
268 tty_ldiscs[disc].flags |= LDISC_FLAG_DEFINED;
269 tty_ldiscs[disc].refcount = 0;
270 } else {
271 if(tty_ldiscs[disc].refcount)
272 ret = -EBUSY;
273 else
274 tty_ldiscs[disc].flags &= ~LDISC_FLAG_DEFINED;
275 }
276 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
277
278 return ret;
279}
280
281EXPORT_SYMBOL(tty_register_ldisc);
282
283struct tty_ldisc *tty_ldisc_get(int disc)
284{
285 unsigned long flags;
286 struct tty_ldisc *ld;
287
288 if (disc < N_TTY || disc >= NR_LDISCS)
289 return NULL;
290
291 spin_lock_irqsave(&tty_ldisc_lock, flags);
292
293 ld = &tty_ldiscs[disc];
294
295 if(ld->flags & LDISC_FLAG_DEFINED)
296 {
297
298 if (!try_module_get(ld->owner))
299 ld = NULL;
300 else
301 ld->refcount++;
302 }
303 else
304 ld = NULL;
305 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
306 return ld;
307}
308
309EXPORT_SYMBOL_GPL(tty_ldisc_get);
310
311void tty_ldisc_put(int disc)
312{
313 struct tty_ldisc *ld;
314 unsigned long flags;
315
316 if (disc < N_TTY || disc >= NR_LDISCS)
317 BUG();
318
319 spin_lock_irqsave(&tty_ldisc_lock, flags);
320 ld = &tty_ldiscs[disc];
321 if(ld->refcount == 0)
322 BUG();
323 ld->refcount --;
324 module_put(ld->owner);
325 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
326}
327
328EXPORT_SYMBOL_GPL(tty_ldisc_put);
329
330void tty_ldisc_assign(struct tty_struct *tty, struct tty_ldisc *ld)
331{
332 tty->ldisc = *ld;
333 tty->ldisc.refcount = 0;
334}
335
336
337
338
339
340
341
342
343
344
345
346static int tty_ldisc_try(struct tty_struct *tty)
347{
348 unsigned long flags;
349 struct tty_ldisc *ld;
350 int ret = 0;
351
352 spin_lock_irqsave(&tty_ldisc_lock, flags);
353 ld = &tty->ldisc;
354 if(test_bit(TTY_LDISC, &tty->flags))
355 {
356 ld->refcount++;
357 ret = 1;
358 }
359 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
360 return ret;
361}
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty)
378{
379
380 wait_event(tty_ldisc_wait, tty_ldisc_try(tty));
381 if(tty->ldisc.refcount == 0)
382 printk(KERN_ERR "tty_ldisc_ref_wait\n");
383 return &tty->ldisc;
384}
385
386EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait);
387
388
389
390
391
392
393
394
395
396
397struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty)
398{
399 if(tty_ldisc_try(tty))
400 return &tty->ldisc;
401 return NULL;
402}
403
404EXPORT_SYMBOL_GPL(tty_ldisc_ref);
405
406
407
408
409
410
411
412
413
414void tty_ldisc_deref(struct tty_ldisc *ld)
415{
416 unsigned long flags;
417
418 if(ld == NULL)
419 BUG();
420
421 spin_lock_irqsave(&tty_ldisc_lock, flags);
422 if(ld->refcount == 0)
423 printk(KERN_ERR "tty_ldisc_deref: no references.\n");
424 else
425 ld->refcount--;
426 if(ld->refcount == 0)
427 wake_up(&tty_ldisc_wait);
428 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
429}
430
431EXPORT_SYMBOL_GPL(tty_ldisc_deref);
432
433
434
435
436
437
438
439
440
441
442
443
444static void tty_ldisc_enable(struct tty_struct *tty)
445{
446 set_bit(TTY_LDISC, &tty->flags);
447 wake_up(&tty_ldisc_wait);
448}
449
450
451
452
453
454
455
456
457
458
459static int tty_set_ldisc(struct tty_struct *tty, int ldisc)
460{
461 int retval = 0;
462 struct tty_ldisc o_ldisc;
463 char buf[64];
464 int work;
465 unsigned long flags;
466 struct tty_ldisc *ld;
467
468 if ((ldisc < N_TTY) || (ldisc >= NR_LDISCS))
469 return -EINVAL;
470
471restart:
472
473 if (tty->ldisc.num == ldisc)
474 return 0;
475
476 ld = tty_ldisc_get(ldisc);
477
478
479 if (ld == NULL) {
480 request_module("tty-ldisc-%d", ldisc);
481 ld = tty_ldisc_get(ldisc);
482 }
483 if (ld == NULL)
484 return -EINVAL;
485
486 o_ldisc = tty->ldisc;
487
488 tty_wait_until_sent(tty, 0);
489
490
491
492
493
494
495
496
497 spin_lock_irqsave(&tty_ldisc_lock, flags);
498 if(tty->ldisc.refcount)
499 {
500
501
502 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
503 tty_ldisc_put(ldisc);
504
505
506
507
508
509
510
511 if(wait_event_interruptible(tty_ldisc_wait, tty->ldisc.refcount == 0) < 0)
512 return -ERESTARTSYS;
513 goto restart;
514 }
515 clear_bit(TTY_LDISC, &tty->flags);
516 clear_bit(TTY_DONT_FLIP, &tty->flags);
517 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
518
519
520
521
522
523
524
525 work = cancel_delayed_work(&tty->flip.work);
526
527
528
529
530 flush_scheduled_work();
531
532 if (tty->ldisc.close)
533 (tty->ldisc.close)(tty);
534
535
536 tty_ldisc_assign(tty, ld);
537 tty_set_termios_ldisc(tty, ldisc);
538 if (tty->ldisc.open)
539 retval = (tty->ldisc.open)(tty);
540 if (retval < 0) {
541 tty_ldisc_put(ldisc);
542
543 tty_ldisc_assign(tty, tty_ldisc_get(o_ldisc.num));
544 tty_set_termios_ldisc(tty, tty->ldisc.num);
545 if (tty->ldisc.open && (tty->ldisc.open(tty) < 0)) {
546 tty_ldisc_put(o_ldisc.num);
547
548 tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
549 tty_set_termios_ldisc(tty, N_TTY);
550 if (tty->ldisc.open) {
551 int r = tty->ldisc.open(tty);
552
553 if (r < 0)
554 panic("Couldn't open N_TTY ldisc for "
555 "%s --- error %d.",
556 tty_name(tty, buf), r);
557 }
558 }
559 }
560
561
562
563
564 if (tty->ldisc.num != o_ldisc.num && tty->driver->set_ldisc)
565 tty->driver->set_ldisc(tty);
566
567 tty_ldisc_put(o_ldisc.num);
568
569
570
571
572
573
574 tty_ldisc_enable(tty);
575
576
577
578 if(work)
579 schedule_delayed_work(&tty->flip.work, 1);
580 return retval;
581}
582
583
584
585
586struct tty_driver *get_tty_driver(dev_t device, int *index)
587{
588 struct tty_driver *p;
589
590 list_for_each_entry(p, &tty_drivers, tty_drivers) {
591 dev_t base = MKDEV(p->major, p->minor_start);
592 if (device < base || device >= base + p->num)
593 continue;
594 *index = device - base;
595 return p;
596 }
597 return NULL;
598}
599
600
601
602
603
604
605int tty_check_change(struct tty_struct * tty)
606{
607 if (current->signal->tty != tty)
608 return 0;
609 if (tty->pgrp <= 0) {
610 printk(KERN_WARNING "tty_check_change: tty->pgrp <= 0!\n");
611 return 0;
612 }
613 if (process_group(current) == tty->pgrp)
614 return 0;
615 if (is_ignored(SIGTTOU))
616 return 0;
617 if (is_orphaned_pgrp(process_group(current)))
618 return -EIO;
619 (void) kill_pg(process_group(current), SIGTTOU, 1);
620 return -ERESTARTSYS;
621}
622
623EXPORT_SYMBOL(tty_check_change);
624
625static ssize_t hung_up_tty_read(struct file * file, char __user * buf,
626 size_t count, loff_t *ppos)
627{
628 return 0;
629}
630
631static ssize_t hung_up_tty_write(struct file * file, const char __user * buf,
632 size_t count, loff_t *ppos)
633{
634 return -EIO;
635}
636
637
638static unsigned int hung_up_tty_poll(struct file * filp, poll_table * wait)
639{
640 return POLLIN | POLLOUT | POLLERR | POLLHUP | POLLRDNORM | POLLWRNORM;
641}
642
643static int hung_up_tty_ioctl(struct inode * inode, struct file * file,
644 unsigned int cmd, unsigned long arg)
645{
646 return cmd == TIOCSPGRP ? -ENOTTY : -EIO;
647}
648
649static struct file_operations tty_fops = {
650 .llseek = no_llseek,
651 .read = tty_read,
652 .write = tty_write,
653 .poll = tty_poll,
654 .ioctl = tty_ioctl,
655 .open = tty_open,
656 .release = tty_release,
657 .fasync = tty_fasync,
658};
659
660#ifdef CONFIG_UNIX98_PTYS
661static struct file_operations ptmx_fops = {
662 .llseek = no_llseek,
663 .read = tty_read,
664 .write = tty_write,
665 .poll = tty_poll,
666 .ioctl = tty_ioctl,
667 .open = ptmx_open,
668 .release = tty_release,
669 .fasync = tty_fasync,
670};
671#endif
672
673static struct file_operations console_fops = {
674 .llseek = no_llseek,
675 .read = tty_read,
676 .write = redirected_tty_write,
677 .poll = tty_poll,
678 .ioctl = tty_ioctl,
679 .open = tty_open,
680 .release = tty_release,
681 .fasync = tty_fasync,
682};
683
684static struct file_operations hung_up_tty_fops = {
685 .llseek = no_llseek,
686 .read = hung_up_tty_read,
687 .write = hung_up_tty_write,
688 .poll = hung_up_tty_poll,
689 .ioctl = hung_up_tty_ioctl,
690 .release = tty_release,
691};
692
693static spinlock_t redirect_lock = SPIN_LOCK_UNLOCKED;
694static struct file *redirect;
695
696
697
698
699
700
701
702
703
704
705void tty_wakeup(struct tty_struct *tty)
706{
707 struct tty_ldisc *ld;
708
709 if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) {
710 ld = tty_ldisc_ref(tty);
711 if(ld) {
712 if(ld->write_wakeup)
713 ld->write_wakeup(tty);
714 tty_ldisc_deref(ld);
715 }
716 }
717 wake_up_interruptible(&tty->write_wait);
718}
719
720EXPORT_SYMBOL_GPL(tty_wakeup);
721
722
723
724
725
726
727
728
729
730void tty_ldisc_flush(struct tty_struct *tty)
731{
732 struct tty_ldisc *ld = tty_ldisc_ref(tty);
733 if(ld) {
734 if(ld->flush_buffer)
735 ld->flush_buffer(tty);
736 tty_ldisc_deref(ld);
737 }
738}
739
740EXPORT_SYMBOL_GPL(tty_ldisc_flush);
741
742
743
744
745
746
747void do_tty_hangup(void *data)
748{
749 struct tty_struct *tty = (struct tty_struct *) data;
750 struct file * cons_filp = NULL;
751 struct file *filp, *f = NULL;
752 struct task_struct *p;
753 struct tty_ldisc *ld;
754 int closecount = 0, n;
755
756 if (!tty)
757 return;
758
759
760 lock_kernel();
761
762 spin_lock(&redirect_lock);
763 if (redirect && redirect->private_data == tty) {
764 f = redirect;
765 redirect = NULL;
766 }
767 spin_unlock(&redirect_lock);
768
769 check_tty_count(tty, "do_tty_hangup");
770 file_list_lock();
771
772 list_for_each_entry(filp, &tty->tty_files, f_list) {
773 if (filp->f_op->write == redirected_tty_write)
774 cons_filp = filp;
775 if (filp->f_op->write != tty_write)
776 continue;
777 closecount++;
778 tty_fasync(-1, filp, 0);
779 filp->f_op = &hung_up_tty_fops;
780 }
781 file_list_unlock();
782
783
784
785
786 ld = tty_ldisc_ref(tty);
787 if(ld != NULL)
788 {
789 if (ld->flush_buffer)
790 ld->flush_buffer(tty);
791 if (tty->driver->flush_buffer)
792 tty->driver->flush_buffer(tty);
793 if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
794 ld->write_wakeup)
795 ld->write_wakeup(tty);
796 if (ld->hangup)
797 ld->hangup(tty);
798 }
799
800
801
802
803 wake_up_interruptible(&tty->write_wait);
804 wake_up_interruptible(&tty->read_wait);
805
806
807
808
809
810 if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
811 {
812 down(&tty->termios_sem);
813 *tty->termios = tty->driver->init_termios;
814 up(&tty->termios_sem);
815 }
816
817
818
819
820
821
822
823 read_lock(&tasklist_lock);
824 if (tty->session > 0) {
825 do_each_task_pid(tty->session, PIDTYPE_SID, p) {
826 if (p->signal->tty == tty)
827 p->signal->tty = NULL;
828 if (!p->signal->leader)
829 continue;
830 send_group_sig_info(SIGHUP, SEND_SIG_PRIV, p);
831 send_group_sig_info(SIGCONT, SEND_SIG_PRIV, p);
832 if (tty->pgrp > 0)
833 p->signal->tty_old_pgrp = tty->pgrp;
834 } while_each_task_pid(tty->session, PIDTYPE_SID, p);
835 }
836 read_unlock(&tasklist_lock);
837
838 tty->flags = 0;
839 tty->session = 0;
840 tty->pgrp = -1;
841 tty->ctrl_status = 0;
842
843
844
845
846
847
848 if (cons_filp) {
849 if (tty->driver->close)
850 for (n = 0; n < closecount; n++)
851 tty->driver->close(tty, cons_filp);
852 } else if (tty->driver->hangup)
853 (tty->driver->hangup)(tty);
854
855
856
857
858
859
860 set_bit(TTY_HUPPED, &tty->flags);
861 if (ld) {
862 tty_ldisc_enable(tty);
863 tty_ldisc_deref(ld);
864 }
865 unlock_kernel();
866 if (f)
867 fput(f);
868}
869
870void tty_hangup(struct tty_struct * tty)
871{
872#ifdef TTY_DEBUG_HANGUP
873 char buf[64];
874
875 printk(KERN_DEBUG "%s hangup...\n", tty_name(tty, buf));
876#endif
877 schedule_work(&tty->hangup_work);
878}
879
880EXPORT_SYMBOL(tty_hangup);
881
882void tty_vhangup(struct tty_struct * tty)
883{
884#ifdef TTY_DEBUG_HANGUP
885 char buf[64];
886
887 printk(KERN_DEBUG "%s vhangup...\n", tty_name(tty, buf));
888#endif
889 do_tty_hangup((void *) tty);
890}
891EXPORT_SYMBOL(tty_vhangup);
892
893int tty_hung_up_p(struct file * filp)
894{
895 return (filp->f_op == &hung_up_tty_fops);
896}
897
898EXPORT_SYMBOL(tty_hung_up_p);
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913void disassociate_ctty(int on_exit)
914{
915 struct tty_struct *tty;
916 struct task_struct *p;
917 int tty_pgrp = -1;
918
919 lock_kernel();
920
921 tty = current->signal->tty;
922 if (tty) {
923 tty_pgrp = tty->pgrp;
924 if (on_exit && tty->driver->type != TTY_DRIVER_TYPE_PTY)
925 tty_vhangup(tty);
926 } else {
927 if (current->signal->tty_old_pgrp) {
928 kill_pg(current->signal->tty_old_pgrp, SIGHUP, on_exit);
929 kill_pg(current->signal->tty_old_pgrp, SIGCONT, on_exit);
930 }
931 unlock_kernel();
932 return;
933 }
934 if (tty_pgrp > 0) {
935 kill_pg(tty_pgrp, SIGHUP, on_exit);
936 if (!on_exit)
937 kill_pg(tty_pgrp, SIGCONT, on_exit);
938 }
939
940 current->signal->tty_old_pgrp = 0;
941 tty->session = 0;
942 tty->pgrp = -1;
943
944 read_lock(&tasklist_lock);
945 do_each_task_pid(current->signal->session, PIDTYPE_SID, p) {
946 p->signal->tty = NULL;
947 } while_each_task_pid(current->signal->session, PIDTYPE_SID, p);
948 read_unlock(&tasklist_lock);
949 unlock_kernel();
950}
951
952void stop_tty(struct tty_struct *tty)
953{
954 if (tty->stopped)
955 return;
956 tty->stopped = 1;
957 if (tty->link && tty->link->packet) {
958 tty->ctrl_status &= ~TIOCPKT_START;
959 tty->ctrl_status |= TIOCPKT_STOP;
960 wake_up_interruptible(&tty->link->read_wait);
961 }
962 if (tty->driver->stop)
963 (tty->driver->stop)(tty);
964}
965
966EXPORT_SYMBOL(stop_tty);
967
968void start_tty(struct tty_struct *tty)
969{
970 if (!tty->stopped || tty->flow_stopped)
971 return;
972 tty->stopped = 0;
973 if (tty->link && tty->link->packet) {
974 tty->ctrl_status &= ~TIOCPKT_STOP;
975 tty->ctrl_status |= TIOCPKT_START;
976 wake_up_interruptible(&tty->link->read_wait);
977 }
978 if (tty->driver->start)
979 (tty->driver->start)(tty);
980
981
982 tty_wakeup(tty);
983 wake_up_interruptible(&tty->write_wait);
984}
985
986EXPORT_SYMBOL(start_tty);
987
988static ssize_t tty_read(struct file * file, char __user * buf, size_t count,
989 loff_t *ppos)
990{
991 int i;
992 struct tty_struct * tty;
993 struct inode *inode;
994 struct tty_ldisc *ld;
995
996 tty = (struct tty_struct *)file->private_data;
997 inode = file->f_dentry->d_inode;
998 if (tty_paranoia_check(tty, inode, "tty_read"))
999 return -EIO;
1000 if (!tty || (test_bit(TTY_IO_ERROR, &tty->flags)))
1001 return -EIO;
1002
1003
1004
1005 ld = tty_ldisc_ref_wait(tty);
1006 lock_kernel();
1007 if (ld->read)
1008 i = (ld->read)(tty,file,buf,count);
1009 else
1010 i = -EIO;
1011 tty_ldisc_deref(ld);
1012 unlock_kernel();
1013 if (i > 0)
1014 inode->i_atime = CURRENT_TIME;
1015 return i;
1016}
1017
1018
1019
1020
1021
1022static inline ssize_t do_tty_write(
1023 ssize_t (*write)(struct tty_struct *, struct file *, const unsigned char *, size_t),
1024 struct tty_struct *tty,
1025 struct file *file,
1026 const char __user *buf,
1027 size_t count)
1028{
1029 ssize_t ret = 0, written = 0;
1030 unsigned int chunk;
1031
1032 if (down_interruptible(&tty->atomic_write)) {
1033 return -ERESTARTSYS;
1034 }
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044 chunk = 4096;
1045 if (test_bit(TTY_NO_WRITE_SPLIT, &tty->flags))
1046 chunk = 65536;
1047 if (count < chunk)
1048 chunk = count;
1049
1050
1051 if (tty->write_cnt < chunk) {
1052 unsigned char *buf;
1053
1054 if (chunk < 1024)
1055 chunk = 1024;
1056
1057 buf = kmalloc(chunk, GFP_KERNEL);
1058 if (!buf) {
1059 up(&tty->atomic_write);
1060 return -ENOMEM;
1061 }
1062 kfree(tty->write_buf);
1063 tty->write_cnt = chunk;
1064 tty->write_buf = buf;
1065 }
1066
1067
1068 for (;;) {
1069 size_t size = count;
1070 if (size > chunk)
1071 size = chunk;
1072 ret = -EFAULT;
1073 if (copy_from_user(tty->write_buf, buf, size))
1074 break;
1075 lock_kernel();
1076 ret = write(tty, file, tty->write_buf, size);
1077 unlock_kernel();
1078 if (ret <= 0)
1079 break;
1080 written += ret;
1081 buf += ret;
1082 count -= ret;
1083 if (!count)
1084 break;
1085 ret = -ERESTARTSYS;
1086 if (signal_pending(current))
1087 break;
1088 cond_resched();
1089 }
1090 if (written) {
1091 file->f_dentry->d_inode->i_mtime = CURRENT_TIME;
1092 ret = written;
1093 }
1094 up(&tty->atomic_write);
1095 return ret;
1096}
1097
1098
1099static ssize_t tty_write(struct file * file, const char __user * buf, size_t count,
1100 loff_t *ppos)
1101{
1102 struct tty_struct * tty;
1103 struct inode *inode = file->f_dentry->d_inode;
1104 ssize_t ret;
1105 struct tty_ldisc *ld;
1106
1107 tty = (struct tty_struct *)file->private_data;
1108 if (tty_paranoia_check(tty, inode, "tty_write"))
1109 return -EIO;
1110 if (!tty || !tty->driver->write || (test_bit(TTY_IO_ERROR, &tty->flags)))
1111 return -EIO;
1112
1113 ld = tty_ldisc_ref_wait(tty);
1114 if (!ld->write)
1115 ret = -EIO;
1116 else
1117 ret = do_tty_write(ld->write, tty, file, buf, count);
1118 tty_ldisc_deref(ld);
1119 return ret;
1120}
1121
1122ssize_t redirected_tty_write(struct file * file, const char __user * buf, size_t count,
1123 loff_t *ppos)
1124{
1125 struct file *p = NULL;
1126
1127 spin_lock(&redirect_lock);
1128 if (redirect) {
1129 get_file(redirect);
1130 p = redirect;
1131 }
1132 spin_unlock(&redirect_lock);
1133
1134 if (p) {
1135 ssize_t res;
1136 res = vfs_write(p, buf, count, &p->f_pos);
1137 fput(p);
1138 return res;
1139 }
1140
1141 return tty_write(file, buf, count, ppos);
1142}
1143
1144static char ptychar[] = "pqrstuvwxyzabcde";
1145
1146static inline void pty_line_name(struct tty_driver *driver, int index, char *p)
1147{
1148 int i = index + driver->name_base;
1149
1150 sprintf(p, "%s%c%x",
1151 driver->subtype == PTY_TYPE_SLAVE ? "tty" : driver->name,
1152 ptychar[i >> 4 & 0xf], i & 0xf);
1153}
1154
1155static inline void tty_line_name(struct tty_driver *driver, int index, char *p)
1156{
1157 sprintf(p, "%s%d", driver->name, index + driver->name_base);
1158}
1159
1160
1161
1162
1163
1164
1165
1166static int init_dev(struct tty_driver *driver, int idx,
1167 struct tty_struct **ret_tty)
1168{
1169 struct tty_struct *tty, *o_tty;
1170 struct termios *tp, **tp_loc, *o_tp, **o_tp_loc;
1171 struct termios *ltp, **ltp_loc, *o_ltp, **o_ltp_loc;
1172 int retval=0;
1173
1174
1175
1176
1177
1178 down(&tty_sem);
1179
1180
1181 if (driver->flags & TTY_DRIVER_DEVPTS_MEM) {
1182 tty = devpts_get_tty(idx);
1183 if (tty && driver->subtype == PTY_TYPE_MASTER)
1184 tty = tty->link;
1185 } else {
1186 tty = driver->ttys[idx];
1187 }
1188 if (tty) goto fast_track;
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198 if (!try_module_get(driver->owner)) {
1199 retval = -ENODEV;
1200 goto end_init;
1201 }
1202
1203 o_tty = NULL;
1204 tp = o_tp = NULL;
1205 ltp = o_ltp = NULL;
1206
1207 tty = alloc_tty_struct();
1208 if(!tty)
1209 goto fail_no_mem;
1210 initialize_tty_struct(tty);
1211 tty->driver = driver;
1212 tty->index = idx;
1213 tty_line_name(driver, idx, tty->name);
1214
1215 if (driver->flags & TTY_DRIVER_DEVPTS_MEM) {
1216 tp_loc = &tty->termios;
1217 ltp_loc = &tty->termios_locked;
1218 } else {
1219 tp_loc = &driver->termios[idx];
1220 ltp_loc = &driver->termios_locked[idx];
1221 }
1222
1223 if (!*tp_loc) {
1224 tp = (struct termios *) kmalloc(sizeof(struct termios),
1225 GFP_KERNEL);
1226 if (!tp)
1227 goto free_mem_out;
1228 *tp = driver->init_termios;
1229 }
1230
1231 if (!*ltp_loc) {
1232 ltp = (struct termios *) kmalloc(sizeof(struct termios),
1233 GFP_KERNEL);
1234 if (!ltp)
1235 goto free_mem_out;
1236 memset(ltp, 0, sizeof(struct termios));
1237 }
1238
1239 if (driver->type == TTY_DRIVER_TYPE_PTY) {
1240 o_tty = alloc_tty_struct();
1241 if (!o_tty)
1242 goto free_mem_out;
1243 initialize_tty_struct(o_tty);
1244 o_tty->driver = driver->other;
1245 o_tty->index = idx;
1246 tty_line_name(driver->other, idx, o_tty->name);
1247
1248 if (driver->flags & TTY_DRIVER_DEVPTS_MEM) {
1249 o_tp_loc = &o_tty->termios;
1250 o_ltp_loc = &o_tty->termios_locked;
1251 } else {
1252 o_tp_loc = &driver->other->termios[idx];
1253 o_ltp_loc = &driver->other->termios_locked[idx];
1254 }
1255
1256 if (!*o_tp_loc) {
1257 o_tp = (struct termios *)
1258 kmalloc(sizeof(struct termios), GFP_KERNEL);
1259 if (!o_tp)
1260 goto free_mem_out;
1261 *o_tp = driver->other->init_termios;
1262 }
1263
1264 if (!*o_ltp_loc) {
1265 o_ltp = (struct termios *)
1266 kmalloc(sizeof(struct termios), GFP_KERNEL);
1267 if (!o_ltp)
1268 goto free_mem_out;
1269 memset(o_ltp, 0, sizeof(struct termios));
1270 }
1271
1272
1273
1274
1275 if (!(driver->other->flags & TTY_DRIVER_DEVPTS_MEM)) {
1276 driver->other->ttys[idx] = o_tty;
1277 }
1278 if (!*o_tp_loc)
1279 *o_tp_loc = o_tp;
1280 if (!*o_ltp_loc)
1281 *o_ltp_loc = o_ltp;
1282 o_tty->termios = *o_tp_loc;
1283 o_tty->termios_locked = *o_ltp_loc;
1284 driver->other->refcount++;
1285 if (driver->subtype == PTY_TYPE_MASTER)
1286 o_tty->count++;
1287
1288
1289 tty->link = o_tty;
1290 o_tty->link = tty;
1291 }
1292
1293
1294
1295
1296
1297
1298 if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
1299 driver->ttys[idx] = tty;
1300 }
1301
1302 if (!*tp_loc)
1303 *tp_loc = tp;
1304 if (!*ltp_loc)
1305 *ltp_loc = ltp;
1306 tty->termios = *tp_loc;
1307 tty->termios_locked = *ltp_loc;
1308 driver->refcount++;
1309 tty->count++;
1310
1311
1312
1313
1314
1315
1316
1317 if (tty->ldisc.open) {
1318 retval = (tty->ldisc.open)(tty);
1319 if (retval)
1320 goto release_mem_out;
1321 }
1322 if (o_tty && o_tty->ldisc.open) {
1323 retval = (o_tty->ldisc.open)(o_tty);
1324 if (retval) {
1325 if (tty->ldisc.close)
1326 (tty->ldisc.close)(tty);
1327 goto release_mem_out;
1328 }
1329 tty_ldisc_enable(o_tty);
1330 }
1331 tty_ldisc_enable(tty);
1332 goto success;
1333
1334
1335
1336
1337
1338
1339
1340fast_track:
1341 if (test_bit(TTY_CLOSING, &tty->flags)) {
1342 retval = -EIO;
1343 goto end_init;
1344 }
1345 if (driver->type == TTY_DRIVER_TYPE_PTY &&
1346 driver->subtype == PTY_TYPE_MASTER) {
1347
1348
1349
1350
1351 if (tty->count) {
1352 retval = -EIO;
1353 goto end_init;
1354 }
1355 tty->link->count++;
1356 }
1357 tty->count++;
1358 tty->driver = driver;
1359
1360
1361 if(!test_bit(TTY_LDISC, &tty->flags))
1362 printk(KERN_ERR "init_dev but no ldisc\n");
1363success:
1364 *ret_tty = tty;
1365
1366
1367end_init:
1368 up(&tty_sem);
1369 return retval;
1370
1371
1372free_mem_out:
1373 if (o_tp)
1374 kfree(o_tp);
1375 if (o_tty)
1376 free_tty_struct(o_tty);
1377 if (ltp)
1378 kfree(ltp);
1379 if (tp)
1380 kfree(tp);
1381 free_tty_struct(tty);
1382
1383fail_no_mem:
1384 module_put(driver->owner);
1385 retval = -ENOMEM;
1386 goto end_init;
1387
1388
1389release_mem_out:
1390 printk(KERN_INFO "init_dev: ldisc open failed, "
1391 "clearing slot %d\n", idx);
1392 release_mem(tty, idx);
1393 goto end_init;
1394}
1395
1396
1397
1398
1399
1400static void release_mem(struct tty_struct *tty, int idx)
1401{
1402 struct tty_struct *o_tty;
1403 struct termios *tp;
1404 int devpts = tty->driver->flags & TTY_DRIVER_DEVPTS_MEM;
1405
1406 if ((o_tty = tty->link) != NULL) {
1407 if (!devpts)
1408 o_tty->driver->ttys[idx] = NULL;
1409 if (o_tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
1410 tp = o_tty->termios;
1411 if (!devpts)
1412 o_tty->driver->termios[idx] = NULL;
1413 kfree(tp);
1414
1415 tp = o_tty->termios_locked;
1416 if (!devpts)
1417 o_tty->driver->termios_locked[idx] = NULL;
1418 kfree(tp);
1419 }
1420 o_tty->magic = 0;
1421 o_tty->driver->refcount--;
1422 file_list_lock();
1423 list_del_init(&o_tty->tty_files);
1424 file_list_unlock();
1425 free_tty_struct(o_tty);
1426 }
1427
1428 if (!devpts)
1429 tty->driver->ttys[idx] = NULL;
1430 if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
1431 tp = tty->termios;
1432 if (!devpts)
1433 tty->driver->termios[idx] = NULL;
1434 kfree(tp);
1435
1436 tp = tty->termios_locked;
1437 if (!devpts)
1438 tty->driver->termios_locked[idx] = NULL;
1439 kfree(tp);
1440 }
1441
1442 tty->magic = 0;
1443 tty->driver->refcount--;
1444 file_list_lock();
1445 list_del_init(&tty->tty_files);
1446 file_list_unlock();
1447 module_put(tty->driver->owner);
1448 free_tty_struct(tty);
1449}
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459static void release_dev(struct file * filp)
1460{
1461 struct tty_struct *tty, *o_tty;
1462 int pty_master, tty_closing, o_tty_closing, do_sleep;
1463 int devpts_master, devpts;
1464 int idx;
1465 char buf[64];
1466 unsigned long flags;
1467
1468 tty = (struct tty_struct *)filp->private_data;
1469 if (tty_paranoia_check(tty, filp->f_dentry->d_inode, "release_dev"))
1470 return;
1471
1472 check_tty_count(tty, "release_dev");
1473
1474 tty_fasync(-1, filp, 0);
1475
1476 idx = tty->index;
1477 pty_master = (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
1478 tty->driver->subtype == PTY_TYPE_MASTER);
1479 devpts = (tty->driver->flags & TTY_DRIVER_DEVPTS_MEM) != 0;
1480 devpts_master = pty_master && devpts;
1481 o_tty = tty->link;
1482
1483#ifdef TTY_PARANOIA_CHECK
1484 if (idx < 0 || idx >= tty->driver->num) {
1485 printk(KERN_DEBUG "release_dev: bad idx when trying to "
1486 "free (%s)\n", tty->name);
1487 return;
1488 }
1489 if (!(tty->driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
1490 if (tty != tty->driver->ttys[idx]) {
1491 printk(KERN_DEBUG "release_dev: driver.table[%d] not tty "
1492 "for (%s)\n", idx, tty->name);
1493 return;
1494 }
1495 if (tty->termios != tty->driver->termios[idx]) {
1496 printk(KERN_DEBUG "release_dev: driver.termios[%d] not termios "
1497 "for (%s)\n",
1498 idx, tty->name);
1499 return;
1500 }
1501 if (tty->termios_locked != tty->driver->termios_locked[idx]) {
1502 printk(KERN_DEBUG "release_dev: driver.termios_locked[%d] not "
1503 "termios_locked for (%s)\n",
1504 idx, tty->name);
1505 return;
1506 }
1507 }
1508#endif
1509
1510#ifdef TTY_DEBUG_HANGUP
1511 printk(KERN_DEBUG "release_dev of %s (tty count=%d)...",
1512 tty_name(tty, buf), tty->count);
1513#endif
1514
1515#ifdef TTY_PARANOIA_CHECK
1516 if (tty->driver->other &&
1517 !(tty->driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
1518 if (o_tty != tty->driver->other->ttys[idx]) {
1519 printk(KERN_DEBUG "release_dev: other->table[%d] "
1520 "not o_tty for (%s)\n",
1521 idx, tty->name);
1522 return;
1523 }
1524 if (o_tty->termios != tty->driver->other->termios[idx]) {
1525 printk(KERN_DEBUG "release_dev: other->termios[%d] "
1526 "not o_termios for (%s)\n",
1527 idx, tty->name);
1528 return;
1529 }
1530 if (o_tty->termios_locked !=
1531 tty->driver->other->termios_locked[idx]) {
1532 printk(KERN_DEBUG "release_dev: other->termios_locked["
1533 "%d] not o_termios_locked for (%s)\n",
1534 idx, tty->name);
1535 return;
1536 }
1537 if (o_tty->link != tty) {
1538 printk(KERN_DEBUG "release_dev: bad pty pointers\n");
1539 return;
1540 }
1541 }
1542#endif
1543 if (tty->driver->close)
1544 tty->driver->close(tty, filp);
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563 while (1) {
1564 tty_closing = tty->count <= 1;
1565 o_tty_closing = o_tty &&
1566 (o_tty->count <= (pty_master ? 1 : 0));
1567 do_sleep = 0;
1568
1569 if (tty_closing) {
1570 if (waitqueue_active(&tty->read_wait)) {
1571 wake_up(&tty->read_wait);
1572 do_sleep++;
1573 }
1574 if (waitqueue_active(&tty->write_wait)) {
1575 wake_up(&tty->write_wait);
1576 do_sleep++;
1577 }
1578 }
1579 if (o_tty_closing) {
1580 if (waitqueue_active(&o_tty->read_wait)) {
1581 wake_up(&o_tty->read_wait);
1582 do_sleep++;
1583 }
1584 if (waitqueue_active(&o_tty->write_wait)) {
1585 wake_up(&o_tty->write_wait);
1586 do_sleep++;
1587 }
1588 }
1589 if (!do_sleep)
1590 break;
1591
1592 printk(KERN_WARNING "release_dev: %s: read/write wait queue "
1593 "active!\n", tty_name(tty, buf));
1594 schedule();
1595 }
1596
1597
1598
1599
1600
1601
1602 if (pty_master) {
1603 if (--o_tty->count < 0) {
1604 printk(KERN_WARNING "release_dev: bad pty slave count "
1605 "(%d) for %s\n",
1606 o_tty->count, tty_name(o_tty, buf));
1607 o_tty->count = 0;
1608 }
1609 }
1610 if (--tty->count < 0) {
1611 printk(KERN_WARNING "release_dev: bad tty->count (%d) for %s\n",
1612 tty->count, tty_name(tty, buf));
1613 tty->count = 0;
1614 }
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625 file_kill(filp);
1626 filp->private_data = NULL;
1627
1628
1629
1630
1631
1632
1633
1634
1635 if(tty_closing)
1636 set_bit(TTY_CLOSING, &tty->flags);
1637 if(o_tty_closing)
1638 set_bit(TTY_CLOSING, &o_tty->flags);
1639
1640
1641
1642
1643
1644
1645 if (tty_closing || o_tty_closing) {
1646 struct task_struct *p;
1647
1648 read_lock(&tasklist_lock);
1649 do_each_task_pid(tty->session, PIDTYPE_SID, p) {
1650 p->signal->tty = NULL;
1651 } while_each_task_pid(tty->session, PIDTYPE_SID, p);
1652 if (o_tty)
1653 do_each_task_pid(o_tty->session, PIDTYPE_SID, p) {
1654 p->signal->tty = NULL;
1655 } while_each_task_pid(o_tty->session, PIDTYPE_SID, p);
1656 read_unlock(&tasklist_lock);
1657 }
1658
1659
1660 if (!tty_closing || (o_tty && !o_tty_closing))
1661 return;
1662
1663#ifdef TTY_DEBUG_HANGUP
1664 printk(KERN_DEBUG "freeing tty structure...");
1665#endif
1666
1667
1668
1669
1670
1671 clear_bit(TTY_LDISC, &tty->flags);
1672 clear_bit(TTY_DONT_FLIP, &tty->flags);
1673 cancel_delayed_work(&tty->flip.work);
1674
1675
1676
1677
1678
1679 flush_scheduled_work();
1680
1681
1682
1683
1684
1685
1686 spin_lock_irqsave(&tty_ldisc_lock, flags);
1687 while(tty->ldisc.refcount)
1688 {
1689 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
1690 wait_event(tty_ldisc_wait, tty->ldisc.refcount == 0);
1691 spin_lock_irqsave(&tty_ldisc_lock, flags);
1692 }
1693 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
1694
1695
1696
1697
1698
1699
1700 if (tty->ldisc.close)
1701 (tty->ldisc.close)(tty);
1702 tty_ldisc_put(tty->ldisc.num);
1703
1704
1705
1706
1707 tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
1708 tty_set_termios_ldisc(tty,N_TTY);
1709 if (o_tty) {
1710
1711 clear_bit(TTY_LDISC, &o_tty->flags);
1712 if (o_tty->ldisc.close)
1713 (o_tty->ldisc.close)(o_tty);
1714 tty_ldisc_put(o_tty->ldisc.num);
1715 tty_ldisc_assign(o_tty, tty_ldisc_get(N_TTY));
1716 tty_set_termios_ldisc(o_tty,N_TTY);
1717 }
1718
1719
1720
1721
1722 release_mem(tty, idx);
1723
1724#ifdef CONFIG_UNIX98_PTYS
1725
1726 if (devpts) {
1727 down(&allocated_ptys_lock);
1728 idr_remove(&allocated_ptys, idx);
1729 up(&allocated_ptys_lock);
1730 }
1731#endif
1732
1733}
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747static int tty_open(struct inode * inode, struct file * filp)
1748{
1749 struct tty_struct *tty;
1750 int noctty, retval;
1751 struct tty_driver *driver;
1752 int index;
1753 dev_t device = inode->i_rdev;
1754 unsigned short saved_flags = filp->f_flags;
1755
1756 nonseekable_open(inode, filp);
1757
1758retry_open:
1759 noctty = filp->f_flags & O_NOCTTY;
1760 index = -1;
1761 retval = 0;
1762
1763 if (device == MKDEV(TTYAUX_MAJOR,0)) {
1764 if (!current->signal->tty)
1765 return -ENXIO;
1766 driver = current->signal->tty->driver;
1767 index = current->signal->tty->index;
1768 filp->f_flags |= O_NONBLOCK;
1769
1770 goto got_driver;
1771 }
1772#ifdef CONFIG_VT
1773 if (device == MKDEV(TTY_MAJOR,0)) {
1774 extern int fg_console;
1775 extern struct tty_driver *console_driver;
1776 driver = console_driver;
1777 index = fg_console;
1778 noctty = 1;
1779 goto got_driver;
1780 }
1781#endif
1782 if (device == MKDEV(TTYAUX_MAJOR,1)) {
1783 driver = console_device(&index);
1784 if (driver) {
1785
1786 filp->f_flags |= O_NONBLOCK;
1787 noctty = 1;
1788 goto got_driver;
1789 }
1790 return -ENODEV;
1791 }
1792
1793 driver = get_tty_driver(device, &index);
1794 if (!driver)
1795 return -ENODEV;
1796got_driver:
1797 retval = init_dev(driver, index, &tty);
1798 if (retval)
1799 return retval;
1800
1801 filp->private_data = tty;
1802 file_move(filp, &tty->tty_files);
1803 check_tty_count(tty, "tty_open");
1804 if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
1805 tty->driver->subtype == PTY_TYPE_MASTER)
1806 noctty = 1;
1807#ifdef TTY_DEBUG_HANGUP
1808 printk(KERN_DEBUG "opening %s...", tty->name);
1809#endif
1810 if (!retval) {
1811 if (tty->driver->open)
1812 retval = tty->driver->open(tty, filp);
1813 else
1814 retval = -ENODEV;
1815 }
1816 filp->f_flags = saved_flags;
1817
1818 if (!retval && test_bit(TTY_EXCLUSIVE, &tty->flags) && !capable(CAP_SYS_ADMIN))
1819 retval = -EBUSY;
1820
1821 if (retval) {
1822#ifdef TTY_DEBUG_HANGUP
1823 printk(KERN_DEBUG "error %d in opening %s...", retval,
1824 tty->name);
1825#endif
1826 release_dev(filp);
1827 if (retval != -ERESTARTSYS)
1828 return retval;
1829 if (signal_pending(current))
1830 return retval;
1831 schedule();
1832
1833
1834
1835 if (filp->f_op == &hung_up_tty_fops)
1836 filp->f_op = &tty_fops;
1837 goto retry_open;
1838 }
1839 if (!noctty &&
1840 current->signal->leader &&
1841 !current->signal->tty &&
1842 tty->session == 0) {
1843 task_lock(current);
1844 current->signal->tty = tty;
1845 task_unlock(current);
1846 current->signal->tty_old_pgrp = 0;
1847 tty->session = current->signal->session;
1848 tty->pgrp = process_group(current);
1849 }
1850 return 0;
1851}
1852
1853#ifdef CONFIG_UNIX98_PTYS
1854static int ptmx_open(struct inode * inode, struct file * filp)
1855{
1856 struct tty_struct *tty;
1857 int retval;
1858 int index;
1859 int idr_ret;
1860
1861 nonseekable_open(inode, filp);
1862
1863
1864 down(&allocated_ptys_lock);
1865 if (!idr_pre_get(&allocated_ptys, GFP_KERNEL)) {
1866 up(&allocated_ptys_lock);
1867 return -ENOMEM;
1868 }
1869 idr_ret = idr_get_new(&allocated_ptys, NULL, &index);
1870 if (idr_ret < 0) {
1871 up(&allocated_ptys_lock);
1872 if (idr_ret == -EAGAIN)
1873 return -ENOMEM;
1874 return -EIO;
1875 }
1876 if (index >= pty_limit) {
1877 idr_remove(&allocated_ptys, index);
1878 up(&allocated_ptys_lock);
1879 return -EIO;
1880 }
1881 up(&allocated_ptys_lock);
1882
1883 retval = init_dev(ptm_driver, index, &tty);
1884 if (retval)
1885 goto out;
1886
1887 set_bit(TTY_PTY_LOCK, &tty->flags);
1888 filp->private_data = tty;
1889 file_move(filp, &tty->tty_files);
1890
1891 retval = -ENOMEM;
1892 if (devpts_pty_new(tty->link))
1893 goto out1;
1894
1895 check_tty_count(tty, "tty_open");
1896 retval = ptm_driver->open(tty, filp);
1897 if (!retval)
1898 return 0;
1899out1:
1900 release_dev(filp);
1901out:
1902 down(&allocated_ptys_lock);
1903 idr_remove(&allocated_ptys, index);
1904 up(&allocated_ptys_lock);
1905 return retval;
1906}
1907#endif
1908
1909static int tty_release(struct inode * inode, struct file * filp)
1910{
1911 lock_kernel();
1912 release_dev(filp);
1913 unlock_kernel();
1914 return 0;
1915}
1916
1917
1918static unsigned int tty_poll(struct file * filp, poll_table * wait)
1919{
1920 struct tty_struct * tty;
1921 struct tty_ldisc *ld;
1922 int ret = 0;
1923
1924 tty = (struct tty_struct *)filp->private_data;
1925 if (tty_paranoia_check(tty, filp->f_dentry->d_inode, "tty_poll"))
1926 return 0;
1927
1928 ld = tty_ldisc_ref_wait(tty);
1929 if (ld->poll)
1930 ret = (ld->poll)(tty, filp, wait);
1931 tty_ldisc_deref(ld);
1932 return ret;
1933}
1934
1935static int tty_fasync(int fd, struct file * filp, int on)
1936{
1937 struct tty_struct * tty;
1938 int retval;
1939
1940 tty = (struct tty_struct *)filp->private_data;
1941 if (tty_paranoia_check(tty, filp->f_dentry->d_inode, "tty_fasync"))
1942 return 0;
1943
1944 retval = fasync_helper(fd, filp, on, &tty->fasync);
1945 if (retval <= 0)
1946 return retval;
1947
1948 if (on) {
1949 if (!waitqueue_active(&tty->read_wait))
1950 tty->minimum_to_wake = 1;
1951 retval = f_setown(filp, (-tty->pgrp) ? : current->pid, 0);
1952 if (retval)
1953 return retval;
1954 } else {
1955 if (!tty->fasync && !waitqueue_active(&tty->read_wait))
1956 tty->minimum_to_wake = N_TTY_BUF_SIZE;
1957 }
1958 return 0;
1959}
1960
1961static int tiocsti(struct tty_struct *tty, char __user *p)
1962{
1963 char ch, mbz = 0;
1964 struct tty_ldisc *ld;
1965
1966 if ((current->signal->tty != tty) && !capable(CAP_SYS_ADMIN))
1967 return -EPERM;
1968 if (get_user(ch, p))
1969 return -EFAULT;
1970 ld = tty_ldisc_ref_wait(tty);
1971 ld->receive_buf(tty, &ch, &mbz, 1);
1972 tty_ldisc_deref(ld);
1973 return 0;
1974}
1975
1976static int tiocgwinsz(struct tty_struct *tty, struct winsize __user * arg)
1977{
1978 if (copy_to_user(arg, &tty->winsize, sizeof(*arg)))
1979 return -EFAULT;
1980 return 0;
1981}
1982
1983static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty,
1984 struct winsize __user * arg)
1985{
1986 struct winsize tmp_ws;
1987
1988 if (copy_from_user(&tmp_ws, arg, sizeof(*arg)))
1989 return -EFAULT;
1990 if (!memcmp(&tmp_ws, &tty->winsize, sizeof(*arg)))
1991 return 0;
1992#ifdef CONFIG_VT
1993 if (tty->driver->type == TTY_DRIVER_TYPE_CONSOLE) {
1994 unsigned int currcons = tty->index;
1995 int rc;
1996
1997 acquire_console_sem();
1998 rc = vc_resize(currcons, tmp_ws.ws_col, tmp_ws.ws_row);
1999 release_console_sem();
2000 if (rc)
2001 return -ENXIO;
2002 }
2003#endif
2004 if (tty->pgrp > 0)
2005 kill_pg(tty->pgrp, SIGWINCH, 1);
2006 if ((real_tty->pgrp != tty->pgrp) && (real_tty->pgrp > 0))
2007 kill_pg(real_tty->pgrp, SIGWINCH, 1);
2008 tty->winsize = tmp_ws;
2009 real_tty->winsize = tmp_ws;
2010 return 0;
2011}
2012
2013static int tioccons(struct file *file)
2014{
2015 if (!capable(CAP_SYS_ADMIN))
2016 return -EPERM;
2017 if (file->f_op->write == redirected_tty_write) {
2018 struct file *f;
2019 spin_lock(&redirect_lock);
2020 f = redirect;
2021 redirect = NULL;
2022 spin_unlock(&redirect_lock);
2023 if (f)
2024 fput(f);
2025 return 0;
2026 }
2027 spin_lock(&redirect_lock);
2028 if (redirect) {
2029 spin_unlock(&redirect_lock);
2030 return -EBUSY;
2031 }
2032 get_file(file);
2033 redirect = file;
2034 spin_unlock(&redirect_lock);
2035 return 0;
2036}
2037
2038
2039static int fionbio(struct file *file, int __user *p)
2040{
2041 int nonblock;
2042
2043 if (get_user(nonblock, p))
2044 return -EFAULT;
2045
2046 if (nonblock)
2047 file->f_flags |= O_NONBLOCK;
2048 else
2049 file->f_flags &= ~O_NONBLOCK;
2050 return 0;
2051}
2052
2053static int tiocsctty(struct tty_struct *tty, int arg)
2054{
2055 task_t *p;
2056
2057 if (current->signal->leader &&
2058 (current->signal->session == tty->session))
2059 return 0;
2060
2061
2062
2063
2064 if (!current->signal->leader || current->signal->tty)
2065 return -EPERM;
2066 if (tty->session > 0) {
2067
2068
2069
2070
2071 if ((arg == 1) && capable(CAP_SYS_ADMIN)) {
2072
2073
2074
2075
2076 read_lock(&tasklist_lock);
2077 do_each_task_pid(tty->session, PIDTYPE_SID, p) {
2078 p->signal->tty = NULL;
2079 } while_each_task_pid(tty->session, PIDTYPE_SID, p);
2080 read_unlock(&tasklist_lock);
2081 } else
2082 return -EPERM;
2083 }
2084 task_lock(current);
2085 current->signal->tty = tty;
2086 task_unlock(current);
2087 current->signal->tty_old_pgrp = 0;
2088 tty->session = current->signal->session;
2089 tty->pgrp = process_group(current);
2090 return 0;
2091}
2092
2093static int tiocgpgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
2094{
2095
2096
2097
2098
2099 if (tty == real_tty && current->signal->tty != real_tty)
2100 return -ENOTTY;
2101 return put_user(real_tty->pgrp, p);
2102}
2103
2104static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
2105{
2106 pid_t pgrp;
2107 int retval = tty_check_change(real_tty);
2108
2109 if (retval == -EIO)
2110 return -ENOTTY;
2111 if (retval)
2112 return retval;
2113 if (!current->signal->tty ||
2114 (current->signal->tty != real_tty) ||
2115 (real_tty->session != current->signal->session))
2116 return -ENOTTY;
2117 if (get_user(pgrp, p))
2118 return -EFAULT;
2119 if (pgrp < 0)
2120 return -EINVAL;
2121 if (session_of_pgrp(pgrp) != current->signal->session)
2122 return -EPERM;
2123 real_tty->pgrp = pgrp;
2124 return 0;
2125}
2126
2127static int tiocgsid(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
2128{
2129
2130
2131
2132
2133 if (tty == real_tty && current->signal->tty != real_tty)
2134 return -ENOTTY;
2135 if (real_tty->session <= 0)
2136 return -ENOTTY;
2137 return put_user(real_tty->session, p);
2138}
2139
2140static int tiocsetd(struct tty_struct *tty, int __user *p)
2141{
2142 int ldisc;
2143
2144 if (get_user(ldisc, p))
2145 return -EFAULT;
2146 return tty_set_ldisc(tty, ldisc);
2147}
2148
2149static int send_break(struct tty_struct *tty, int duration)
2150{
2151 tty->driver->break_ctl(tty, -1);
2152 if (!signal_pending(current)) {
2153 set_current_state(TASK_INTERRUPTIBLE);
2154 schedule_timeout(duration);
2155 }
2156 tty->driver->break_ctl(tty, 0);
2157 if (signal_pending(current))
2158 return -EINTR;
2159 return 0;
2160}
2161
2162static int
2163tty_tiocmget(struct tty_struct *tty, struct file *file, int __user *p)
2164{
2165 int retval = -EINVAL;
2166
2167 if (tty->driver->tiocmget) {
2168 retval = tty->driver->tiocmget(tty, file);
2169
2170 if (retval >= 0)
2171 retval = put_user(retval, p);
2172 }
2173 return retval;
2174}
2175
2176static int
2177tty_tiocmset(struct tty_struct *tty, struct file *file, unsigned int cmd,
2178 unsigned __user *p)
2179{
2180 int retval = -EINVAL;
2181
2182 if (tty->driver->tiocmset) {
2183 unsigned int set, clear, val;
2184
2185 retval = get_user(val, p);
2186 if (retval)
2187 return retval;
2188
2189 set = clear = 0;
2190 switch (cmd) {
2191 case TIOCMBIS:
2192 set = val;
2193 break;
2194 case TIOCMBIC:
2195 clear = val;
2196 break;
2197 case TIOCMSET:
2198 set = val;
2199 clear = ~val;
2200 break;
2201 }
2202
2203 set &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP;
2204 clear &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP;
2205
2206 retval = tty->driver->tiocmset(tty, file, set, clear);
2207 }
2208 return retval;
2209}
2210
2211
2212
2213
2214int tty_ioctl(struct inode * inode, struct file * file,
2215 unsigned int cmd, unsigned long arg)
2216{
2217 struct tty_struct *tty, *real_tty;
2218 void __user *p = (void __user *)arg;
2219 int retval;
2220 struct tty_ldisc *ld;
2221
2222 tty = (struct tty_struct *)file->private_data;
2223 if (tty_paranoia_check(tty, inode, "tty_ioctl"))
2224 return -EINVAL;
2225
2226 real_tty = tty;
2227 if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
2228 tty->driver->subtype == PTY_TYPE_MASTER)
2229 real_tty = tty->link;
2230
2231
2232
2233
2234 if (!tty->driver->break_ctl) {
2235 switch(cmd) {
2236 case TIOCSBRK:
2237 case TIOCCBRK:
2238 if (tty->driver->ioctl)
2239 return tty->driver->ioctl(tty, file, cmd, arg);
2240 return -EINVAL;
2241
2242
2243
2244 case TCSBRK:
2245 case TCSBRKP:
2246 if (!tty->driver->ioctl)
2247 return 0;
2248 retval = tty->driver->ioctl(tty, file, cmd, arg);
2249 if (retval == -ENOIOCTLCMD)
2250 retval = 0;
2251 return retval;
2252 }
2253 }
2254
2255
2256
2257
2258 switch (cmd) {
2259 case TIOCSETD:
2260 case TIOCSBRK:
2261 case TIOCCBRK:
2262 case TCSBRK:
2263 case TCSBRKP:
2264 retval = tty_check_change(tty);
2265 if (retval)
2266 return retval;
2267 if (cmd != TIOCCBRK) {
2268 tty_wait_until_sent(tty, 0);
2269 if (signal_pending(current))
2270 return -EINTR;
2271 }
2272 break;
2273 }
2274
2275 switch (cmd) {
2276 case TIOCSTI:
2277 return tiocsti(tty, p);
2278 case TIOCGWINSZ:
2279 return tiocgwinsz(tty, p);
2280 case TIOCSWINSZ:
2281 return tiocswinsz(tty, real_tty, p);
2282 case TIOCCONS:
2283 return real_tty!=tty ? -EINVAL : tioccons(file);
2284 case FIONBIO:
2285 return fionbio(file, p);
2286 case TIOCEXCL:
2287 set_bit(TTY_EXCLUSIVE, &tty->flags);
2288 return 0;
2289 case TIOCNXCL:
2290 clear_bit(TTY_EXCLUSIVE, &tty->flags);
2291 return 0;
2292 case TIOCNOTTY:
2293 if (current->signal->tty != tty)
2294 return -ENOTTY;
2295 if (current->signal->leader)
2296 disassociate_ctty(0);
2297 task_lock(current);
2298 current->signal->tty = NULL;
2299 task_unlock(current);
2300 return 0;
2301 case TIOCSCTTY:
2302 return tiocsctty(tty, arg);
2303 case TIOCGPGRP:
2304 return tiocgpgrp(tty, real_tty, p);
2305 case TIOCSPGRP:
2306 return tiocspgrp(tty, real_tty, p);
2307 case TIOCGSID:
2308 return tiocgsid(tty, real_tty, p);
2309 case TIOCGETD:
2310
2311 return put_user(tty->ldisc.num, (int __user *)p);
2312 case TIOCSETD:
2313 return tiocsetd(tty, p);
2314#ifdef CONFIG_VT
2315 case TIOCLINUX:
2316 return tioclinux(tty, arg);
2317#endif
2318
2319
2320
2321 case TIOCSBRK:
2322 tty->driver->break_ctl(tty, -1);
2323 return 0;
2324
2325 case TIOCCBRK:
2326 tty->driver->break_ctl(tty, 0);
2327 return 0;
2328 case TCSBRK:
2329
2330
2331
2332
2333
2334 if (!arg)
2335 return send_break(tty, HZ/4);
2336 return 0;
2337 case TCSBRKP:
2338 return send_break(tty, arg ? arg*(HZ/10) : HZ/4);
2339
2340 case TIOCMGET:
2341 return tty_tiocmget(tty, file, p);
2342
2343 case TIOCMSET:
2344 case TIOCMBIC:
2345 case TIOCMBIS:
2346 return tty_tiocmset(tty, file, cmd, p);
2347 }
2348 if (tty->driver->ioctl) {
2349 retval = (tty->driver->ioctl)(tty, file, cmd, arg);
2350 if (retval != -ENOIOCTLCMD)
2351 return retval;
2352 }
2353 ld = tty_ldisc_ref_wait(tty);
2354 retval = -EINVAL;
2355 if (ld->ioctl) {
2356 retval = ld->ioctl(tty, file, cmd, arg);
2357 if (retval == -ENOIOCTLCMD)
2358 retval = -EINVAL;
2359 }
2360 tty_ldisc_deref(ld);
2361 return retval;
2362}
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384static void __do_SAK(void *arg)
2385{
2386#ifdef TTY_SOFT_SAK
2387 tty_hangup(tty);
2388#else
2389 struct tty_struct *tty = arg;
2390 struct task_struct *p;
2391 int session;
2392 int i;
2393 struct file *filp;
2394 struct tty_ldisc *disc;
2395
2396 if (!tty)
2397 return;
2398 session = tty->session;
2399
2400
2401 disc = tty_ldisc_ref(tty);
2402 if (disc && disc->flush_buffer)
2403 disc->flush_buffer(tty);
2404 tty_ldisc_deref(disc);
2405
2406 if (tty->driver->flush_buffer)
2407 tty->driver->flush_buffer(tty);
2408
2409 read_lock(&tasklist_lock);
2410 do_each_task_pid(session, PIDTYPE_SID, p) {
2411 if (p->signal->tty == tty || session > 0) {
2412 printk(KERN_NOTICE "SAK: killed process %d"
2413 " (%s): p->signal->session==tty->session\n",
2414 p->pid, p->comm);
2415 send_sig(SIGKILL, p, 1);
2416 continue;
2417 }
2418 task_lock(p);
2419 if (p->files) {
2420 spin_lock(&p->files->file_lock);
2421 for (i=0; i < p->files->max_fds; i++) {
2422 filp = fcheck_files(p->files, i);
2423 if (!filp)
2424 continue;
2425 if (filp->f_op->read == tty_read &&
2426 filp->private_data == tty) {
2427 printk(KERN_NOTICE "SAK: killed process %d"
2428 " (%s): fd#%d opened to the tty\n",
2429 p->pid, p->comm, i);
2430 send_sig(SIGKILL, p, 1);
2431 break;
2432 }
2433 }
2434 spin_unlock(&p->files->file_lock);
2435 }
2436 task_unlock(p);
2437 } while_each_task_pid(session, PIDTYPE_SID, p);
2438 read_unlock(&tasklist_lock);
2439#endif
2440}
2441
2442
2443
2444
2445
2446
2447
2448void do_SAK(struct tty_struct *tty)
2449{
2450 if (!tty)
2451 return;
2452 PREPARE_WORK(&tty->SAK_work, __do_SAK, tty);
2453 schedule_work(&tty->SAK_work);
2454}
2455
2456EXPORT_SYMBOL(do_SAK);
2457
2458
2459
2460
2461
2462
2463static void flush_to_ldisc(void *private_)
2464{
2465 struct tty_struct *tty = (struct tty_struct *) private_;
2466 unsigned char *cp;
2467 char *fp;
2468 int count;
2469 unsigned long flags;
2470 struct tty_ldisc *disc;
2471
2472 disc = tty_ldisc_ref(tty);
2473 if (disc == NULL)
2474 return;
2475
2476 if (test_bit(TTY_DONT_FLIP, &tty->flags)) {
2477
2478
2479
2480 schedule_delayed_work(&tty->flip.work, 1);
2481 goto out;
2482 }
2483 spin_lock_irqsave(&tty->read_lock, flags);
2484 if (tty->flip.buf_num) {
2485 cp = tty->flip.char_buf + TTY_FLIPBUF_SIZE;
2486 fp = tty->flip.flag_buf + TTY_FLIPBUF_SIZE;
2487 tty->flip.buf_num = 0;
2488 tty->flip.char_buf_ptr = tty->flip.char_buf;
2489 tty->flip.flag_buf_ptr = tty->flip.flag_buf;
2490 } else {
2491 cp = tty->flip.char_buf;
2492 fp = tty->flip.flag_buf;
2493 tty->flip.buf_num = 1;
2494 tty->flip.char_buf_ptr = tty->flip.char_buf + TTY_FLIPBUF_SIZE;
2495 tty->flip.flag_buf_ptr = tty->flip.flag_buf + TTY_FLIPBUF_SIZE;
2496 }
2497 count = tty->flip.count;
2498 tty->flip.count = 0;
2499 spin_unlock_irqrestore(&tty->read_lock, flags);
2500
2501 disc->receive_buf(tty, cp, fp, count);
2502out:
2503 tty_ldisc_deref(disc);
2504}
2505
2506
2507
2508
2509
2510
2511int tty_push_data(struct tty_struct *tty, unsigned char *cp, unsigned char *fp, int count)
2512{
2513 int ret = 0;
2514 struct tty_ldisc *disc;
2515
2516 disc = tty_ldisc_ref(tty);
2517 if(test_bit(TTY_DONT_FLIP, &tty->flags))
2518 ret = -EAGAIN;
2519 else if(disc == NULL)
2520 ret = -EIO;
2521 else
2522 disc->receive_buf(tty, cp, fp, count);
2523 tty_ldisc_deref(disc);
2524 return ret;
2525
2526}
2527
2528
2529
2530
2531
2532
2533
2534static int baud_table[] = {
2535 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
2536 9600, 19200, 38400, 57600, 115200, 230400, 460800,
2537#ifdef __sparc__
2538 76800, 153600, 307200, 614400, 921600
2539#else
2540 500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000,
2541 2500000, 3000000, 3500000, 4000000
2542#endif
2543};
2544
2545static int n_baud_table = ARRAY_SIZE(baud_table);
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556int tty_termios_baud_rate(struct termios *termios)
2557{
2558 unsigned int cbaud;
2559
2560 cbaud = termios->c_cflag & CBAUD;
2561
2562 if (cbaud & CBAUDEX) {
2563 cbaud &= ~CBAUDEX;
2564
2565 if (cbaud < 1 || cbaud + 15 > n_baud_table)
2566 termios->c_cflag &= ~CBAUDEX;
2567 else
2568 cbaud += 15;
2569 }
2570 return baud_table[cbaud];
2571}
2572
2573EXPORT_SYMBOL(tty_termios_baud_rate);
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584int tty_get_baud_rate(struct tty_struct *tty)
2585{
2586 int baud = tty_termios_baud_rate(tty->termios);
2587
2588 if (baud == 38400 && tty->alt_speed) {
2589 if (!tty->warned) {
2590 printk(KERN_WARNING "Use of setserial/setrocket to "
2591 "set SPD_* flags is deprecated\n");
2592 tty->warned = 1;
2593 }
2594 baud = tty->alt_speed;
2595 }
2596
2597 return baud;
2598}
2599
2600EXPORT_SYMBOL(tty_get_baud_rate);
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613void tty_flip_buffer_push(struct tty_struct *tty)
2614{
2615 if (tty->low_latency)
2616 flush_to_ldisc((void *) tty);
2617 else
2618 schedule_delayed_work(&tty->flip.work, 1);
2619}
2620
2621EXPORT_SYMBOL(tty_flip_buffer_push);
2622
2623
2624
2625
2626static void initialize_tty_struct(struct tty_struct *tty)
2627{
2628 memset(tty, 0, sizeof(struct tty_struct));
2629 tty->magic = TTY_MAGIC;
2630 tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
2631 tty->pgrp = -1;
2632 tty->flip.char_buf_ptr = tty->flip.char_buf;
2633 tty->flip.flag_buf_ptr = tty->flip.flag_buf;
2634 INIT_WORK(&tty->flip.work, flush_to_ldisc, tty);
2635 init_MUTEX(&tty->flip.pty_sem);
2636 init_MUTEX(&tty->termios_sem);
2637 init_waitqueue_head(&tty->write_wait);
2638 init_waitqueue_head(&tty->read_wait);
2639 INIT_WORK(&tty->hangup_work, do_tty_hangup, tty);
2640 sema_init(&tty->atomic_read, 1);
2641 sema_init(&tty->atomic_write, 1);
2642 spin_lock_init(&tty->read_lock);
2643 INIT_LIST_HEAD(&tty->tty_files);
2644 INIT_WORK(&tty->SAK_work, NULL, NULL);
2645}
2646
2647
2648
2649
2650static void tty_default_put_char(struct tty_struct *tty, unsigned char ch)
2651{
2652 tty->driver->write(tty, &ch, 1);
2653}
2654
2655static struct class_simple *tty_class;
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669void tty_register_device(struct tty_driver *driver, unsigned index,
2670 struct device *device)
2671{
2672 char name[64];
2673 dev_t dev = MKDEV(driver->major, driver->minor_start) + index;
2674
2675 if (index >= driver->num) {
2676 printk(KERN_ERR "Attempt to register invalid tty line number "
2677 " (%d).\n", index);
2678 return;
2679 }
2680
2681 devfs_mk_cdev(dev, S_IFCHR | S_IRUSR | S_IWUSR,
2682 "%s%d", driver->devfs_name, index + driver->name_base);
2683
2684 if (driver->type == TTY_DRIVER_TYPE_PTY)
2685 pty_line_name(driver, index, name);
2686 else
2687 tty_line_name(driver, index, name);
2688 class_simple_device_add(tty_class, dev, device, name);
2689}
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699void tty_unregister_device(struct tty_driver *driver, unsigned index)
2700{
2701 devfs_remove("%s%d", driver->devfs_name, index + driver->name_base);
2702 class_simple_device_remove(MKDEV(driver->major, driver->minor_start) + index);
2703}
2704
2705EXPORT_SYMBOL(tty_register_device);
2706EXPORT_SYMBOL(tty_unregister_device);
2707
2708struct tty_driver *alloc_tty_driver(int lines)
2709{
2710 struct tty_driver *driver;
2711
2712 driver = kmalloc(sizeof(struct tty_driver), GFP_KERNEL);
2713 if (driver) {
2714 memset(driver, 0, sizeof(struct tty_driver));
2715 driver->magic = TTY_DRIVER_MAGIC;
2716 driver->num = lines;
2717
2718 }
2719 return driver;
2720}
2721
2722void put_tty_driver(struct tty_driver *driver)
2723{
2724 kfree(driver);
2725}
2726
2727void tty_set_operations(struct tty_driver *driver, struct tty_operations *op)
2728{
2729 driver->open = op->open;
2730 driver->close = op->close;
2731 driver->write = op->write;
2732 driver->put_char = op->put_char;
2733 driver->flush_chars = op->flush_chars;
2734 driver->write_room = op->write_room;
2735 driver->chars_in_buffer = op->chars_in_buffer;
2736 driver->ioctl = op->ioctl;
2737 driver->set_termios = op->set_termios;
2738 driver->throttle = op->throttle;
2739 driver->unthrottle = op->unthrottle;
2740 driver->stop = op->stop;
2741 driver->start = op->start;
2742 driver->hangup = op->hangup;
2743 driver->break_ctl = op->break_ctl;
2744 driver->flush_buffer = op->flush_buffer;
2745 driver->set_ldisc = op->set_ldisc;
2746 driver->wait_until_sent = op->wait_until_sent;
2747 driver->send_xchar = op->send_xchar;
2748 driver->read_proc = op->read_proc;
2749 driver->write_proc = op->write_proc;
2750 driver->tiocmget = op->tiocmget;
2751 driver->tiocmset = op->tiocmset;
2752}
2753
2754
2755EXPORT_SYMBOL(alloc_tty_driver);
2756EXPORT_SYMBOL(put_tty_driver);
2757EXPORT_SYMBOL(tty_set_operations);
2758
2759
2760
2761
2762int tty_register_driver(struct tty_driver *driver)
2763{
2764 int error;
2765 int i;
2766 dev_t dev;
2767 void **p = NULL;
2768
2769 if (driver->flags & TTY_DRIVER_INSTALLED)
2770 return 0;
2771
2772 if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
2773 p = kmalloc(driver->num * 3 * sizeof(void *), GFP_KERNEL);
2774 if (!p)
2775 return -ENOMEM;
2776 memset(p, 0, driver->num * 3 * sizeof(void *));
2777 }
2778
2779 if (!driver->major) {
2780 error = alloc_chrdev_region(&dev, driver->minor_start, driver->num,
2781 (char*)driver->name);
2782 if (!error) {
2783 driver->major = MAJOR(dev);
2784 driver->minor_start = MINOR(dev);
2785 }
2786 } else {
2787 dev = MKDEV(driver->major, driver->minor_start);
2788 error = register_chrdev_region(dev, driver->num,
2789 (char*)driver->name);
2790 }
2791 if (error < 0) {
2792 kfree(p);
2793 return error;
2794 }
2795
2796 if (p) {
2797 driver->ttys = (struct tty_struct **)p;
2798 driver->termios = (struct termios **)(p + driver->num);
2799 driver->termios_locked = (struct termios **)(p + driver->num * 2);
2800 } else {
2801 driver->ttys = NULL;
2802 driver->termios = NULL;
2803 driver->termios_locked = NULL;
2804 }
2805
2806 cdev_init(&driver->cdev, &tty_fops);
2807 driver->cdev.owner = driver->owner;
2808 error = cdev_add(&driver->cdev, dev, driver->num);
2809 if (error) {
2810 cdev_del(&driver->cdev);
2811 unregister_chrdev_region(dev, driver->num);
2812 driver->ttys = NULL;
2813 driver->termios = driver->termios_locked = NULL;
2814 kfree(p);
2815 return error;
2816 }
2817
2818 if (!driver->put_char)
2819 driver->put_char = tty_default_put_char;
2820
2821 list_add(&driver->tty_drivers, &tty_drivers);
2822
2823 if ( !(driver->flags & TTY_DRIVER_NO_DEVFS) ) {
2824 for(i = 0; i < driver->num; i++)
2825 tty_register_device(driver, i, NULL);
2826 }
2827 proc_tty_register_driver(driver);
2828 return 0;
2829}
2830
2831EXPORT_SYMBOL(tty_register_driver);
2832
2833
2834
2835
2836int tty_unregister_driver(struct tty_driver *driver)
2837{
2838 int i;
2839 struct termios *tp;
2840 void *p;
2841
2842 if (driver->refcount)
2843 return -EBUSY;
2844
2845 unregister_chrdev_region(MKDEV(driver->major, driver->minor_start),
2846 driver->num);
2847
2848 list_del(&driver->tty_drivers);
2849
2850
2851
2852
2853
2854
2855 for (i = 0; i < driver->num; i++) {
2856 tp = driver->termios[i];
2857 if (tp) {
2858 driver->termios[i] = NULL;
2859 kfree(tp);
2860 }
2861 tp = driver->termios_locked[i];
2862 if (tp) {
2863 driver->termios_locked[i] = NULL;
2864 kfree(tp);
2865 }
2866 if (!(driver->flags & TTY_DRIVER_NO_DEVFS))
2867 tty_unregister_device(driver, i);
2868 }
2869 p = driver->ttys;
2870 proc_tty_unregister_driver(driver);
2871 driver->ttys = NULL;
2872 driver->termios = driver->termios_locked = NULL;
2873 kfree(p);
2874 cdev_del(&driver->cdev);
2875 return 0;
2876}
2877
2878EXPORT_SYMBOL(tty_unregister_driver);
2879
2880
2881
2882
2883
2884
2885
2886
2887void __init console_init(void)
2888{
2889 initcall_t *call;
2890
2891
2892 (void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);
2893
2894
2895
2896
2897
2898#ifdef CONFIG_EARLY_PRINTK
2899 disable_early_printk();
2900#endif
2901#ifdef CONFIG_SERIAL_68360
2902
2903
2904 rs_360_init();
2905#endif
2906 call = &__con_initcall_start;
2907 while (call < &__con_initcall_end) {
2908 (*call)();
2909 call++;
2910 }
2911}
2912
2913#ifdef CONFIG_VT
2914extern int vty_init(void);
2915#endif
2916
2917static int __init tty_class_init(void)
2918{
2919 tty_class = class_simple_create(THIS_MODULE, "tty");
2920 if (IS_ERR(tty_class))
2921 return PTR_ERR(tty_class);
2922 return 0;
2923}
2924
2925postcore_initcall(tty_class_init);
2926
2927
2928
2929static struct cdev tty_cdev, console_cdev;
2930#ifdef CONFIG_UNIX98_PTYS
2931static struct cdev ptmx_cdev;
2932#endif
2933#ifdef CONFIG_VT
2934static struct cdev vc0_cdev;
2935#endif
2936
2937
2938
2939
2940
2941static int __init tty_init(void)
2942{
2943 cdev_init(&tty_cdev, &tty_fops);
2944 if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) ||
2945 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)
2946 panic("Couldn't register /dev/tty driver\n");
2947 devfs_mk_cdev(MKDEV(TTYAUX_MAJOR, 0), S_IFCHR|S_IRUGO|S_IWUGO, "tty");
2948 class_simple_device_add(tty_class, MKDEV(TTYAUX_MAJOR, 0), NULL, "tty");
2949
2950 cdev_init(&console_cdev, &console_fops);
2951 if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) ||
2952 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)
2953 panic("Couldn't register /dev/console driver\n");
2954 devfs_mk_cdev(MKDEV(TTYAUX_MAJOR, 1), S_IFCHR|S_IRUSR|S_IWUSR, "console");
2955 class_simple_device_add(tty_class, MKDEV(TTYAUX_MAJOR, 1), NULL, "console");
2956
2957#ifdef CONFIG_UNIX98_PTYS
2958 cdev_init(&ptmx_cdev, &ptmx_fops);
2959 if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) ||
2960 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0)
2961 panic("Couldn't register /dev/ptmx driver\n");
2962 devfs_mk_cdev(MKDEV(TTYAUX_MAJOR, 2), S_IFCHR|S_IRUGO|S_IWUGO, "ptmx");
2963 class_simple_device_add(tty_class, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx");
2964#endif
2965
2966#ifdef CONFIG_VT
2967 cdev_init(&vc0_cdev, &console_fops);
2968 if (cdev_add(&vc0_cdev, MKDEV(TTY_MAJOR, 0), 1) ||
2969 register_chrdev_region(MKDEV(TTY_MAJOR, 0), 1, "/dev/vc/0") < 0)
2970 panic("Couldn't register /dev/tty0 driver\n");
2971 devfs_mk_cdev(MKDEV(TTY_MAJOR, 0), S_IFCHR|S_IRUSR|S_IWUSR, "vc/0");
2972 class_simple_device_add(tty_class, MKDEV(TTY_MAJOR, 0), NULL, "tty0");
2973
2974 vty_init();
2975#endif
2976 return 0;
2977}
2978module_init(tty_init);
2979