]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/tty/pty.c
a0ca0830cbcf28d73842ae7e914f9ea5c345a168
[karo-tx-linux.git] / drivers / tty / pty.c
1 /*
2  *  Copyright (C) 1991, 1992  Linus Torvalds
3  *
4  *  Added support for a Unix98-style ptmx device.
5  *    -- C. Scott Ananian <cananian@alumni.princeton.edu>, 14-Jan-1998
6  *
7  *  When reading this code see also fs/devpts. In particular note that the
8  *  driver_data field is used by the devpts side as a binding to the devpts
9  *  inode.
10  */
11
12 #include <linux/module.h>
13
14 #include <linux/errno.h>
15 #include <linux/interrupt.h>
16 #include <linux/tty.h>
17 #include <linux/tty_flip.h>
18 #include <linux/fcntl.h>
19 #include <linux/sched.h>
20 #include <linux/string.h>
21 #include <linux/major.h>
22 #include <linux/mm.h>
23 #include <linux/init.h>
24 #include <linux/device.h>
25 #include <linux/uaccess.h>
26 #include <linux/bitops.h>
27 #include <linux/devpts_fs.h>
28 #include <linux/slab.h>
29 #include <linux/mutex.h>
30
31
32 #ifdef CONFIG_UNIX98_PTYS
33 static struct tty_driver *ptm_driver;
34 static struct tty_driver *pts_driver;
35 static DEFINE_MUTEX(devpts_mutex);
36 #endif
37
38 static void pty_close(struct tty_struct *tty, struct file *filp)
39 {
40         BUG_ON(!tty);
41         if (tty->driver->subtype == PTY_TYPE_MASTER)
42                 WARN_ON(tty->count > 1);
43         else {
44                 if (tty->count > 2)
45                         return;
46         }
47         wake_up_interruptible(&tty->read_wait);
48         wake_up_interruptible(&tty->write_wait);
49         tty->packet = 0;
50         /* Review - krefs on tty_link ?? */
51         if (!tty->link)
52                 return;
53         tty->link->packet = 0;
54         set_bit(TTY_OTHER_CLOSED, &tty->link->flags);
55         wake_up_interruptible(&tty->link->read_wait);
56         wake_up_interruptible(&tty->link->write_wait);
57         if (tty->driver->subtype == PTY_TYPE_MASTER) {
58                 set_bit(TTY_OTHER_CLOSED, &tty->flags);
59 #ifdef CONFIG_UNIX98_PTYS
60                 if (tty->driver == ptm_driver) {
61                         mutex_lock(&devpts_mutex);
62                         devpts_pty_kill(tty->link);
63                         mutex_unlock(&devpts_mutex);
64                 }
65 #endif
66                 tty_unlock(tty);
67                 tty_vhangup(tty->link);
68                 tty_lock(tty);
69         }
70 }
71
72 /*
73  * The unthrottle routine is called by the line discipline to signal
74  * that it can receive more characters.  For PTY's, the TTY_THROTTLED
75  * flag is always set, to force the line discipline to always call the
76  * unthrottle routine when there are fewer than TTY_THRESHOLD_UNTHROTTLE
77  * characters in the queue.  This is necessary since each time this
78  * happens, we need to wake up any sleeping processes that could be
79  * (1) trying to send data to the pty, or (2) waiting in wait_until_sent()
80  * for the pty buffer to be drained.
81  */
82 static void pty_unthrottle(struct tty_struct *tty)
83 {
84         tty_wakeup(tty->link);
85         set_bit(TTY_THROTTLED, &tty->flags);
86 }
87
88 /**
89  *      pty_space       -       report space left for writing
90  *      @to: tty we are writing into
91  *
92  *      The tty buffers allow 64K but we sneak a peak and clip at 8K this
93  *      allows a lot of overspill room for echo and other fun messes to
94  *      be handled properly
95  */
96
97 static int pty_space(struct tty_struct *to)
98 {
99         int n = 8192 - to->buf.memory_used;
100         if (n < 0)
101                 return 0;
102         return n;
103 }
104
105 /**
106  *      pty_write               -       write to a pty
107  *      @tty: the tty we write from
108  *      @buf: kernel buffer of data
109  *      @count: bytes to write
110  *
111  *      Our "hardware" write method. Data is coming from the ldisc which
112  *      may be in a non sleeping state. We simply throw this at the other
113  *      end of the link as if we were an IRQ handler receiving stuff for
114  *      the other side of the pty/tty pair.
115  */
116
117 static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c)
118 {
119         struct tty_struct *to = tty->link;
120
121         if (tty->stopped)
122                 return 0;
123
124         if (c > 0) {
125                 /* Stuff the data into the input queue of the other end */
126                 c = tty_insert_flip_string(to, buf, c);
127                 /* And shovel */
128                 if (c) {
129                         tty_flip_buffer_push(to);
130                         tty_wakeup(tty);
131                 }
132         }
133         return c;
134 }
135
136 /**
137  *      pty_write_room  -       write space
138  *      @tty: tty we are writing from
139  *
140  *      Report how many bytes the ldisc can send into the queue for
141  *      the other device.
142  */
143
144 static int pty_write_room(struct tty_struct *tty)
145 {
146         if (tty->stopped)
147                 return 0;
148         return pty_space(tty->link);
149 }
150
151 /**
152  *      pty_chars_in_buffer     -       characters currently in our tx queue
153  *      @tty: our tty
154  *
155  *      Report how much we have in the transmit queue. As everything is
156  *      instantly at the other end this is easy to implement.
157  */
158
159 static int pty_chars_in_buffer(struct tty_struct *tty)
160 {
161         return 0;
162 }
163
164 /* Set the lock flag on a pty */
165 static int pty_set_lock(struct tty_struct *tty, int __user *arg)
166 {
167         int val;
168         if (get_user(val, arg))
169                 return -EFAULT;
170         if (val)
171                 set_bit(TTY_PTY_LOCK, &tty->flags);
172         else
173                 clear_bit(TTY_PTY_LOCK, &tty->flags);
174         return 0;
175 }
176
177 /* Send a signal to the slave */
178 static int pty_signal(struct tty_struct *tty, int sig)
179 {
180         unsigned long flags;
181         struct pid *pgrp;
182
183         if (tty->link) {
184                 spin_lock_irqsave(&tty->link->ctrl_lock, flags);
185                 pgrp = get_pid(tty->link->pgrp);
186                 spin_unlock_irqrestore(&tty->link->ctrl_lock, flags);
187
188                 kill_pgrp(pgrp, sig, 1);
189                 put_pid(pgrp);
190         }
191         return 0;
192 }
193
194 static void pty_flush_buffer(struct tty_struct *tty)
195 {
196         struct tty_struct *to = tty->link;
197         unsigned long flags;
198
199         if (!to)
200                 return;
201         /* tty_buffer_flush(to); FIXME */
202         if (to->packet) {
203                 spin_lock_irqsave(&tty->ctrl_lock, flags);
204                 tty->ctrl_status |= TIOCPKT_FLUSHWRITE;
205                 wake_up_interruptible(&to->read_wait);
206                 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
207         }
208 }
209
210 static int pty_open(struct tty_struct *tty, struct file *filp)
211 {
212         int     retval = -ENODEV;
213
214         if (!tty || !tty->link)
215                 goto out;
216
217         retval = -EIO;
218         if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
219                 goto out;
220         if (test_bit(TTY_PTY_LOCK, &tty->link->flags))
221                 goto out;
222         if (tty->link->count != 1)
223                 goto out;
224
225         clear_bit(TTY_OTHER_CLOSED, &tty->link->flags);
226         set_bit(TTY_THROTTLED, &tty->flags);
227         retval = 0;
228 out:
229         return retval;
230 }
231
232 static void pty_set_termios(struct tty_struct *tty,
233                                         struct ktermios *old_termios)
234 {
235         tty->termios->c_cflag &= ~(CSIZE | PARENB);
236         tty->termios->c_cflag |= (CS8 | CREAD);
237 }
238
239 /**
240  *      pty_do_resize           -       resize event
241  *      @tty: tty being resized
242  *      @ws: window size being set.
243  *
244  *      Update the termios variables and send the necessary signals to
245  *      peform a terminal resize correctly
246  */
247
248 int pty_resize(struct tty_struct *tty,  struct winsize *ws)
249 {
250         struct pid *pgrp, *rpgrp;
251         unsigned long flags;
252         struct tty_struct *pty = tty->link;
253
254         /* For a PTY we need to lock the tty side */
255         mutex_lock(&tty->termios_mutex);
256         if (!memcmp(ws, &tty->winsize, sizeof(*ws)))
257                 goto done;
258
259         /* Get the PID values and reference them so we can
260            avoid holding the tty ctrl lock while sending signals.
261            We need to lock these individually however. */
262
263         spin_lock_irqsave(&tty->ctrl_lock, flags);
264         pgrp = get_pid(tty->pgrp);
265         spin_unlock_irqrestore(&tty->ctrl_lock, flags);
266
267         spin_lock_irqsave(&pty->ctrl_lock, flags);
268         rpgrp = get_pid(pty->pgrp);
269         spin_unlock_irqrestore(&pty->ctrl_lock, flags);
270
271         if (pgrp)
272                 kill_pgrp(pgrp, SIGWINCH, 1);
273         if (rpgrp != pgrp && rpgrp)
274                 kill_pgrp(rpgrp, SIGWINCH, 1);
275
276         put_pid(pgrp);
277         put_pid(rpgrp);
278
279         tty->winsize = *ws;
280         pty->winsize = *ws;     /* Never used so will go away soon */
281 done:
282         mutex_unlock(&tty->termios_mutex);
283         return 0;
284 }
285
286 static int pty_common_install(struct tty_driver *driver, struct tty_struct *tty,
287                 bool legacy)
288 {
289         struct tty_struct *o_tty;
290         struct tty_port *ports[2];
291         int idx = tty->index;
292         int retval = -ENOMEM;
293
294         o_tty = alloc_tty_struct();
295         ports[0] = kmalloc(sizeof **ports, GFP_KERNEL);
296         ports[1] = kmalloc(sizeof **ports, GFP_KERNEL);
297         if (!o_tty || !ports[0] || !ports[1])
298                 goto err_free_tty;
299         if (!try_module_get(driver->other->owner)) {
300                 /* This cannot in fact currently happen */
301                 goto err_free_tty;
302         }
303         initialize_tty_struct(o_tty, driver->other, idx);
304
305         if (legacy) {
306                 /* We always use new tty termios data so we can do this
307                    the easy way .. */
308                 retval = tty_init_termios(tty);
309                 if (retval)
310                         goto err_deinit_tty;
311
312                 retval = tty_init_termios(o_tty);
313                 if (retval)
314                         goto err_free_termios;
315
316                 driver->other->ttys[idx] = o_tty;
317                 driver->ttys[idx] = tty;
318         } else {
319                 tty->termios = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL);
320                 if (tty->termios == NULL)
321                         goto err_deinit_tty;
322                 *tty->termios = driver->init_termios;
323                 tty->termios_locked = tty->termios + 1;
324
325                 o_tty->termios = kzalloc(sizeof(struct ktermios[2]),
326                                 GFP_KERNEL);
327                 if (o_tty->termios == NULL)
328                         goto err_free_termios;
329                 *o_tty->termios = driver->other->init_termios;
330                 o_tty->termios_locked = o_tty->termios + 1;
331         }
332
333         /*
334          * Everything allocated ... set up the o_tty structure.
335          */
336         tty_driver_kref_get(driver->other);
337         if (driver->subtype == PTY_TYPE_MASTER)
338                 o_tty->count++;
339         /* Establish the links in both directions */
340         tty->link   = o_tty;
341         o_tty->link = tty;
342         tty_port_init(ports[0]);
343         tty_port_init(ports[1]);
344         o_tty->port = ports[0];
345         tty->port = ports[1];
346
347         tty_driver_kref_get(driver);
348         tty->count++;
349         return 0;
350 err_free_termios:
351         if (legacy)
352                 tty_free_termios(tty);
353         else
354                 kfree(tty->termios);
355 err_deinit_tty:
356         deinitialize_tty_struct(o_tty);
357         module_put(o_tty->driver->owner);
358 err_free_tty:
359         kfree(ports[0]);
360         kfree(ports[1]);
361         free_tty_struct(o_tty);
362         return retval;
363 }
364
365 static void pty_cleanup(struct tty_struct *tty)
366 {
367         kfree(tty->port);
368 }
369
370 /* Traditional BSD devices */
371 #ifdef CONFIG_LEGACY_PTYS
372
373 static int pty_install(struct tty_driver *driver, struct tty_struct *tty)
374 {
375         return pty_common_install(driver, tty, true);
376 }
377
378 static int pty_bsd_ioctl(struct tty_struct *tty,
379                          unsigned int cmd, unsigned long arg)
380 {
381         switch (cmd) {
382         case TIOCSPTLCK: /* Set PT Lock (disallow slave open) */
383                 return pty_set_lock(tty, (int __user *) arg);
384         case TIOCSIG:    /* Send signal to other side of pty */
385                 return pty_signal(tty, (int) arg);
386         }
387         return -ENOIOCTLCMD;
388 }
389
390 static int legacy_count = CONFIG_LEGACY_PTY_COUNT;
391 module_param(legacy_count, int, 0);
392
393 /*
394  * The master side of a pty can do TIOCSPTLCK and thus
395  * has pty_bsd_ioctl.
396  */
397 static const struct tty_operations master_pty_ops_bsd = {
398         .install = pty_install,
399         .open = pty_open,
400         .close = pty_close,
401         .write = pty_write,
402         .write_room = pty_write_room,
403         .flush_buffer = pty_flush_buffer,
404         .chars_in_buffer = pty_chars_in_buffer,
405         .unthrottle = pty_unthrottle,
406         .set_termios = pty_set_termios,
407         .ioctl = pty_bsd_ioctl,
408         .cleanup = pty_cleanup,
409         .resize = pty_resize
410 };
411
412 static const struct tty_operations slave_pty_ops_bsd = {
413         .install = pty_install,
414         .open = pty_open,
415         .close = pty_close,
416         .write = pty_write,
417         .write_room = pty_write_room,
418         .flush_buffer = pty_flush_buffer,
419         .chars_in_buffer = pty_chars_in_buffer,
420         .unthrottle = pty_unthrottle,
421         .set_termios = pty_set_termios,
422         .cleanup = pty_cleanup,
423         .resize = pty_resize
424 };
425
426 static void __init legacy_pty_init(void)
427 {
428         struct tty_driver *pty_driver, *pty_slave_driver;
429
430         if (legacy_count <= 0)
431                 return;
432
433         pty_driver = alloc_tty_driver(legacy_count);
434         if (!pty_driver)
435                 panic("Couldn't allocate pty driver");
436
437         pty_slave_driver = alloc_tty_driver(legacy_count);
438         if (!pty_slave_driver)
439                 panic("Couldn't allocate pty slave driver");
440
441         pty_driver->driver_name = "pty_master";
442         pty_driver->name = "pty";
443         pty_driver->major = PTY_MASTER_MAJOR;
444         pty_driver->minor_start = 0;
445         pty_driver->type = TTY_DRIVER_TYPE_PTY;
446         pty_driver->subtype = PTY_TYPE_MASTER;
447         pty_driver->init_termios = tty_std_termios;
448         pty_driver->init_termios.c_iflag = 0;
449         pty_driver->init_termios.c_oflag = 0;
450         pty_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
451         pty_driver->init_termios.c_lflag = 0;
452         pty_driver->init_termios.c_ispeed = 38400;
453         pty_driver->init_termios.c_ospeed = 38400;
454         pty_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW;
455         pty_driver->other = pty_slave_driver;
456         tty_set_operations(pty_driver, &master_pty_ops_bsd);
457
458         pty_slave_driver->driver_name = "pty_slave";
459         pty_slave_driver->name = "ttyp";
460         pty_slave_driver->major = PTY_SLAVE_MAJOR;
461         pty_slave_driver->minor_start = 0;
462         pty_slave_driver->type = TTY_DRIVER_TYPE_PTY;
463         pty_slave_driver->subtype = PTY_TYPE_SLAVE;
464         pty_slave_driver->init_termios = tty_std_termios;
465         pty_slave_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
466         pty_slave_driver->init_termios.c_ispeed = 38400;
467         pty_slave_driver->init_termios.c_ospeed = 38400;
468         pty_slave_driver->flags = TTY_DRIVER_RESET_TERMIOS |
469                                         TTY_DRIVER_REAL_RAW;
470         pty_slave_driver->other = pty_driver;
471         tty_set_operations(pty_slave_driver, &slave_pty_ops_bsd);
472
473         if (tty_register_driver(pty_driver))
474                 panic("Couldn't register pty driver");
475         if (tty_register_driver(pty_slave_driver))
476                 panic("Couldn't register pty slave driver");
477 }
478 #else
479 static inline void legacy_pty_init(void) { }
480 #endif
481
482 /* Unix98 devices */
483 #ifdef CONFIG_UNIX98_PTYS
484
485 static struct cdev ptmx_cdev;
486
487 static int pty_unix98_ioctl(struct tty_struct *tty,
488                             unsigned int cmd, unsigned long arg)
489 {
490         switch (cmd) {
491         case TIOCSPTLCK: /* Set PT Lock (disallow slave open) */
492                 return pty_set_lock(tty, (int __user *)arg);
493         case TIOCGPTN: /* Get PT Number */
494                 return put_user(tty->index, (unsigned int __user *)arg);
495         case TIOCSIG:    /* Send signal to other side of pty */
496                 return pty_signal(tty, (int) arg);
497         }
498
499         return -ENOIOCTLCMD;
500 }
501
502 /**
503  *      ptm_unix98_lookup       -       find a pty master
504  *      @driver: ptm driver
505  *      @idx: tty index
506  *
507  *      Look up a pty master device. Called under the tty_mutex for now.
508  *      This provides our locking.
509  */
510
511 static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver,
512                 struct inode *ptm_inode, int idx)
513 {
514         /* Master must be open via /dev/ptmx */
515         return ERR_PTR(-EIO);
516 }
517
518 /**
519  *      pts_unix98_lookup       -       find a pty slave
520  *      @driver: pts driver
521  *      @idx: tty index
522  *
523  *      Look up a pty master device. Called under the tty_mutex for now.
524  *      This provides our locking for the tty pointer.
525  */
526
527 static struct tty_struct *pts_unix98_lookup(struct tty_driver *driver,
528                 struct inode *pts_inode, int idx)
529 {
530         struct tty_struct *tty;
531
532         mutex_lock(&devpts_mutex);
533         tty = devpts_get_tty(pts_inode, idx);
534         mutex_unlock(&devpts_mutex);
535         /* Master must be open before slave */
536         if (!tty)
537                 return ERR_PTR(-EIO);
538         return tty;
539 }
540
541 static void pty_unix98_shutdown(struct tty_struct *tty)
542 {
543         tty_driver_remove_tty(tty->driver, tty);
544         /* We have our own method as we don't use the tty index */
545         kfree(tty->termios);
546 }
547
548 /* We have no need to install and remove our tty objects as devpts does all
549    the work for us */
550
551 static int pty_unix98_install(struct tty_driver *driver, struct tty_struct *tty)
552 {
553         return pty_common_install(driver, tty, false);
554 }
555
556 static void pty_unix98_remove(struct tty_driver *driver, struct tty_struct *tty)
557 {
558 }
559
560 static const struct tty_operations ptm_unix98_ops = {
561         .lookup = ptm_unix98_lookup,
562         .install = pty_unix98_install,
563         .remove = pty_unix98_remove,
564         .open = pty_open,
565         .close = pty_close,
566         .write = pty_write,
567         .write_room = pty_write_room,
568         .flush_buffer = pty_flush_buffer,
569         .chars_in_buffer = pty_chars_in_buffer,
570         .unthrottle = pty_unthrottle,
571         .set_termios = pty_set_termios,
572         .ioctl = pty_unix98_ioctl,
573         .shutdown = pty_unix98_shutdown,
574         .cleanup = pty_cleanup,
575         .resize = pty_resize
576 };
577
578 static const struct tty_operations pty_unix98_ops = {
579         .lookup = pts_unix98_lookup,
580         .install = pty_unix98_install,
581         .remove = pty_unix98_remove,
582         .open = pty_open,
583         .close = pty_close,
584         .write = pty_write,
585         .write_room = pty_write_room,
586         .flush_buffer = pty_flush_buffer,
587         .chars_in_buffer = pty_chars_in_buffer,
588         .unthrottle = pty_unthrottle,
589         .set_termios = pty_set_termios,
590         .shutdown = pty_unix98_shutdown,
591         .cleanup = pty_cleanup,
592 };
593
594 /**
595  *      ptmx_open               -       open a unix 98 pty master
596  *      @inode: inode of device file
597  *      @filp: file pointer to tty
598  *
599  *      Allocate a unix98 pty master device from the ptmx driver.
600  *
601  *      Locking: tty_mutex protects the init_dev work. tty->count should
602  *              protect the rest.
603  *              allocated_ptys_lock handles the list of free pty numbers
604  */
605
606 static int ptmx_open(struct inode *inode, struct file *filp)
607 {
608         struct tty_struct *tty;
609         int retval;
610         int index;
611
612         nonseekable_open(inode, filp);
613
614         retval = tty_alloc_file(filp);
615         if (retval)
616                 return retval;
617
618         /* find a device that is not in use. */
619         mutex_lock(&devpts_mutex);
620         index = devpts_new_index(inode);
621         mutex_unlock(&devpts_mutex);
622         if (index < 0) {
623                 retval = index;
624                 goto err_file;
625         }
626
627         mutex_lock(&tty_mutex);
628         tty = tty_init_dev(ptm_driver, index);
629
630         if (IS_ERR(tty)) {
631                 retval = PTR_ERR(tty);
632                 goto out;
633         }
634
635         /* The tty returned here is locked so we can safely
636            drop the mutex */
637         mutex_unlock(&tty_mutex);
638
639         set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */
640
641         tty_add_file(tty, filp);
642
643         retval = devpts_pty_new(inode, tty->link);
644         if (retval)
645                 goto err_release;
646
647         retval = ptm_driver->ops->open(tty, filp);
648         if (retval)
649                 goto err_release;
650
651         tty_unlock(tty);
652         return 0;
653 err_release:
654         tty_unlock(tty);
655         tty_release(inode, filp);
656         return retval;
657 out:
658         mutex_unlock(&tty_mutex);
659         devpts_kill_index(inode, index);
660 err_file:
661         tty_free_file(filp);
662         return retval;
663 }
664
665 static struct file_operations ptmx_fops;
666
667 static void __init unix98_pty_init(void)
668 {
669         ptm_driver = alloc_tty_driver(NR_UNIX98_PTY_MAX);
670         if (!ptm_driver)
671                 panic("Couldn't allocate Unix98 ptm driver");
672         pts_driver = alloc_tty_driver(NR_UNIX98_PTY_MAX);
673         if (!pts_driver)
674                 panic("Couldn't allocate Unix98 pts driver");
675
676         ptm_driver->driver_name = "pty_master";
677         ptm_driver->name = "ptm";
678         ptm_driver->major = UNIX98_PTY_MASTER_MAJOR;
679         ptm_driver->minor_start = 0;
680         ptm_driver->type = TTY_DRIVER_TYPE_PTY;
681         ptm_driver->subtype = PTY_TYPE_MASTER;
682         ptm_driver->init_termios = tty_std_termios;
683         ptm_driver->init_termios.c_iflag = 0;
684         ptm_driver->init_termios.c_oflag = 0;
685         ptm_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
686         ptm_driver->init_termios.c_lflag = 0;
687         ptm_driver->init_termios.c_ispeed = 38400;
688         ptm_driver->init_termios.c_ospeed = 38400;
689         ptm_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW |
690                 TTY_DRIVER_DYNAMIC_DEV | TTY_DRIVER_DEVPTS_MEM;
691         ptm_driver->other = pts_driver;
692         tty_set_operations(ptm_driver, &ptm_unix98_ops);
693
694         pts_driver->driver_name = "pty_slave";
695         pts_driver->name = "pts";
696         pts_driver->major = UNIX98_PTY_SLAVE_MAJOR;
697         pts_driver->minor_start = 0;
698         pts_driver->type = TTY_DRIVER_TYPE_PTY;
699         pts_driver->subtype = PTY_TYPE_SLAVE;
700         pts_driver->init_termios = tty_std_termios;
701         pts_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
702         pts_driver->init_termios.c_ispeed = 38400;
703         pts_driver->init_termios.c_ospeed = 38400;
704         pts_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW |
705                 TTY_DRIVER_DYNAMIC_DEV | TTY_DRIVER_DEVPTS_MEM;
706         pts_driver->other = ptm_driver;
707         tty_set_operations(pts_driver, &pty_unix98_ops);
708
709         if (tty_register_driver(ptm_driver))
710                 panic("Couldn't register Unix98 ptm driver");
711         if (tty_register_driver(pts_driver))
712                 panic("Couldn't register Unix98 pts driver");
713
714         /* Now create the /dev/ptmx special device */
715         tty_default_fops(&ptmx_fops);
716         ptmx_fops.open = ptmx_open;
717
718         cdev_init(&ptmx_cdev, &ptmx_fops);
719         if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) ||
720             register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0)
721                 panic("Couldn't register /dev/ptmx driver\n");
722         device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx");
723 }
724
725 #else
726 static inline void unix98_pty_init(void) { }
727 #endif
728
729 static int __init pty_init(void)
730 {
731         legacy_pty_init();
732         unix98_pty_init();
733         return 0;
734 }
735 module_init(pty_init);