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 (tty_io_error(tty))
  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        wake_up_interruptible(&tty->link->read_wait);
  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        clear_bit(TTY_OTHER_CLOSED, &tty->link->flags);
 251        set_bit(TTY_THROTTLED, &tty->flags);
 252        return 0;
 253
 254out:
 255        set_bit(TTY_IO_ERROR, &tty->flags);
 256        return -EIO;
 257}
 258
 259static void pty_set_termios(struct tty_struct *tty,
 260                                        struct ktermios *old_termios)
 261{
 262        /* See if packet mode change of state. */
 263        if (tty->link && tty->link->packet) {
 264                int extproc = (old_termios->c_lflag & EXTPROC) | L_EXTPROC(tty);
 265                int old_flow = ((old_termios->c_iflag & IXON) &&
 266                                (old_termios->c_cc[VSTOP] == '\023') &&
 267                                (old_termios->c_cc[VSTART] == '\021'));
 268                int new_flow = (I_IXON(tty) &&
 269                                STOP_CHAR(tty) == '\023' &&
 270                                START_CHAR(tty) == '\021');
 271                if ((old_flow != new_flow) || extproc) {
 272                        spin_lock_irq(&tty->ctrl_lock);
 273                        if (old_flow != new_flow) {
 274                                tty->ctrl_status &= ~(TIOCPKT_DOSTOP | TIOCPKT_NOSTOP);
 275                                if (new_flow)
 276                                        tty->ctrl_status |= TIOCPKT_DOSTOP;
 277                                else
 278                                        tty->ctrl_status |= TIOCPKT_NOSTOP;
 279                        }
 280                        if (extproc)
 281                                tty->ctrl_status |= TIOCPKT_IOCTL;
 282                        spin_unlock_irq(&tty->ctrl_lock);
 283                        wake_up_interruptible(&tty->link->read_wait);
 284                }
 285        }
 286
 287        tty->termios.c_cflag &= ~(CSIZE | PARENB);
 288        tty->termios.c_cflag |= (CS8 | CREAD);
 289}
 290
 291/**
 292 *      pty_do_resize           -       resize event
 293 *      @tty: tty being resized
 294 *      @ws: window size being set.
 295 *
 296 *      Update the termios variables and send the necessary signals to
 297 *      peform a terminal resize correctly
 298 */
 299
 300static int pty_resize(struct tty_struct *tty,  struct winsize *ws)
 301{
 302        struct pid *pgrp, *rpgrp;
 303        struct tty_struct *pty = tty->link;
 304
 305        /* For a PTY we need to lock the tty side */
 306        mutex_lock(&tty->winsize_mutex);
 307        if (!memcmp(ws, &tty->winsize, sizeof(*ws)))
 308                goto done;
 309
 310        /* Signal the foreground process group of both ptys */
 311        pgrp = tty_get_pgrp(tty);
 312        rpgrp = tty_get_pgrp(pty);
 313
 314        if (pgrp)
 315                kill_pgrp(pgrp, SIGWINCH, 1);
 316        if (rpgrp != pgrp && rpgrp)
 317                kill_pgrp(rpgrp, SIGWINCH, 1);
 318
 319        put_pid(pgrp);
 320        put_pid(rpgrp);
 321
 322        tty->winsize = *ws;
 323        pty->winsize = *ws;     /* Never used so will go away soon */
 324done:
 325        mutex_unlock(&tty->winsize_mutex);
 326        return 0;
 327}
 328
 329/**
 330 *      pty_start - start() handler
 331 *      pty_stop  - stop() handler
 332 *      @tty: tty being flow-controlled
 333 *
 334 *      Propagates the TIOCPKT status to the master pty.
 335 *
 336 *      NB: only the master pty can be in packet mode so only the slave
 337 *          needs start()/stop() handlers
 338 */
 339static void pty_start(struct tty_struct *tty)
 340{
 341        unsigned long flags;
 342
 343        if (tty->link && tty->link->packet) {
 344                spin_lock_irqsave(&tty->ctrl_lock, flags);
 345                tty->ctrl_status &= ~TIOCPKT_STOP;
 346                tty->ctrl_status |= TIOCPKT_START;
 347                spin_unlock_irqrestore(&tty->ctrl_lock, flags);
 348                wake_up_interruptible_poll(&tty->link->read_wait, POLLIN);
 349        }
 350}
 351
 352static void pty_stop(struct tty_struct *tty)
 353{
 354        unsigned long flags;
 355
 356        if (tty->link && tty->link->packet) {
 357                spin_lock_irqsave(&tty->ctrl_lock, flags);
 358                tty->ctrl_status &= ~TIOCPKT_START;
 359                tty->ctrl_status |= TIOCPKT_STOP;
 360                spin_unlock_irqrestore(&tty->ctrl_lock, flags);
 361                wake_up_interruptible_poll(&tty->link->read_wait, POLLIN);
 362        }
 363}
 364
 365/**
 366 *      pty_common_install              -       set up the pty pair
 367 *      @driver: the pty driver
 368 *      @tty: the tty being instantiated
 369 *      @legacy: true if this is BSD style
 370 *
 371 *      Perform the initial set up for the tty/pty pair. Called from the
 372 *      tty layer when the port is first opened.
 373 *
 374 *      Locking: the caller must hold the tty_mutex
 375 */
 376static int pty_common_install(struct tty_driver *driver, struct tty_struct *tty,
 377                bool legacy)
 378{
 379        struct tty_struct *o_tty;
 380        struct tty_port *ports[2];
 381        int idx = tty->index;
 382        int retval = -ENOMEM;
 383
 384        /* Opening the slave first has always returned -EIO */
 385        if (driver->subtype != PTY_TYPE_MASTER)
 386                return -EIO;
 387
 388        ports[0] = kmalloc(sizeof **ports, GFP_KERNEL);
 389        ports[1] = kmalloc(sizeof **ports, GFP_KERNEL);
 390        if (!ports[0] || !ports[1])
 391                goto err;
 392        if (!try_module_get(driver->other->owner)) {
 393                /* This cannot in fact currently happen */
 394                goto err;
 395        }
 396        o_tty = alloc_tty_struct(driver->other, idx);
 397        if (!o_tty)
 398                goto err_put_module;
 399
 400        tty_set_lock_subclass(o_tty);
 401        lockdep_set_subclass(&o_tty->termios_rwsem, TTY_LOCK_SLAVE);
 402
 403        if (legacy) {
 404                /* We always use new tty termios data so we can do this
 405                   the easy way .. */
 406                tty_init_termios(tty);
 407                tty_init_termios(o_tty);
 408
 409                driver->other->ttys[idx] = o_tty;
 410                driver->ttys[idx] = tty;
 411        } else {
 412                memset(&tty->termios_locked, 0, sizeof(tty->termios_locked));
 413                tty->termios = driver->init_termios;
 414                memset(&o_tty->termios_locked, 0, sizeof(tty->termios_locked));
 415                o_tty->termios = driver->other->init_termios;
 416        }
 417
 418        /*
 419         * Everything allocated ... set up the o_tty structure.
 420         */
 421        tty_driver_kref_get(driver->other);
 422        /* Establish the links in both directions */
 423        tty->link   = o_tty;
 424        o_tty->link = tty;
 425        tty_port_init(ports[0]);
 426        tty_port_init(ports[1]);
 427        tty_buffer_set_limit(ports[0], 8192);
 428        tty_buffer_set_limit(ports[1], 8192);
 429        o_tty->port = ports[0];
 430        tty->port = ports[1];
 431        o_tty->port->itty = o_tty;
 432
 433        tty_buffer_set_lock_subclass(o_tty->port);
 434
 435        tty_driver_kref_get(driver);
 436        tty->count++;
 437        o_tty->count++;
 438        return 0;
 439
 440err_put_module:
 441        module_put(driver->other->owner);
 442err:
 443        kfree(ports[0]);
 444        kfree(ports[1]);
 445        return retval;
 446}
 447
 448static void pty_cleanup(struct tty_struct *tty)
 449{
 450        tty_port_put(tty->port);
 451}
 452
 453/* Traditional BSD devices */
 454#ifdef CONFIG_LEGACY_PTYS
 455
 456static int pty_install(struct tty_driver *driver, struct tty_struct *tty)
 457{
 458        return pty_common_install(driver, tty, true);
 459}
 460
 461static void pty_remove(struct tty_driver *driver, struct tty_struct *tty)
 462{
 463        struct tty_struct *pair = tty->link;
 464        driver->ttys[tty->index] = NULL;
 465        if (pair)
 466                pair->driver->ttys[pair->index] = NULL;
 467}
 468
 469static int pty_bsd_ioctl(struct tty_struct *tty,
 470                         unsigned int cmd, unsigned long arg)
 471{
 472        switch (cmd) {
 473        case TIOCSPTLCK: /* Set PT Lock (disallow slave open) */
 474                return pty_set_lock(tty, (int __user *) arg);
 475        case TIOCGPTLCK: /* Get PT Lock status */
 476                return pty_get_lock(tty, (int __user *)arg);
 477        case TIOCPKT: /* Set PT packet mode */
 478                return pty_set_pktmode(tty, (int __user *)arg);
 479        case TIOCGPKT: /* Get PT packet mode */
 480                return pty_get_pktmode(tty, (int __user *)arg);
 481        case TIOCSIG:    /* Send signal to other side of pty */
 482                return pty_signal(tty, (int) arg);
 483        case TIOCGPTN: /* TTY returns ENOTTY, but glibc expects EINVAL here */
 484                return -EINVAL;
 485        }
 486        return -ENOIOCTLCMD;
 487}
 488
 489static int legacy_count = CONFIG_LEGACY_PTY_COUNT;
 490/*
 491 * not really modular, but the easiest way to keep compat with existing
 492 * bootargs behaviour is to continue using module_param here.
 493 */
 494module_param(legacy_count, int, 0);
 495
 496/*
 497 * The master side of a pty can do TIOCSPTLCK and thus
 498 * has pty_bsd_ioctl.
 499 */
 500static const struct tty_operations master_pty_ops_bsd = {
 501        .install = pty_install,
 502        .open = pty_open,
 503        .close = pty_close,
 504        .write = pty_write,
 505        .write_room = pty_write_room,
 506        .flush_buffer = pty_flush_buffer,
 507        .chars_in_buffer = pty_chars_in_buffer,
 508        .unthrottle = pty_unthrottle,
 509        .ioctl = pty_bsd_ioctl,
 510        .cleanup = pty_cleanup,
 511        .resize = pty_resize,
 512        .remove = pty_remove
 513};
 514
 515static const struct tty_operations slave_pty_ops_bsd = {
 516        .install = pty_install,
 517        .open = pty_open,
 518        .close = pty_close,
 519        .write = pty_write,
 520        .write_room = pty_write_room,
 521        .flush_buffer = pty_flush_buffer,
 522        .chars_in_buffer = pty_chars_in_buffer,
 523        .unthrottle = pty_unthrottle,
 524        .set_termios = pty_set_termios,
 525        .cleanup = pty_cleanup,
 526        .resize = pty_resize,
 527        .start = pty_start,
 528        .stop = pty_stop,
 529        .remove = pty_remove
 530};
 531
 532static void __init legacy_pty_init(void)
 533{
 534        struct tty_driver *pty_driver, *pty_slave_driver;
 535
 536        if (legacy_count <= 0)
 537                return;
 538
 539        pty_driver = tty_alloc_driver(legacy_count,
 540                        TTY_DRIVER_RESET_TERMIOS |
 541                        TTY_DRIVER_REAL_RAW |
 542                        TTY_DRIVER_DYNAMIC_ALLOC);
 543        if (IS_ERR(pty_driver))
 544                panic("Couldn't allocate pty driver");
 545
 546        pty_slave_driver = tty_alloc_driver(legacy_count,
 547                        TTY_DRIVER_RESET_TERMIOS |
 548                        TTY_DRIVER_REAL_RAW |
 549                        TTY_DRIVER_DYNAMIC_ALLOC);
 550        if (IS_ERR(pty_slave_driver))
 551                panic("Couldn't allocate pty slave driver");
 552
 553        pty_driver->driver_name = "pty_master";
 554        pty_driver->name = "pty";
 555        pty_driver->major = PTY_MASTER_MAJOR;
 556        pty_driver->minor_start = 0;
 557        pty_driver->type = TTY_DRIVER_TYPE_PTY;
 558        pty_driver->subtype = PTY_TYPE_MASTER;
 559        pty_driver->init_termios = tty_std_termios;
 560        pty_driver->init_termios.c_iflag = 0;
 561        pty_driver->init_termios.c_oflag = 0;
 562        pty_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
 563        pty_driver->init_termios.c_lflag = 0;
 564        pty_driver->init_termios.c_ispeed = 38400;
 565        pty_driver->init_termios.c_ospeed = 38400;
 566        pty_driver->other = pty_slave_driver;
 567        tty_set_operations(pty_driver, &master_pty_ops_bsd);
 568
 569        pty_slave_driver->driver_name = "pty_slave";
 570        pty_slave_driver->name = "ttyp";
 571        pty_slave_driver->major = PTY_SLAVE_MAJOR;
 572        pty_slave_driver->minor_start = 0;
 573        pty_slave_driver->type = TTY_DRIVER_TYPE_PTY;
 574        pty_slave_driver->subtype = PTY_TYPE_SLAVE;
 575        pty_slave_driver->init_termios = tty_std_termios;
 576        pty_slave_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
 577        pty_slave_driver->init_termios.c_ispeed = 38400;
 578        pty_slave_driver->init_termios.c_ospeed = 38400;
 579        pty_slave_driver->other = pty_driver;
 580        tty_set_operations(pty_slave_driver, &slave_pty_ops_bsd);
 581
 582        if (tty_register_driver(pty_driver))
 583                panic("Couldn't register pty driver");
 584        if (tty_register_driver(pty_slave_driver))
 585                panic("Couldn't register pty slave driver");
 586}
 587#else
 588static inline void legacy_pty_init(void) { }
 589#endif
 590
 591/* Unix98 devices */
 592#ifdef CONFIG_UNIX98_PTYS
 593
 594static struct cdev ptmx_cdev;
 595
 596static int pty_unix98_ioctl(struct tty_struct *tty,
 597                            unsigned int cmd, unsigned long arg)
 598{
 599        switch (cmd) {
 600        case TIOCSPTLCK: /* Set PT Lock (disallow slave open) */
 601                return pty_set_lock(tty, (int __user *)arg);
 602        case TIOCGPTLCK: /* Get PT Lock status */
 603                return pty_get_lock(tty, (int __user *)arg);
 604        case TIOCPKT: /* Set PT packet mode */
 605                return pty_set_pktmode(tty, (int __user *)arg);
 606        case TIOCGPKT: /* Get PT packet mode */
 607                return pty_get_pktmode(tty, (int __user *)arg);
 608        case TIOCGPTN: /* Get PT Number */
 609                return put_user(tty->index, (unsigned int __user *)arg);
 610        case TIOCSIG:    /* Send signal to other side of pty */
 611                return pty_signal(tty, (int) arg);
 612        }
 613
 614        return -ENOIOCTLCMD;
 615}
 616
 617/**
 618 *      ptm_unix98_lookup       -       find a pty master
 619 *      @driver: ptm driver
 620 *      @idx: tty index
 621 *
 622 *      Look up a pty master device. Called under the tty_mutex for now.
 623 *      This provides our locking.
 624 */
 625
 626static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver,
 627                struct file *file, int idx)
 628{
 629        /* Master must be open via /dev/ptmx */
 630        return ERR_PTR(-EIO);
 631}
 632
 633/**
 634 *      pts_unix98_lookup       -       find a pty slave
 635 *      @driver: pts driver
 636 *      @idx: tty index
 637 *
 638 *      Look up a pty master device. Called under the tty_mutex for now.
 639 *      This provides our locking for the tty pointer.
 640 */
 641
 642static struct tty_struct *pts_unix98_lookup(struct tty_driver *driver,
 643                struct file *file, int idx)
 644{
 645        struct tty_struct *tty;
 646
 647        mutex_lock(&devpts_mutex);
 648        tty = devpts_get_priv(file->f_path.dentry);
 649        mutex_unlock(&devpts_mutex);
 650        /* Master must be open before slave */
 651        if (!tty)
 652                return ERR_PTR(-EIO);
 653        return tty;
 654}
 655
 656static int pty_unix98_install(struct tty_driver *driver, struct tty_struct *tty)
 657{
 658        return pty_common_install(driver, tty, false);
 659}
 660
 661/* this is called once with whichever end is closed last */
 662static void pty_unix98_remove(struct tty_driver *driver, struct tty_struct *tty)
 663{
 664        struct pts_fs_info *fsi;
 665
 666        if (tty->driver->subtype == PTY_TYPE_MASTER)
 667                fsi = tty->driver_data;
 668        else
 669                fsi = tty->link->driver_data;
 670
 671        if (fsi) {
 672                devpts_kill_index(fsi, tty->index);
 673                devpts_release(fsi);
 674        }
 675}
 676
 677static const struct tty_operations ptm_unix98_ops = {
 678        .lookup = ptm_unix98_lookup,
 679        .install = pty_unix98_install,
 680        .remove = pty_unix98_remove,
 681        .open = pty_open,
 682        .close = pty_close,
 683        .write = pty_write,
 684        .write_room = pty_write_room,
 685        .flush_buffer = pty_flush_buffer,
 686        .chars_in_buffer = pty_chars_in_buffer,
 687        .unthrottle = pty_unthrottle,
 688        .ioctl = pty_unix98_ioctl,
 689        .resize = pty_resize,
 690        .cleanup = pty_cleanup
 691};
 692
 693static const struct tty_operations pty_unix98_ops = {
 694        .lookup = pts_unix98_lookup,
 695        .install = pty_unix98_install,
 696        .remove = pty_unix98_remove,
 697        .open = pty_open,
 698        .close = pty_close,
 699        .write = pty_write,
 700        .write_room = pty_write_room,
 701        .flush_buffer = pty_flush_buffer,
 702        .chars_in_buffer = pty_chars_in_buffer,
 703        .unthrottle = pty_unthrottle,
 704        .set_termios = pty_set_termios,
 705        .start = pty_start,
 706        .stop = pty_stop,
 707        .cleanup = pty_cleanup,
 708};
 709
 710/**
 711 *      ptmx_open               -       open a unix 98 pty master
 712 *      @inode: inode of device file
 713 *      @filp: file pointer to tty
 714 *
 715 *      Allocate a unix98 pty master device from the ptmx driver.
 716 *
 717 *      Locking: tty_mutex protects the init_dev work. tty->count should
 718 *              protect the rest.
 719 *              allocated_ptys_lock handles the list of free pty numbers
 720 */
 721
 722static int ptmx_open(struct inode *inode, struct file *filp)
 723{
 724        struct pts_fs_info *fsi;
 725        struct tty_struct *tty;
 726        struct dentry *dentry;
 727        int retval;
 728        int index;
 729
 730        nonseekable_open(inode, filp);
 731
 732        /* We refuse fsnotify events on ptmx, since it's a shared resource */
 733        filp->f_mode |= FMODE_NONOTIFY;
 734
 735        retval = tty_alloc_file(filp);
 736        if (retval)
 737                return retval;
 738
 739        fsi = devpts_acquire(filp);
 740        if (IS_ERR(fsi)) {
 741                retval = PTR_ERR(fsi);
 742                goto out_free_file;
 743        }
 744
 745        /* find a device that is not in use. */
 746        mutex_lock(&devpts_mutex);
 747        index = devpts_new_index(fsi);
 748        mutex_unlock(&devpts_mutex);
 749
 750        retval = index;
 751        if (index < 0)
 752                goto out_put_fsi;
 753
 754
 755        mutex_lock(&tty_mutex);
 756        tty = tty_init_dev(ptm_driver, index);
 757        /* The tty returned here is locked so we can safely
 758           drop the mutex */
 759        mutex_unlock(&tty_mutex);
 760
 761        retval = PTR_ERR(tty);
 762        if (IS_ERR(tty))
 763                goto out;
 764
 765        /*
 766         * From here on out, the tty is "live", and the index and
 767         * fsi will be killed/put by the tty_release()
 768         */
 769        set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */
 770        tty->driver_data = fsi;
 771
 772        tty_add_file(tty, filp);
 773
 774        dentry = devpts_pty_new(fsi, index, tty->link);
 775        if (IS_ERR(dentry)) {
 776                retval = PTR_ERR(dentry);
 777                goto err_release;
 778        }
 779        tty->link->driver_data = dentry;
 780
 781        retval = ptm_driver->ops->open(tty, filp);
 782        if (retval)
 783                goto err_release;
 784
 785        tty_debug_hangup(tty, "opening (count=%d)\n", tty->count);
 786
 787        tty_unlock(tty);
 788        return 0;
 789err_release:
 790        tty_unlock(tty);
 791        // This will also put-ref the fsi
 792        tty_release(inode, filp);
 793        return retval;
 794out:
 795        devpts_kill_index(fsi, index);
 796out_put_fsi:
 797        devpts_release(fsi);
 798out_free_file:
 799        tty_free_file(filp);
 800        return retval;
 801}
 802
 803static struct file_operations ptmx_fops __ro_after_init;
 804
 805static void __init unix98_pty_init(void)
 806{
 807        ptm_driver = tty_alloc_driver(NR_UNIX98_PTY_MAX,
 808                        TTY_DRIVER_RESET_TERMIOS |
 809                        TTY_DRIVER_REAL_RAW |
 810                        TTY_DRIVER_DYNAMIC_DEV |
 811                        TTY_DRIVER_DEVPTS_MEM |
 812                        TTY_DRIVER_DYNAMIC_ALLOC);
 813        if (IS_ERR(ptm_driver))
 814                panic("Couldn't allocate Unix98 ptm driver");
 815        pts_driver = tty_alloc_driver(NR_UNIX98_PTY_MAX,
 816                        TTY_DRIVER_RESET_TERMIOS |
 817                        TTY_DRIVER_REAL_RAW |
 818                        TTY_DRIVER_DYNAMIC_DEV |
 819                        TTY_DRIVER_DEVPTS_MEM |
 820                        TTY_DRIVER_DYNAMIC_ALLOC);
 821        if (IS_ERR(pts_driver))
 822                panic("Couldn't allocate Unix98 pts driver");
 823
 824        ptm_driver->driver_name = "pty_master";
 825        ptm_driver->name = "ptm";
 826        ptm_driver->major = UNIX98_PTY_MASTER_MAJOR;
 827        ptm_driver->minor_start = 0;
 828        ptm_driver->type = TTY_DRIVER_TYPE_PTY;
 829        ptm_driver->subtype = PTY_TYPE_MASTER;
 830        ptm_driver->init_termios = tty_std_termios;
 831        ptm_driver->init_termios.c_iflag = 0;
 832        ptm_driver->init_termios.c_oflag = 0;
 833        ptm_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
 834        ptm_driver->init_termios.c_lflag = 0;
 835        ptm_driver->init_termios.c_ispeed = 38400;
 836        ptm_driver->init_termios.c_ospeed = 38400;
 837        ptm_driver->other = pts_driver;
 838        tty_set_operations(ptm_driver, &ptm_unix98_ops);
 839
 840        pts_driver->driver_name = "pty_slave";
 841        pts_driver->name = "pts";
 842        pts_driver->major = UNIX98_PTY_SLAVE_MAJOR;
 843        pts_driver->minor_start = 0;
 844        pts_driver->type = TTY_DRIVER_TYPE_PTY;
 845        pts_driver->subtype = PTY_TYPE_SLAVE;
 846        pts_driver->init_termios = tty_std_termios;
 847        pts_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
 848        pts_driver->init_termios.c_ispeed = 38400;
 849        pts_driver->init_termios.c_ospeed = 38400;
 850        pts_driver->other = ptm_driver;
 851        tty_set_operations(pts_driver, &pty_unix98_ops);
 852
 853        if (tty_register_driver(ptm_driver))
 854                panic("Couldn't register Unix98 ptm driver");
 855        if (tty_register_driver(pts_driver))
 856                panic("Couldn't register Unix98 pts driver");
 857
 858        /* Now create the /dev/ptmx special device */
 859        tty_default_fops(&ptmx_fops);
 860        ptmx_fops.open = ptmx_open;
 861
 862        cdev_init(&ptmx_cdev, &ptmx_fops);
 863        if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) ||
 864            register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0)
 865                panic("Couldn't register /dev/ptmx driver");
 866        device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx");
 867}
 868
 869#else
 870static inline void unix98_pty_init(void) { }
 871#endif
 872
 873static int __init pty_init(void)
 874{
 875        legacy_pty_init();
 876        unix98_pty_init();
 877        return 0;
 878}
 879device_initcall(pty_init);
 880