linux/drivers/tty/tty_ioctl.c
<<
>>
Prefs
   1/*
   2 *  linux/drivers/char/tty_ioctl.c
   3 *
   4 *  Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds
   5 *
   6 * Modified by Fred N. van Kempen, 01/29/93, to add line disciplines
   7 * which can be dynamically activated and de-activated by the line
   8 * discipline handling modules (like SLIP).
   9 */
  10
  11#include <linux/types.h>
  12#include <linux/termios.h>
  13#include <linux/errno.h>
  14#include <linux/sched.h>
  15#include <linux/kernel.h>
  16#include <linux/major.h>
  17#include <linux/tty.h>
  18#include <linux/fcntl.h>
  19#include <linux/string.h>
  20#include <linux/mm.h>
  21#include <linux/module.h>
  22#include <linux/bitops.h>
  23#include <linux/mutex.h>
  24
  25#include <asm/io.h>
  26#include <asm/uaccess.h>
  27#include <asm/system.h>
  28
  29#undef TTY_DEBUG_WAIT_UNTIL_SENT
  30
  31#undef  DEBUG
  32
  33/*
  34 * Internal flag options for termios setting behavior
  35 */
  36#define TERMIOS_FLUSH   1
  37#define TERMIOS_WAIT    2
  38#define TERMIOS_TERMIO  4
  39#define TERMIOS_OLD     8
  40
  41
  42/**
  43 *      tty_chars_in_buffer     -       characters pending
  44 *      @tty: terminal
  45 *
  46 *      Return the number of bytes of data in the device private
  47 *      output queue. If no private method is supplied there is assumed
  48 *      to be no queue on the device.
  49 */
  50
  51int tty_chars_in_buffer(struct tty_struct *tty)
  52{
  53        if (tty->ops->chars_in_buffer)
  54                return tty->ops->chars_in_buffer(tty);
  55        else
  56                return 0;
  57}
  58EXPORT_SYMBOL(tty_chars_in_buffer);
  59
  60/**
  61 *      tty_write_room          -       write queue space
  62 *      @tty: terminal
  63 *
  64 *      Return the number of bytes that can be queued to this device
  65 *      at the present time. The result should be treated as a guarantee
  66 *      and the driver cannot offer a value it later shrinks by more than
  67 *      the number of bytes written. If no method is provided 2K is always
  68 *      returned and data may be lost as there will be no flow control.
  69 */
  70 
  71int tty_write_room(struct tty_struct *tty)
  72{
  73        if (tty->ops->write_room)
  74                return tty->ops->write_room(tty);
  75        return 2048;
  76}
  77EXPORT_SYMBOL(tty_write_room);
  78
  79/**
  80 *      tty_driver_flush_buffer -       discard internal buffer
  81 *      @tty: terminal
  82 *
  83 *      Discard the internal output buffer for this device. If no method
  84 *      is provided then either the buffer cannot be hardware flushed or
  85 *      there is no buffer driver side.
  86 */
  87void tty_driver_flush_buffer(struct tty_struct *tty)
  88{
  89        if (tty->ops->flush_buffer)
  90                tty->ops->flush_buffer(tty);
  91}
  92EXPORT_SYMBOL(tty_driver_flush_buffer);
  93
  94/**
  95 *      tty_throttle            -       flow control
  96 *      @tty: terminal
  97 *
  98 *      Indicate that a tty should stop transmitting data down the stack.
  99 *      Takes the termios mutex to protect against parallel throttle/unthrottle
 100 *      and also to ensure the driver can consistently reference its own
 101 *      termios data at this point when implementing software flow control.
 102 */
 103
 104void tty_throttle(struct tty_struct *tty)
 105{
 106        mutex_lock(&tty->termios_mutex);
 107        /* check TTY_THROTTLED first so it indicates our state */
 108        if (!test_and_set_bit(TTY_THROTTLED, &tty->flags) &&
 109            tty->ops->throttle)
 110                tty->ops->throttle(tty);
 111        mutex_unlock(&tty->termios_mutex);
 112}
 113EXPORT_SYMBOL(tty_throttle);
 114
 115/**
 116 *      tty_unthrottle          -       flow control
 117 *      @tty: terminal
 118 *
 119 *      Indicate that a tty may continue transmitting data down the stack.
 120 *      Takes the termios mutex to protect against parallel throttle/unthrottle
 121 *      and also to ensure the driver can consistently reference its own
 122 *      termios data at this point when implementing software flow control.
 123 *
 124 *      Drivers should however remember that the stack can issue a throttle,
 125 *      then change flow control method, then unthrottle.
 126 */
 127
 128void tty_unthrottle(struct tty_struct *tty)
 129{
 130        mutex_lock(&tty->termios_mutex);
 131        if (test_and_clear_bit(TTY_THROTTLED, &tty->flags) &&
 132            tty->ops->unthrottle)
 133                tty->ops->unthrottle(tty);
 134        mutex_unlock(&tty->termios_mutex);
 135}
 136EXPORT_SYMBOL(tty_unthrottle);
 137
 138/**
 139 *      tty_wait_until_sent     -       wait for I/O to finish
 140 *      @tty: tty we are waiting for
 141 *      @timeout: how long we will wait
 142 *
 143 *      Wait for characters pending in a tty driver to hit the wire, or
 144 *      for a timeout to occur (eg due to flow control)
 145 *
 146 *      Locking: none
 147 */
 148
 149void tty_wait_until_sent(struct tty_struct *tty, long timeout)
 150{
 151#ifdef TTY_DEBUG_WAIT_UNTIL_SENT
 152        char buf[64];
 153
 154        printk(KERN_DEBUG "%s wait until sent...\n", tty_name(tty, buf));
 155#endif
 156        if (!timeout)
 157                timeout = MAX_SCHEDULE_TIMEOUT;
 158        if (wait_event_interruptible_timeout(tty->write_wait,
 159                        !tty_chars_in_buffer(tty), timeout) >= 0) {
 160                if (tty->ops->wait_until_sent)
 161                        tty->ops->wait_until_sent(tty, timeout);
 162        }
 163}
 164EXPORT_SYMBOL(tty_wait_until_sent);
 165
 166
 167/*
 168 *              Termios Helper Methods
 169 */
 170
 171static void unset_locked_termios(struct ktermios *termios,
 172                                 struct ktermios *old,
 173                                 struct ktermios *locked)
 174{
 175        int     i;
 176
 177#define NOSET_MASK(x, y, z) (x = ((x) & ~(z)) | ((y) & (z)))
 178
 179        if (!locked) {
 180                printk(KERN_WARNING "Warning?!? termios_locked is NULL.\n");
 181                return;
 182        }
 183
 184        NOSET_MASK(termios->c_iflag, old->c_iflag, locked->c_iflag);
 185        NOSET_MASK(termios->c_oflag, old->c_oflag, locked->c_oflag);
 186        NOSET_MASK(termios->c_cflag, old->c_cflag, locked->c_cflag);
 187        NOSET_MASK(termios->c_lflag, old->c_lflag, locked->c_lflag);
 188        termios->c_line = locked->c_line ? old->c_line : termios->c_line;
 189        for (i = 0; i < NCCS; i++)
 190                termios->c_cc[i] = locked->c_cc[i] ?
 191                        old->c_cc[i] : termios->c_cc[i];
 192        /* FIXME: What should we do for i/ospeed */
 193}
 194
 195/*
 196 * Routine which returns the baud rate of the tty
 197 *
 198 * Note that the baud_table needs to be kept in sync with the
 199 * include/asm/termbits.h file.
 200 */
 201static const speed_t baud_table[] = {
 202        0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
 203        9600, 19200, 38400, 57600, 115200, 230400, 460800,
 204#ifdef __sparc__
 205        76800, 153600, 307200, 614400, 921600
 206#else
 207        500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000,
 208        2500000, 3000000, 3500000, 4000000
 209#endif
 210};
 211
 212#ifndef __sparc__
 213static const tcflag_t baud_bits[] = {
 214        B0, B50, B75, B110, B134, B150, B200, B300, B600,
 215        B1200, B1800, B2400, B4800, B9600, B19200, B38400,
 216        B57600, B115200, B230400, B460800, B500000, B576000,
 217        B921600, B1000000, B1152000, B1500000, B2000000, B2500000,
 218        B3000000, B3500000, B4000000
 219};
 220#else
 221static const tcflag_t baud_bits[] = {
 222        B0, B50, B75, B110, B134, B150, B200, B300, B600,
 223        B1200, B1800, B2400, B4800, B9600, B19200, B38400,
 224        B57600, B115200, B230400, B460800, B76800, B153600,
 225        B307200, B614400, B921600
 226};
 227#endif
 228
 229static int n_baud_table = ARRAY_SIZE(baud_table);
 230
 231/**
 232 *      tty_termios_baud_rate
 233 *      @termios: termios structure
 234 *
 235 *      Convert termios baud rate data into a speed. This should be called
 236 *      with the termios lock held if this termios is a terminal termios
 237 *      structure. May change the termios data. Device drivers can call this
 238 *      function but should use ->c_[io]speed directly as they are updated.
 239 *
 240 *      Locking: none
 241 */
 242
 243speed_t tty_termios_baud_rate(struct ktermios *termios)
 244{
 245        unsigned int cbaud;
 246
 247        cbaud = termios->c_cflag & CBAUD;
 248
 249#ifdef BOTHER
 250        /* Magic token for arbitary speed via c_ispeed/c_ospeed */
 251        if (cbaud == BOTHER)
 252                return termios->c_ospeed;
 253#endif
 254        if (cbaud & CBAUDEX) {
 255                cbaud &= ~CBAUDEX;
 256
 257                if (cbaud < 1 || cbaud + 15 > n_baud_table)
 258                        termios->c_cflag &= ~CBAUDEX;
 259                else
 260                        cbaud += 15;
 261        }
 262        return baud_table[cbaud];
 263}
 264EXPORT_SYMBOL(tty_termios_baud_rate);
 265
 266/**
 267 *      tty_termios_input_baud_rate
 268 *      @termios: termios structure
 269 *
 270 *      Convert termios baud rate data into a speed. This should be called
 271 *      with the termios lock held if this termios is a terminal termios
 272 *      structure. May change the termios data. Device drivers can call this
 273 *      function but should use ->c_[io]speed directly as they are updated.
 274 *
 275 *      Locking: none
 276 */
 277
 278speed_t tty_termios_input_baud_rate(struct ktermios *termios)
 279{
 280#ifdef IBSHIFT
 281        unsigned int cbaud = (termios->c_cflag >> IBSHIFT) & CBAUD;
 282
 283        if (cbaud == B0)
 284                return tty_termios_baud_rate(termios);
 285
 286        /* Magic token for arbitary speed via c_ispeed*/
 287        if (cbaud == BOTHER)
 288                return termios->c_ispeed;
 289
 290        if (cbaud & CBAUDEX) {
 291                cbaud &= ~CBAUDEX;
 292
 293                if (cbaud < 1 || cbaud + 15 > n_baud_table)
 294                        termios->c_cflag &= ~(CBAUDEX << IBSHIFT);
 295                else
 296                        cbaud += 15;
 297        }
 298        return baud_table[cbaud];
 299#else
 300        return tty_termios_baud_rate(termios);
 301#endif
 302}
 303EXPORT_SYMBOL(tty_termios_input_baud_rate);
 304
 305/**
 306 *      tty_termios_encode_baud_rate
 307 *      @termios: ktermios structure holding user requested state
 308 *      @ispeed: input speed
 309 *      @ospeed: output speed
 310 *
 311 *      Encode the speeds set into the passed termios structure. This is
 312 *      used as a library helper for drivers os that they can report back
 313 *      the actual speed selected when it differs from the speed requested
 314 *
 315 *      For maximal back compatibility with legacy SYS5/POSIX *nix behaviour
 316 *      we need to carefully set the bits when the user does not get the
 317 *      desired speed. We allow small margins and preserve as much of possible
 318 *      of the input intent to keep compatibility.
 319 *
 320 *      Locking: Caller should hold termios lock. This is already held
 321 *      when calling this function from the driver termios handler.
 322 *
 323 *      The ifdefs deal with platforms whose owners have yet to update them
 324 *      and will all go away once this is done.
 325 */
 326
 327void tty_termios_encode_baud_rate(struct ktermios *termios,
 328                                  speed_t ibaud, speed_t obaud)
 329{
 330        int i = 0;
 331        int ifound = -1, ofound = -1;
 332        int iclose = ibaud/50, oclose = obaud/50;
 333        int ibinput = 0;
 334
 335        if (obaud == 0)                 /* CD dropped             */
 336                ibaud = 0;              /* Clear ibaud to be sure */
 337
 338        termios->c_ispeed = ibaud;
 339        termios->c_ospeed = obaud;
 340
 341#ifdef BOTHER
 342        /* If the user asked for a precise weird speed give a precise weird
 343           answer. If they asked for a Bfoo speed they many have problems
 344           digesting non-exact replies so fuzz a bit */
 345
 346        if ((termios->c_cflag & CBAUD) == BOTHER)
 347                oclose = 0;
 348        if (((termios->c_cflag >> IBSHIFT) & CBAUD) == BOTHER)
 349                iclose = 0;
 350        if ((termios->c_cflag >> IBSHIFT) & CBAUD)
 351                ibinput = 1;    /* An input speed was specified */
 352#endif
 353        termios->c_cflag &= ~CBAUD;
 354
 355        /*
 356         *      Our goal is to find a close match to the standard baud rate
 357         *      returned. Walk the baud rate table and if we get a very close
 358         *      match then report back the speed as a POSIX Bxxxx value by
 359         *      preference
 360         */
 361
 362        do {
 363                if (obaud - oclose <= baud_table[i] &&
 364                    obaud + oclose >= baud_table[i]) {
 365                        termios->c_cflag |= baud_bits[i];
 366                        ofound = i;
 367                }
 368                if (ibaud - iclose <= baud_table[i] &&
 369                    ibaud + iclose >= baud_table[i]) {
 370                        /* For the case input == output don't set IBAUD bits
 371                           if the user didn't do so */
 372                        if (ofound == i && !ibinput)
 373                                ifound  = i;
 374#ifdef IBSHIFT
 375                        else {
 376                                ifound = i;
 377                                termios->c_cflag |= (baud_bits[i] << IBSHIFT);
 378                        }
 379#endif
 380                }
 381        } while (++i < n_baud_table);
 382
 383        /*
 384         *      If we found no match then use BOTHER if provided or warn
 385         *      the user their platform maintainer needs to wake up if not.
 386         */
 387#ifdef BOTHER
 388        if (ofound == -1)
 389                termios->c_cflag |= BOTHER;
 390        /* Set exact input bits only if the input and output differ or the
 391           user already did */
 392        if (ifound == -1 && (ibaud != obaud || ibinput))
 393                termios->c_cflag |= (BOTHER << IBSHIFT);
 394#else
 395        if (ifound == -1 || ofound == -1) {
 396                printk_once(KERN_WARNING "tty: Unable to return correct "
 397                          "speed data as your architecture needs updating.\n");
 398        }
 399#endif
 400}
 401EXPORT_SYMBOL_GPL(tty_termios_encode_baud_rate);
 402
 403/**
 404 *      tty_encode_baud_rate            -       set baud rate of the tty
 405 *      @ibaud: input baud rate
 406 *      @obad: output baud rate
 407 *
 408 *      Update the current termios data for the tty with the new speed
 409 *      settings. The caller must hold the termios_mutex for the tty in
 410 *      question.
 411 */
 412
 413void tty_encode_baud_rate(struct tty_struct *tty, speed_t ibaud, speed_t obaud)
 414{
 415        tty_termios_encode_baud_rate(tty->termios, ibaud, obaud);
 416}
 417EXPORT_SYMBOL_GPL(tty_encode_baud_rate);
 418
 419/**
 420 *      tty_get_baud_rate       -       get tty bit rates
 421 *      @tty: tty to query
 422 *
 423 *      Returns the baud rate as an integer for this terminal. The
 424 *      termios lock must be held by the caller and the terminal bit
 425 *      flags may be updated.
 426 *
 427 *      Locking: none
 428 */
 429
 430speed_t tty_get_baud_rate(struct tty_struct *tty)
 431{
 432        speed_t baud = tty_termios_baud_rate(tty->termios);
 433
 434        if (baud == 38400 && tty->alt_speed) {
 435                if (!tty->warned) {
 436                        printk(KERN_WARNING "Use of setserial/setrocket to "
 437                                            "set SPD_* flags is deprecated\n");
 438                        tty->warned = 1;
 439                }
 440                baud = tty->alt_speed;
 441        }
 442
 443        return baud;
 444}
 445EXPORT_SYMBOL(tty_get_baud_rate);
 446
 447/**
 448 *      tty_termios_copy_hw     -       copy hardware settings
 449 *      @new: New termios
 450 *      @old: Old termios
 451 *
 452 *      Propogate the hardware specific terminal setting bits from
 453 *      the old termios structure to the new one. This is used in cases
 454 *      where the hardware does not support reconfiguration or as a helper
 455 *      in some cases where only minimal reconfiguration is supported
 456 */
 457
 458void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old)
 459{
 460        /* The bits a dumb device handles in software. Smart devices need
 461           to always provide a set_termios method */
 462        new->c_cflag &= HUPCL | CREAD | CLOCAL;
 463        new->c_cflag |= old->c_cflag & ~(HUPCL | CREAD | CLOCAL);
 464        new->c_ispeed = old->c_ispeed;
 465        new->c_ospeed = old->c_ospeed;
 466}
 467EXPORT_SYMBOL(tty_termios_copy_hw);
 468
 469/**
 470 *      tty_termios_hw_change   -       check for setting change
 471 *      @a: termios
 472 *      @b: termios to compare
 473 *
 474 *      Check if any of the bits that affect a dumb device have changed
 475 *      between the two termios structures, or a speed change is needed.
 476 */
 477
 478int tty_termios_hw_change(struct ktermios *a, struct ktermios *b)
 479{
 480        if (a->c_ispeed != b->c_ispeed || a->c_ospeed != b->c_ospeed)
 481                return 1;
 482        if ((a->c_cflag ^ b->c_cflag) & ~(HUPCL | CREAD | CLOCAL))
 483                return 1;
 484        return 0;
 485}
 486EXPORT_SYMBOL(tty_termios_hw_change);
 487
 488/**
 489 *      change_termios          -       update termios values
 490 *      @tty: tty to update
 491 *      @new_termios: desired new value
 492 *
 493 *      Perform updates to the termios values set on this terminal. There
 494 *      is a bit of layering violation here with n_tty in terms of the
 495 *      internal knowledge of this function.
 496 *
 497 *      Locking: termios_mutex
 498 */
 499
 500static void change_termios(struct tty_struct *tty, struct ktermios *new_termios)
 501{
 502        struct ktermios old_termios;
 503        struct tty_ldisc *ld;
 504        unsigned long flags;
 505
 506        /*
 507         *      Perform the actual termios internal changes under lock.
 508         */
 509
 510
 511        /* FIXME: we need to decide on some locking/ordering semantics
 512           for the set_termios notification eventually */
 513        mutex_lock(&tty->termios_mutex);
 514        old_termios = *tty->termios;
 515        *tty->termios = *new_termios;
 516        unset_locked_termios(tty->termios, &old_termios, tty->termios_locked);
 517
 518        /* See if packet mode change of state. */
 519        if (tty->link && tty->link->packet) {
 520                int extproc = (old_termios.c_lflag & EXTPROC) |
 521                                (tty->termios->c_lflag & EXTPROC);
 522                int old_flow = ((old_termios.c_iflag & IXON) &&
 523                                (old_termios.c_cc[VSTOP] == '\023') &&
 524                                (old_termios.c_cc[VSTART] == '\021'));
 525                int new_flow = (I_IXON(tty) &&
 526                                STOP_CHAR(tty) == '\023' &&
 527                                START_CHAR(tty) == '\021');
 528                if ((old_flow != new_flow) || extproc) {
 529                        spin_lock_irqsave(&tty->ctrl_lock, flags);
 530                        if (old_flow != new_flow) {
 531                                tty->ctrl_status &= ~(TIOCPKT_DOSTOP | TIOCPKT_NOSTOP);
 532                                if (new_flow)
 533                                        tty->ctrl_status |= TIOCPKT_DOSTOP;
 534                                else
 535                                        tty->ctrl_status |= TIOCPKT_NOSTOP;
 536                        }
 537                        if (extproc)
 538                                tty->ctrl_status |= TIOCPKT_IOCTL;
 539                        spin_unlock_irqrestore(&tty->ctrl_lock, flags);
 540                        wake_up_interruptible(&tty->link->read_wait);
 541                }
 542        }
 543
 544        if (tty->ops->set_termios)
 545                (*tty->ops->set_termios)(tty, &old_termios);
 546        else
 547                tty_termios_copy_hw(tty->termios, &old_termios);
 548
 549        ld = tty_ldisc_ref(tty);
 550        if (ld != NULL) {
 551                if (ld->ops->set_termios)
 552                        (ld->ops->set_termios)(tty, &old_termios);
 553                tty_ldisc_deref(ld);
 554        }
 555        mutex_unlock(&tty->termios_mutex);
 556}
 557
 558/**
 559 *      set_termios             -       set termios values for a tty
 560 *      @tty: terminal device
 561 *      @arg: user data
 562 *      @opt: option information
 563 *
 564 *      Helper function to prepare termios data and run necessary other
 565 *      functions before using change_termios to do the actual changes.
 566 *
 567 *      Locking:
 568 *              Called functions take ldisc and termios_mutex locks
 569 */
 570
 571static int set_termios(struct tty_struct *tty, void __user *arg, int opt)
 572{
 573        struct ktermios tmp_termios;
 574        struct tty_ldisc *ld;
 575        int retval = tty_check_change(tty);
 576
 577        if (retval)
 578                return retval;
 579
 580        mutex_lock(&tty->termios_mutex);
 581        memcpy(&tmp_termios, tty->termios, sizeof(struct ktermios));
 582        mutex_unlock(&tty->termios_mutex);
 583
 584        if (opt & TERMIOS_TERMIO) {
 585                if (user_termio_to_kernel_termios(&tmp_termios,
 586                                                (struct termio __user *)arg))
 587                        return -EFAULT;
 588#ifdef TCGETS2
 589        } else if (opt & TERMIOS_OLD) {
 590                if (user_termios_to_kernel_termios_1(&tmp_termios,
 591                                                (struct termios __user *)arg))
 592                        return -EFAULT;
 593        } else {
 594                if (user_termios_to_kernel_termios(&tmp_termios,
 595                                                (struct termios2 __user *)arg))
 596                        return -EFAULT;
 597        }
 598#else
 599        } else if (user_termios_to_kernel_termios(&tmp_termios,
 600                                        (struct termios __user *)arg))
 601                return -EFAULT;
 602#endif
 603
 604        /* If old style Bfoo values are used then load c_ispeed/c_ospeed
 605         * with the real speed so its unconditionally usable */
 606        tmp_termios.c_ispeed = tty_termios_input_baud_rate(&tmp_termios);
 607        tmp_termios.c_ospeed = tty_termios_baud_rate(&tmp_termios);
 608
 609        ld = tty_ldisc_ref(tty);
 610
 611        if (ld != NULL) {
 612                if ((opt & TERMIOS_FLUSH) && ld->ops->flush_buffer)
 613                        ld->ops->flush_buffer(tty);
 614                tty_ldisc_deref(ld);
 615        }
 616
 617        if (opt & TERMIOS_WAIT) {
 618                tty_wait_until_sent(tty, 0);
 619                if (signal_pending(current))
 620                        return -EINTR;
 621        }
 622
 623        change_termios(tty, &tmp_termios);
 624
 625        /* FIXME: Arguably if tmp_termios == tty->termios AND the
 626           actual requested termios was not tmp_termios then we may
 627           want to return an error as no user requested change has
 628           succeeded */
 629        return 0;
 630}
 631
 632static void copy_termios(struct tty_struct *tty, struct ktermios *kterm)
 633{
 634        mutex_lock(&tty->termios_mutex);
 635        memcpy(kterm, tty->termios, sizeof(struct ktermios));
 636        mutex_unlock(&tty->termios_mutex);
 637}
 638
 639static void copy_termios_locked(struct tty_struct *tty, struct ktermios *kterm)
 640{
 641        mutex_lock(&tty->termios_mutex);
 642        memcpy(kterm, tty->termios_locked, sizeof(struct ktermios));
 643        mutex_unlock(&tty->termios_mutex);
 644}
 645
 646static int get_termio(struct tty_struct *tty, struct termio __user *termio)
 647{
 648        struct ktermios kterm;
 649        copy_termios(tty, &kterm);
 650        if (kernel_termios_to_user_termio(termio, &kterm))
 651                return -EFAULT;
 652        return 0;
 653}
 654
 655
 656#ifdef TCGETX
 657
 658/**
 659 *      set_termiox     -       set termiox fields if possible
 660 *      @tty: terminal
 661 *      @arg: termiox structure from user
 662 *      @opt: option flags for ioctl type
 663 *
 664 *      Implement the device calling points for the SYS5 termiox ioctl
 665 *      interface in Linux
 666 */
 667
 668static int set_termiox(struct tty_struct *tty, void __user *arg, int opt)
 669{
 670        struct termiox tnew;
 671        struct tty_ldisc *ld;
 672
 673        if (tty->termiox == NULL)
 674                return -EINVAL;
 675        if (copy_from_user(&tnew, arg, sizeof(struct termiox)))
 676                return -EFAULT;
 677
 678        ld = tty_ldisc_ref(tty);
 679        if (ld != NULL) {
 680                if ((opt & TERMIOS_FLUSH) && ld->ops->flush_buffer)
 681                        ld->ops->flush_buffer(tty);
 682                tty_ldisc_deref(ld);
 683        }
 684        if (opt & TERMIOS_WAIT) {
 685                tty_wait_until_sent(tty, 0);
 686                if (signal_pending(current))
 687                        return -EINTR;
 688        }
 689
 690        mutex_lock(&tty->termios_mutex);
 691        if (tty->ops->set_termiox)
 692                tty->ops->set_termiox(tty, &tnew);
 693        mutex_unlock(&tty->termios_mutex);
 694        return 0;
 695}
 696
 697#endif
 698
 699
 700#ifdef TIOCGETP
 701/*
 702 * These are deprecated, but there is limited support..
 703 *
 704 * The "sg_flags" translation is a joke..
 705 */
 706static int get_sgflags(struct tty_struct *tty)
 707{
 708        int flags = 0;
 709
 710        if (!(tty->termios->c_lflag & ICANON)) {
 711                if (tty->termios->c_lflag & ISIG)
 712                        flags |= 0x02;          /* cbreak */
 713                else
 714                        flags |= 0x20;          /* raw */
 715        }
 716        if (tty->termios->c_lflag & ECHO)
 717                flags |= 0x08;                  /* echo */
 718        if (tty->termios->c_oflag & OPOST)
 719                if (tty->termios->c_oflag & ONLCR)
 720                        flags |= 0x10;          /* crmod */
 721        return flags;
 722}
 723
 724static int get_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb)
 725{
 726        struct sgttyb tmp;
 727
 728        mutex_lock(&tty->termios_mutex);
 729        tmp.sg_ispeed = tty->termios->c_ispeed;
 730        tmp.sg_ospeed = tty->termios->c_ospeed;
 731        tmp.sg_erase = tty->termios->c_cc[VERASE];
 732        tmp.sg_kill = tty->termios->c_cc[VKILL];
 733        tmp.sg_flags = get_sgflags(tty);
 734        mutex_unlock(&tty->termios_mutex);
 735
 736        return copy_to_user(sgttyb, &tmp, sizeof(tmp)) ? -EFAULT : 0;
 737}
 738
 739static void set_sgflags(struct ktermios *termios, int flags)
 740{
 741        termios->c_iflag = ICRNL | IXON;
 742        termios->c_oflag = 0;
 743        termios->c_lflag = ISIG | ICANON;
 744        if (flags & 0x02) {     /* cbreak */
 745                termios->c_iflag = 0;
 746                termios->c_lflag &= ~ICANON;
 747        }
 748        if (flags & 0x08) {             /* echo */
 749                termios->c_lflag |= ECHO | ECHOE | ECHOK |
 750                                    ECHOCTL | ECHOKE | IEXTEN;
 751        }
 752        if (flags & 0x10) {             /* crmod */
 753                termios->c_oflag |= OPOST | ONLCR;
 754        }
 755        if (flags & 0x20) {     /* raw */
 756                termios->c_iflag = 0;
 757                termios->c_lflag &= ~(ISIG | ICANON);
 758        }
 759        if (!(termios->c_lflag & ICANON)) {
 760                termios->c_cc[VMIN] = 1;
 761                termios->c_cc[VTIME] = 0;
 762        }
 763}
 764
 765/**
 766 *      set_sgttyb              -       set legacy terminal values
 767 *      @tty: tty structure
 768 *      @sgttyb: pointer to old style terminal structure
 769 *
 770 *      Updates a terminal from the legacy BSD style terminal information
 771 *      structure.
 772 *
 773 *      Locking: termios_mutex
 774 */
 775
 776static int set_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb)
 777{
 778        int retval;
 779        struct sgttyb tmp;
 780        struct ktermios termios;
 781
 782        retval = tty_check_change(tty);
 783        if (retval)
 784                return retval;
 785
 786        if (copy_from_user(&tmp, sgttyb, sizeof(tmp)))
 787                return -EFAULT;
 788
 789        mutex_lock(&tty->termios_mutex);
 790        termios = *tty->termios;
 791        termios.c_cc[VERASE] = tmp.sg_erase;
 792        termios.c_cc[VKILL] = tmp.sg_kill;
 793        set_sgflags(&termios, tmp.sg_flags);
 794        /* Try and encode into Bfoo format */
 795#ifdef BOTHER
 796        tty_termios_encode_baud_rate(&termios, termios.c_ispeed,
 797                                                termios.c_ospeed);
 798#endif
 799        mutex_unlock(&tty->termios_mutex);
 800        change_termios(tty, &termios);
 801        return 0;
 802}
 803#endif
 804
 805#ifdef TIOCGETC
 806static int get_tchars(struct tty_struct *tty, struct tchars __user *tchars)
 807{
 808        struct tchars tmp;
 809
 810        mutex_lock(&tty->termios_mutex);
 811        tmp.t_intrc = tty->termios->c_cc[VINTR];
 812        tmp.t_quitc = tty->termios->c_cc[VQUIT];
 813        tmp.t_startc = tty->termios->c_cc[VSTART];
 814        tmp.t_stopc = tty->termios->c_cc[VSTOP];
 815        tmp.t_eofc = tty->termios->c_cc[VEOF];
 816        tmp.t_brkc = tty->termios->c_cc[VEOL2]; /* what is brkc anyway? */
 817        mutex_unlock(&tty->termios_mutex);
 818        return copy_to_user(tchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
 819}
 820
 821static int set_tchars(struct tty_struct *tty, struct tchars __user *tchars)
 822{
 823        struct tchars tmp;
 824
 825        if (copy_from_user(&tmp, tchars, sizeof(tmp)))
 826                return -EFAULT;
 827        mutex_lock(&tty->termios_mutex);
 828        tty->termios->c_cc[VINTR] = tmp.t_intrc;
 829        tty->termios->c_cc[VQUIT] = tmp.t_quitc;
 830        tty->termios->c_cc[VSTART] = tmp.t_startc;
 831        tty->termios->c_cc[VSTOP] = tmp.t_stopc;
 832        tty->termios->c_cc[VEOF] = tmp.t_eofc;
 833        tty->termios->c_cc[VEOL2] = tmp.t_brkc; /* what is brkc anyway? */
 834        mutex_unlock(&tty->termios_mutex);
 835        return 0;
 836}
 837#endif
 838
 839#ifdef TIOCGLTC
 840static int get_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
 841{
 842        struct ltchars tmp;
 843
 844        mutex_lock(&tty->termios_mutex);
 845        tmp.t_suspc = tty->termios->c_cc[VSUSP];
 846        /* what is dsuspc anyway? */
 847        tmp.t_dsuspc = tty->termios->c_cc[VSUSP];
 848        tmp.t_rprntc = tty->termios->c_cc[VREPRINT];
 849        /* what is flushc anyway? */
 850        tmp.t_flushc = tty->termios->c_cc[VEOL2];
 851        tmp.t_werasc = tty->termios->c_cc[VWERASE];
 852        tmp.t_lnextc = tty->termios->c_cc[VLNEXT];
 853        mutex_unlock(&tty->termios_mutex);
 854        return copy_to_user(ltchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
 855}
 856
 857static int set_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
 858{
 859        struct ltchars tmp;
 860
 861        if (copy_from_user(&tmp, ltchars, sizeof(tmp)))
 862                return -EFAULT;
 863
 864        mutex_lock(&tty->termios_mutex);
 865        tty->termios->c_cc[VSUSP] = tmp.t_suspc;
 866        /* what is dsuspc anyway? */
 867        tty->termios->c_cc[VEOL2] = tmp.t_dsuspc;
 868        tty->termios->c_cc[VREPRINT] = tmp.t_rprntc;
 869        /* what is flushc anyway? */
 870        tty->termios->c_cc[VEOL2] = tmp.t_flushc;
 871        tty->termios->c_cc[VWERASE] = tmp.t_werasc;
 872        tty->termios->c_cc[VLNEXT] = tmp.t_lnextc;
 873        mutex_unlock(&tty->termios_mutex);
 874        return 0;
 875}
 876#endif
 877
 878/**
 879 *      send_prio_char          -       send priority character
 880 *
 881 *      Send a high priority character to the tty even if stopped
 882 *
 883 *      Locking: none for xchar method, write ordering for write method.
 884 */
 885
 886static int send_prio_char(struct tty_struct *tty, char ch)
 887{
 888        int     was_stopped = tty->stopped;
 889
 890        if (tty->ops->send_xchar) {
 891                tty->ops->send_xchar(tty, ch);
 892                return 0;
 893        }
 894
 895        if (tty_write_lock(tty, 0) < 0)
 896                return -ERESTARTSYS;
 897
 898        if (was_stopped)
 899                start_tty(tty);
 900        tty->ops->write(tty, &ch, 1);
 901        if (was_stopped)
 902                stop_tty(tty);
 903        tty_write_unlock(tty);
 904        return 0;
 905}
 906
 907/**
 908 *      tty_change_softcar      -       carrier change ioctl helper
 909 *      @tty: tty to update
 910 *      @arg: enable/disable CLOCAL
 911 *
 912 *      Perform a change to the CLOCAL state and call into the driver
 913 *      layer to make it visible. All done with the termios mutex
 914 */
 915
 916static int tty_change_softcar(struct tty_struct *tty, int arg)
 917{
 918        int ret = 0;
 919        int bit = arg ? CLOCAL : 0;
 920        struct ktermios old;
 921
 922        mutex_lock(&tty->termios_mutex);
 923        old = *tty->termios;
 924        tty->termios->c_cflag &= ~CLOCAL;
 925        tty->termios->c_cflag |= bit;
 926        if (tty->ops->set_termios)
 927                tty->ops->set_termios(tty, &old);
 928        if ((tty->termios->c_cflag & CLOCAL) != bit)
 929                ret = -EINVAL;
 930        mutex_unlock(&tty->termios_mutex);
 931        return ret;
 932}
 933
 934/**
 935 *      tty_mode_ioctl          -       mode related ioctls
 936 *      @tty: tty for the ioctl
 937 *      @file: file pointer for the tty
 938 *      @cmd: command
 939 *      @arg: ioctl argument
 940 *
 941 *      Perform non line discipline specific mode control ioctls. This
 942 *      is designed to be called by line disciplines to ensure they provide
 943 *      consistent mode setting.
 944 */
 945
 946int tty_mode_ioctl(struct tty_struct *tty, struct file *file,
 947                        unsigned int cmd, unsigned long arg)
 948{
 949        struct tty_struct *real_tty;
 950        void __user *p = (void __user *)arg;
 951        int ret = 0;
 952        struct ktermios kterm;
 953
 954        if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
 955            tty->driver->subtype == PTY_TYPE_MASTER)
 956                real_tty = tty->link;
 957        else
 958                real_tty = tty;
 959
 960        switch (cmd) {
 961#ifdef TIOCGETP
 962        case TIOCGETP:
 963                return get_sgttyb(real_tty, (struct sgttyb __user *) arg);
 964        case TIOCSETP:
 965        case TIOCSETN:
 966                return set_sgttyb(real_tty, (struct sgttyb __user *) arg);
 967#endif
 968#ifdef TIOCGETC
 969        case TIOCGETC:
 970                return get_tchars(real_tty, p);
 971        case TIOCSETC:
 972                return set_tchars(real_tty, p);
 973#endif
 974#ifdef TIOCGLTC
 975        case TIOCGLTC:
 976                return get_ltchars(real_tty, p);
 977        case TIOCSLTC:
 978                return set_ltchars(real_tty, p);
 979#endif
 980        case TCSETSF:
 981                return set_termios(real_tty, p,  TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_OLD);
 982        case TCSETSW:
 983                return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_OLD);
 984        case TCSETS:
 985                return set_termios(real_tty, p, TERMIOS_OLD);
 986#ifndef TCGETS2
 987        case TCGETS:
 988                copy_termios(real_tty, &kterm);
 989                if (kernel_termios_to_user_termios((struct termios __user *)arg, &kterm))
 990                        ret = -EFAULT;
 991                return ret;
 992#else
 993        case TCGETS:
 994                copy_termios(real_tty, &kterm);
 995                if (kernel_termios_to_user_termios_1((struct termios __user *)arg, &kterm))
 996                        ret = -EFAULT;
 997                return ret;
 998        case TCGETS2:
 999                copy_termios(real_tty, &kterm);
1000                if (kernel_termios_to_user_termios((struct termios2 __user *)arg, &kterm))
1001                        ret = -EFAULT;
1002                return ret;
1003        case TCSETSF2:
1004                return set_termios(real_tty, p,  TERMIOS_FLUSH | TERMIOS_WAIT);
1005        case TCSETSW2:
1006                return set_termios(real_tty, p, TERMIOS_WAIT);
1007        case TCSETS2:
1008                return set_termios(real_tty, p, 0);
1009#endif
1010        case TCGETA:
1011                return get_termio(real_tty, p);
1012        case TCSETAF:
1013                return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_TERMIO);
1014        case TCSETAW:
1015                return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_TERMIO);
1016        case TCSETA:
1017                return set_termios(real_tty, p, TERMIOS_TERMIO);
1018#ifndef TCGETS2
1019        case TIOCGLCKTRMIOS:
1020                copy_termios_locked(real_tty, &kterm);
1021                if (kernel_termios_to_user_termios((struct termios __user *)arg, &kterm))
1022                        ret = -EFAULT;
1023                return ret;
1024        case TIOCSLCKTRMIOS:
1025                if (!capable(CAP_SYS_ADMIN))
1026                        return -EPERM;
1027                copy_termios_locked(real_tty, &kterm);
1028                if (user_termios_to_kernel_termios(&kterm,
1029                                               (struct termios __user *) arg))
1030                        return -EFAULT;
1031                mutex_lock(&real_tty->termios_mutex);
1032                memcpy(real_tty->termios_locked, &kterm, sizeof(struct ktermios));
1033                mutex_unlock(&real_tty->termios_mutex);
1034                return 0;
1035#else
1036        case TIOCGLCKTRMIOS:
1037                copy_termios_locked(real_tty, &kterm);
1038                if (kernel_termios_to_user_termios_1((struct termios __user *)arg, &kterm))
1039                        ret = -EFAULT;
1040                return ret;
1041        case TIOCSLCKTRMIOS:
1042                if (!capable(CAP_SYS_ADMIN))
1043                        return -EPERM;
1044                copy_termios_locked(real_tty, &kterm);
1045                if (user_termios_to_kernel_termios_1(&kterm,
1046                                               (struct termios __user *) arg))
1047                        return -EFAULT;
1048                mutex_lock(&real_tty->termios_mutex);
1049                memcpy(real_tty->termios_locked, &kterm, sizeof(struct ktermios));
1050                mutex_unlock(&real_tty->termios_mutex);
1051                return ret;
1052#endif
1053#ifdef TCGETX
1054        case TCGETX: {
1055                struct termiox ktermx;
1056                if (real_tty->termiox == NULL)
1057                        return -EINVAL;
1058                mutex_lock(&real_tty->termios_mutex);
1059                memcpy(&ktermx, real_tty->termiox, sizeof(struct termiox));
1060                mutex_unlock(&real_tty->termios_mutex);
1061                if (copy_to_user(p, &ktermx, sizeof(struct termiox)))
1062                        ret = -EFAULT;
1063                return ret;
1064        }
1065        case TCSETX:
1066                return set_termiox(real_tty, p, 0);
1067        case TCSETXW:
1068                return set_termiox(real_tty, p, TERMIOS_WAIT);
1069        case TCSETXF:
1070                return set_termiox(real_tty, p, TERMIOS_FLUSH);
1071#endif          
1072        case TIOCGSOFTCAR:
1073                copy_termios(real_tty, &kterm);
1074                ret = put_user((kterm.c_cflag & CLOCAL) ? 1 : 0,
1075                                                (int __user *)arg);
1076                return ret;
1077        case TIOCSSOFTCAR:
1078                if (get_user(arg, (unsigned int __user *) arg))
1079                        return -EFAULT;
1080                return tty_change_softcar(real_tty, arg);
1081        default:
1082                return -ENOIOCTLCMD;
1083        }
1084}
1085EXPORT_SYMBOL_GPL(tty_mode_ioctl);
1086
1087int tty_perform_flush(struct tty_struct *tty, unsigned long arg)
1088{
1089        struct tty_ldisc *ld;
1090        int retval = tty_check_change(tty);
1091        if (retval)
1092                return retval;
1093
1094        ld = tty_ldisc_ref_wait(tty);
1095        switch (arg) {
1096        case TCIFLUSH:
1097                if (ld && ld->ops->flush_buffer)
1098                        ld->ops->flush_buffer(tty);
1099                break;
1100        case TCIOFLUSH:
1101                if (ld && ld->ops->flush_buffer)
1102                        ld->ops->flush_buffer(tty);
1103                /* fall through */
1104        case TCOFLUSH:
1105                tty_driver_flush_buffer(tty);
1106                break;
1107        default:
1108                tty_ldisc_deref(ld);
1109                return -EINVAL;
1110        }
1111        tty_ldisc_deref(ld);
1112        return 0;
1113}
1114EXPORT_SYMBOL_GPL(tty_perform_flush);
1115
1116int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file,
1117                       unsigned int cmd, unsigned long arg)
1118{
1119        unsigned long flags;
1120        int retval;
1121
1122        switch (cmd) {
1123        case TCXONC:
1124                retval = tty_check_change(tty);
1125                if (retval)
1126                        return retval;
1127                switch (arg) {
1128                case TCOOFF:
1129                        if (!tty->flow_stopped) {
1130                                tty->flow_stopped = 1;
1131                                stop_tty(tty);
1132                        }
1133                        break;
1134                case TCOON:
1135                        if (tty->flow_stopped) {
1136                                tty->flow_stopped = 0;
1137                                start_tty(tty);
1138                        }
1139                        break;
1140                case TCIOFF:
1141                        if (STOP_CHAR(tty) != __DISABLED_CHAR)
1142                                return send_prio_char(tty, STOP_CHAR(tty));
1143                        break;
1144                case TCION:
1145                        if (START_CHAR(tty) != __DISABLED_CHAR)
1146                                return send_prio_char(tty, START_CHAR(tty));
1147                        break;
1148                default:
1149                        return -EINVAL;
1150                }
1151                return 0;
1152        case TCFLSH:
1153                return tty_perform_flush(tty, arg);
1154        case TIOCPKT:
1155        {
1156                int pktmode;
1157
1158                if (tty->driver->type != TTY_DRIVER_TYPE_PTY ||
1159                    tty->driver->subtype != PTY_TYPE_MASTER)
1160                        return -ENOTTY;
1161                if (get_user(pktmode, (int __user *) arg))
1162                        return -EFAULT;
1163                spin_lock_irqsave(&tty->ctrl_lock, flags);
1164                if (pktmode) {
1165                        if (!tty->packet) {
1166                                tty->packet = 1;
1167                                tty->link->ctrl_status = 0;
1168                        }
1169                } else
1170                        tty->packet = 0;
1171                spin_unlock_irqrestore(&tty->ctrl_lock, flags);
1172                return 0;
1173        }
1174        default:
1175                /* Try the mode commands */
1176                return tty_mode_ioctl(tty, file, cmd, arg);
1177        }
1178}
1179EXPORT_SYMBOL(n_tty_ioctl_helper);
1180