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