1
2
3
4
5
6
7
8
9#include <linux/module.h>
10
11#include <linux/errno.h>
12#include <linux/interrupt.h>
13#include <linux/tty.h>
14#include <linux/tty_flip.h>
15#include <linux/fcntl.h>
16#include <linux/sched.h>
17#include <linux/string.h>
18#include <linux/major.h>
19#include <linux/mm.h>
20#include <linux/init.h>
21#include <linux/device.h>
22#include <linux/uaccess.h>
23#include <linux/bitops.h>
24#include <linux/devpts_fs.h>
25#include <linux/slab.h>
26#include <linux/mutex.h>
27
28
29#ifdef CONFIG_UNIX98_PTYS
30static struct tty_driver *ptm_driver;
31static struct tty_driver *pts_driver;
32static DEFINE_MUTEX(devpts_mutex);
33#endif
34
35static void pty_close(struct tty_struct *tty, struct file *filp)
36{
37 BUG_ON(!tty);
38 if (tty->driver->subtype == PTY_TYPE_MASTER)
39 WARN_ON(tty->count > 1);
40 else {
41 if (test_bit(TTY_IO_ERROR, &tty->flags))
42 return;
43 if (tty->count > 2)
44 return;
45 }
46 set_bit(TTY_IO_ERROR, &tty->flags);
47 wake_up_interruptible(&tty->read_wait);
48 wake_up_interruptible(&tty->write_wait);
49 tty->packet = 0;
50
51 if (!tty->link)
52 return;
53 set_bit(TTY_OTHER_CLOSED, &tty->link->flags);
54 wake_up_interruptible(&tty->link->read_wait);
55 wake_up_interruptible(&tty->link->write_wait);
56 if (tty->driver->subtype == PTY_TYPE_MASTER) {
57 set_bit(TTY_OTHER_CLOSED, &tty->flags);
58#ifdef CONFIG_UNIX98_PTYS
59 if (tty->driver == ptm_driver) {
60 mutex_lock(&devpts_mutex);
61 if (tty->link->driver_data)
62 devpts_pty_kill(tty->link->driver_data);
63 mutex_unlock(&devpts_mutex);
64 }
65#endif
66 tty_vhangup(tty->link);
67 }
68}
69
70
71
72
73
74
75
76
77
78
79
80static void pty_unthrottle(struct tty_struct *tty)
81{
82 tty_wakeup(tty->link);
83 set_bit(TTY_THROTTLED, &tty->flags);
84}
85
86
87
88
89
90
91
92
93
94
95static int pty_space(struct tty_struct *to)
96{
97 int n = 8192 - to->port->buf.memory_used;
98 if (n < 0)
99 return 0;
100 return n;
101}
102
103
104
105
106
107
108
109
110
111
112
113
114
115static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c)
116{
117 struct tty_struct *to = tty->link;
118
119 if (tty->stopped)
120 return 0;
121
122 if (c > 0) {
123
124 c = tty_insert_flip_string(to->port, buf, c);
125
126 if (c) {
127 tty_flip_buffer_push(to->port);
128 tty_wakeup(tty);
129 }
130 }
131 return c;
132}
133
134
135
136
137
138
139
140
141
142static int pty_write_room(struct tty_struct *tty)
143{
144 if (tty->stopped)
145 return 0;
146 return pty_space(tty->link);
147}
148
149
150
151
152
153
154
155
156
157static int pty_chars_in_buffer(struct tty_struct *tty)
158{
159 return 0;
160}
161
162
163static int pty_set_lock(struct tty_struct *tty, int __user *arg)
164{
165 int val;
166 if (get_user(val, arg))
167 return -EFAULT;
168 if (val)
169 set_bit(TTY_PTY_LOCK, &tty->flags);
170 else
171 clear_bit(TTY_PTY_LOCK, &tty->flags);
172 return 0;
173}
174
175static int pty_get_lock(struct tty_struct *tty, int __user *arg)
176{
177 int locked = test_bit(TTY_PTY_LOCK, &tty->flags);
178 return put_user(locked, arg);
179}
180
181
182static int pty_set_pktmode(struct tty_struct *tty, int __user *arg)
183{
184 unsigned long flags;
185 int pktmode;
186
187 if (get_user(pktmode, arg))
188 return -EFAULT;
189
190 spin_lock_irqsave(&tty->ctrl_lock, flags);
191 if (pktmode) {
192 if (!tty->packet) {
193 tty->packet = 1;
194 tty->link->ctrl_status = 0;
195 }
196 } else
197 tty->packet = 0;
198 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
199
200 return 0;
201}
202
203
204static int pty_get_pktmode(struct tty_struct *tty, int __user *arg)
205{
206 int pktmode = tty->packet;
207 return put_user(pktmode, arg);
208}
209
210
211static int pty_signal(struct tty_struct *tty, int sig)
212{
213 unsigned long flags;
214 struct pid *pgrp;
215
216 if (tty->link) {
217 spin_lock_irqsave(&tty->link->ctrl_lock, flags);
218 pgrp = get_pid(tty->link->pgrp);
219 spin_unlock_irqrestore(&tty->link->ctrl_lock, flags);
220
221 kill_pgrp(pgrp, sig, 1);
222 put_pid(pgrp);
223 }
224 return 0;
225}
226
227static void pty_flush_buffer(struct tty_struct *tty)
228{
229 struct tty_struct *to = tty->link;
230 unsigned long flags;
231
232 if (!to)
233 return;
234
235 if (to->packet) {
236 spin_lock_irqsave(&tty->ctrl_lock, flags);
237 tty->ctrl_status |= TIOCPKT_FLUSHWRITE;
238 wake_up_interruptible(&to->read_wait);
239 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
240 }
241}
242
243static int pty_open(struct tty_struct *tty, struct file *filp)
244{
245 if (!tty || !tty->link)
246 return -ENODEV;
247
248 if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
249 goto out;
250 if (test_bit(TTY_PTY_LOCK, &tty->link->flags))
251 goto out;
252 if (tty->driver->subtype == PTY_TYPE_SLAVE && tty->link->count != 1)
253 goto out;
254
255 clear_bit(TTY_IO_ERROR, &tty->flags);
256 clear_bit(TTY_OTHER_CLOSED, &tty->link->flags);
257 set_bit(TTY_THROTTLED, &tty->flags);
258 return 0;
259
260out:
261 set_bit(TTY_IO_ERROR, &tty->flags);
262 return -EIO;
263}
264
265static void pty_set_termios(struct tty_struct *tty,
266 struct ktermios *old_termios)
267{
268 tty->termios.c_cflag &= ~(CSIZE | PARENB);
269 tty->termios.c_cflag |= (CS8 | CREAD);
270}
271
272
273
274
275
276
277
278
279
280
281static int pty_resize(struct tty_struct *tty, struct winsize *ws)
282{
283 struct pid *pgrp, *rpgrp;
284 unsigned long flags;
285 struct tty_struct *pty = tty->link;
286
287
288 mutex_lock(&tty->winsize_mutex);
289 if (!memcmp(ws, &tty->winsize, sizeof(*ws)))
290 goto done;
291
292
293
294
295
296 spin_lock_irqsave(&tty->ctrl_lock, flags);
297 pgrp = get_pid(tty->pgrp);
298 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
299
300 spin_lock_irqsave(&pty->ctrl_lock, flags);
301 rpgrp = get_pid(pty->pgrp);
302 spin_unlock_irqrestore(&pty->ctrl_lock, flags);
303
304 if (pgrp)
305 kill_pgrp(pgrp, SIGWINCH, 1);
306 if (rpgrp != pgrp && rpgrp)
307 kill_pgrp(rpgrp, SIGWINCH, 1);
308
309 put_pid(pgrp);
310 put_pid(rpgrp);
311
312 tty->winsize = *ws;
313 pty->winsize = *ws;
314done:
315 mutex_unlock(&tty->winsize_mutex);
316 return 0;
317}
318
319
320
321
322
323
324
325
326
327
328
329
330static int pty_common_install(struct tty_driver *driver, struct tty_struct *tty,
331 bool legacy)
332{
333 struct tty_struct *o_tty;
334 struct tty_port *ports[2];
335 int idx = tty->index;
336 int retval = -ENOMEM;
337
338
339 if (driver->subtype != PTY_TYPE_MASTER)
340 return -EIO;
341
342 ports[0] = kmalloc(sizeof **ports, GFP_KERNEL);
343 ports[1] = kmalloc(sizeof **ports, GFP_KERNEL);
344 if (!ports[0] || !ports[1])
345 goto err;
346 if (!try_module_get(driver->other->owner)) {
347
348 goto err;
349 }
350 o_tty = alloc_tty_struct(driver->other, idx);
351 if (!o_tty)
352 goto err_put_module;
353
354 tty_set_lock_subclass(o_tty);
355
356 if (legacy) {
357
358
359 retval = tty_init_termios(tty);
360 if (retval)
361 goto err_deinit_tty;
362
363 retval = tty_init_termios(o_tty);
364 if (retval)
365 goto err_free_termios;
366
367 driver->other->ttys[idx] = o_tty;
368 driver->ttys[idx] = tty;
369 } else {
370 memset(&tty->termios_locked, 0, sizeof(tty->termios_locked));
371 tty->termios = driver->init_termios;
372 memset(&o_tty->termios_locked, 0, sizeof(tty->termios_locked));
373 o_tty->termios = driver->other->init_termios;
374 }
375
376
377
378
379 tty_driver_kref_get(driver->other);
380
381 tty->link = o_tty;
382 o_tty->link = tty;
383 tty_port_init(ports[0]);
384 tty_port_init(ports[1]);
385 o_tty->port = ports[0];
386 tty->port = ports[1];
387 o_tty->port->itty = o_tty;
388
389 tty_driver_kref_get(driver);
390 tty->count++;
391 o_tty->count++;
392 return 0;
393err_free_termios:
394 if (legacy)
395 tty_free_termios(tty);
396err_deinit_tty:
397 deinitialize_tty_struct(o_tty);
398 free_tty_struct(o_tty);
399err_put_module:
400 module_put(driver->other->owner);
401err:
402 kfree(ports[0]);
403 kfree(ports[1]);
404 return retval;
405}
406
407static void pty_cleanup(struct tty_struct *tty)
408{
409 tty_port_put(tty->port);
410}
411
412
413#ifdef CONFIG_LEGACY_PTYS
414
415static int pty_install(struct tty_driver *driver, struct tty_struct *tty)
416{
417 return pty_common_install(driver, tty, true);
418}
419
420static void pty_remove(struct tty_driver *driver, struct tty_struct *tty)
421{
422 struct tty_struct *pair = tty->link;
423 driver->ttys[tty->index] = NULL;
424 if (pair)
425 pair->driver->ttys[pair->index] = NULL;
426}
427
428static int pty_bsd_ioctl(struct tty_struct *tty,
429 unsigned int cmd, unsigned long arg)
430{
431 switch (cmd) {
432 case TIOCSPTLCK:
433 return pty_set_lock(tty, (int __user *) arg);
434 case TIOCGPTLCK:
435 return pty_get_lock(tty, (int __user *)arg);
436 case TIOCPKT:
437 return pty_set_pktmode(tty, (int __user *)arg);
438 case TIOCGPKT:
439 return pty_get_pktmode(tty, (int __user *)arg);
440 case TIOCSIG:
441 return pty_signal(tty, (int) arg);
442 case TIOCGPTN:
443 return -EINVAL;
444 }
445 return -ENOIOCTLCMD;
446}
447
448static int legacy_count = CONFIG_LEGACY_PTY_COUNT;
449module_param(legacy_count, int, 0);
450
451
452
453
454
455static const struct tty_operations master_pty_ops_bsd = {
456 .install = pty_install,
457 .open = pty_open,
458 .close = pty_close,
459 .write = pty_write,
460 .write_room = pty_write_room,
461 .flush_buffer = pty_flush_buffer,
462 .chars_in_buffer = pty_chars_in_buffer,
463 .unthrottle = pty_unthrottle,
464 .set_termios = pty_set_termios,
465 .ioctl = pty_bsd_ioctl,
466 .cleanup = pty_cleanup,
467 .resize = pty_resize,
468 .remove = pty_remove
469};
470
471static const struct tty_operations slave_pty_ops_bsd = {
472 .install = pty_install,
473 .open = pty_open,
474 .close = pty_close,
475 .write = pty_write,
476 .write_room = pty_write_room,
477 .flush_buffer = pty_flush_buffer,
478 .chars_in_buffer = pty_chars_in_buffer,
479 .unthrottle = pty_unthrottle,
480 .set_termios = pty_set_termios,
481 .cleanup = pty_cleanup,
482 .resize = pty_resize,
483 .remove = pty_remove
484};
485
486static void __init legacy_pty_init(void)
487{
488 struct tty_driver *pty_driver, *pty_slave_driver;
489
490 if (legacy_count <= 0)
491 return;
492
493 pty_driver = tty_alloc_driver(legacy_count,
494 TTY_DRIVER_RESET_TERMIOS |
495 TTY_DRIVER_REAL_RAW |
496 TTY_DRIVER_DYNAMIC_ALLOC);
497 if (IS_ERR(pty_driver))
498 panic("Couldn't allocate pty driver");
499
500 pty_slave_driver = tty_alloc_driver(legacy_count,
501 TTY_DRIVER_RESET_TERMIOS |
502 TTY_DRIVER_REAL_RAW |
503 TTY_DRIVER_DYNAMIC_ALLOC);
504 if (IS_ERR(pty_slave_driver))
505 panic("Couldn't allocate pty slave driver");
506
507 pty_driver->driver_name = "pty_master";
508 pty_driver->name = "pty";
509 pty_driver->major = PTY_MASTER_MAJOR;
510 pty_driver->minor_start = 0;
511 pty_driver->type = TTY_DRIVER_TYPE_PTY;
512 pty_driver->subtype = PTY_TYPE_MASTER;
513 pty_driver->init_termios = tty_std_termios;
514 pty_driver->init_termios.c_iflag = 0;
515 pty_driver->init_termios.c_oflag = 0;
516 pty_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
517 pty_driver->init_termios.c_lflag = 0;
518 pty_driver->init_termios.c_ispeed = 38400;
519 pty_driver->init_termios.c_ospeed = 38400;
520 pty_driver->other = pty_slave_driver;
521 tty_set_operations(pty_driver, &master_pty_ops_bsd);
522
523 pty_slave_driver->driver_name = "pty_slave";
524 pty_slave_driver->name = "ttyp";
525 pty_slave_driver->major = PTY_SLAVE_MAJOR;
526 pty_slave_driver->minor_start = 0;
527 pty_slave_driver->type = TTY_DRIVER_TYPE_PTY;
528 pty_slave_driver->subtype = PTY_TYPE_SLAVE;
529 pty_slave_driver->init_termios = tty_std_termios;
530 pty_slave_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
531 pty_slave_driver->init_termios.c_ispeed = 38400;
532 pty_slave_driver->init_termios.c_ospeed = 38400;
533 pty_slave_driver->other = pty_driver;
534 tty_set_operations(pty_slave_driver, &slave_pty_ops_bsd);
535
536 if (tty_register_driver(pty_driver))
537 panic("Couldn't register pty driver");
538 if (tty_register_driver(pty_slave_driver))
539 panic("Couldn't register pty slave driver");
540}
541#else
542static inline void legacy_pty_init(void) { }
543#endif
544
545
546#ifdef CONFIG_UNIX98_PTYS
547
548static struct cdev ptmx_cdev;
549
550static int pty_unix98_ioctl(struct tty_struct *tty,
551 unsigned int cmd, unsigned long arg)
552{
553 switch (cmd) {
554 case TIOCSPTLCK:
555 return pty_set_lock(tty, (int __user *)arg);
556 case TIOCGPTLCK:
557 return pty_get_lock(tty, (int __user *)arg);
558 case TIOCPKT:
559 return pty_set_pktmode(tty, (int __user *)arg);
560 case TIOCGPKT:
561 return pty_get_pktmode(tty, (int __user *)arg);
562 case TIOCGPTN:
563 return put_user(tty->index, (unsigned int __user *)arg);
564 case TIOCSIG:
565 return pty_signal(tty, (int) arg);
566 }
567
568 return -ENOIOCTLCMD;
569}
570
571
572
573
574
575
576
577
578
579
580static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver,
581 struct inode *ptm_inode, int idx)
582{
583
584 return ERR_PTR(-EIO);
585}
586
587
588
589
590
591
592
593
594
595
596static struct tty_struct *pts_unix98_lookup(struct tty_driver *driver,
597 struct inode *pts_inode, int idx)
598{
599 struct tty_struct *tty;
600
601 mutex_lock(&devpts_mutex);
602 tty = devpts_get_priv(pts_inode);
603 mutex_unlock(&devpts_mutex);
604
605 if (!tty)
606 return ERR_PTR(-EIO);
607 return tty;
608}
609
610
611
612
613static int pty_unix98_install(struct tty_driver *driver, struct tty_struct *tty)
614{
615 return pty_common_install(driver, tty, false);
616}
617
618static void pty_unix98_remove(struct tty_driver *driver, struct tty_struct *tty)
619{
620}
621
622
623static void pty_unix98_shutdown(struct tty_struct *tty)
624{
625 struct pts_fs_info *fsi;
626
627 if (tty->driver->subtype == PTY_TYPE_MASTER)
628 fsi = tty->driver_data;
629 else
630 fsi = tty->link->driver_data;
631 devpts_kill_index(fsi, tty->index);
632 devpts_put_ref(fsi);
633}
634
635static const struct tty_operations ptm_unix98_ops = {
636 .lookup = ptm_unix98_lookup,
637 .install = pty_unix98_install,
638 .remove = pty_unix98_remove,
639 .open = pty_open,
640 .close = pty_close,
641 .write = pty_write,
642 .write_room = pty_write_room,
643 .flush_buffer = pty_flush_buffer,
644 .chars_in_buffer = pty_chars_in_buffer,
645 .unthrottle = pty_unthrottle,
646 .set_termios = pty_set_termios,
647 .ioctl = pty_unix98_ioctl,
648 .resize = pty_resize,
649 .shutdown = pty_unix98_shutdown,
650 .cleanup = pty_cleanup
651};
652
653static const struct tty_operations pty_unix98_ops = {
654 .lookup = pts_unix98_lookup,
655 .install = pty_unix98_install,
656 .remove = pty_unix98_remove,
657 .open = pty_open,
658 .close = pty_close,
659 .write = pty_write,
660 .write_room = pty_write_room,
661 .flush_buffer = pty_flush_buffer,
662 .chars_in_buffer = pty_chars_in_buffer,
663 .unthrottle = pty_unthrottle,
664 .set_termios = pty_set_termios,
665 .shutdown = pty_unix98_shutdown,
666 .cleanup = pty_cleanup,
667};
668
669
670
671
672
673
674
675
676
677
678
679
680
681static int ptmx_open(struct inode *inode, struct file *filp)
682{
683 struct pts_fs_info *fsi;
684 struct tty_struct *tty;
685 struct inode *slave_inode;
686 int retval;
687 int index;
688
689 nonseekable_open(inode, filp);
690
691
692 filp->f_mode |= FMODE_NONOTIFY;
693
694 retval = tty_alloc_file(filp);
695 if (retval)
696 return retval;
697
698 fsi = devpts_get_ref(inode, filp);
699 retval = -ENODEV;
700 if (!fsi)
701 goto out_free_file;
702
703
704 mutex_lock(&devpts_mutex);
705 index = devpts_new_index(fsi);
706 mutex_unlock(&devpts_mutex);
707
708 retval = index;
709 if (index < 0)
710 goto out_put_ref;
711
712
713 mutex_lock(&tty_mutex);
714 tty = tty_init_dev(ptm_driver, index);
715
716
717 mutex_unlock(&tty_mutex);
718
719 retval = PTR_ERR(tty);
720 if (IS_ERR(tty))
721 goto out;
722
723
724
725
726
727 set_bit(TTY_PTY_LOCK, &tty->flags);
728 tty->driver_data = fsi;
729
730 tty_add_file(tty, filp);
731
732 slave_inode = devpts_pty_new(fsi,
733 MKDEV(UNIX98_PTY_SLAVE_MAJOR, index), index,
734 tty->link);
735 if (IS_ERR(slave_inode)) {
736 retval = PTR_ERR(slave_inode);
737 goto err_release;
738 }
739 tty->link->driver_data = slave_inode;
740
741 retval = ptm_driver->ops->open(tty, filp);
742 if (retval)
743 goto err_release;
744
745 tty_unlock(tty);
746 return 0;
747err_release:
748 tty_unlock(tty);
749
750 tty_release(inode, filp);
751 return retval;
752out:
753 devpts_kill_index(fsi, index);
754out_put_ref:
755 devpts_put_ref(fsi);
756out_free_file:
757 tty_free_file(filp);
758 return retval;
759}
760
761static struct file_operations ptmx_fops;
762
763static void __init unix98_pty_init(void)
764{
765 ptm_driver = tty_alloc_driver(NR_UNIX98_PTY_MAX,
766 TTY_DRIVER_RESET_TERMIOS |
767 TTY_DRIVER_REAL_RAW |
768 TTY_DRIVER_DYNAMIC_DEV |
769 TTY_DRIVER_DEVPTS_MEM |
770 TTY_DRIVER_DYNAMIC_ALLOC);
771 if (IS_ERR(ptm_driver))
772 panic("Couldn't allocate Unix98 ptm driver");
773 pts_driver = tty_alloc_driver(NR_UNIX98_PTY_MAX,
774 TTY_DRIVER_RESET_TERMIOS |
775 TTY_DRIVER_REAL_RAW |
776 TTY_DRIVER_DYNAMIC_DEV |
777 TTY_DRIVER_DEVPTS_MEM |
778 TTY_DRIVER_DYNAMIC_ALLOC);
779 if (IS_ERR(pts_driver))
780 panic("Couldn't allocate Unix98 pts driver");
781
782 ptm_driver->driver_name = "pty_master";
783 ptm_driver->name = "ptm";
784 ptm_driver->major = UNIX98_PTY_MASTER_MAJOR;
785 ptm_driver->minor_start = 0;
786 ptm_driver->type = TTY_DRIVER_TYPE_PTY;
787 ptm_driver->subtype = PTY_TYPE_MASTER;
788 ptm_driver->init_termios = tty_std_termios;
789 ptm_driver->init_termios.c_iflag = 0;
790 ptm_driver->init_termios.c_oflag = 0;
791 ptm_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
792 ptm_driver->init_termios.c_lflag = 0;
793 ptm_driver->init_termios.c_ispeed = 38400;
794 ptm_driver->init_termios.c_ospeed = 38400;
795 ptm_driver->other = pts_driver;
796 tty_set_operations(ptm_driver, &ptm_unix98_ops);
797
798 pts_driver->driver_name = "pty_slave";
799 pts_driver->name = "pts";
800 pts_driver->major = UNIX98_PTY_SLAVE_MAJOR;
801 pts_driver->minor_start = 0;
802 pts_driver->type = TTY_DRIVER_TYPE_PTY;
803 pts_driver->subtype = PTY_TYPE_SLAVE;
804 pts_driver->init_termios = tty_std_termios;
805 pts_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
806 pts_driver->init_termios.c_ispeed = 38400;
807 pts_driver->init_termios.c_ospeed = 38400;
808 pts_driver->other = ptm_driver;
809 tty_set_operations(pts_driver, &pty_unix98_ops);
810
811 if (tty_register_driver(ptm_driver))
812 panic("Couldn't register Unix98 ptm driver");
813 if (tty_register_driver(pts_driver))
814 panic("Couldn't register Unix98 pts driver");
815
816
817 tty_default_fops(&ptmx_fops);
818 ptmx_fops.open = ptmx_open;
819
820 cdev_init(&ptmx_cdev, &ptmx_fops);
821 if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) ||
822 register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0)
823 panic("Couldn't register /dev/ptmx driver");
824 device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx");
825}
826
827#else
828static inline void unix98_pty_init(void) { }
829#endif
830
831static int __init pty_init(void)
832{
833 legacy_pty_init();
834 unix98_pty_init();
835 return 0;
836}
837module_init(pty_init);
838