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#include <linux/types.h>
68#include <linux/major.h>
69#include <linux/errno.h>
70#include <linux/signal.h>
71#include <linux/fcntl.h>
72#include <linux/sched.h>
73#include <linux/interrupt.h>
74#include <linux/tty.h>
75#include <linux/tty_driver.h>
76#include <linux/tty_flip.h>
77#include <linux/devpts_fs.h>
78#include <linux/file.h>
79#include <linux/fdtable.h>
80#include <linux/console.h>
81#include <linux/timer.h>
82#include <linux/ctype.h>
83#include <linux/kd.h>
84#include <linux/mm.h>
85#include <linux/string.h>
86#include <linux/slab.h>
87#include <linux/poll.h>
88#include <linux/proc_fs.h>
89#include <linux/init.h>
90#include <linux/module.h>
91#include <linux/device.h>
92#include <linux/wait.h>
93#include <linux/bitops.h>
94#include <linux/delay.h>
95#include <linux/seq_file.h>
96#include <linux/serial.h>
97#include <linux/ratelimit.h>
98
99#include <linux/uaccess.h>
100
101#include <linux/kbd_kern.h>
102#include <linux/vt_kern.h>
103#include <linux/selection.h>
104
105#include <linux/kmod.h>
106#include <linux/nsproxy.h>
107
108#undef TTY_DEBUG_HANGUP
109#ifdef TTY_DEBUG_HANGUP
110# define tty_debug_hangup(tty, f, args...) tty_debug(tty, f, ##args)
111#else
112# define tty_debug_hangup(tty, f, args...) do { } while (0)
113#endif
114
115#define TTY_PARANOIA_CHECK 1
116#define CHECK_TTY_COUNT 1
117
118struct ktermios tty_std_termios = {
119 .c_iflag = ICRNL | IXON,
120 .c_oflag = OPOST | ONLCR,
121 .c_cflag = B38400 | CS8 | CREAD | HUPCL,
122 .c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK |
123 ECHOCTL | ECHOKE | IEXTEN,
124 .c_cc = INIT_C_CC,
125 .c_ispeed = 38400,
126 .c_ospeed = 38400
127};
128
129EXPORT_SYMBOL(tty_std_termios);
130
131
132
133
134
135LIST_HEAD(tty_drivers);
136
137
138
139DEFINE_MUTEX(tty_mutex);
140EXPORT_SYMBOL(tty_mutex);
141
142
143DEFINE_SPINLOCK(tty_files_lock);
144
145static ssize_t tty_read(struct file *, char __user *, size_t, loff_t *);
146static ssize_t tty_write(struct file *, const char __user *, size_t, loff_t *);
147ssize_t redirected_tty_write(struct file *, const char __user *,
148 size_t, loff_t *);
149static unsigned int tty_poll(struct file *, poll_table *);
150static int tty_open(struct inode *, struct file *);
151long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
152#ifdef CONFIG_COMPAT
153static long tty_compat_ioctl(struct file *file, unsigned int cmd,
154 unsigned long arg);
155#else
156#define tty_compat_ioctl NULL
157#endif
158static int __tty_fasync(int fd, struct file *filp, int on);
159static int tty_fasync(int fd, struct file *filp, int on);
160static void release_tty(struct tty_struct *tty, int idx);
161
162
163
164
165
166
167
168
169
170
171void free_tty_struct(struct tty_struct *tty)
172{
173 if (!tty)
174 return;
175 put_device(tty->dev);
176 kfree(tty->write_buf);
177 tty->magic = 0xDEADDEAD;
178 kfree(tty);
179}
180
181static inline struct tty_struct *file_tty(struct file *file)
182{
183 return ((struct tty_file_private *)file->private_data)->tty;
184}
185
186int tty_alloc_file(struct file *file)
187{
188 struct tty_file_private *priv;
189
190 priv = kmalloc(sizeof(*priv), GFP_KERNEL);
191 if (!priv)
192 return -ENOMEM;
193
194 file->private_data = priv;
195
196 return 0;
197}
198
199
200void tty_add_file(struct tty_struct *tty, struct file *file)
201{
202 struct tty_file_private *priv = file->private_data;
203
204 priv->tty = tty;
205 priv->file = file;
206
207 spin_lock(&tty_files_lock);
208 list_add(&priv->list, &tty->tty_files);
209 spin_unlock(&tty_files_lock);
210}
211
212
213
214
215
216
217
218void tty_free_file(struct file *file)
219{
220 struct tty_file_private *priv = file->private_data;
221
222 file->private_data = NULL;
223 kfree(priv);
224}
225
226
227static void tty_del_file(struct file *file)
228{
229 struct tty_file_private *priv = file->private_data;
230
231 spin_lock(&tty_files_lock);
232 list_del(&priv->list);
233 spin_unlock(&tty_files_lock);
234 tty_free_file(file);
235}
236
237
238#define TTY_NUMBER(tty) ((tty)->index + (tty)->driver->name_base)
239
240
241
242
243
244
245
246
247
248
249
250const char *tty_name(const struct tty_struct *tty)
251{
252 if (!tty)
253 return "NULL tty";
254 return tty->name;
255}
256
257EXPORT_SYMBOL(tty_name);
258
259int tty_paranoia_check(struct tty_struct *tty, struct inode *inode,
260 const char *routine)
261{
262#ifdef TTY_PARANOIA_CHECK
263 if (!tty) {
264 printk(KERN_WARNING
265 "null TTY for (%d:%d) in %s\n",
266 imajor(inode), iminor(inode), routine);
267 return 1;
268 }
269 if (tty->magic != TTY_MAGIC) {
270 printk(KERN_WARNING
271 "bad magic number for tty struct (%d:%d) in %s\n",
272 imajor(inode), iminor(inode), routine);
273 return 1;
274 }
275#endif
276 return 0;
277}
278
279
280static int check_tty_count(struct tty_struct *tty, const char *routine)
281{
282#ifdef CHECK_TTY_COUNT
283 struct list_head *p;
284 int count = 0;
285
286 spin_lock(&tty_files_lock);
287 list_for_each(p, &tty->tty_files) {
288 count++;
289 }
290 spin_unlock(&tty_files_lock);
291 if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
292 tty->driver->subtype == PTY_TYPE_SLAVE &&
293 tty->link && tty->link->count)
294 count++;
295 if (tty->count != count) {
296 printk(KERN_WARNING "Warning: dev (%s) tty->count(%d) "
297 "!= #fd's(%d) in %s\n",
298 tty->name, tty->count, count, routine);
299 return count;
300 }
301#endif
302 return 0;
303}
304
305
306
307
308
309
310
311
312
313
314
315
316static struct tty_driver *get_tty_driver(dev_t device, int *index)
317{
318 struct tty_driver *p;
319
320 list_for_each_entry(p, &tty_drivers, tty_drivers) {
321 dev_t base = MKDEV(p->major, p->minor_start);
322 if (device < base || device >= base + p->num)
323 continue;
324 *index = device - base;
325 return tty_driver_kref_get(p);
326 }
327 return NULL;
328}
329
330#ifdef CONFIG_CONSOLE_POLL
331
332
333
334
335
336
337
338
339
340
341struct tty_driver *tty_find_polling_driver(char *name, int *line)
342{
343 struct tty_driver *p, *res = NULL;
344 int tty_line = 0;
345 int len;
346 char *str, *stp;
347
348 for (str = name; *str; str++)
349 if ((*str >= '0' && *str <= '9') || *str == ',')
350 break;
351 if (!*str)
352 return NULL;
353
354 len = str - name;
355 tty_line = simple_strtoul(str, &str, 10);
356
357 mutex_lock(&tty_mutex);
358
359 list_for_each_entry(p, &tty_drivers, tty_drivers) {
360 if (strncmp(name, p->name, len) != 0)
361 continue;
362 stp = str;
363 if (*stp == ',')
364 stp++;
365 if (*stp == '\0')
366 stp = NULL;
367
368 if (tty_line >= 0 && tty_line < p->num && p->ops &&
369 p->ops->poll_init && !p->ops->poll_init(p, tty_line, stp)) {
370 res = tty_driver_kref_get(p);
371 *line = tty_line;
372 break;
373 }
374 }
375 mutex_unlock(&tty_mutex);
376
377 return res;
378}
379EXPORT_SYMBOL_GPL(tty_find_polling_driver);
380#endif
381
382
383
384
385
386
387
388
389
390
391
392
393int __tty_check_change(struct tty_struct *tty, int sig)
394{
395 unsigned long flags;
396 struct pid *pgrp, *tty_pgrp;
397 int ret = 0;
398
399 if (current->signal->tty != tty)
400 return 0;
401
402 rcu_read_lock();
403 pgrp = task_pgrp(current);
404
405 spin_lock_irqsave(&tty->ctrl_lock, flags);
406 tty_pgrp = tty->pgrp;
407 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
408
409 if (tty_pgrp && pgrp != tty->pgrp) {
410 if (is_ignored(sig)) {
411 if (sig == SIGTTIN)
412 ret = -EIO;
413 } else if (is_current_pgrp_orphaned())
414 ret = -EIO;
415 else {
416 kill_pgrp(pgrp, sig, 1);
417 set_thread_flag(TIF_SIGPENDING);
418 ret = -ERESTARTSYS;
419 }
420 }
421 rcu_read_unlock();
422
423 if (!tty_pgrp) {
424 pr_warn("%s: tty_check_change: sig=%d, tty->pgrp == NULL!\n",
425 tty_name(tty), sig);
426 }
427
428 return ret;
429}
430
431int tty_check_change(struct tty_struct *tty)
432{
433 return __tty_check_change(tty, SIGTTOU);
434}
435EXPORT_SYMBOL(tty_check_change);
436
437static ssize_t hung_up_tty_read(struct file *file, char __user *buf,
438 size_t count, loff_t *ppos)
439{
440 return 0;
441}
442
443static ssize_t hung_up_tty_write(struct file *file, const char __user *buf,
444 size_t count, loff_t *ppos)
445{
446 return -EIO;
447}
448
449
450static unsigned int hung_up_tty_poll(struct file *filp, poll_table *wait)
451{
452 return POLLIN | POLLOUT | POLLERR | POLLHUP | POLLRDNORM | POLLWRNORM;
453}
454
455static long hung_up_tty_ioctl(struct file *file, unsigned int cmd,
456 unsigned long arg)
457{
458 return cmd == TIOCSPGRP ? -ENOTTY : -EIO;
459}
460
461static long hung_up_tty_compat_ioctl(struct file *file,
462 unsigned int cmd, unsigned long arg)
463{
464 return cmd == TIOCSPGRP ? -ENOTTY : -EIO;
465}
466
467static const struct file_operations tty_fops = {
468 .llseek = no_llseek,
469 .read = tty_read,
470 .write = tty_write,
471 .poll = tty_poll,
472 .unlocked_ioctl = tty_ioctl,
473 .compat_ioctl = tty_compat_ioctl,
474 .open = tty_open,
475 .release = tty_release,
476 .fasync = tty_fasync,
477};
478
479static const struct file_operations console_fops = {
480 .llseek = no_llseek,
481 .read = tty_read,
482 .write = redirected_tty_write,
483 .poll = tty_poll,
484 .unlocked_ioctl = tty_ioctl,
485 .compat_ioctl = tty_compat_ioctl,
486 .open = tty_open,
487 .release = tty_release,
488 .fasync = tty_fasync,
489};
490
491static const struct file_operations hung_up_tty_fops = {
492 .llseek = no_llseek,
493 .read = hung_up_tty_read,
494 .write = hung_up_tty_write,
495 .poll = hung_up_tty_poll,
496 .unlocked_ioctl = hung_up_tty_ioctl,
497 .compat_ioctl = hung_up_tty_compat_ioctl,
498 .release = tty_release,
499};
500
501static DEFINE_SPINLOCK(redirect_lock);
502static struct file *redirect;
503
504
505void proc_clear_tty(struct task_struct *p)
506{
507 unsigned long flags;
508 struct tty_struct *tty;
509 spin_lock_irqsave(&p->sighand->siglock, flags);
510 tty = p->signal->tty;
511 p->signal->tty = NULL;
512 spin_unlock_irqrestore(&p->sighand->siglock, flags);
513 tty_kref_put(tty);
514}
515
516
517
518
519
520
521
522
523
524
525
526static void __proc_set_tty(struct tty_struct *tty)
527{
528 unsigned long flags;
529
530 spin_lock_irqsave(&tty->ctrl_lock, flags);
531
532
533
534
535 put_pid(tty->session);
536 put_pid(tty->pgrp);
537 tty->pgrp = get_pid(task_pgrp(current));
538 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
539 tty->session = get_pid(task_session(current));
540 if (current->signal->tty) {
541 tty_debug(tty, "current tty %s not NULL!!\n",
542 current->signal->tty->name);
543 tty_kref_put(current->signal->tty);
544 }
545 put_pid(current->signal->tty_old_pgrp);
546 current->signal->tty = tty_kref_get(tty);
547 current->signal->tty_old_pgrp = NULL;
548}
549
550static void proc_set_tty(struct tty_struct *tty)
551{
552 spin_lock_irq(¤t->sighand->siglock);
553 __proc_set_tty(tty);
554 spin_unlock_irq(¤t->sighand->siglock);
555}
556
557struct tty_struct *get_current_tty(void)
558{
559 struct tty_struct *tty;
560 unsigned long flags;
561
562 spin_lock_irqsave(¤t->sighand->siglock, flags);
563 tty = tty_kref_get(current->signal->tty);
564 spin_unlock_irqrestore(¤t->sighand->siglock, flags);
565 return tty;
566}
567EXPORT_SYMBOL_GPL(get_current_tty);
568
569static void session_clear_tty(struct pid *session)
570{
571 struct task_struct *p;
572 do_each_pid_task(session, PIDTYPE_SID, p) {
573 proc_clear_tty(p);
574 } while_each_pid_task(session, PIDTYPE_SID, p);
575}
576
577
578
579
580
581
582
583
584
585
586void tty_wakeup(struct tty_struct *tty)
587{
588 struct tty_ldisc *ld;
589
590 if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) {
591 ld = tty_ldisc_ref(tty);
592 if (ld) {
593 if (ld->ops->write_wakeup)
594 ld->ops->write_wakeup(tty);
595 tty_ldisc_deref(ld);
596 }
597 }
598 wake_up_interruptible_poll(&tty->write_wait, POLLOUT);
599}
600
601EXPORT_SYMBOL_GPL(tty_wakeup);
602
603
604
605
606
607
608
609
610
611
612
613
614
615static int tty_signal_session_leader(struct tty_struct *tty, int exit_session)
616{
617 struct task_struct *p;
618 int refs = 0;
619 struct pid *tty_pgrp = NULL;
620
621 read_lock(&tasklist_lock);
622 if (tty->session) {
623 do_each_pid_task(tty->session, PIDTYPE_SID, p) {
624 spin_lock_irq(&p->sighand->siglock);
625 if (p->signal->tty == tty) {
626 p->signal->tty = NULL;
627
628
629 refs++;
630 }
631 if (!p->signal->leader) {
632 spin_unlock_irq(&p->sighand->siglock);
633 continue;
634 }
635 __group_send_sig_info(SIGHUP, SEND_SIG_PRIV, p);
636 __group_send_sig_info(SIGCONT, SEND_SIG_PRIV, p);
637 put_pid(p->signal->tty_old_pgrp);
638 spin_lock(&tty->ctrl_lock);
639 tty_pgrp = get_pid(tty->pgrp);
640 if (tty->pgrp)
641 p->signal->tty_old_pgrp = get_pid(tty->pgrp);
642 spin_unlock(&tty->ctrl_lock);
643 spin_unlock_irq(&p->sighand->siglock);
644 } while_each_pid_task(tty->session, PIDTYPE_SID, p);
645 }
646 read_unlock(&tasklist_lock);
647
648 if (tty_pgrp) {
649 if (exit_session)
650 kill_pgrp(tty_pgrp, SIGHUP, exit_session);
651 put_pid(tty_pgrp);
652 }
653
654 return refs;
655}
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679static void __tty_hangup(struct tty_struct *tty, int exit_session)
680{
681 struct file *cons_filp = NULL;
682 struct file *filp, *f = NULL;
683 struct tty_file_private *priv;
684 int closecount = 0, n;
685 int refs;
686
687 if (!tty)
688 return;
689
690
691 spin_lock(&redirect_lock);
692 if (redirect && file_tty(redirect) == tty) {
693 f = redirect;
694 redirect = NULL;
695 }
696 spin_unlock(&redirect_lock);
697
698 tty_lock(tty);
699
700 if (test_bit(TTY_HUPPED, &tty->flags)) {
701 tty_unlock(tty);
702 return;
703 }
704
705
706
707
708 check_tty_count(tty, "tty_hangup");
709
710 spin_lock(&tty_files_lock);
711
712 list_for_each_entry(priv, &tty->tty_files, list) {
713 filp = priv->file;
714 if (filp->f_op->write == redirected_tty_write)
715 cons_filp = filp;
716 if (filp->f_op->write != tty_write)
717 continue;
718 closecount++;
719 __tty_fasync(-1, filp, 0);
720 filp->f_op = &hung_up_tty_fops;
721 }
722 spin_unlock(&tty_files_lock);
723
724 refs = tty_signal_session_leader(tty, exit_session);
725
726 while (refs--)
727 tty_kref_put(tty);
728
729 tty_ldisc_hangup(tty);
730
731 spin_lock_irq(&tty->ctrl_lock);
732 clear_bit(TTY_THROTTLED, &tty->flags);
733 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
734 put_pid(tty->session);
735 put_pid(tty->pgrp);
736 tty->session = NULL;
737 tty->pgrp = NULL;
738 tty->ctrl_status = 0;
739 spin_unlock_irq(&tty->ctrl_lock);
740
741
742
743
744
745
746
747 if (cons_filp) {
748 if (tty->ops->close)
749 for (n = 0; n < closecount; n++)
750 tty->ops->close(tty, cons_filp);
751 } else if (tty->ops->hangup)
752 tty->ops->hangup(tty);
753
754
755
756
757
758
759 set_bit(TTY_HUPPED, &tty->flags);
760 tty_unlock(tty);
761
762 if (f)
763 fput(f);
764}
765
766static void do_tty_hangup(struct work_struct *work)
767{
768 struct tty_struct *tty =
769 container_of(work, struct tty_struct, hangup_work);
770
771 __tty_hangup(tty, 0);
772}
773
774
775
776
777
778
779
780
781
782void tty_hangup(struct tty_struct *tty)
783{
784 tty_debug_hangup(tty, "\n");
785 schedule_work(&tty->hangup_work);
786}
787
788EXPORT_SYMBOL(tty_hangup);
789
790
791
792
793
794
795
796
797
798
799void tty_vhangup(struct tty_struct *tty)
800{
801 tty_debug_hangup(tty, "\n");
802 __tty_hangup(tty, 0);
803}
804
805EXPORT_SYMBOL(tty_vhangup);
806
807
808
809
810
811
812
813
814void tty_vhangup_self(void)
815{
816 struct tty_struct *tty;
817
818 tty = get_current_tty();
819 if (tty) {
820 tty_vhangup(tty);
821 tty_kref_put(tty);
822 }
823}
824
825
826
827
828
829
830
831
832
833
834
835
836static void tty_vhangup_session(struct tty_struct *tty)
837{
838 tty_debug_hangup(tty, "\n");
839 __tty_hangup(tty, 1);
840}
841
842
843
844
845
846
847
848
849
850int tty_hung_up_p(struct file *filp)
851{
852 return (filp->f_op == &hung_up_tty_fops);
853}
854
855EXPORT_SYMBOL(tty_hung_up_p);
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882void disassociate_ctty(int on_exit)
883{
884 struct tty_struct *tty;
885
886 if (!current->signal->leader)
887 return;
888
889 tty = get_current_tty();
890 if (tty) {
891 if (on_exit && tty->driver->type != TTY_DRIVER_TYPE_PTY) {
892 tty_vhangup_session(tty);
893 } else {
894 struct pid *tty_pgrp = tty_get_pgrp(tty);
895 if (tty_pgrp) {
896 kill_pgrp(tty_pgrp, SIGHUP, on_exit);
897 if (!on_exit)
898 kill_pgrp(tty_pgrp, SIGCONT, on_exit);
899 put_pid(tty_pgrp);
900 }
901 }
902 tty_kref_put(tty);
903
904 } else if (on_exit) {
905 struct pid *old_pgrp;
906 spin_lock_irq(¤t->sighand->siglock);
907 old_pgrp = current->signal->tty_old_pgrp;
908 current->signal->tty_old_pgrp = NULL;
909 spin_unlock_irq(¤t->sighand->siglock);
910 if (old_pgrp) {
911 kill_pgrp(old_pgrp, SIGHUP, on_exit);
912 kill_pgrp(old_pgrp, SIGCONT, on_exit);
913 put_pid(old_pgrp);
914 }
915 return;
916 }
917
918 spin_lock_irq(¤t->sighand->siglock);
919 put_pid(current->signal->tty_old_pgrp);
920 current->signal->tty_old_pgrp = NULL;
921
922 tty = tty_kref_get(current->signal->tty);
923 if (tty) {
924 unsigned long flags;
925 spin_lock_irqsave(&tty->ctrl_lock, flags);
926 put_pid(tty->session);
927 put_pid(tty->pgrp);
928 tty->session = NULL;
929 tty->pgrp = NULL;
930 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
931 tty_kref_put(tty);
932 } else
933 tty_debug_hangup(tty, "no current tty\n");
934
935 spin_unlock_irq(¤t->sighand->siglock);
936
937 read_lock(&tasklist_lock);
938 session_clear_tty(task_session(current));
939 read_unlock(&tasklist_lock);
940}
941
942
943
944
945
946void no_tty(void)
947{
948
949
950
951 struct task_struct *tsk = current;
952 disassociate_ctty(0);
953 proc_clear_tty(tsk);
954}
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974void __stop_tty(struct tty_struct *tty)
975{
976 if (tty->stopped)
977 return;
978 tty->stopped = 1;
979 if (tty->ops->stop)
980 tty->ops->stop(tty);
981}
982
983void stop_tty(struct tty_struct *tty)
984{
985 unsigned long flags;
986
987 spin_lock_irqsave(&tty->flow_lock, flags);
988 __stop_tty(tty);
989 spin_unlock_irqrestore(&tty->flow_lock, flags);
990}
991EXPORT_SYMBOL(stop_tty);
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005void __start_tty(struct tty_struct *tty)
1006{
1007 if (!tty->stopped || tty->flow_stopped)
1008 return;
1009 tty->stopped = 0;
1010 if (tty->ops->start)
1011 tty->ops->start(tty);
1012 tty_wakeup(tty);
1013}
1014
1015void start_tty(struct tty_struct *tty)
1016{
1017 unsigned long flags;
1018
1019 spin_lock_irqsave(&tty->flow_lock, flags);
1020 __start_tty(tty);
1021 spin_unlock_irqrestore(&tty->flow_lock, flags);
1022}
1023EXPORT_SYMBOL(start_tty);
1024
1025static void tty_update_time(struct timespec *time)
1026{
1027 unsigned long sec = get_seconds();
1028
1029
1030
1031
1032
1033
1034
1035 if ((sec ^ time->tv_sec) & ~7)
1036 time->tv_sec = sec;
1037}
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054static ssize_t tty_read(struct file *file, char __user *buf, size_t count,
1055 loff_t *ppos)
1056{
1057 int i;
1058 struct inode *inode = file_inode(file);
1059 struct tty_struct *tty = file_tty(file);
1060 struct tty_ldisc *ld;
1061
1062 if (tty_paranoia_check(tty, inode, "tty_read"))
1063 return -EIO;
1064 if (!tty || (test_bit(TTY_IO_ERROR, &tty->flags)))
1065 return -EIO;
1066
1067
1068
1069 ld = tty_ldisc_ref_wait(tty);
1070 if (ld->ops->read)
1071 i = ld->ops->read(tty, file, buf, count);
1072 else
1073 i = -EIO;
1074 tty_ldisc_deref(ld);
1075
1076 if (i > 0)
1077 tty_update_time(&inode->i_atime);
1078
1079 return i;
1080}
1081
1082static void tty_write_unlock(struct tty_struct *tty)
1083{
1084 mutex_unlock(&tty->atomic_write_lock);
1085 wake_up_interruptible_poll(&tty->write_wait, POLLOUT);
1086}
1087
1088static int tty_write_lock(struct tty_struct *tty, int ndelay)
1089{
1090 if (!mutex_trylock(&tty->atomic_write_lock)) {
1091 if (ndelay)
1092 return -EAGAIN;
1093 if (mutex_lock_interruptible(&tty->atomic_write_lock))
1094 return -ERESTARTSYS;
1095 }
1096 return 0;
1097}
1098
1099
1100
1101
1102
1103static inline ssize_t do_tty_write(
1104 ssize_t (*write)(struct tty_struct *, struct file *, const unsigned char *, size_t),
1105 struct tty_struct *tty,
1106 struct file *file,
1107 const char __user *buf,
1108 size_t count)
1109{
1110 ssize_t ret, written = 0;
1111 unsigned int chunk;
1112
1113 ret = tty_write_lock(tty, file->f_flags & O_NDELAY);
1114 if (ret < 0)
1115 return ret;
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133 chunk = 2048;
1134 if (test_bit(TTY_NO_WRITE_SPLIT, &tty->flags))
1135 chunk = 65536;
1136 if (count < chunk)
1137 chunk = count;
1138
1139
1140 if (tty->write_cnt < chunk) {
1141 unsigned char *buf_chunk;
1142
1143 if (chunk < 1024)
1144 chunk = 1024;
1145
1146 buf_chunk = kmalloc(chunk, GFP_KERNEL);
1147 if (!buf_chunk) {
1148 ret = -ENOMEM;
1149 goto out;
1150 }
1151 kfree(tty->write_buf);
1152 tty->write_cnt = chunk;
1153 tty->write_buf = buf_chunk;
1154 }
1155
1156
1157 for (;;) {
1158 size_t size = count;
1159 if (size > chunk)
1160 size = chunk;
1161 ret = -EFAULT;
1162 if (copy_from_user(tty->write_buf, buf, size))
1163 break;
1164 ret = write(tty, file, tty->write_buf, size);
1165 if (ret <= 0)
1166 break;
1167 written += ret;
1168 buf += ret;
1169 count -= ret;
1170 if (!count)
1171 break;
1172 ret = -ERESTARTSYS;
1173 if (signal_pending(current))
1174 break;
1175 cond_resched();
1176 }
1177 if (written) {
1178 tty_update_time(&file_inode(file)->i_mtime);
1179 ret = written;
1180 }
1181out:
1182 tty_write_unlock(tty);
1183 return ret;
1184}
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198void tty_write_message(struct tty_struct *tty, char *msg)
1199{
1200 if (tty) {
1201 mutex_lock(&tty->atomic_write_lock);
1202 tty_lock(tty);
1203 if (tty->ops->write && tty->count > 0)
1204 tty->ops->write(tty, msg, strlen(msg));
1205 tty_unlock(tty);
1206 tty_write_unlock(tty);
1207 }
1208 return;
1209}
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228static ssize_t tty_write(struct file *file, const char __user *buf,
1229 size_t count, loff_t *ppos)
1230{
1231 struct tty_struct *tty = file_tty(file);
1232 struct tty_ldisc *ld;
1233 ssize_t ret;
1234
1235 if (tty_paranoia_check(tty, file_inode(file), "tty_write"))
1236 return -EIO;
1237 if (!tty || !tty->ops->write ||
1238 (test_bit(TTY_IO_ERROR, &tty->flags)))
1239 return -EIO;
1240
1241 if (tty->ops->write_room == NULL)
1242 printk(KERN_ERR "tty driver %s lacks a write_room method.\n",
1243 tty->driver->name);
1244 ld = tty_ldisc_ref_wait(tty);
1245 if (!ld->ops->write)
1246 ret = -EIO;
1247 else
1248 ret = do_tty_write(ld->ops->write, tty, file, buf, count);
1249 tty_ldisc_deref(ld);
1250 return ret;
1251}
1252
1253ssize_t redirected_tty_write(struct file *file, const char __user *buf,
1254 size_t count, loff_t *ppos)
1255{
1256 struct file *p = NULL;
1257
1258 spin_lock(&redirect_lock);
1259 if (redirect)
1260 p = get_file(redirect);
1261 spin_unlock(&redirect_lock);
1262
1263 if (p) {
1264 ssize_t res;
1265 res = vfs_write(p, buf, count, &p->f_pos);
1266 fput(p);
1267 return res;
1268 }
1269 return tty_write(file, buf, count, ppos);
1270}
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280int tty_send_xchar(struct tty_struct *tty, char ch)
1281{
1282 int was_stopped = tty->stopped;
1283
1284 if (tty->ops->send_xchar) {
1285 down_read(&tty->termios_rwsem);
1286 tty->ops->send_xchar(tty, ch);
1287 up_read(&tty->termios_rwsem);
1288 return 0;
1289 }
1290
1291 if (tty_write_lock(tty, 0) < 0)
1292 return -ERESTARTSYS;
1293
1294 down_read(&tty->termios_rwsem);
1295 if (was_stopped)
1296 start_tty(tty);
1297 tty->ops->write(tty, &ch, 1);
1298 if (was_stopped)
1299 stop_tty(tty);
1300 up_read(&tty->termios_rwsem);
1301 tty_write_unlock(tty);
1302 return 0;
1303}
1304
1305static char ptychar[] = "pqrstuvwxyzabcde";
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318static void pty_line_name(struct tty_driver *driver, int index, char *p)
1319{
1320 int i = index + driver->name_base;
1321
1322 sprintf(p, "%s%c%x",
1323 driver->subtype == PTY_TYPE_SLAVE ? "tty" : driver->name,
1324 ptychar[i >> 4 & 0xf], i & 0xf);
1325}
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338static ssize_t tty_line_name(struct tty_driver *driver, int index, char *p)
1339{
1340 if (driver->flags & TTY_DRIVER_UNNUMBERED_NODE)
1341 return sprintf(p, "%s", driver->name);
1342 else
1343 return sprintf(p, "%s%d", driver->name,
1344 index + driver->name_base);
1345}
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357static struct tty_struct *tty_driver_lookup_tty(struct tty_driver *driver,
1358 struct inode *inode, int idx)
1359{
1360 struct tty_struct *tty;
1361
1362 if (driver->ops->lookup)
1363 tty = driver->ops->lookup(driver, inode, idx);
1364 else
1365 tty = driver->ttys[idx];
1366
1367 if (!IS_ERR(tty))
1368 tty_kref_get(tty);
1369 return tty;
1370}
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380int tty_init_termios(struct tty_struct *tty)
1381{
1382 struct ktermios *tp;
1383 int idx = tty->index;
1384
1385 if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
1386 tty->termios = tty->driver->init_termios;
1387 else {
1388
1389 tp = tty->driver->termios[idx];
1390 if (tp != NULL)
1391 tty->termios = *tp;
1392 else
1393 tty->termios = tty->driver->init_termios;
1394 }
1395
1396 tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios);
1397 tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios);
1398 return 0;
1399}
1400EXPORT_SYMBOL_GPL(tty_init_termios);
1401
1402int tty_standard_install(struct tty_driver *driver, struct tty_struct *tty)
1403{
1404 int ret = tty_init_termios(tty);
1405 if (ret)
1406 return ret;
1407
1408 tty_driver_kref_get(driver);
1409 tty->count++;
1410 driver->ttys[tty->index] = tty;
1411 return 0;
1412}
1413EXPORT_SYMBOL_GPL(tty_standard_install);
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427static int tty_driver_install_tty(struct tty_driver *driver,
1428 struct tty_struct *tty)
1429{
1430 return driver->ops->install ? driver->ops->install(driver, tty) :
1431 tty_standard_install(driver, tty);
1432}
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444void tty_driver_remove_tty(struct tty_driver *driver, struct tty_struct *tty)
1445{
1446 if (driver->ops->remove)
1447 driver->ops->remove(driver, tty);
1448 else
1449 driver->ttys[tty->index] = NULL;
1450}
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461static int tty_reopen(struct tty_struct *tty)
1462{
1463 struct tty_driver *driver = tty->driver;
1464
1465 if (!tty->count)
1466 return -EIO;
1467
1468 if (driver->type == TTY_DRIVER_TYPE_PTY &&
1469 driver->subtype == PTY_TYPE_MASTER)
1470 return -EIO;
1471
1472 if (test_bit(TTY_EXCLUSIVE, &tty->flags) && !capable(CAP_SYS_ADMIN))
1473 return -EBUSY;
1474
1475 tty->count++;
1476
1477 WARN_ON(!tty->ldisc);
1478
1479 return 0;
1480}
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx)
1507{
1508 struct tty_struct *tty;
1509 int retval;
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519 if (!try_module_get(driver->owner))
1520 return ERR_PTR(-ENODEV);
1521
1522 tty = alloc_tty_struct(driver, idx);
1523 if (!tty) {
1524 retval = -ENOMEM;
1525 goto err_module_put;
1526 }
1527
1528 tty_lock(tty);
1529 retval = tty_driver_install_tty(driver, tty);
1530 if (retval < 0)
1531 goto err_deinit_tty;
1532
1533 if (!tty->port)
1534 tty->port = driver->ports[idx];
1535
1536 WARN_RATELIMIT(!tty->port,
1537 "%s: %s driver does not set tty->port. This will crash the kernel later. Fix the driver!\n",
1538 __func__, tty->driver->name);
1539
1540 tty->port->itty = tty;
1541
1542
1543
1544
1545
1546
1547 retval = tty_ldisc_setup(tty, tty->link);
1548 if (retval)
1549 goto err_release_tty;
1550
1551 return tty;
1552
1553err_deinit_tty:
1554 tty_unlock(tty);
1555 deinitialize_tty_struct(tty);
1556 free_tty_struct(tty);
1557err_module_put:
1558 module_put(driver->owner);
1559 return ERR_PTR(retval);
1560
1561
1562err_release_tty:
1563 tty_unlock(tty);
1564 printk_ratelimited(KERN_INFO "tty_init_dev: ldisc open failed, "
1565 "clearing slot %d\n", idx);
1566 release_tty(tty, idx);
1567 return ERR_PTR(retval);
1568}
1569
1570void tty_free_termios(struct tty_struct *tty)
1571{
1572 struct ktermios *tp;
1573 int idx = tty->index;
1574
1575
1576 if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
1577 return;
1578
1579
1580 tp = tty->driver->termios[idx];
1581 if (tp == NULL) {
1582 tp = kmalloc(sizeof(struct ktermios), GFP_KERNEL);
1583 if (tp == NULL) {
1584 pr_warn("tty: no memory to save termios state.\n");
1585 return;
1586 }
1587 tty->driver->termios[idx] = tp;
1588 }
1589 *tp = tty->termios;
1590}
1591EXPORT_SYMBOL(tty_free_termios);
1592
1593
1594
1595
1596
1597
1598
1599static void tty_flush_works(struct tty_struct *tty)
1600{
1601 flush_work(&tty->SAK_work);
1602 flush_work(&tty->hangup_work);
1603 if (tty->link) {
1604 flush_work(&tty->link->SAK_work);
1605 flush_work(&tty->link->hangup_work);
1606 }
1607}
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624static void release_one_tty(struct work_struct *work)
1625{
1626 struct tty_struct *tty =
1627 container_of(work, struct tty_struct, hangup_work);
1628 struct tty_driver *driver = tty->driver;
1629 struct module *owner = driver->owner;
1630
1631 if (tty->ops->cleanup)
1632 tty->ops->cleanup(tty);
1633
1634 tty->magic = 0;
1635 tty_driver_kref_put(driver);
1636 module_put(owner);
1637
1638 spin_lock(&tty_files_lock);
1639 list_del_init(&tty->tty_files);
1640 spin_unlock(&tty_files_lock);
1641
1642 put_pid(tty->pgrp);
1643 put_pid(tty->session);
1644 free_tty_struct(tty);
1645}
1646
1647static void queue_release_one_tty(struct kref *kref)
1648{
1649 struct tty_struct *tty = container_of(kref, struct tty_struct, kref);
1650
1651
1652
1653 INIT_WORK(&tty->hangup_work, release_one_tty);
1654 schedule_work(&tty->hangup_work);
1655}
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665void tty_kref_put(struct tty_struct *tty)
1666{
1667 if (tty)
1668 kref_put(&tty->kref, queue_release_one_tty);
1669}
1670EXPORT_SYMBOL(tty_kref_put);
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684static void release_tty(struct tty_struct *tty, int idx)
1685{
1686
1687 WARN_ON(tty->index != idx);
1688 WARN_ON(!mutex_is_locked(&tty_mutex));
1689 if (tty->ops->shutdown)
1690 tty->ops->shutdown(tty);
1691 tty_free_termios(tty);
1692 tty_driver_remove_tty(tty->driver, tty);
1693 tty->port->itty = NULL;
1694 if (tty->link)
1695 tty->link->port->itty = NULL;
1696 tty_buffer_cancel_work(tty->port);
1697
1698 tty_kref_put(tty->link);
1699 tty_kref_put(tty);
1700}
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711static int tty_release_checks(struct tty_struct *tty, int idx)
1712{
1713#ifdef TTY_PARANOIA_CHECK
1714 if (idx < 0 || idx >= tty->driver->num) {
1715 tty_debug(tty, "bad idx %d\n", idx);
1716 return -1;
1717 }
1718
1719
1720 if (tty->driver->flags & TTY_DRIVER_DEVPTS_MEM)
1721 return 0;
1722
1723 if (tty != tty->driver->ttys[idx]) {
1724 tty_debug(tty, "bad driver table[%d] = %p\n",
1725 idx, tty->driver->ttys[idx]);
1726 return -1;
1727 }
1728 if (tty->driver->other) {
1729 struct tty_struct *o_tty = tty->link;
1730
1731 if (o_tty != tty->driver->other->ttys[idx]) {
1732 tty_debug(tty, "bad other table[%d] = %p\n",
1733 idx, tty->driver->other->ttys[idx]);
1734 return -1;
1735 }
1736 if (o_tty->link != tty) {
1737 tty_debug(tty, "bad link = %p\n", o_tty->link);
1738 return -1;
1739 }
1740 }
1741#endif
1742 return 0;
1743}
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764int tty_release(struct inode *inode, struct file *filp)
1765{
1766 struct tty_struct *tty = file_tty(filp);
1767 struct tty_struct *o_tty = NULL;
1768 int do_sleep, final;
1769 int idx;
1770 long timeout = 0;
1771 int once = 1;
1772
1773 if (tty_paranoia_check(tty, inode, __func__))
1774 return 0;
1775
1776 tty_lock(tty);
1777 check_tty_count(tty, __func__);
1778
1779 __tty_fasync(-1, filp, 0);
1780
1781 idx = tty->index;
1782 if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
1783 tty->driver->subtype == PTY_TYPE_MASTER)
1784 o_tty = tty->link;
1785
1786 if (tty_release_checks(tty, idx)) {
1787 tty_unlock(tty);
1788 return 0;
1789 }
1790
1791 tty_debug_hangup(tty, "(tty count=%d)...\n", tty->count);
1792
1793 if (tty->ops->close)
1794 tty->ops->close(tty, filp);
1795
1796
1797 tty_lock_slave(o_tty);
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812 while (1) {
1813 do_sleep = 0;
1814
1815 if (tty->count <= 1) {
1816 if (waitqueue_active(&tty->read_wait)) {
1817 wake_up_poll(&tty->read_wait, POLLIN);
1818 do_sleep++;
1819 }
1820 if (waitqueue_active(&tty->write_wait)) {
1821 wake_up_poll(&tty->write_wait, POLLOUT);
1822 do_sleep++;
1823 }
1824 }
1825 if (o_tty && o_tty->count <= 1) {
1826 if (waitqueue_active(&o_tty->read_wait)) {
1827 wake_up_poll(&o_tty->read_wait, POLLIN);
1828 do_sleep++;
1829 }
1830 if (waitqueue_active(&o_tty->write_wait)) {
1831 wake_up_poll(&o_tty->write_wait, POLLOUT);
1832 do_sleep++;
1833 }
1834 }
1835 if (!do_sleep)
1836 break;
1837
1838 if (once) {
1839 once = 0;
1840 printk(KERN_WARNING "%s: %s: read/write wait queue active!\n",
1841 __func__, tty_name(tty));
1842 }
1843 schedule_timeout_killable(timeout);
1844 if (timeout < 120 * HZ)
1845 timeout = 2 * timeout + 1;
1846 else
1847 timeout = MAX_SCHEDULE_TIMEOUT;
1848 }
1849
1850 if (o_tty) {
1851 if (--o_tty->count < 0) {
1852 printk(KERN_WARNING "%s: bad pty slave count (%d) for %s\n",
1853 __func__, o_tty->count, tty_name(o_tty));
1854 o_tty->count = 0;
1855 }
1856 }
1857 if (--tty->count < 0) {
1858 printk(KERN_WARNING "%s: bad tty->count (%d) for %s\n",
1859 __func__, tty->count, tty_name(tty));
1860 tty->count = 0;
1861 }
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872 tty_del_file(filp);
1873
1874
1875
1876
1877
1878
1879
1880
1881 if (!tty->count) {
1882 read_lock(&tasklist_lock);
1883 session_clear_tty(tty->session);
1884 if (o_tty)
1885 session_clear_tty(o_tty->session);
1886 read_unlock(&tasklist_lock);
1887 }
1888
1889
1890 final = !tty->count && !(o_tty && o_tty->count);
1891
1892 tty_unlock_slave(o_tty);
1893 tty_unlock(tty);
1894
1895
1896
1897
1898 if (!final)
1899 return 0;
1900
1901 tty_debug_hangup(tty, "final close\n");
1902
1903
1904
1905 tty_ldisc_release(tty);
1906
1907
1908 tty_flush_works(tty);
1909
1910 tty_debug_hangup(tty, "freeing structure...\n");
1911
1912
1913
1914
1915
1916
1917 mutex_lock(&tty_mutex);
1918 release_tty(tty, idx);
1919 mutex_unlock(&tty_mutex);
1920
1921 return 0;
1922}
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935static struct tty_struct *tty_open_current_tty(dev_t device, struct file *filp)
1936{
1937 struct tty_struct *tty;
1938 int retval;
1939
1940 if (device != MKDEV(TTYAUX_MAJOR, 0))
1941 return NULL;
1942
1943 tty = get_current_tty();
1944 if (!tty)
1945 return ERR_PTR(-ENXIO);
1946
1947 filp->f_flags |= O_NONBLOCK;
1948
1949 tty_lock(tty);
1950 tty_kref_put(tty);
1951
1952 retval = tty_reopen(tty);
1953 if (retval < 0) {
1954 tty_unlock(tty);
1955 tty = ERR_PTR(retval);
1956 }
1957 return tty;
1958}
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973static struct tty_driver *tty_lookup_driver(dev_t device, struct file *filp,
1974 int *noctty, int *index)
1975{
1976 struct tty_driver *driver;
1977
1978 switch (device) {
1979#ifdef CONFIG_VT
1980 case MKDEV(TTY_MAJOR, 0): {
1981 extern struct tty_driver *console_driver;
1982 driver = tty_driver_kref_get(console_driver);
1983 *index = fg_console;
1984 *noctty = 1;
1985 break;
1986 }
1987#endif
1988 case MKDEV(TTYAUX_MAJOR, 1): {
1989 struct tty_driver *console_driver = console_device(index);
1990 if (console_driver) {
1991 driver = tty_driver_kref_get(console_driver);
1992 if (driver) {
1993
1994 filp->f_flags |= O_NONBLOCK;
1995 *noctty = 1;
1996 break;
1997 }
1998 }
1999 return ERR_PTR(-ENODEV);
2000 }
2001 default:
2002 driver = get_tty_driver(device, index);
2003 if (!driver)
2004 return ERR_PTR(-ENODEV);
2005 break;
2006 }
2007 return driver;
2008}
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034static int tty_open(struct inode *inode, struct file *filp)
2035{
2036 struct tty_struct *tty;
2037 int noctty, retval;
2038 struct tty_driver *driver = NULL;
2039 int index;
2040 dev_t device = inode->i_rdev;
2041 unsigned saved_flags = filp->f_flags;
2042
2043 nonseekable_open(inode, filp);
2044
2045retry_open:
2046 retval = tty_alloc_file(filp);
2047 if (retval)
2048 return -ENOMEM;
2049
2050 noctty = filp->f_flags & O_NOCTTY;
2051 index = -1;
2052 retval = 0;
2053
2054 tty = tty_open_current_tty(device, filp);
2055 if (!tty) {
2056 mutex_lock(&tty_mutex);
2057 driver = tty_lookup_driver(device, filp, &noctty, &index);
2058 if (IS_ERR(driver)) {
2059 retval = PTR_ERR(driver);
2060 goto err_unlock;
2061 }
2062
2063
2064 tty = tty_driver_lookup_tty(driver, inode, index);
2065 if (IS_ERR(tty)) {
2066 retval = PTR_ERR(tty);
2067 goto err_unlock;
2068 }
2069
2070 if (tty) {
2071 mutex_unlock(&tty_mutex);
2072 tty_lock(tty);
2073
2074 tty_kref_put(tty);
2075 retval = tty_reopen(tty);
2076 if (retval < 0) {
2077 tty_unlock(tty);
2078 tty = ERR_PTR(retval);
2079 }
2080 } else {
2081 tty = tty_init_dev(driver, index);
2082 mutex_unlock(&tty_mutex);
2083 }
2084
2085 tty_driver_kref_put(driver);
2086 }
2087
2088 if (IS_ERR(tty)) {
2089 retval = PTR_ERR(tty);
2090 goto err_file;
2091 }
2092
2093 tty_add_file(tty, filp);
2094
2095 check_tty_count(tty, __func__);
2096 if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
2097 tty->driver->subtype == PTY_TYPE_MASTER)
2098 noctty = 1;
2099
2100 tty_debug_hangup(tty, "(tty count=%d)\n", tty->count);
2101
2102 if (tty->ops->open)
2103 retval = tty->ops->open(tty, filp);
2104 else
2105 retval = -ENODEV;
2106 filp->f_flags = saved_flags;
2107
2108 if (retval) {
2109 tty_debug_hangup(tty, "error %d, releasing...\n", retval);
2110
2111 tty_unlock(tty);
2112 tty_release(inode, filp);
2113 if (retval != -ERESTARTSYS)
2114 return retval;
2115
2116 if (signal_pending(current))
2117 return retval;
2118
2119 schedule();
2120
2121
2122
2123 if (tty_hung_up_p(filp))
2124 filp->f_op = &tty_fops;
2125 goto retry_open;
2126 }
2127 clear_bit(TTY_HUPPED, &tty->flags);
2128
2129
2130 read_lock(&tasklist_lock);
2131 spin_lock_irq(¤t->sighand->siglock);
2132 if (!noctty &&
2133 current->signal->leader &&
2134 !current->signal->tty &&
2135 tty->session == NULL) {
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150 if (filp->f_mode & FMODE_READ)
2151 __proc_set_tty(tty);
2152 }
2153 spin_unlock_irq(¤t->sighand->siglock);
2154 read_unlock(&tasklist_lock);
2155 tty_unlock(tty);
2156 return 0;
2157err_unlock:
2158 mutex_unlock(&tty_mutex);
2159
2160 if (!IS_ERR_OR_NULL(driver))
2161 tty_driver_kref_put(driver);
2162err_file:
2163 tty_free_file(filp);
2164 return retval;
2165}
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181static unsigned int tty_poll(struct file *filp, poll_table *wait)
2182{
2183 struct tty_struct *tty = file_tty(filp);
2184 struct tty_ldisc *ld;
2185 int ret = 0;
2186
2187 if (tty_paranoia_check(tty, file_inode(filp), "tty_poll"))
2188 return 0;
2189
2190 ld = tty_ldisc_ref_wait(tty);
2191 if (ld->ops->poll)
2192 ret = ld->ops->poll(tty, filp, wait);
2193 tty_ldisc_deref(ld);
2194 return ret;
2195}
2196
2197static int __tty_fasync(int fd, struct file *filp, int on)
2198{
2199 struct tty_struct *tty = file_tty(filp);
2200 struct tty_ldisc *ldisc;
2201 unsigned long flags;
2202 int retval = 0;
2203
2204 if (tty_paranoia_check(tty, file_inode(filp), "tty_fasync"))
2205 goto out;
2206
2207 retval = fasync_helper(fd, filp, on, &tty->fasync);
2208 if (retval <= 0)
2209 goto out;
2210
2211 ldisc = tty_ldisc_ref(tty);
2212 if (ldisc) {
2213 if (ldisc->ops->fasync)
2214 ldisc->ops->fasync(tty, on);
2215 tty_ldisc_deref(ldisc);
2216 }
2217
2218 if (on) {
2219 enum pid_type type;
2220 struct pid *pid;
2221
2222 spin_lock_irqsave(&tty->ctrl_lock, flags);
2223 if (tty->pgrp) {
2224 pid = tty->pgrp;
2225 type = PIDTYPE_PGID;
2226 } else {
2227 pid = task_pid(current);
2228 type = PIDTYPE_PID;
2229 }
2230 get_pid(pid);
2231 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
2232 __f_setown(filp, pid, type, 0);
2233 put_pid(pid);
2234 retval = 0;
2235 }
2236out:
2237 return retval;
2238}
2239
2240static int tty_fasync(int fd, struct file *filp, int on)
2241{
2242 struct tty_struct *tty = file_tty(filp);
2243 int retval;
2244
2245 tty_lock(tty);
2246 retval = __tty_fasync(fd, filp, on);
2247 tty_unlock(tty);
2248
2249 return retval;
2250}
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269static int tiocsti(struct tty_struct *tty, char __user *p)
2270{
2271 char ch, mbz = 0;
2272 struct tty_ldisc *ld;
2273
2274 if ((current->signal->tty != tty) && !capable(CAP_SYS_ADMIN))
2275 return -EPERM;
2276 if (get_user(ch, p))
2277 return -EFAULT;
2278 tty_audit_tiocsti(tty, ch);
2279 ld = tty_ldisc_ref_wait(tty);
2280 ld->ops->receive_buf(tty, &ch, &mbz, 1);
2281 tty_ldisc_deref(ld);
2282 return 0;
2283}
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296static int tiocgwinsz(struct tty_struct *tty, struct winsize __user *arg)
2297{
2298 int err;
2299
2300 mutex_lock(&tty->winsize_mutex);
2301 err = copy_to_user(arg, &tty->winsize, sizeof(*arg));
2302 mutex_unlock(&tty->winsize_mutex);
2303
2304 return err ? -EFAULT: 0;
2305}
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317int tty_do_resize(struct tty_struct *tty, struct winsize *ws)
2318{
2319 struct pid *pgrp;
2320
2321
2322 mutex_lock(&tty->winsize_mutex);
2323 if (!memcmp(ws, &tty->winsize, sizeof(*ws)))
2324 goto done;
2325
2326
2327 pgrp = tty_get_pgrp(tty);
2328 if (pgrp)
2329 kill_pgrp(pgrp, SIGWINCH, 1);
2330 put_pid(pgrp);
2331
2332 tty->winsize = *ws;
2333done:
2334 mutex_unlock(&tty->winsize_mutex);
2335 return 0;
2336}
2337EXPORT_SYMBOL(tty_do_resize);
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354static int tiocswinsz(struct tty_struct *tty, struct winsize __user *arg)
2355{
2356 struct winsize tmp_ws;
2357 if (copy_from_user(&tmp_ws, arg, sizeof(*arg)))
2358 return -EFAULT;
2359
2360 if (tty->ops->resize)
2361 return tty->ops->resize(tty, &tmp_ws);
2362 else
2363 return tty_do_resize(tty, &tmp_ws);
2364}
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375static int tioccons(struct file *file)
2376{
2377 if (!capable(CAP_SYS_ADMIN))
2378 return -EPERM;
2379 if (file->f_op->write == redirected_tty_write) {
2380 struct file *f;
2381 spin_lock(&redirect_lock);
2382 f = redirect;
2383 redirect = NULL;
2384 spin_unlock(&redirect_lock);
2385 if (f)
2386 fput(f);
2387 return 0;
2388 }
2389 spin_lock(&redirect_lock);
2390 if (redirect) {
2391 spin_unlock(&redirect_lock);
2392 return -EBUSY;
2393 }
2394 redirect = get_file(file);
2395 spin_unlock(&redirect_lock);
2396 return 0;
2397}
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411static int fionbio(struct file *file, int __user *p)
2412{
2413 int nonblock;
2414
2415 if (get_user(nonblock, p))
2416 return -EFAULT;
2417
2418 spin_lock(&file->f_lock);
2419 if (nonblock)
2420 file->f_flags |= O_NONBLOCK;
2421 else
2422 file->f_flags &= ~O_NONBLOCK;
2423 spin_unlock(&file->f_lock);
2424 return 0;
2425}
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441static int tiocsctty(struct tty_struct *tty, struct file *file, int arg)
2442{
2443 int ret = 0;
2444
2445 tty_lock(tty);
2446 read_lock(&tasklist_lock);
2447
2448 if (current->signal->leader && (task_session(current) == tty->session))
2449 goto unlock;
2450
2451
2452
2453
2454
2455 if (!current->signal->leader || current->signal->tty) {
2456 ret = -EPERM;
2457 goto unlock;
2458 }
2459
2460 if (tty->session) {
2461
2462
2463
2464
2465 if (arg == 1 && capable(CAP_SYS_ADMIN)) {
2466
2467
2468
2469 session_clear_tty(tty->session);
2470 } else {
2471 ret = -EPERM;
2472 goto unlock;
2473 }
2474 }
2475
2476
2477 if ((file->f_mode & FMODE_READ) == 0 && !capable(CAP_SYS_ADMIN)) {
2478 ret = -EPERM;
2479 goto unlock;
2480 }
2481
2482 proc_set_tty(tty);
2483unlock:
2484 read_unlock(&tasklist_lock);
2485 tty_unlock(tty);
2486 return ret;
2487}
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497struct pid *tty_get_pgrp(struct tty_struct *tty)
2498{
2499 unsigned long flags;
2500 struct pid *pgrp;
2501
2502 spin_lock_irqsave(&tty->ctrl_lock, flags);
2503 pgrp = get_pid(tty->pgrp);
2504 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
2505
2506 return pgrp;
2507}
2508EXPORT_SYMBOL_GPL(tty_get_pgrp);
2509
2510
2511
2512
2513
2514
2515
2516
2517static struct pid *session_of_pgrp(struct pid *pgrp)
2518{
2519 struct task_struct *p;
2520 struct pid *sid = NULL;
2521
2522 p = pid_task(pgrp, PIDTYPE_PGID);
2523 if (p == NULL)
2524 p = pid_task(pgrp, PIDTYPE_PID);
2525 if (p != NULL)
2526 sid = task_session(p);
2527
2528 return sid;
2529}
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543static int tiocgpgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
2544{
2545 struct pid *pid;
2546 int ret;
2547
2548
2549
2550
2551 if (tty == real_tty && current->signal->tty != real_tty)
2552 return -ENOTTY;
2553 pid = tty_get_pgrp(real_tty);
2554 ret = put_user(pid_vnr(pid), p);
2555 put_pid(pid);
2556 return ret;
2557}
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
2572{
2573 struct pid *pgrp;
2574 pid_t pgrp_nr;
2575 int retval = tty_check_change(real_tty);
2576
2577 if (retval == -EIO)
2578 return -ENOTTY;
2579 if (retval)
2580 return retval;
2581 if (!current->signal->tty ||
2582 (current->signal->tty != real_tty) ||
2583 (real_tty->session != task_session(current)))
2584 return -ENOTTY;
2585 if (get_user(pgrp_nr, p))
2586 return -EFAULT;
2587 if (pgrp_nr < 0)
2588 return -EINVAL;
2589 rcu_read_lock();
2590 pgrp = find_vpid(pgrp_nr);
2591 retval = -ESRCH;
2592 if (!pgrp)
2593 goto out_unlock;
2594 retval = -EPERM;
2595 if (session_of_pgrp(pgrp) != task_session(current))
2596 goto out_unlock;
2597 retval = 0;
2598 spin_lock_irq(&tty->ctrl_lock);
2599 put_pid(real_tty->pgrp);
2600 real_tty->pgrp = get_pid(pgrp);
2601 spin_unlock_irq(&tty->ctrl_lock);
2602out_unlock:
2603 rcu_read_unlock();
2604 return retval;
2605}
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619static int tiocgsid(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
2620{
2621
2622
2623
2624
2625 if (tty == real_tty && current->signal->tty != real_tty)
2626 return -ENOTTY;
2627 if (!real_tty->session)
2628 return -ENOTTY;
2629 return put_user(pid_vnr(real_tty->session), p);
2630}
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642static int tiocsetd(struct tty_struct *tty, int __user *p)
2643{
2644 int ldisc;
2645 int ret;
2646
2647 if (get_user(ldisc, p))
2648 return -EFAULT;
2649
2650 ret = tty_set_ldisc(tty, ldisc);
2651
2652 return ret;
2653}
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668static int send_break(struct tty_struct *tty, unsigned int duration)
2669{
2670 int retval;
2671
2672 if (tty->ops->break_ctl == NULL)
2673 return 0;
2674
2675 if (tty->driver->flags & TTY_DRIVER_HARDWARE_BREAK)
2676 retval = tty->ops->break_ctl(tty, duration);
2677 else {
2678
2679 if (tty_write_lock(tty, 0) < 0)
2680 return -EINTR;
2681 retval = tty->ops->break_ctl(tty, -1);
2682 if (retval)
2683 goto out;
2684 if (!signal_pending(current))
2685 msleep_interruptible(duration);
2686 retval = tty->ops->break_ctl(tty, 0);
2687out:
2688 tty_write_unlock(tty);
2689 if (signal_pending(current))
2690 retval = -EINTR;
2691 }
2692 return retval;
2693}
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707static int tty_tiocmget(struct tty_struct *tty, int __user *p)
2708{
2709 int retval = -EINVAL;
2710
2711 if (tty->ops->tiocmget) {
2712 retval = tty->ops->tiocmget(tty);
2713
2714 if (retval >= 0)
2715 retval = put_user(retval, p);
2716 }
2717 return retval;
2718}
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732static int tty_tiocmset(struct tty_struct *tty, unsigned int cmd,
2733 unsigned __user *p)
2734{
2735 int retval;
2736 unsigned int set, clear, val;
2737
2738 if (tty->ops->tiocmset == NULL)
2739 return -EINVAL;
2740
2741 retval = get_user(val, p);
2742 if (retval)
2743 return retval;
2744 set = clear = 0;
2745 switch (cmd) {
2746 case TIOCMBIS:
2747 set = val;
2748 break;
2749 case TIOCMBIC:
2750 clear = val;
2751 break;
2752 case TIOCMSET:
2753 set = val;
2754 clear = ~val;
2755 break;
2756 }
2757 set &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP;
2758 clear &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP;
2759 return tty->ops->tiocmset(tty, set, clear);
2760}
2761
2762static int tty_tiocgicount(struct tty_struct *tty, void __user *arg)
2763{
2764 int retval = -EINVAL;
2765 struct serial_icounter_struct icount;
2766 memset(&icount, 0, sizeof(icount));
2767 if (tty->ops->get_icount)
2768 retval = tty->ops->get_icount(tty, &icount);
2769 if (retval != 0)
2770 return retval;
2771 if (copy_to_user(arg, &icount, sizeof(icount)))
2772 return -EFAULT;
2773 return 0;
2774}
2775
2776static void tty_warn_deprecated_flags(struct serial_struct __user *ss)
2777{
2778 static DEFINE_RATELIMIT_STATE(depr_flags,
2779 DEFAULT_RATELIMIT_INTERVAL,
2780 DEFAULT_RATELIMIT_BURST);
2781 char comm[TASK_COMM_LEN];
2782 int flags;
2783
2784 if (get_user(flags, &ss->flags))
2785 return;
2786
2787 flags &= ASYNC_DEPRECATED;
2788
2789 if (flags && __ratelimit(&depr_flags))
2790 pr_warning("%s: '%s' is using deprecated serial flags (with no effect): %.8x\n",
2791 __func__, get_task_comm(comm, current), flags);
2792}
2793
2794
2795
2796
2797
2798static struct tty_struct *tty_pair_get_tty(struct tty_struct *tty)
2799{
2800 if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
2801 tty->driver->subtype == PTY_TYPE_MASTER)
2802 tty = tty->link;
2803 return tty;
2804}
2805
2806
2807
2808
2809long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
2810{
2811 struct tty_struct *tty = file_tty(file);
2812 struct tty_struct *real_tty;
2813 void __user *p = (void __user *)arg;
2814 int retval;
2815 struct tty_ldisc *ld;
2816
2817 if (tty_paranoia_check(tty, file_inode(file), "tty_ioctl"))
2818 return -EINVAL;
2819
2820 real_tty = tty_pair_get_tty(tty);
2821
2822
2823
2824
2825 switch (cmd) {
2826 case TIOCSETD:
2827 case TIOCSBRK:
2828 case TIOCCBRK:
2829 case TCSBRK:
2830 case TCSBRKP:
2831 retval = tty_check_change(tty);
2832 if (retval)
2833 return retval;
2834 if (cmd != TIOCCBRK) {
2835 tty_wait_until_sent(tty, 0);
2836 if (signal_pending(current))
2837 return -EINTR;
2838 }
2839 break;
2840 }
2841
2842
2843
2844
2845 switch (cmd) {
2846 case TIOCSTI:
2847 return tiocsti(tty, p);
2848 case TIOCGWINSZ:
2849 return tiocgwinsz(real_tty, p);
2850 case TIOCSWINSZ:
2851 return tiocswinsz(real_tty, p);
2852 case TIOCCONS:
2853 return real_tty != tty ? -EINVAL : tioccons(file);
2854 case FIONBIO:
2855 return fionbio(file, p);
2856 case TIOCEXCL:
2857 set_bit(TTY_EXCLUSIVE, &tty->flags);
2858 return 0;
2859 case TIOCNXCL:
2860 clear_bit(TTY_EXCLUSIVE, &tty->flags);
2861 return 0;
2862 case TIOCGEXCL:
2863 {
2864 int excl = test_bit(TTY_EXCLUSIVE, &tty->flags);
2865 return put_user(excl, (int __user *)p);
2866 }
2867 case TIOCNOTTY:
2868 if (current->signal->tty != tty)
2869 return -ENOTTY;
2870 no_tty();
2871 return 0;
2872 case TIOCSCTTY:
2873 return tiocsctty(tty, file, arg);
2874 case TIOCGPGRP:
2875 return tiocgpgrp(tty, real_tty, p);
2876 case TIOCSPGRP:
2877 return tiocspgrp(tty, real_tty, p);
2878 case TIOCGSID:
2879 return tiocgsid(tty, real_tty, p);
2880 case TIOCGETD:
2881 return put_user(tty->ldisc->ops->num, (int __user *)p);
2882 case TIOCSETD:
2883 return tiocsetd(tty, p);
2884 case TIOCVHANGUP:
2885 if (!capable(CAP_SYS_ADMIN))
2886 return -EPERM;
2887 tty_vhangup(tty);
2888 return 0;
2889 case TIOCGDEV:
2890 {
2891 unsigned int ret = new_encode_dev(tty_devnum(real_tty));
2892 return put_user(ret, (unsigned int __user *)p);
2893 }
2894
2895
2896
2897 case TIOCSBRK:
2898 if (tty->ops->break_ctl)
2899 return tty->ops->break_ctl(tty, -1);
2900 return 0;
2901 case TIOCCBRK:
2902 if (tty->ops->break_ctl)
2903 return tty->ops->break_ctl(tty, 0);
2904 return 0;
2905 case TCSBRK:
2906
2907
2908
2909
2910 if (!arg)
2911 return send_break(tty, 250);
2912 return 0;
2913 case TCSBRKP:
2914 return send_break(tty, arg ? arg*100 : 250);
2915
2916 case TIOCMGET:
2917 return tty_tiocmget(tty, p);
2918 case TIOCMSET:
2919 case TIOCMBIC:
2920 case TIOCMBIS:
2921 return tty_tiocmset(tty, cmd, p);
2922 case TIOCGICOUNT:
2923 retval = tty_tiocgicount(tty, p);
2924
2925 if (retval != -EINVAL)
2926 return retval;
2927 break;
2928 case TCFLSH:
2929 switch (arg) {
2930 case TCIFLUSH:
2931 case TCIOFLUSH:
2932
2933 tty_buffer_flush(tty, NULL);
2934 break;
2935 }
2936 break;
2937 case TIOCSSERIAL:
2938 tty_warn_deprecated_flags(p);
2939 break;
2940 }
2941 if (tty->ops->ioctl) {
2942 retval = tty->ops->ioctl(tty, cmd, arg);
2943 if (retval != -ENOIOCTLCMD)
2944 return retval;
2945 }
2946 ld = tty_ldisc_ref_wait(tty);
2947 retval = -EINVAL;
2948 if (ld->ops->ioctl) {
2949 retval = ld->ops->ioctl(tty, file, cmd, arg);
2950 if (retval == -ENOIOCTLCMD)
2951 retval = -ENOTTY;
2952 }
2953 tty_ldisc_deref(ld);
2954 return retval;
2955}
2956
2957#ifdef CONFIG_COMPAT
2958static long tty_compat_ioctl(struct file *file, unsigned int cmd,
2959 unsigned long arg)
2960{
2961 struct tty_struct *tty = file_tty(file);
2962 struct tty_ldisc *ld;
2963 int retval = -ENOIOCTLCMD;
2964
2965 if (tty_paranoia_check(tty, file_inode(file), "tty_ioctl"))
2966 return -EINVAL;
2967
2968 if (tty->ops->compat_ioctl) {
2969 retval = tty->ops->compat_ioctl(tty, cmd, arg);
2970 if (retval != -ENOIOCTLCMD)
2971 return retval;
2972 }
2973
2974 ld = tty_ldisc_ref_wait(tty);
2975 if (ld->ops->compat_ioctl)
2976 retval = ld->ops->compat_ioctl(tty, file, cmd, arg);
2977 else
2978 retval = n_tty_compat_ioctl_helper(tty, file, cmd, arg);
2979 tty_ldisc_deref(ld);
2980
2981 return retval;
2982}
2983#endif
2984
2985static int this_tty(const void *t, struct file *file, unsigned fd)
2986{
2987 if (likely(file->f_op->read != tty_read))
2988 return 0;
2989 return file_tty(file) != t ? 0 : fd + 1;
2990}
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011void __do_SAK(struct tty_struct *tty)
3012{
3013#ifdef TTY_SOFT_SAK
3014 tty_hangup(tty);
3015#else
3016 struct task_struct *g, *p;
3017 struct pid *session;
3018 int i;
3019
3020 if (!tty)
3021 return;
3022 session = tty->session;
3023
3024 tty_ldisc_flush(tty);
3025
3026 tty_driver_flush_buffer(tty);
3027
3028 read_lock(&tasklist_lock);
3029
3030 do_each_pid_task(session, PIDTYPE_SID, p) {
3031 printk(KERN_NOTICE "SAK: killed process %d"
3032 " (%s): task_session(p)==tty->session\n",
3033 task_pid_nr(p), p->comm);
3034 send_sig(SIGKILL, p, 1);
3035 } while_each_pid_task(session, PIDTYPE_SID, p);
3036
3037
3038
3039 do_each_thread(g, p) {
3040 if (p->signal->tty == tty) {
3041 printk(KERN_NOTICE "SAK: killed process %d"
3042 " (%s): task_session(p)==tty->session\n",
3043 task_pid_nr(p), p->comm);
3044 send_sig(SIGKILL, p, 1);
3045 continue;
3046 }
3047 task_lock(p);
3048 i = iterate_fd(p->files, 0, this_tty, tty);
3049 if (i != 0) {
3050 printk(KERN_NOTICE "SAK: killed process %d"
3051 " (%s): fd#%d opened to the tty\n",
3052 task_pid_nr(p), p->comm, i - 1);
3053 force_sig(SIGKILL, p);
3054 }
3055 task_unlock(p);
3056 } while_each_thread(g, p);
3057 read_unlock(&tasklist_lock);
3058#endif
3059}
3060
3061static void do_SAK_work(struct work_struct *work)
3062{
3063 struct tty_struct *tty =
3064 container_of(work, struct tty_struct, SAK_work);
3065 __do_SAK(tty);
3066}
3067
3068
3069
3070
3071
3072
3073
3074void do_SAK(struct tty_struct *tty)
3075{
3076 if (!tty)
3077 return;
3078 schedule_work(&tty->SAK_work);
3079}
3080
3081EXPORT_SYMBOL(do_SAK);
3082
3083static int dev_match_devt(struct device *dev, const void *data)
3084{
3085 const dev_t *devt = data;
3086 return dev->devt == *devt;
3087}
3088
3089
3090static struct device *tty_get_device(struct tty_struct *tty)
3091{
3092 dev_t devt = tty_devnum(tty);
3093 return class_find_device(tty_class, NULL, &devt, dev_match_devt);
3094}
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105struct tty_struct *alloc_tty_struct(struct tty_driver *driver, int idx)
3106{
3107 struct tty_struct *tty;
3108
3109 tty = kzalloc(sizeof(*tty), GFP_KERNEL);
3110 if (!tty)
3111 return NULL;
3112
3113 kref_init(&tty->kref);
3114 tty->magic = TTY_MAGIC;
3115 tty_ldisc_init(tty);
3116 tty->session = NULL;
3117 tty->pgrp = NULL;
3118 mutex_init(&tty->legacy_mutex);
3119 mutex_init(&tty->throttle_mutex);
3120 init_rwsem(&tty->termios_rwsem);
3121 mutex_init(&tty->winsize_mutex);
3122 init_ldsem(&tty->ldisc_sem);
3123 init_waitqueue_head(&tty->write_wait);
3124 init_waitqueue_head(&tty->read_wait);
3125 INIT_WORK(&tty->hangup_work, do_tty_hangup);
3126 mutex_init(&tty->atomic_write_lock);
3127 spin_lock_init(&tty->ctrl_lock);
3128 spin_lock_init(&tty->flow_lock);
3129 INIT_LIST_HEAD(&tty->tty_files);
3130 INIT_WORK(&tty->SAK_work, do_SAK_work);
3131
3132 tty->driver = driver;
3133 tty->ops = driver->ops;
3134 tty->index = idx;
3135 tty_line_name(driver, idx, tty->name);
3136 tty->dev = tty_get_device(tty);
3137
3138 return tty;
3139}
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150void deinitialize_tty_struct(struct tty_struct *tty)
3151{
3152 tty_ldisc_deinit(tty);
3153}
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167int tty_put_char(struct tty_struct *tty, unsigned char ch)
3168{
3169 if (tty->ops->put_char)
3170 return tty->ops->put_char(tty, ch);
3171 return tty->ops->write(tty, &ch, 1);
3172}
3173EXPORT_SYMBOL_GPL(tty_put_char);
3174
3175struct class *tty_class;
3176
3177static int tty_cdev_add(struct tty_driver *driver, dev_t dev,
3178 unsigned int index, unsigned int count)
3179{
3180 int err;
3181
3182
3183 driver->cdevs[index] = cdev_alloc();
3184 if (!driver->cdevs[index])
3185 return -ENOMEM;
3186 driver->cdevs[index]->ops = &tty_fops;
3187 driver->cdevs[index]->owner = driver->owner;
3188 err = cdev_add(driver->cdevs[index], dev, count);
3189 if (err)
3190 kobject_put(&driver->cdevs[index]->kobj);
3191 return err;
3192}
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213struct device *tty_register_device(struct tty_driver *driver, unsigned index,
3214 struct device *device)
3215{
3216 return tty_register_device_attr(driver, index, device, NULL, NULL);
3217}
3218EXPORT_SYMBOL(tty_register_device);
3219
3220static void tty_device_create_release(struct device *dev)
3221{
3222 pr_debug("device: '%s': %s\n", dev_name(dev), __func__);
3223 kfree(dev);
3224}
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246struct device *tty_register_device_attr(struct tty_driver *driver,
3247 unsigned index, struct device *device,
3248 void *drvdata,
3249 const struct attribute_group **attr_grp)
3250{
3251 char name[64];
3252 dev_t devt = MKDEV(driver->major, driver->minor_start) + index;
3253 struct device *dev = NULL;
3254 int retval = -ENODEV;
3255 bool cdev = false;
3256
3257 if (index >= driver->num) {
3258 printk(KERN_ERR "Attempt to register invalid tty line number "
3259 " (%d).\n", index);
3260 return ERR_PTR(-EINVAL);
3261 }
3262
3263 if (driver->type == TTY_DRIVER_TYPE_PTY)
3264 pty_line_name(driver, index, name);
3265 else
3266 tty_line_name(driver, index, name);
3267
3268 if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)) {
3269 retval = tty_cdev_add(driver, devt, index, 1);
3270 if (retval)
3271 goto error;
3272 cdev = true;
3273 }
3274
3275 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
3276 if (!dev) {
3277 retval = -ENOMEM;
3278 goto error;
3279 }
3280
3281 dev->devt = devt;
3282 dev->class = tty_class;
3283 dev->parent = device;
3284 dev->release = tty_device_create_release;
3285 dev_set_name(dev, "%s", name);
3286 dev->groups = attr_grp;
3287 dev_set_drvdata(dev, drvdata);
3288
3289 retval = device_register(dev);
3290 if (retval)
3291 goto error;
3292
3293 return dev;
3294
3295error:
3296 put_device(dev);
3297 if (cdev) {
3298 cdev_del(driver->cdevs[index]);
3299 driver->cdevs[index] = NULL;
3300 }
3301 return ERR_PTR(retval);
3302}
3303EXPORT_SYMBOL_GPL(tty_register_device_attr);
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316void tty_unregister_device(struct tty_driver *driver, unsigned index)
3317{
3318 device_destroy(tty_class,
3319 MKDEV(driver->major, driver->minor_start) + index);
3320 if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)) {
3321 cdev_del(driver->cdevs[index]);
3322 driver->cdevs[index] = NULL;
3323 }
3324}
3325EXPORT_SYMBOL(tty_unregister_device);
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336struct tty_driver *__tty_alloc_driver(unsigned int lines, struct module *owner,
3337 unsigned long flags)
3338{
3339 struct tty_driver *driver;
3340 unsigned int cdevs = 1;
3341 int err;
3342
3343 if (!lines || (flags & TTY_DRIVER_UNNUMBERED_NODE && lines > 1))
3344 return ERR_PTR(-EINVAL);
3345
3346 driver = kzalloc(sizeof(struct tty_driver), GFP_KERNEL);
3347 if (!driver)
3348 return ERR_PTR(-ENOMEM);
3349
3350 kref_init(&driver->kref);
3351 driver->magic = TTY_DRIVER_MAGIC;
3352 driver->num = lines;
3353 driver->owner = owner;
3354 driver->flags = flags;
3355
3356 if (!(flags & TTY_DRIVER_DEVPTS_MEM)) {
3357 driver->ttys = kcalloc(lines, sizeof(*driver->ttys),
3358 GFP_KERNEL);
3359 driver->termios = kcalloc(lines, sizeof(*driver->termios),
3360 GFP_KERNEL);
3361 if (!driver->ttys || !driver->termios) {
3362 err = -ENOMEM;
3363 goto err_free_all;
3364 }
3365 }
3366
3367 if (!(flags & TTY_DRIVER_DYNAMIC_ALLOC)) {
3368 driver->ports = kcalloc(lines, sizeof(*driver->ports),
3369 GFP_KERNEL);
3370 if (!driver->ports) {
3371 err = -ENOMEM;
3372 goto err_free_all;
3373 }
3374 cdevs = lines;
3375 }
3376
3377 driver->cdevs = kcalloc(cdevs, sizeof(*driver->cdevs), GFP_KERNEL);
3378 if (!driver->cdevs) {
3379 err = -ENOMEM;
3380 goto err_free_all;
3381 }
3382
3383 return driver;
3384err_free_all:
3385 kfree(driver->ports);
3386 kfree(driver->ttys);
3387 kfree(driver->termios);
3388 kfree(driver->cdevs);
3389 kfree(driver);
3390 return ERR_PTR(err);
3391}
3392EXPORT_SYMBOL(__tty_alloc_driver);
3393
3394static void destruct_tty_driver(struct kref *kref)
3395{
3396 struct tty_driver *driver = container_of(kref, struct tty_driver, kref);
3397 int i;
3398 struct ktermios *tp;
3399
3400 if (driver->flags & TTY_DRIVER_INSTALLED) {
3401
3402
3403
3404
3405
3406 for (i = 0; i < driver->num; i++) {
3407 tp = driver->termios[i];
3408 if (tp) {
3409 driver->termios[i] = NULL;
3410 kfree(tp);
3411 }
3412 if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV))
3413 tty_unregister_device(driver, i);
3414 }
3415 proc_tty_unregister_driver(driver);
3416 if (driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)
3417 cdev_del(driver->cdevs[0]);
3418 }
3419 kfree(driver->cdevs);
3420 kfree(driver->ports);
3421 kfree(driver->termios);
3422 kfree(driver->ttys);
3423 kfree(driver);
3424}
3425
3426void tty_driver_kref_put(struct tty_driver *driver)
3427{
3428 kref_put(&driver->kref, destruct_tty_driver);
3429}
3430EXPORT_SYMBOL(tty_driver_kref_put);
3431
3432void tty_set_operations(struct tty_driver *driver,
3433 const struct tty_operations *op)
3434{
3435 driver->ops = op;
3436};
3437EXPORT_SYMBOL(tty_set_operations);
3438
3439void put_tty_driver(struct tty_driver *d)
3440{
3441 tty_driver_kref_put(d);
3442}
3443EXPORT_SYMBOL(put_tty_driver);
3444
3445
3446
3447
3448int tty_register_driver(struct tty_driver *driver)
3449{
3450 int error;
3451 int i;
3452 dev_t dev;
3453 struct device *d;
3454
3455 if (!driver->major) {
3456 error = alloc_chrdev_region(&dev, driver->minor_start,
3457 driver->num, driver->name);
3458 if (!error) {
3459 driver->major = MAJOR(dev);
3460 driver->minor_start = MINOR(dev);
3461 }
3462 } else {
3463 dev = MKDEV(driver->major, driver->minor_start);
3464 error = register_chrdev_region(dev, driver->num, driver->name);
3465 }
3466 if (error < 0)
3467 goto err;
3468
3469 if (driver->flags & TTY_DRIVER_DYNAMIC_ALLOC) {
3470 error = tty_cdev_add(driver, dev, 0, driver->num);
3471 if (error)
3472 goto err_unreg_char;
3473 }
3474
3475 mutex_lock(&tty_mutex);
3476 list_add(&driver->tty_drivers, &tty_drivers);
3477 mutex_unlock(&tty_mutex);
3478
3479 if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV)) {
3480 for (i = 0; i < driver->num; i++) {
3481 d = tty_register_device(driver, i, NULL);
3482 if (IS_ERR(d)) {
3483 error = PTR_ERR(d);
3484 goto err_unreg_devs;
3485 }
3486 }
3487 }
3488 proc_tty_register_driver(driver);
3489 driver->flags |= TTY_DRIVER_INSTALLED;
3490 return 0;
3491
3492err_unreg_devs:
3493 for (i--; i >= 0; i--)
3494 tty_unregister_device(driver, i);
3495
3496 mutex_lock(&tty_mutex);
3497 list_del(&driver->tty_drivers);
3498 mutex_unlock(&tty_mutex);
3499
3500err_unreg_char:
3501 unregister_chrdev_region(dev, driver->num);
3502err:
3503 return error;
3504}
3505EXPORT_SYMBOL(tty_register_driver);
3506
3507
3508
3509
3510int tty_unregister_driver(struct tty_driver *driver)
3511{
3512#if 0
3513
3514 if (driver->refcount)
3515 return -EBUSY;
3516#endif
3517 unregister_chrdev_region(MKDEV(driver->major, driver->minor_start),
3518 driver->num);
3519 mutex_lock(&tty_mutex);
3520 list_del(&driver->tty_drivers);
3521 mutex_unlock(&tty_mutex);
3522 return 0;
3523}
3524
3525EXPORT_SYMBOL(tty_unregister_driver);
3526
3527dev_t tty_devnum(struct tty_struct *tty)
3528{
3529 return MKDEV(tty->driver->major, tty->driver->minor_start) + tty->index;
3530}
3531EXPORT_SYMBOL(tty_devnum);
3532
3533void tty_default_fops(struct file_operations *fops)
3534{
3535 *fops = tty_fops;
3536}
3537
3538
3539
3540
3541
3542
3543
3544void __init console_init(void)
3545{
3546 initcall_t *call;
3547
3548
3549 tty_ldisc_begin();
3550
3551
3552
3553
3554
3555 call = __con_initcall_start;
3556 while (call < __con_initcall_end) {
3557 (*call)();
3558 call++;
3559 }
3560}
3561
3562static char *tty_devnode(struct device *dev, umode_t *mode)
3563{
3564 if (!mode)
3565 return NULL;
3566 if (dev->devt == MKDEV(TTYAUX_MAJOR, 0) ||
3567 dev->devt == MKDEV(TTYAUX_MAJOR, 2))
3568 *mode = 0666;
3569 return NULL;
3570}
3571
3572static int __init tty_class_init(void)
3573{
3574 tty_class = class_create(THIS_MODULE, "tty");
3575 if (IS_ERR(tty_class))
3576 return PTR_ERR(tty_class);
3577 tty_class->devnode = tty_devnode;
3578 return 0;
3579}
3580
3581postcore_initcall(tty_class_init);
3582
3583
3584static struct cdev tty_cdev, console_cdev;
3585
3586static ssize_t show_cons_active(struct device *dev,
3587 struct device_attribute *attr, char *buf)
3588{
3589 struct console *cs[16];
3590 int i = 0;
3591 struct console *c;
3592 ssize_t count = 0;
3593
3594 console_lock();
3595 for_each_console(c) {
3596 if (!c->device)
3597 continue;
3598 if (!c->write)
3599 continue;
3600 if ((c->flags & CON_ENABLED) == 0)
3601 continue;
3602 cs[i++] = c;
3603 if (i >= ARRAY_SIZE(cs))
3604 break;
3605 }
3606 while (i--) {
3607 int index = cs[i]->index;
3608 struct tty_driver *drv = cs[i]->device(cs[i], &index);
3609
3610
3611 if (drv && (cs[i]->index > 0 || drv->major != TTY_MAJOR))
3612 count += tty_line_name(drv, index, buf + count);
3613 else
3614 count += sprintf(buf + count, "%s%d",
3615 cs[i]->name, cs[i]->index);
3616
3617 count += sprintf(buf + count, "%c", i ? ' ':'\n');
3618 }
3619 console_unlock();
3620
3621 return count;
3622}
3623static DEVICE_ATTR(active, S_IRUGO, show_cons_active, NULL);
3624
3625static struct attribute *cons_dev_attrs[] = {
3626 &dev_attr_active.attr,
3627 NULL
3628};
3629
3630ATTRIBUTE_GROUPS(cons_dev);
3631
3632static struct device *consdev;
3633
3634void console_sysfs_notify(void)
3635{
3636 if (consdev)
3637 sysfs_notify(&consdev->kobj, NULL, "active");
3638}
3639
3640
3641
3642
3643
3644int __init tty_init(void)
3645{
3646 cdev_init(&tty_cdev, &tty_fops);
3647 if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) ||
3648 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)
3649 panic("Couldn't register /dev/tty driver\n");
3650 device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 0), NULL, "tty");
3651
3652 cdev_init(&console_cdev, &console_fops);
3653 if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) ||
3654 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)
3655 panic("Couldn't register /dev/console driver\n");
3656 consdev = device_create_with_groups(tty_class, NULL,
3657 MKDEV(TTYAUX_MAJOR, 1), NULL,
3658 cons_dev_groups, "console");
3659 if (IS_ERR(consdev))
3660 consdev = NULL;
3661
3662#ifdef CONFIG_VT
3663 vty_init(&console_fops);
3664#endif
3665 return 0;
3666}
3667
3668