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