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