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 */
   8
   9#include <linux/module.h>
  10#include <linux/errno.h>
  11#include <linux/interrupt.h>
  12#include <linux/tty.h>
  13#include <linux/tty_flip.h>
  14#include <linux/fcntl.h>
  15#include <linux/sched.h>
  16#include <linux/string.h>
  17#include <linux/major.h>
  18#include <linux/mm.h>
  19#include <linux/init.h>
  20#include <linux/device.h>
  21#include <linux/uaccess.h>
  22#include <linux/bitops.h>
  23#include <linux/devpts_fs.h>
  24#include <linux/slab.h>
  25#include <linux/mutex.h>
  26#include <linux/poll.h>
  27
  28#undef TTY_DEBUG_HANGUP
  29#ifdef TTY_DEBUG_HANGUP
  30# define tty_debug_hangup(tty, f, args...)      tty_debug(tty, f, ##args)
  31#else
  32# define tty_debug_hangup(tty, f, args...)      do {} while (0)
  33#endif
  34
  35#ifdef CONFIG_UNIX98_PTYS
  36static struct tty_driver *ptm_driver;
  37static struct tty_driver *pts_driver;
  38static DEFINE_MUTEX(devpts_mutex);
  39#endif
  40
  41static void pty_close(struct tty_struct *tty, struct file *filp)
  42{
  43        BUG_ON(!tty);
  44        if (tty->driver->subtype == PTY_TYPE_MASTER)
  45                WARN_ON(tty->count > 1);
  46        else {
  47                if (test_bit(TTY_IO_ERROR, &tty->flags))
  48                        return;
  49                if (tty->count > 2)
  50                        return;
  51        }
  52        set_bit(TTY_IO_ERROR, &tty->flags);
  53        wake_up_interruptible(&tty->read_wait);
  54        wake_up_interruptible(&tty->write_wait);
  55        spin_lock_irq(&tty->ctrl_lock);
  56        tty->packet = 0;
  57        spin_unlock_irq(&tty->ctrl_lock);
  58        /* Review - krefs on tty_link ?? */
  59        if (!tty->link)
  60                return;
  61        set_bit(TTY_OTHER_CLOSED, &tty->link->flags);
  62        tty_flip_buffer_push(tty->link->port);
  63        wake_up_interruptible(&tty->link->write_wait);
  64        if (tty->driver->subtype == PTY_TYPE_MASTER) {
  65                set_bit(TTY_OTHER_CLOSED, &tty->flags);
  66#ifdef CONFIG_UNIX98_PTYS
  67                if (tty->driver == ptm_driver) {
  68                        mutex_lock(&devpts_mutex);
  69                        if (tty->link->driver_data)
  70                                devpts_pty_kill(tty->link->driver_data);
  71                        mutex_unlock(&devpts_mutex);
  72                }
  73#endif
  74                tty_vhangup(tty->link);
  75        }
  76}
  77
  78/*
  79 * The unthrottle routine is called by the line discipline to signal
  80 * that it can receive more characters.  For PTY's, the TTY_THROTTLED
  81 * flag is always set, to force the line discipline to always call the
  82 * unthrottle routine when there are fewer than TTY_THRESHOLD_UNTHROTTLE
  83 * characters in the queue.  This is necessary since each time this
  84 * happens, we need to wake up any sleeping processes that could be
  85 * (1) trying to send data to the pty, or (2) waiting in wait_until_sent()
  86 * for the pty buffer to be drained.
  87 */
  88static void pty_unthrottle(struct tty_struct *tty)
  89{
  90        tty_wakeup(tty->link);
  91        set_bit(TTY_THROTTLED, &tty->flags);
  92}
  93
  94/**
  95 *      pty_write               -       write to a pty
  96 *      @tty: the tty we write from
  97 *      @buf: kernel buffer of data
  98 *      @count: bytes to write
  99 *
 100 *      Our "hardware" write method. Data is coming from the ldisc which
 101 *      may be in a non sleeping state. We simply throw this at the other
 102 *      end of the link as if we were an IRQ handler receiving stuff for
 103 *      the other side of the pty/tty pair.
 104 */
 105
 106static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c)
 107{
 108        struct tty_struct *to = tty->link;
 109
 110        if (tty->stopped)
 111                return 0;
 112
 113        if (c > 0) {
 114                /* Stuff the data into the input queue of the other end */
 115                c = tty_insert_flip_string(to->port, buf, c);
 116                /* And shovel */
 117                if (c)
 118                        tty_flip_buffer_push(to->port);
 119        }
 120        return c;
 121}
 122
 123/**
 124 *      pty_write_room  -       write space
 125 *      @tty: tty we are writing from
 126 *
 127 *      Report how many bytes the ldisc can send into the queue for
 128 *      the other device.
 129 */
 130
 131static int pty_write_room(struct tty_struct *tty)
 132{
 133        if (tty->stopped)
 134                return 0;
 135        return tty_buffer_space_avail(tty->link->port);
 136}
 137
 138/**
 139 *      pty_chars_in_buffer     -       characters currently in our tx queue
 140 *      @tty: our tty
 141 *
 142 *      Report how much we have in the transmit queue. As everything is
 143 *      instantly at the other end this is easy to implement.
 144 */
 145
 146static int pty_chars_in_buffer(struct tty_struct *tty)
 147{
 148        return 0;
 149}
 150
 151/* Set the lock flag on a pty */
 152static int pty_set_lock(struct tty_struct *tty, int __user *arg)
 153{
 154        int val;
 155        if (get_user(val, arg))
 156                return -EFAULT;
 157        if (val)
 158                set_bit(TTY_PTY_LOCK, &tty->flags);
 159        else
 160                clear_bit(TTY_PTY_LOCK, &tty->flags);
 161        return 0;
 162}
 163
 164static int pty_get_lock(struct tty_struct *tty, int __user *arg)
 165{
 166        int locked = test_bit(TTY_PTY_LOCK, &tty->flags);
 167        return put_user(locked, arg);
 168}
 169
 170/* Set the packet mode on a pty */
 171static int pty_set_pktmode(struct tty_struct *tty, int __user *arg)
 172{
 173        int pktmode;
 174
 175        if (get_user(pktmode, arg))
 176                return -EFAULT;
 177
 178        spin_lock_irq(&tty->ctrl_lock);
 179        if (pktmode) {
 180                if (!tty->packet) {
 181                        tty->link->ctrl_status = 0;
 182                        smp_mb();
 183                        tty->packet = 1;
 184                }
 185        } else
 186                tty->packet = 0;
 187        spin_unlock_irq(&tty->ctrl_lock);
 188
 189        return 0;
 190}
 191
 192/* Get the packet mode of a pty */
 193static int pty_get_pktmode(struct tty_struct *tty, int __user *arg)
 194{
 195        int pktmode = tty->packet;
 196        return put_user(pktmode, arg);
 197}
 198
 199/* Send a signal to the slave */
 200static int pty_signal(struct tty_struct *tty, int sig)
 201{
 202        struct pid *pgrp;
 203
 204        if (sig != SIGINT && sig != SIGQUIT && sig != SIGTSTP)
 205                return -EINVAL;
 206
 207        if (tty->link) {
 208                pgrp = tty_get_pgrp(tty->link);
 209                if (pgrp)
 210                        kill_pgrp(pgrp, sig, 1);
 211                put_pid(pgrp);
 212        }
 213        return 0;
 214}
 215
 216static void pty_flush_buffer(struct tty_struct *tty)
 217{
 218        struct tty_struct *to = tty->link;
 219        struct tty_ldisc *ld;
 220
 221        if (!to)
 222                return;
 223
 224        ld = tty_ldisc_ref(to);
 225        tty_buffer_flush(to, ld);
 226        if (ld)
 227                tty_ldisc_deref(ld);
 228
 229        if (to->packet) {
 230                spin_lock_irq(&tty->ctrl_lock);
 231                tty->ctrl_status |= TIOCPKT_FLUSHWRITE;
 232                wake_up_interruptible(&to->read_wait);
 233                spin_unlock_irq(&tty->ctrl_lock);
 234        }
 235}
 236
 237static int pty_open(struct tty_struct *tty, struct file *filp)
 238{
 239        if (!tty || !tty->link)
 240                return -ENODEV;
 241
 242        if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
 243                goto out;
 244        if (test_bit(TTY_PTY_LOCK, &tty->link->flags))
 245                goto out;
 246        if (tty->driver->subtype == PTY_TYPE_SLAVE && tty->link->count != 1)
 247                goto out;
 248
 249        clear_bit(TTY_IO_ERROR, &tty->flags);
 250        /* TTY_OTHER_CLOSED must be cleared before TTY_OTHER_DONE */
 251        clear_bit(TTY_OTHER_CLOSED, &tty->link->flags);
 252        clear_bit(TTY_OTHER_DONE, &tty->link->flags);
 253        set_bit(TTY_THROTTLED, &tty->flags);
 254        return 0;
 255
 256out:
 257        set_bit(TTY_IO_ERROR, &tty->flags);
 258        return -EIO;
 259}
 260
 261static void pty_set_termios(struct tty_struct *tty,
 262                                        struct ktermios *old_termios)
 263{
 264        /* See if packet mode change of state. */
 265        if (tty->link && tty->link->packet) {
 266                int extproc = (old_termios->c_lflag & EXTPROC) |
 267                                (tty->termios.c_lflag & EXTPROC);
 268                int old_flow = ((old_termios->c_iflag & IXON) &&
 269                                (old_termios->c_cc[VSTOP] == '\023') &&
 270                                (old_termios->c_cc[VSTART] == '\021'));
 271                int new_flow = (I_IXON(tty) &&
 272                                STOP_CHAR(tty) == '\023' &&
 273                                START_CHAR(tty) == '\021');
 274                if ((old_flow != new_flow) || extproc) {
 275                        spin_lock_irq(&tty->ctrl_lock);
 276                        if (old_flow != new_flow) {
 277                                tty->ctrl_status &= ~(TIOCPKT_DOSTOP | TIOCPKT_NOSTOP);
 278                                if (new_flow)
 279                                        tty->ctrl_status |= TIOCPKT_DOSTOP;
 280                                else
 281                                        tty->ctrl_status |= TIOCPKT_NOSTOP;
 282                        }
 283                        if (extproc)
 284                                tty->ctrl_status |= TIOCPKT_IOCTL;
 285                        spin_unlock_irq(&tty->ctrl_lock);
 286                        wake_up_interruptible(&tty->link->read_wait);
 287                }
 288        }
 289
 290        tty->termios.c_cflag &= ~(CSIZE | PARENB);
 291        tty->termios.c_cflag |= (CS8 | CREAD);
 292}
 293
 294/**
 295 *      pty_do_resize           -       resize event
 296 *      @tty: tty being resized
 297 *      @ws: window size being set.
 298 *
 299 *      Update the termios variables and send the necessary signals to
 300 *      peform a terminal resize correctly
 301 */
 302
 303static int pty_resize(struct tty_struct *tty,  struct winsize *ws)
 304{
 305        struct pid *pgrp, *rpgrp;
 306        struct tty_struct *pty = tty->link;
 307
 308        /* For a PTY we need to lock the tty side */
 309        mutex_lock(&tty->winsize_mutex);
 310        if (!memcmp(ws, &tty->winsize, sizeof(*ws)))
 311                goto done;
 312
 313        /* Signal the foreground process group of both ptys */
 314        pgrp = tty_get_pgrp(tty);
 315        rpgrp = tty_get_pgrp(pty);
 316
 317        if (pgrp)
 318                kill_pgrp(pgrp, SIGWINCH, 1);
 319        if (rpgrp != pgrp && rpgrp)
 320                kill_pgrp(rpgrp, SIGWINCH, 1);
 321
 322        put_pid(pgrp);
 323        put_pid(rpgrp);
 324
 325        tty->winsize = *ws;
 326        pty->winsize = *ws;     /* Never used so will go away soon */
 327done:
 328        mutex_unlock(&tty->winsize_mutex);
 329        return 0;
 330}
 331
 332/**
 333 *      pty_start - start() handler
 334 *      pty_stop  - stop() handler
 335 *      @tty: tty being flow-controlled
 336 *
 337 *      Propagates the TIOCPKT status to the master pty.
 338 *
 339 *      NB: only the master pty can be in packet mode so only the slave
 340 *          needs start()/stop() handlers
 341 */
 342static void pty_start(struct tty_struct *tty)
 343{
 344        unsigned long flags;
 345
 346        if (tty->link && tty->link->packet) {
 347                spin_lock_irqsave(&tty->ctrl_lock, flags);
 348                tty->ctrl_status &= ~TIOCPKT_STOP;
 349                tty->ctrl_status |= TIOCPKT_START;
 350                spin_unlock_irqrestore(&tty->ctrl_lock, flags);
 351                wake_up_interruptible_poll(&tty->link->read_wait, POLLIN);
 352        }
 353}
 354
 355static void pty_stop(struct tty_struct *tty)
 356{
 357        unsigned long flags;
 358
 359        if (tty->link && tty->link->packet) {
 360                spin_lock_irqsave(&tty->ctrl_lock, flags);
 361                tty->ctrl_status &= ~TIOCPKT_START;
 362                tty->ctrl_status |= TIOCPKT_STOP;
 363                spin_unlock_irqrestore(&tty->ctrl_lock, flags);
 364                wake_up_interruptible_poll(&tty->link->read_wait, POLLIN);
 365        }
 366}
 367
 368/**
 369 *      pty_common_install              -       set up the pty pair
 370 *      @driver: the pty driver
 371 *      @tty: the tty being instantiated
 372 *      @legacy: true if this is BSD style
 373 *
 374 *      Perform the initial set up for the tty/pty pair. Called from the
 375 *      tty layer when the port is first opened.
 376 *
 377 *      Locking: the caller must hold the tty_mutex
 378 */
 379static int pty_common_install(struct tty_driver *driver, struct tty_struct *tty,
 380                bool legacy)
 381{
 382        struct tty_struct *o_tty;
 383        struct tty_port *ports[2];
 384        int idx = tty->index;
 385        int retval = -ENOMEM;
 386
 387        /* Opening the slave first has always returned -EIO */
 388        if (driver->subtype != PTY_TYPE_MASTER)
 389                return -EIO;
 390
 391        ports[0] = kmalloc(sizeof **ports, GFP_KERNEL);
 392        ports[1] = kmalloc(sizeof **ports, GFP_KERNEL);
 393        if (!ports[0] || !ports[1])
 394                goto err;
 395        if (!try_module_get(driver->other->owner)) {
 396                /* This cannot in fact currently happen */
 397                goto err;
 398        }
 399        o_tty = alloc_tty_struct(driver->other, idx);
 400        if (!o_tty)
 401                goto err_put_module;
 402
 403        tty_set_lock_subclass(o_tty);
 404        lockdep_set_subclass(&o_tty->termios_rwsem, TTY_LOCK_SLAVE);
 405
 406        if (legacy) {
 407                /* We always use new tty termios data so we can do this
 408                   the easy way .. */
 409                retval = tty_init_termios(tty);
 410                if (retval)
 411                        goto err_deinit_tty;
 412
 413                retval = tty_init_termios(o_tty);
 414                if (retval)
 415                        goto err_free_termios;
 416
 417                driver->other->ttys[idx] = o_tty;
 418                driver->ttys[idx] = tty;
 419        } else {
 420                memset(&tty->termios_locked, 0, sizeof(tty->termios_locked));
 421                tty->termios = driver->init_termios;
 422                memset(&o_tty->termios_locked, 0, sizeof(tty->termios_locked));
 423                o_tty->termios = driver->other->init_termios;
 424        }
 425
 426        /*
 427         * Everything allocated ... set up the o_tty structure.
 428         */
 429        tty_driver_kref_get(driver->other);
 430        /* Establish the links in both directions */
 431        tty->link   = o_tty;
 432        o_tty->link = tty;
 433        tty_port_init(ports[0]);
 434        tty_port_init(ports[1]);
 435        tty_buffer_set_limit(ports[0], 8192);
 436        tty_buffer_set_limit(ports[1], 8192);
 437        o_tty->port = ports[0];
 438        tty->port = ports[1];
 439        o_tty->port->itty = o_tty;
 440
 441        tty_buffer_set_lock_subclass(o_tty->port);
 442
 443        tty_driver_kref_get(driver);
 444        tty->count++;
 445        o_tty->count++;
 446        return 0;
 447err_free_termios:
 448        if (legacy)
 449                tty_free_termios(tty);
 450err_deinit_tty:
 451        deinitialize_tty_struct(o_tty);
 452        free_tty_struct(o_tty);
 453err_put_module:
 454        module_put(driver->other->owner);
 455err:
 456        kfree(ports[0]);
 457        kfree(ports[1]);
 458        return retval;
 459}
 460
 461static void pty_cleanup(struct tty_struct *tty)
 462{
 463        tty_port_put(tty->port);
 464}
 465
 466/* Traditional BSD devices */
 467#ifdef CONFIG_LEGACY_PTYS
 468
 469static int pty_install(struct tty_driver *driver, struct tty_struct *tty)
 470{
 471        return pty_common_install(driver, tty, true);
 472}
 473
 474static void pty_remove(struct tty_driver *driver, struct tty_struct *tty)
 475{
 476        struct tty_struct *pair = tty->link;
 477        driver->ttys[tty->index] = NULL;
 478        if (pair)
 479                pair->driver->ttys[pair->index] = NULL;
 480}
 481
 482static int pty_bsd_ioctl(struct tty_struct *tty,
 483                         unsigned int cmd, unsigned long arg)
 484{
 485        switch (cmd) {
 486        case TIOCSPTLCK: /* Set PT Lock (disallow slave open) */
 487                return pty_set_lock(tty, (int __user *) arg);
 488        case TIOCGPTLCK: /* Get PT Lock status */
 489                return pty_get_lock(tty, (int __user *)arg);
 490        case TIOCPKT: /* Set PT packet mode */
 491                return pty_set_pktmode(tty, (int __user *)arg);
 492        case TIOCGPKT: /* Get PT packet mode */
 493                return pty_get_pktmode(tty, (int __user *)arg);
 494        case TIOCSIG:    /* Send signal to other side of pty */
 495                return pty_signal(tty, (int) arg);
 496        case TIOCGPTN: /* TTY returns ENOTTY, but glibc expects EINVAL here */
 497                return -EINVAL;
 498        }
 499        return -ENOIOCTLCMD;
 500}
 501
 502static int legacy_count = CONFIG_LEGACY_PTY_COUNT;
 503/*
 504 * not really modular, but the easiest way to keep compat with existing
 505 * bootargs behaviour is to continue using module_param here.
 506 */
 507module_param(legacy_count, int, 0);
 508
 509/*
 510 * The master side of a pty can do TIOCSPTLCK and thus
 511 * has pty_bsd_ioctl.
 512 */
 513static const struct tty_operations master_pty_ops_bsd = {
 514        .install = pty_install,
 515        .open = pty_open,
 516        .close = pty_close,
 517        .write = pty_write,
 518        .write_room = pty_write_room,
 519        .flush_buffer = pty_flush_buffer,
 520        .chars_in_buffer = pty_chars_in_buffer,
 521        .unthrottle = pty_unthrottle,
 522        .ioctl = pty_bsd_ioctl,
 523        .cleanup = pty_cleanup,
 524        .resize = pty_resize,
 525        .remove = pty_remove
 526};
 527
 528static const struct tty_operations slave_pty_ops_bsd = {
 529        .install = pty_install,
 530        .open = pty_open,
 531        .close = pty_close,
 532        .write = pty_write,
 533        .write_room = pty_write_room,
 534        .flush_buffer = pty_flush_buffer,
 535        .chars_in_buffer = pty_chars_in_buffer,
 536        .unthrottle = pty_unthrottle,
 537        .set_termios = pty_set_termios,
 538        .cleanup = pty_cleanup,
 539        .resize = pty_resize,
 540        .start = pty_start,
 541        .stop = pty_stop,
 542        .remove = pty_remove
 543};
 544
 545static void __init legacy_pty_init(void)
 546{
 547        struct tty_driver *pty_driver, *pty_slave_driver;
 548
 549        if (legacy_count <= 0)
 550                return;
 551
 552        pty_driver = tty_alloc_driver(legacy_count,
 553                        TTY_DRIVER_RESET_TERMIOS |
 554                        TTY_DRIVER_REAL_RAW |
 555                        TTY_DRIVER_DYNAMIC_ALLOC);
 556        if (IS_ERR(pty_driver))
 557                panic("Couldn't allocate pty driver");
 558
 559        pty_slave_driver = tty_alloc_driver(legacy_count,
 560                        TTY_DRIVER_RESET_TERMIOS |
 561                        TTY_DRIVER_REAL_RAW |
 562                        TTY_DRIVER_DYNAMIC_ALLOC);
 563        if (IS_ERR(pty_slave_driver))
 564                panic("Couldn't allocate pty slave driver");
 565
 566        pty_driver->driver_name = "pty_master";
 567        pty_driver->name = "pty";
 568        pty_driver->major = PTY_MASTER_MAJOR;
 569        pty_driver->minor_start = 0;
 570        pty_driver->type = TTY_DRIVER_TYPE_PTY;
 571        pty_driver->subtype = PTY_TYPE_MASTER;
 572        pty_driver->init_termios = tty_std_termios;
 573        pty_driver->init_termios.c_iflag = 0;
 574        pty_driver->init_termios.c_oflag = 0;
 575        pty_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
 576        pty_driver->init_termios.c_lflag = 0;
 577        pty_driver->init_termios.c_ispeed = 38400;
 578        pty_driver->init_termios.c_ospeed = 38400;
 579        pty_driver->other = pty_slave_driver;
 580        tty_set_operations(pty_driver, &master_pty_ops_bsd);
 581
 582        pty_slave_driver->driver_name = "pty_slave";
 583        pty_slave_driver->name = "ttyp";
 584        pty_slave_driver->major = PTY_SLAVE_MAJOR;
 585        pty_slave_driver->minor_start = 0;
 586        pty_slave_driver->type = TTY_DRIVER_TYPE_PTY;
 587        pty_slave_driver->subtype = PTY_TYPE_SLAVE;
 588        pty_slave_driver->init_termios = tty_std_termios;
 589        pty_slave_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
 590        pty_slave_driver->init_termios.c_ispeed = 38400;
 591        pty_slave_driver->init_termios.c_ospeed = 38400;
 592        pty_slave_driver->other = pty_driver;
 593        tty_set_operations(pty_slave_driver, &slave_pty_ops_bsd);
 594
 595        if (tty_register_driver(pty_driver))
 596                panic("Couldn't register pty driver");
 597        if (tty_register_driver(pty_slave_driver))
 598                panic("Couldn't register pty slave driver");
 599}
 600#else
 601static inline void legacy_pty_init(void) { }
 602#endif
 603
 604/* Unix98 devices */
 605#ifdef CONFIG_UNIX98_PTYS
 606
 607static struct cdev ptmx_cdev;
 608
 609static int pty_unix98_ioctl(struct tty_struct *tty,
 610                            unsigned int cmd, unsigned long arg)
 611{
 612        switch (cmd) {
 613        case TIOCSPTLCK: /* Set PT Lock (disallow slave open) */
 614                return pty_set_lock(tty, (int __user *)arg);
 615        case TIOCGPTLCK: /* Get PT Lock status */
 616                return pty_get_lock(tty, (int __user *)arg);
 617        case TIOCPKT: /* Set PT packet mode */
 618                return pty_set_pktmode(tty, (int __user *)arg);
 619        case TIOCGPKT: /* Get PT packet mode */
 620                return pty_get_pktmode(tty, (int __user *)arg);
 621        case TIOCGPTN: /* Get PT Number */
 622                return put_user(tty->index, (unsigned int __user *)arg);
 623        case TIOCSIG:    /* Send signal to other side of pty */
 624                return pty_signal(tty, (int) arg);
 625        }
 626
 627        return -ENOIOCTLCMD;
 628}
 629
 630/**
 631 *      ptm_unix98_lookup       -       find a pty master
 632 *      @driver: ptm driver
 633 *      @idx: tty index
 634 *
 635 *      Look up a pty master device. Called under the tty_mutex for now.
 636 *      This provides our locking.
 637 */
 638
 639static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver,
 640                struct inode *ptm_inode, int idx)
 641{
 642        /* Master must be open via /dev/ptmx */
 643        return ERR_PTR(-EIO);
 644}
 645
 646/**
 647 *      pts_unix98_lookup       -       find a pty slave
 648 *      @driver: pts driver
 649 *      @idx: tty index
 650 *
 651 *      Look up a pty master device. Called under the tty_mutex for now.
 652 *      This provides our locking for the tty pointer.
 653 */
 654
 655static struct tty_struct *pts_unix98_lookup(struct tty_driver *driver,
 656                struct inode *pts_inode, int idx)
 657{
 658        struct tty_struct *tty;
 659
 660        mutex_lock(&devpts_mutex);
 661        tty = devpts_get_priv(pts_inode);
 662        mutex_unlock(&devpts_mutex);
 663        /* Master must be open before slave */
 664        if (!tty)
 665                return ERR_PTR(-EIO);
 666        return tty;
 667}
 668
 669/* We have no need to install and remove our tty objects as devpts does all
 670   the work for us */
 671
 672static int pty_unix98_install(struct tty_driver *driver, struct tty_struct *tty)
 673{
 674        return pty_common_install(driver, tty, false);
 675}
 676
 677static void pty_unix98_remove(struct tty_driver *driver, struct tty_struct *tty)
 678{
 679}
 680
 681/* this is called once with whichever end is closed last */
 682static void pty_unix98_shutdown(struct tty_struct *tty)
 683{
 684        devpts_kill_index(tty->driver_data, tty->index);
 685}
 686
 687static const struct tty_operations ptm_unix98_ops = {
 688        .lookup = ptm_unix98_lookup,
 689        .install = pty_unix98_install,
 690        .remove = pty_unix98_remove,
 691        .open = pty_open,
 692        .close = pty_close,
 693        .write = pty_write,
 694        .write_room = pty_write_room,
 695        .flush_buffer = pty_flush_buffer,
 696        .chars_in_buffer = pty_chars_in_buffer,
 697        .unthrottle = pty_unthrottle,
 698        .ioctl = pty_unix98_ioctl,
 699        .resize = pty_resize,
 700        .shutdown = pty_unix98_shutdown,
 701        .cleanup = pty_cleanup
 702};
 703
 704static const struct tty_operations pty_unix98_ops = {
 705        .lookup = pts_unix98_lookup,
 706        .install = pty_unix98_install,
 707        .remove = pty_unix98_remove,
 708        .open = pty_open,
 709        .close = pty_close,
 710        .write = pty_write,
 711        .write_room = pty_write_room,
 712        .flush_buffer = pty_flush_buffer,
 713        .chars_in_buffer = pty_chars_in_buffer,
 714        .unthrottle = pty_unthrottle,
 715        .set_termios = pty_set_termios,
 716        .start = pty_start,
 717        .stop = pty_stop,
 718        .shutdown = pty_unix98_shutdown,
 719        .cleanup = pty_cleanup,
 720};
 721
 722/**
 723 *      ptmx_open               -       open a unix 98 pty master
 724 *      @inode: inode of device file
 725 *      @filp: file pointer to tty
 726 *
 727 *      Allocate a unix98 pty master device from the ptmx driver.
 728 *
 729 *      Locking: tty_mutex protects the init_dev work. tty->count should
 730 *              protect the rest.
 731 *              allocated_ptys_lock handles the list of free pty numbers
 732 */
 733
 734static int ptmx_open(struct inode *inode, struct file *filp)
 735{
 736        struct tty_struct *tty;
 737        struct inode *slave_inode;
 738        int retval;
 739        int index;
 740
 741        nonseekable_open(inode, filp);
 742
 743        /* We refuse fsnotify events on ptmx, since it's a shared resource */
 744        filp->f_mode |= FMODE_NONOTIFY;
 745
 746        retval = tty_alloc_file(filp);
 747        if (retval)
 748                return retval;
 749
 750        /* find a device that is not in use. */
 751        mutex_lock(&devpts_mutex);
 752        index = devpts_new_index(inode);
 753        if (index < 0) {
 754                retval = index;
 755                mutex_unlock(&devpts_mutex);
 756                goto err_file;
 757        }
 758
 759        mutex_unlock(&devpts_mutex);
 760
 761        mutex_lock(&tty_mutex);
 762        tty = tty_init_dev(ptm_driver, index);
 763
 764        if (IS_ERR(tty)) {
 765                retval = PTR_ERR(tty);
 766                goto out;
 767        }
 768
 769        /* The tty returned here is locked so we can safely
 770           drop the mutex */
 771        mutex_unlock(&tty_mutex);
 772
 773        set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */
 774        tty->driver_data = inode;
 775
 776        tty_add_file(tty, filp);
 777
 778        slave_inode = devpts_pty_new(inode,
 779                        MKDEV(UNIX98_PTY_SLAVE_MAJOR, index), index,
 780                        tty->link);
 781        if (IS_ERR(slave_inode)) {
 782                retval = PTR_ERR(slave_inode);
 783                goto err_release;
 784        }
 785        tty->link->driver_data = slave_inode;
 786
 787        retval = ptm_driver->ops->open(tty, filp);
 788        if (retval)
 789                goto err_release;
 790
 791        tty_debug_hangup(tty, "(tty count=%d)\n", tty->count);
 792
 793        tty_unlock(tty);
 794        return 0;
 795err_release:
 796        tty_unlock(tty);
 797        tty_release(inode, filp);
 798        return retval;
 799out:
 800        mutex_unlock(&tty_mutex);
 801        devpts_kill_index(inode, index);
 802err_file:
 803        tty_free_file(filp);
 804        return retval;
 805}
 806
 807static struct file_operations ptmx_fops;
 808
 809static void __init unix98_pty_init(void)
 810{
 811        ptm_driver = tty_alloc_driver(NR_UNIX98_PTY_MAX,
 812                        TTY_DRIVER_RESET_TERMIOS |
 813                        TTY_DRIVER_REAL_RAW |
 814                        TTY_DRIVER_DYNAMIC_DEV |
 815                        TTY_DRIVER_DEVPTS_MEM |
 816                        TTY_DRIVER_DYNAMIC_ALLOC);
 817        if (IS_ERR(ptm_driver))
 818                panic("Couldn't allocate Unix98 ptm driver");
 819        pts_driver = tty_alloc_driver(NR_UNIX98_PTY_MAX,
 820                        TTY_DRIVER_RESET_TERMIOS |
 821                        TTY_DRIVER_REAL_RAW |
 822                        TTY_DRIVER_DYNAMIC_DEV |
 823                        TTY_DRIVER_DEVPTS_MEM |
 824                        TTY_DRIVER_DYNAMIC_ALLOC);
 825        if (IS_ERR(pts_driver))
 826                panic("Couldn't allocate Unix98 pts driver");
 827
 828        ptm_driver->driver_name = "pty_master";
 829        ptm_driver->name = "ptm";
 830        ptm_driver->major = UNIX98_PTY_MASTER_MAJOR;
 831        ptm_driver->minor_start = 0;
 832        ptm_driver->type = TTY_DRIVER_TYPE_PTY;
 833        ptm_driver->subtype = PTY_TYPE_MASTER;
 834        ptm_driver->init_termios = tty_std_termios;
 835        ptm_driver->init_termios.c_iflag = 0;
 836        ptm_driver->init_termios.c_oflag = 0;
 837        ptm_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
 838        ptm_driver->init_termios.c_lflag = 0;
 839        ptm_driver->init_termios.c_ispeed = 38400;
 840        ptm_driver->init_termios.c_ospeed = 38400;
 841        ptm_driver->other = pts_driver;
 842        tty_set_operations(ptm_driver, &ptm_unix98_ops);
 843
 844        pts_driver->driver_name = "pty_slave";
 845        pts_driver->name = "pts";
 846        pts_driver->major = UNIX98_PTY_SLAVE_MAJOR;
 847        pts_driver->minor_start = 0;
 848        pts_driver->type = TTY_DRIVER_TYPE_PTY;
 849        pts_driver->subtype = PTY_TYPE_SLAVE;
 850        pts_driver->init_termios = tty_std_termios;
 851        pts_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
 852        pts_driver->init_termios.c_ispeed = 38400;
 853        pts_driver->init_termios.c_ospeed = 38400;
 854        pts_driver->other = ptm_driver;
 855        tty_set_operations(pts_driver, &pty_unix98_ops);
 856
 857        if (tty_register_driver(ptm_driver))
 858                panic("Couldn't register Unix98 ptm driver");
 859        if (tty_register_driver(pts_driver))
 860                panic("Couldn't register Unix98 pts driver");
 861
 862        /* Now create the /dev/ptmx special device */
 863        tty_default_fops(&ptmx_fops);
 864        ptmx_fops.open = ptmx_open;
 865
 866        cdev_init(&ptmx_cdev, &ptmx_fops);
 867        if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) ||
 868            register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0)
 869                panic("Couldn't register /dev/ptmx driver");
 870        device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx");
 871}
 872
 873#else
 874static inline void unix98_pty_init(void) { }
 875#endif
 876
 877static int __init pty_init(void)
 878{
 879        legacy_pty_init();
 880        unix98_pty_init();
 881        return 0;
 882}
 883device_initcall(pty_init);
 884