linux-bk/drivers/char/tty_io.c
<<
>>
Prefs
   1/*
   2 *  linux/drivers/char/tty_io.c
   3 *
   4 *  Copyright (C) 1991, 1992  Linus Torvalds
   5 */
   6
   7/*
   8 * 'tty_io.c' gives an orthogonal feeling to tty's, be they consoles
   9 * or rs-channels. It also implements echoing, cooked mode etc.
  10 *
  11 * Kill-line thanks to John T Kohl, who also corrected VMIN = VTIME = 0.
  12 *
  13 * Modified by Theodore Ts'o, 9/14/92, to dynamically allocate the
  14 * tty_struct and tty_queue structures.  Previously there was an array
  15 * of 256 tty_struct's which was statically allocated, and the
  16 * tty_queue structures were allocated at boot time.  Both are now
  17 * dynamically allocated only when the tty is open.
  18 *
  19 * Also restructured routines so that there is more of a separation
  20 * between the high-level tty routines (tty_io.c and tty_ioctl.c) and
  21 * the low-level tty routines (serial.c, pty.c, console.c).  This
  22 * makes for cleaner and more compact code.  -TYT, 9/17/92 
  23 *
  24 * Modified by Fred N. van Kempen, 01/29/93, to add line disciplines
  25 * which can be dynamically activated and de-activated by the line
  26 * discipline handling modules (like SLIP).
  27 *
  28 * NOTE: pay no attention to the line discipline code (yet); its
  29 * interface is still subject to change in this version...
  30 * -- TYT, 1/31/92
  31 *
  32 * Added functionality to the OPOST tty handling.  No delays, but all
  33 * other bits should be there.
  34 *      -- Nick Holloway <alfie@dcs.warwick.ac.uk>, 27th May 1993.
  35 *
  36 * Rewrote canonical mode and added more termios flags.
  37 *      -- julian@uhunix.uhcc.hawaii.edu (J. Cowley), 13Jan94
  38 *
  39 * Reorganized FASYNC support so mouse code can share it.
  40 *      -- ctm@ardi.com, 9Sep95
  41 *
  42 * New TIOCLINUX variants added.
  43 *      -- mj@k332.feld.cvut.cz, 19-Nov-95
  44 * 
  45 * Restrict vt switching via ioctl()
  46 *      -- grif@cs.ucr.edu, 5-Dec-95
  47 *
  48 * Move console and virtual terminal code to more appropriate files,
  49 * implement CONFIG_VT and generalize console device interface.
  50 *      -- Marko Kohtala <Marko.Kohtala@hut.fi>, March 97
  51 *
  52 * Rewrote init_dev and release_dev to eliminate races.
  53 *      -- Bill Hawes <whawes@star.net>, June 97
  54 *
  55 * Added devfs support.
  56 *      -- C. Scott Ananian <cananian@alumni.princeton.edu>, 13-Jan-1998
  57 *
  58 * Added support for a Unix98-style ptmx device.
  59 *      -- C. Scott Ananian <cananian@alumni.princeton.edu>, 14-Jan-1998
  60 *
  61 * Reduced memory usage for older ARM systems
  62 *      -- Russell King <rmk@arm.linux.org.uk>
  63 *
  64 * Move do_SAK() into process context.  Less stack use in devfs functions.
  65 * alloc_tty_struct() always uses kmalloc() -- Andrew Morton <andrewm@uow.edu.eu> 17Mar01
  66 */
  67
  68#include <linux/config.h>
  69#include <linux/types.h>
  70#include <linux/major.h>
  71#include <linux/errno.h>
  72#include <linux/signal.h>
  73#include <linux/fcntl.h>
  74#include <linux/sched.h>
  75#include <linux/interrupt.h>
  76#include <linux/tty.h>
  77#include <linux/tty_driver.h>
  78#include <linux/tty_flip.h>
  79#include <linux/devpts_fs.h>
  80#include <linux/file.h>
  81#include <linux/console.h>
  82#include <linux/timer.h>
  83#include <linux/ctype.h>
  84#include <linux/kd.h>
  85#include <linux/mm.h>
  86#include <linux/string.h>
  87#include <linux/slab.h>
  88#include <linux/poll.h>
  89#include <linux/proc_fs.h>
  90#include <linux/init.h>
  91#include <linux/module.h>
  92#include <linux/smp_lock.h>
  93#include <linux/device.h>
  94#include <linux/idr.h>
  95#include <linux/wait.h>
  96#include <linux/bitops.h>
  97
  98#include <asm/uaccess.h>
  99#include <asm/system.h>
 100
 101#include <linux/kbd_kern.h>
 102#include <linux/vt_kern.h>
 103#include <linux/selection.h>
 104#include <linux/devfs_fs_kernel.h>
 105
 106#include <linux/kmod.h>
 107
 108#undef TTY_DEBUG_HANGUP
 109
 110#define TTY_PARANOIA_CHECK 1
 111#define CHECK_TTY_COUNT 1
 112
 113struct termios tty_std_termios = {      /* for the benefit of tty drivers  */
 114        .c_iflag = ICRNL | IXON,
 115        .c_oflag = OPOST | ONLCR,
 116        .c_cflag = B38400 | CS8 | CREAD | HUPCL,
 117        .c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK |
 118                   ECHOCTL | ECHOKE | IEXTEN,
 119        .c_cc = INIT_C_CC
 120};
 121
 122EXPORT_SYMBOL(tty_std_termios);
 123
 124/* This list gets poked at by procfs and various bits of boot up code. This
 125   could do with some rationalisation such as pulling the tty proc function
 126   into this file */
 127   
 128LIST_HEAD(tty_drivers);                 /* linked list of tty drivers */
 129
 130/* Semaphore to protect creating and releasing a tty. This is shared with
 131   vt.c for deeply disgusting hack reasons */
 132DECLARE_MUTEX(tty_sem);
 133
 134#ifdef CONFIG_UNIX98_PTYS
 135extern struct tty_driver *ptm_driver;   /* Unix98 pty masters; for /dev/ptmx */
 136extern int pty_limit;           /* Config limit on Unix98 ptys */
 137static DEFINE_IDR(allocated_ptys);
 138static DECLARE_MUTEX(allocated_ptys_lock);
 139static int ptmx_open(struct inode *, struct file *);
 140#endif
 141
 142extern void disable_early_printk(void);
 143
 144static void initialize_tty_struct(struct tty_struct *tty);
 145
 146static ssize_t tty_read(struct file *, char __user *, size_t, loff_t *);
 147static ssize_t tty_write(struct file *, const char __user *, size_t, loff_t *);
 148ssize_t redirected_tty_write(struct file *, const char __user *, size_t, loff_t *);
 149static unsigned int tty_poll(struct file *, poll_table *);
 150static int tty_open(struct inode *, struct file *);
 151static int tty_release(struct inode *, struct file *);
 152int tty_ioctl(struct inode * inode, struct file * file,
 153              unsigned int cmd, unsigned long arg);
 154static int tty_fasync(int fd, struct file * filp, int on);
 155extern void rs_360_init(void);
 156static void release_mem(struct tty_struct *tty, int idx);
 157
 158
 159static struct tty_struct *alloc_tty_struct(void)
 160{
 161        struct tty_struct *tty;
 162
 163        tty = kmalloc(sizeof(struct tty_struct), GFP_KERNEL);
 164        if (tty)
 165                memset(tty, 0, sizeof(struct tty_struct));
 166        return tty;
 167}
 168
 169static inline void free_tty_struct(struct tty_struct *tty)
 170{
 171        kfree(tty->write_buf);
 172        kfree(tty);
 173}
 174
 175#define TTY_NUMBER(tty) ((tty)->index + (tty)->driver->name_base)
 176
 177char *tty_name(struct tty_struct *tty, char *buf)
 178{
 179        if (!tty) /* Hmm.  NULL pointer.  That's fun. */
 180                strcpy(buf, "NULL tty");
 181        else
 182                strcpy(buf, tty->name);
 183        return buf;
 184}
 185
 186EXPORT_SYMBOL(tty_name);
 187
 188inline int tty_paranoia_check(struct tty_struct *tty, struct inode *inode,
 189                              const char *routine)
 190{
 191#ifdef TTY_PARANOIA_CHECK
 192        if (!tty) {
 193                printk(KERN_WARNING
 194                        "null TTY for (%d:%d) in %s\n",
 195                        imajor(inode), iminor(inode), routine);
 196                return 1;
 197        }
 198        if (tty->magic != TTY_MAGIC) {
 199                printk(KERN_WARNING
 200                        "bad magic number for tty struct (%d:%d) in %s\n",
 201                        imajor(inode), iminor(inode), routine);
 202                return 1;
 203        }
 204#endif
 205        return 0;
 206}
 207
 208static int check_tty_count(struct tty_struct *tty, const char *routine)
 209{
 210#ifdef CHECK_TTY_COUNT
 211        struct list_head *p;
 212        int count = 0;
 213        
 214        file_list_lock();
 215        list_for_each(p, &tty->tty_files) {
 216                count++;
 217        }
 218        file_list_unlock();
 219        if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
 220            tty->driver->subtype == PTY_TYPE_SLAVE &&
 221            tty->link && tty->link->count)
 222                count++;
 223        if (tty->count != count) {
 224                printk(KERN_WARNING "Warning: dev (%s) tty->count(%d) "
 225                                    "!= #fd's(%d) in %s\n",
 226                       tty->name, tty->count, count, routine);
 227                return count;
 228       }        
 229#endif
 230        return 0;
 231}
 232
 233/*
 234 *      This is probably overkill for real world processors but
 235 *      they are not on hot paths so a little discipline won't do 
 236 *      any harm.
 237 */
 238 
 239static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
 240{
 241        down(&tty->termios_sem);
 242        tty->termios->c_line = num;
 243        up(&tty->termios_sem);
 244}
 245
 246/*
 247 *      This guards the refcounted line discipline lists. The lock
 248 *      must be taken with irqs off because there are hangup path
 249 *      callers who will do ldisc lookups and cannot sleep.
 250 */
 251 
 252static spinlock_t tty_ldisc_lock = SPIN_LOCK_UNLOCKED;
 253static DECLARE_WAIT_QUEUE_HEAD(tty_ldisc_wait);
 254static struct tty_ldisc tty_ldiscs[NR_LDISCS];  /* line disc dispatch table     */
 255
 256int tty_register_ldisc(int disc, struct tty_ldisc *new_ldisc)
 257{
 258        unsigned long flags;
 259        int ret = 0;
 260        
 261        if (disc < N_TTY || disc >= NR_LDISCS)
 262                return -EINVAL;
 263        
 264        spin_lock_irqsave(&tty_ldisc_lock, flags);
 265        if (new_ldisc) {
 266                tty_ldiscs[disc] = *new_ldisc;
 267                tty_ldiscs[disc].num = disc;
 268                tty_ldiscs[disc].flags |= LDISC_FLAG_DEFINED;
 269                tty_ldiscs[disc].refcount = 0;
 270        } else {
 271                if(tty_ldiscs[disc].refcount)
 272                        ret = -EBUSY;
 273                else
 274                        tty_ldiscs[disc].flags &= ~LDISC_FLAG_DEFINED;
 275        }
 276        spin_unlock_irqrestore(&tty_ldisc_lock, flags);
 277        
 278        return ret;
 279}
 280
 281EXPORT_SYMBOL(tty_register_ldisc);
 282
 283struct tty_ldisc *tty_ldisc_get(int disc)
 284{
 285        unsigned long flags;
 286        struct tty_ldisc *ld;
 287
 288        if (disc < N_TTY || disc >= NR_LDISCS)
 289                return NULL;
 290        
 291        spin_lock_irqsave(&tty_ldisc_lock, flags);
 292
 293        ld = &tty_ldiscs[disc];
 294        /* Check the entry is defined */
 295        if(ld->flags & LDISC_FLAG_DEFINED)
 296        {
 297                /* If the module is being unloaded we can't use it */
 298                if (!try_module_get(ld->owner))
 299                        ld = NULL;
 300                else /* lock it */
 301                        ld->refcount++;
 302        }
 303        else
 304                ld = NULL;
 305        spin_unlock_irqrestore(&tty_ldisc_lock, flags);
 306        return ld;
 307}
 308
 309EXPORT_SYMBOL_GPL(tty_ldisc_get);
 310
 311void tty_ldisc_put(int disc)
 312{
 313        struct tty_ldisc *ld;
 314        unsigned long flags;
 315        
 316        if (disc < N_TTY || disc >= NR_LDISCS)
 317                BUG();
 318                
 319        spin_lock_irqsave(&tty_ldisc_lock, flags);
 320        ld = &tty_ldiscs[disc];
 321        if(ld->refcount == 0)
 322                BUG();
 323        ld->refcount --;
 324        module_put(ld->owner);
 325        spin_unlock_irqrestore(&tty_ldisc_lock, flags);
 326}
 327        
 328EXPORT_SYMBOL_GPL(tty_ldisc_put);
 329
 330void tty_ldisc_assign(struct tty_struct *tty, struct tty_ldisc *ld)
 331{
 332        tty->ldisc = *ld;
 333        tty->ldisc.refcount = 0;
 334}
 335
 336/**
 337 *      tty_ldisc_try           -       internal helper
 338 *      @tty: the tty
 339 *
 340 *      Make a single attempt to grab and bump the refcount on
 341 *      the tty ldisc. Return 0 on failure or 1 on success. This is
 342 *      used to implement both the waiting and non waiting versions
 343 *      of tty_ldisc_ref
 344 */
 345
 346static int tty_ldisc_try(struct tty_struct *tty)
 347{
 348        unsigned long flags;
 349        struct tty_ldisc *ld;
 350        int ret = 0;
 351        
 352        spin_lock_irqsave(&tty_ldisc_lock, flags);
 353        ld = &tty->ldisc;
 354        if(test_bit(TTY_LDISC, &tty->flags))
 355        {
 356                ld->refcount++;
 357                ret = 1;
 358        }
 359        spin_unlock_irqrestore(&tty_ldisc_lock, flags);
 360        return ret;
 361}
 362
 363/**
 364 *      tty_ldisc_ref_wait      -       wait for the tty ldisc
 365 *      @tty: tty device
 366 *
 367 *      Dereference the line discipline for the terminal and take a 
 368 *      reference to it. If the line discipline is in flux then 
 369 *      wait patiently until it changes.
 370 *
 371 *      Note: Must not be called from an IRQ/timer context. The caller
 372 *      must also be careful not to hold other locks that will deadlock
 373 *      against a discipline change, such as an existing ldisc reference
 374 *      (which we check for)
 375 */
 376 
 377struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty)
 378{
 379        /* wait_event is a macro */
 380        wait_event(tty_ldisc_wait, tty_ldisc_try(tty));
 381        if(tty->ldisc.refcount == 0)
 382                printk(KERN_ERR "tty_ldisc_ref_wait\n");
 383        return &tty->ldisc;
 384}
 385
 386EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait);
 387
 388/**
 389 *      tty_ldisc_ref           -       get the tty ldisc
 390 *      @tty: tty device
 391 *
 392 *      Dereference the line discipline for the terminal and take a 
 393 *      reference to it. If the line discipline is in flux then 
 394 *      return NULL. Can be called from IRQ and timer functions.
 395 */
 396 
 397struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty)
 398{
 399        if(tty_ldisc_try(tty))
 400                return &tty->ldisc;
 401        return NULL;
 402}
 403
 404EXPORT_SYMBOL_GPL(tty_ldisc_ref);
 405
 406/**
 407 *      tty_ldisc_deref         -       free a tty ldisc reference
 408 *      @ld: reference to free up
 409 *
 410 *      Undoes the effect of tty_ldisc_ref or tty_ldisc_ref_wait. May
 411 *      be called in IRQ context.
 412 */
 413 
 414void tty_ldisc_deref(struct tty_ldisc *ld)
 415{
 416        unsigned long flags;
 417
 418        if(ld == NULL)
 419                BUG();
 420                
 421        spin_lock_irqsave(&tty_ldisc_lock, flags);
 422        if(ld->refcount == 0)
 423                printk(KERN_ERR "tty_ldisc_deref: no references.\n");
 424        else
 425                ld->refcount--;
 426        if(ld->refcount == 0)
 427                wake_up(&tty_ldisc_wait);
 428        spin_unlock_irqrestore(&tty_ldisc_lock, flags);
 429}
 430
 431EXPORT_SYMBOL_GPL(tty_ldisc_deref);
 432
 433/**
 434 *      tty_ldisc_enable        -       allow ldisc use
 435 *      @tty: terminal to activate ldisc on
 436 *
 437 *      Set the TTY_LDISC flag when the line discipline can be called
 438 *      again. Do neccessary wakeups for existing sleepers.
 439 *
 440 *      Note: nobody should set this bit except via this function. Clearing
 441 *      directly is allowed.
 442 */
 443
 444static void tty_ldisc_enable(struct tty_struct *tty)
 445{
 446        set_bit(TTY_LDISC, &tty->flags);
 447        wake_up(&tty_ldisc_wait);
 448}
 449        
 450/**
 451 *      tty_set_ldisc           -       set line discipline
 452 *      @tty: the terminal to set
 453 *      @ldisc: the line discipline
 454 *
 455 *      Set the discipline of a tty line. Must be called from a process
 456 *      context.
 457 */
 458 
 459static int tty_set_ldisc(struct tty_struct *tty, int ldisc)
 460{
 461        int     retval = 0;
 462        struct  tty_ldisc o_ldisc;
 463        char buf[64];
 464        int work;
 465        unsigned long flags;
 466        struct tty_ldisc *ld;
 467
 468        if ((ldisc < N_TTY) || (ldisc >= NR_LDISCS))
 469                return -EINVAL;
 470
 471restart:
 472
 473        if (tty->ldisc.num == ldisc)
 474                return 0;       /* We are already in the desired discipline */
 475        
 476        ld = tty_ldisc_get(ldisc);
 477        /* Eduardo Blanco <ejbs@cs.cs.com.uy> */
 478        /* Cyrus Durgin <cider@speakeasy.org> */
 479        if (ld == NULL) {
 480                request_module("tty-ldisc-%d", ldisc);
 481                ld = tty_ldisc_get(ldisc);
 482        }
 483        if (ld == NULL)
 484                return -EINVAL;
 485
 486        o_ldisc = tty->ldisc;
 487
 488        tty_wait_until_sent(tty, 0);
 489
 490        /*
 491         *      Make sure we don't change while someone holds a
 492         *      reference to the line discipline. The TTY_LDISC bit
 493         *      prevents anyone taking a reference once it is clear.
 494         *      We need the lock to avoid racing reference takers.
 495         */
 496         
 497        spin_lock_irqsave(&tty_ldisc_lock, flags);
 498        if(tty->ldisc.refcount)
 499        {
 500                /* Free the new ldisc we grabbed. Must drop the lock
 501                   first. */
 502                spin_unlock_irqrestore(&tty_ldisc_lock, flags);
 503                tty_ldisc_put(ldisc);
 504                /*
 505                 * There are several reasons we may be busy, including
 506                 * random momentary I/O traffic. We must therefore
 507                 * retry. We could distinguish between blocking ops
 508                 * and retries if we made tty_ldisc_wait() smarter. That
 509                 * is up for discussion.
 510                 */
 511                if(wait_event_interruptible(tty_ldisc_wait, tty->ldisc.refcount == 0) < 0)
 512                        return -ERESTARTSYS;                    
 513                goto restart;
 514        }
 515        clear_bit(TTY_LDISC, &tty->flags);      
 516        clear_bit(TTY_DONT_FLIP, &tty->flags);
 517        spin_unlock_irqrestore(&tty_ldisc_lock, flags);
 518        
 519        /*
 520         *      From this point on we know nobody has an ldisc
 521         *      usage reference, nor can they obtain one until
 522         *      we say so later on.
 523         */
 524         
 525        work = cancel_delayed_work(&tty->flip.work);
 526        /*
 527         * Wait for ->hangup_work and ->flip.work handlers to terminate
 528         */
 529         
 530        flush_scheduled_work();
 531        /* Shutdown the current discipline. */
 532        if (tty->ldisc.close)
 533                (tty->ldisc.close)(tty);
 534
 535        /* Now set up the new line discipline. */
 536        tty_ldisc_assign(tty, ld);
 537        tty_set_termios_ldisc(tty, ldisc);
 538        if (tty->ldisc.open)
 539                retval = (tty->ldisc.open)(tty);
 540        if (retval < 0) {
 541                tty_ldisc_put(ldisc);
 542                /* There is an outstanding reference here so this is safe */
 543                tty_ldisc_assign(tty, tty_ldisc_get(o_ldisc.num));
 544                tty_set_termios_ldisc(tty, tty->ldisc.num);
 545                if (tty->ldisc.open && (tty->ldisc.open(tty) < 0)) {
 546                        tty_ldisc_put(o_ldisc.num);
 547                        /* This driver is always present */
 548                        tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
 549                        tty_set_termios_ldisc(tty, N_TTY);
 550                        if (tty->ldisc.open) {
 551                                int r = tty->ldisc.open(tty);
 552
 553                                if (r < 0)
 554                                        panic("Couldn't open N_TTY ldisc for "
 555                                              "%s --- error %d.",
 556                                              tty_name(tty, buf), r);
 557                        }
 558                }
 559        }
 560        /* At this point we hold a reference to the new ldisc and a
 561           a reference to the old ldisc. If we ended up flipping back
 562           to the existing ldisc we have two references to it */
 563        
 564        if (tty->ldisc.num != o_ldisc.num && tty->driver->set_ldisc)
 565                tty->driver->set_ldisc(tty);
 566                
 567        tty_ldisc_put(o_ldisc.num);
 568        
 569        /*
 570         *      Allow ldisc referencing to occur as soon as the driver
 571         *      ldisc callback completes.
 572         */
 573         
 574        tty_ldisc_enable(tty);
 575        
 576        /* Restart it in case no characters kick it off. Safe if
 577           already running */
 578        if(work)
 579                schedule_delayed_work(&tty->flip.work, 1);
 580        return retval;
 581}
 582
 583/*
 584 * This routine returns a tty driver structure, given a device number
 585 */
 586struct tty_driver *get_tty_driver(dev_t device, int *index)
 587{
 588        struct tty_driver *p;
 589
 590        list_for_each_entry(p, &tty_drivers, tty_drivers) {
 591                dev_t base = MKDEV(p->major, p->minor_start);
 592                if (device < base || device >= base + p->num)
 593                        continue;
 594                *index = device - base;
 595                return p;
 596        }
 597        return NULL;
 598}
 599
 600/*
 601 * If we try to write to, or set the state of, a terminal and we're
 602 * not in the foreground, send a SIGTTOU.  If the signal is blocked or
 603 * ignored, go ahead and perform the operation.  (POSIX 7.2)
 604 */
 605int tty_check_change(struct tty_struct * tty)
 606{
 607        if (current->signal->tty != tty)
 608                return 0;
 609        if (tty->pgrp <= 0) {
 610                printk(KERN_WARNING "tty_check_change: tty->pgrp <= 0!\n");
 611                return 0;
 612        }
 613        if (process_group(current) == tty->pgrp)
 614                return 0;
 615        if (is_ignored(SIGTTOU))
 616                return 0;
 617        if (is_orphaned_pgrp(process_group(current)))
 618                return -EIO;
 619        (void) kill_pg(process_group(current), SIGTTOU, 1);
 620        return -ERESTARTSYS;
 621}
 622
 623EXPORT_SYMBOL(tty_check_change);
 624
 625static ssize_t hung_up_tty_read(struct file * file, char __user * buf,
 626                                size_t count, loff_t *ppos)
 627{
 628        return 0;
 629}
 630
 631static ssize_t hung_up_tty_write(struct file * file, const char __user * buf,
 632                                 size_t count, loff_t *ppos)
 633{
 634        return -EIO;
 635}
 636
 637/* No kernel lock held - none needed ;) */
 638static unsigned int hung_up_tty_poll(struct file * filp, poll_table * wait)
 639{
 640        return POLLIN | POLLOUT | POLLERR | POLLHUP | POLLRDNORM | POLLWRNORM;
 641}
 642
 643static int hung_up_tty_ioctl(struct inode * inode, struct file * file,
 644                             unsigned int cmd, unsigned long arg)
 645{
 646        return cmd == TIOCSPGRP ? -ENOTTY : -EIO;
 647}
 648
 649static struct file_operations tty_fops = {
 650        .llseek         = no_llseek,
 651        .read           = tty_read,
 652        .write          = tty_write,
 653        .poll           = tty_poll,
 654        .ioctl          = tty_ioctl,
 655        .open           = tty_open,
 656        .release        = tty_release,
 657        .fasync         = tty_fasync,
 658};
 659
 660#ifdef CONFIG_UNIX98_PTYS
 661static struct file_operations ptmx_fops = {
 662        .llseek         = no_llseek,
 663        .read           = tty_read,
 664        .write          = tty_write,
 665        .poll           = tty_poll,
 666        .ioctl          = tty_ioctl,
 667        .open           = ptmx_open,
 668        .release        = tty_release,
 669        .fasync         = tty_fasync,
 670};
 671#endif
 672
 673static struct file_operations console_fops = {
 674        .llseek         = no_llseek,
 675        .read           = tty_read,
 676        .write          = redirected_tty_write,
 677        .poll           = tty_poll,
 678        .ioctl          = tty_ioctl,
 679        .open           = tty_open,
 680        .release        = tty_release,
 681        .fasync         = tty_fasync,
 682};
 683
 684static struct file_operations hung_up_tty_fops = {
 685        .llseek         = no_llseek,
 686        .read           = hung_up_tty_read,
 687        .write          = hung_up_tty_write,
 688        .poll           = hung_up_tty_poll,
 689        .ioctl          = hung_up_tty_ioctl,
 690        .release        = tty_release,
 691};
 692
 693static spinlock_t redirect_lock = SPIN_LOCK_UNLOCKED;
 694static struct file *redirect;
 695
 696/**
 697 *      tty_wakeup      -       request more data
 698 *      @tty: terminal
 699 *
 700 *      Internal and external helper for wakeups of tty. This function
 701 *      informs the line discipline if present that the driver is ready
 702 *      to receive more output data.
 703 */
 704 
 705void tty_wakeup(struct tty_struct *tty)
 706{
 707        struct tty_ldisc *ld;
 708        
 709        if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) {
 710                ld = tty_ldisc_ref(tty);
 711                if(ld) {
 712                        if(ld->write_wakeup)
 713                                ld->write_wakeup(tty);
 714                        tty_ldisc_deref(ld);
 715                }
 716        }
 717        wake_up_interruptible(&tty->write_wait);
 718}
 719
 720EXPORT_SYMBOL_GPL(tty_wakeup);
 721
 722/**
 723 *      tty_ldisc_flush -       flush line discipline queue
 724 *      @tty: tty
 725 *
 726 *      Flush the line discipline queue (if any) for this tty. If there
 727 *      is no line discipline active this is a no-op.
 728 */
 729 
 730void tty_ldisc_flush(struct tty_struct *tty)
 731{
 732        struct tty_ldisc *ld = tty_ldisc_ref(tty);
 733        if(ld) {
 734                if(ld->flush_buffer)
 735                        ld->flush_buffer(tty);
 736                tty_ldisc_deref(ld);
 737        }
 738}
 739
 740EXPORT_SYMBOL_GPL(tty_ldisc_flush);
 741        
 742/*
 743 * This can be called by the "eventd" kernel thread.  That is process synchronous,
 744 * but doesn't hold any locks, so we need to make sure we have the appropriate
 745 * locks for what we're doing..
 746 */
 747void do_tty_hangup(void *data)
 748{
 749        struct tty_struct *tty = (struct tty_struct *) data;
 750        struct file * cons_filp = NULL;
 751        struct file *filp, *f = NULL;
 752        struct task_struct *p;
 753        struct tty_ldisc *ld;
 754        int    closecount = 0, n;
 755
 756        if (!tty)
 757                return;
 758
 759        /* inuse_filps is protected by the single kernel lock */
 760        lock_kernel();
 761
 762        spin_lock(&redirect_lock);
 763        if (redirect && redirect->private_data == tty) {
 764                f = redirect;
 765                redirect = NULL;
 766        }
 767        spin_unlock(&redirect_lock);
 768        
 769        check_tty_count(tty, "do_tty_hangup");
 770        file_list_lock();
 771        /* This breaks for file handles being sent over AF_UNIX sockets ? */
 772        list_for_each_entry(filp, &tty->tty_files, f_list) {
 773                if (filp->f_op->write == redirected_tty_write)
 774                        cons_filp = filp;
 775                if (filp->f_op->write != tty_write)
 776                        continue;
 777                closecount++;
 778                tty_fasync(-1, filp, 0);        /* can't block */
 779                filp->f_op = &hung_up_tty_fops;
 780        }
 781        file_list_unlock();
 782        
 783        /* FIXME! What are the locking issues here? This may me overdoing things..
 784         * this question is especially important now that we've removed the irqlock. */
 785
 786        ld = tty_ldisc_ref(tty);
 787        if(ld != NULL)  /* We may have no line discipline at this point */
 788        {
 789                if (ld->flush_buffer)
 790                        ld->flush_buffer(tty);
 791                if (tty->driver->flush_buffer)
 792                        tty->driver->flush_buffer(tty);
 793                if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
 794                    ld->write_wakeup)
 795                        ld->write_wakeup(tty);
 796                if (ld->hangup)
 797                        ld->hangup(tty);
 798        }
 799
 800        /* FIXME: Once we trust the LDISC code better we can wait here for
 801           ldisc completion and fix the driver call race */
 802           
 803        wake_up_interruptible(&tty->write_wait);
 804        wake_up_interruptible(&tty->read_wait);
 805
 806        /*
 807         * Shutdown the current line discipline, and reset it to
 808         * N_TTY.
 809         */
 810        if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
 811        {
 812                down(&tty->termios_sem);
 813                *tty->termios = tty->driver->init_termios;
 814                up(&tty->termios_sem);
 815        }
 816        
 817        /* Defer ldisc switch */
 818        /* tty_deferred_ldisc_switch(N_TTY);
 819        
 820          This should get done automatically when the port closes and
 821          tty_release is called */
 822        
 823        read_lock(&tasklist_lock);
 824        if (tty->session > 0) {
 825                do_each_task_pid(tty->session, PIDTYPE_SID, p) {
 826                        if (p->signal->tty == tty)
 827                                p->signal->tty = NULL;
 828                        if (!p->signal->leader)
 829                                continue;
 830                        send_group_sig_info(SIGHUP, SEND_SIG_PRIV, p);
 831                        send_group_sig_info(SIGCONT, SEND_SIG_PRIV, p);
 832                        if (tty->pgrp > 0)
 833                                p->signal->tty_old_pgrp = tty->pgrp;
 834                } while_each_task_pid(tty->session, PIDTYPE_SID, p);
 835        }
 836        read_unlock(&tasklist_lock);
 837
 838        tty->flags = 0;
 839        tty->session = 0;
 840        tty->pgrp = -1;
 841        tty->ctrl_status = 0;
 842        /*
 843         *      If one of the devices matches a console pointer, we
 844         *      cannot just call hangup() because that will cause
 845         *      tty->count and state->count to go out of sync.
 846         *      So we just call close() the right number of times.
 847         */
 848        if (cons_filp) {
 849                if (tty->driver->close)
 850                        for (n = 0; n < closecount; n++)
 851                                tty->driver->close(tty, cons_filp);
 852        } else if (tty->driver->hangup)
 853                (tty->driver->hangup)(tty);
 854                
 855        /* We don't want to have driver/ldisc interactions beyond
 856           the ones we did here. The driver layer expects no
 857           calls after ->hangup() from the ldisc side. However we
 858           can't yet guarantee all that */
 859
 860        set_bit(TTY_HUPPED, &tty->flags);
 861        if (ld) {
 862                tty_ldisc_enable(tty);
 863                tty_ldisc_deref(ld);
 864        }
 865        unlock_kernel();
 866        if (f)
 867                fput(f);
 868}
 869
 870void tty_hangup(struct tty_struct * tty)
 871{
 872#ifdef TTY_DEBUG_HANGUP
 873        char    buf[64];
 874        
 875        printk(KERN_DEBUG "%s hangup...\n", tty_name(tty, buf));
 876#endif
 877        schedule_work(&tty->hangup_work);
 878}
 879
 880EXPORT_SYMBOL(tty_hangup);
 881
 882void tty_vhangup(struct tty_struct * tty)
 883{
 884#ifdef TTY_DEBUG_HANGUP
 885        char    buf[64];
 886
 887        printk(KERN_DEBUG "%s vhangup...\n", tty_name(tty, buf));
 888#endif
 889        do_tty_hangup((void *) tty);
 890}
 891EXPORT_SYMBOL(tty_vhangup);
 892
 893int tty_hung_up_p(struct file * filp)
 894{
 895        return (filp->f_op == &hung_up_tty_fops);
 896}
 897
 898EXPORT_SYMBOL(tty_hung_up_p);
 899
 900/*
 901 * This function is typically called only by the session leader, when
 902 * it wants to disassociate itself from its controlling tty.
 903 *
 904 * It performs the following functions:
 905 *      (1)  Sends a SIGHUP and SIGCONT to the foreground process group
 906 *      (2)  Clears the tty from being controlling the session
 907 *      (3)  Clears the controlling tty for all processes in the
 908 *              session group.
 909 *
 910 * The argument on_exit is set to 1 if called when a process is
 911 * exiting; it is 0 if called by the ioctl TIOCNOTTY.
 912 */
 913void disassociate_ctty(int on_exit)
 914{
 915        struct tty_struct *tty;
 916        struct task_struct *p;
 917        int tty_pgrp = -1;
 918
 919        lock_kernel();
 920
 921        tty = current->signal->tty;
 922        if (tty) {
 923                tty_pgrp = tty->pgrp;
 924                if (on_exit && tty->driver->type != TTY_DRIVER_TYPE_PTY)
 925                        tty_vhangup(tty);
 926        } else {
 927                if (current->signal->tty_old_pgrp) {
 928                        kill_pg(current->signal->tty_old_pgrp, SIGHUP, on_exit);
 929                        kill_pg(current->signal->tty_old_pgrp, SIGCONT, on_exit);
 930                }
 931                unlock_kernel();        
 932                return;
 933        }
 934        if (tty_pgrp > 0) {
 935                kill_pg(tty_pgrp, SIGHUP, on_exit);
 936                if (!on_exit)
 937                        kill_pg(tty_pgrp, SIGCONT, on_exit);
 938        }
 939
 940        current->signal->tty_old_pgrp = 0;
 941        tty->session = 0;
 942        tty->pgrp = -1;
 943
 944        read_lock(&tasklist_lock);
 945        do_each_task_pid(current->signal->session, PIDTYPE_SID, p) {
 946                p->signal->tty = NULL;
 947        } while_each_task_pid(current->signal->session, PIDTYPE_SID, p);
 948        read_unlock(&tasklist_lock);
 949        unlock_kernel();
 950}
 951
 952void stop_tty(struct tty_struct *tty)
 953{
 954        if (tty->stopped)
 955                return;
 956        tty->stopped = 1;
 957        if (tty->link && tty->link->packet) {
 958                tty->ctrl_status &= ~TIOCPKT_START;
 959                tty->ctrl_status |= TIOCPKT_STOP;
 960                wake_up_interruptible(&tty->link->read_wait);
 961        }
 962        if (tty->driver->stop)
 963                (tty->driver->stop)(tty);
 964}
 965
 966EXPORT_SYMBOL(stop_tty);
 967
 968void start_tty(struct tty_struct *tty)
 969{
 970        if (!tty->stopped || tty->flow_stopped)
 971                return;
 972        tty->stopped = 0;
 973        if (tty->link && tty->link->packet) {
 974                tty->ctrl_status &= ~TIOCPKT_STOP;
 975                tty->ctrl_status |= TIOCPKT_START;
 976                wake_up_interruptible(&tty->link->read_wait);
 977        }
 978        if (tty->driver->start)
 979                (tty->driver->start)(tty);
 980
 981        /* If we have a running line discipline it may need kicking */
 982        tty_wakeup(tty);
 983        wake_up_interruptible(&tty->write_wait);
 984}
 985
 986EXPORT_SYMBOL(start_tty);
 987
 988static ssize_t tty_read(struct file * file, char __user * buf, size_t count, 
 989                        loff_t *ppos)
 990{
 991        int i;
 992        struct tty_struct * tty;
 993        struct inode *inode;
 994        struct tty_ldisc *ld;
 995
 996        tty = (struct tty_struct *)file->private_data;
 997        inode = file->f_dentry->d_inode;
 998        if (tty_paranoia_check(tty, inode, "tty_read"))
 999                return -EIO;
1000        if (!tty || (test_bit(TTY_IO_ERROR, &tty->flags)))
1001                return -EIO;
1002
1003        /* We want to wait for the line discipline to sort out in this
1004           situation */
1005        ld = tty_ldisc_ref_wait(tty);
1006        lock_kernel();
1007        if (ld->read)
1008                i = (ld->read)(tty,file,buf,count);
1009        else
1010                i = -EIO;
1011        tty_ldisc_deref(ld);
1012        unlock_kernel();
1013        if (i > 0)
1014                inode->i_atime = CURRENT_TIME;
1015        return i;
1016}
1017
1018/*
1019 * Split writes up in sane blocksizes to avoid
1020 * denial-of-service type attacks
1021 */
1022static inline ssize_t do_tty_write(
1023        ssize_t (*write)(struct tty_struct *, struct file *, const unsigned char *, size_t),
1024        struct tty_struct *tty,
1025        struct file *file,
1026        const char __user *buf,
1027        size_t count)
1028{
1029        ssize_t ret = 0, written = 0;
1030        unsigned int chunk;
1031        
1032        if (down_interruptible(&tty->atomic_write)) {
1033                return -ERESTARTSYS;
1034        }
1035
1036        /*
1037         * We chunk up writes into a temporary buffer. This
1038         * simplifies low-level drivers immensely, since they
1039         * don't have locking issues and user mode accesses.
1040         *
1041         * But if TTY_NO_WRITE_SPLIT is set, we should use a
1042         * big chunk-size..
1043         */
1044        chunk = 4096;
1045        if (test_bit(TTY_NO_WRITE_SPLIT, &tty->flags))
1046                chunk = 65536;
1047        if (count < chunk)
1048                chunk = count;
1049
1050        /* write_buf/write_cnt is protected by the atomic_write semaphore */
1051        if (tty->write_cnt < chunk) {
1052                unsigned char *buf;
1053
1054                if (chunk < 1024)
1055                        chunk = 1024;
1056
1057                buf = kmalloc(chunk, GFP_KERNEL);
1058                if (!buf) {
1059                        up(&tty->atomic_write);
1060                        return -ENOMEM;
1061                }
1062                kfree(tty->write_buf);
1063                tty->write_cnt = chunk;
1064                tty->write_buf = buf;
1065        }
1066
1067        /* Do the write .. */
1068        for (;;) {
1069                size_t size = count;
1070                if (size > chunk)
1071                        size = chunk;
1072                ret = -EFAULT;
1073                if (copy_from_user(tty->write_buf, buf, size))
1074                        break;
1075                lock_kernel();
1076                ret = write(tty, file, tty->write_buf, size);
1077                unlock_kernel();
1078                if (ret <= 0)
1079                        break;
1080                written += ret;
1081                buf += ret;
1082                count -= ret;
1083                if (!count)
1084                        break;
1085                ret = -ERESTARTSYS;
1086                if (signal_pending(current))
1087                        break;
1088                cond_resched();
1089        }
1090        if (written) {
1091                file->f_dentry->d_inode->i_mtime = CURRENT_TIME;
1092                ret = written;
1093        }
1094        up(&tty->atomic_write);
1095        return ret;
1096}
1097
1098
1099static ssize_t tty_write(struct file * file, const char __user * buf, size_t count,
1100                         loff_t *ppos)
1101{
1102        struct tty_struct * tty;
1103        struct inode *inode = file->f_dentry->d_inode;
1104        ssize_t ret;
1105        struct tty_ldisc *ld;
1106        
1107        tty = (struct tty_struct *)file->private_data;
1108        if (tty_paranoia_check(tty, inode, "tty_write"))
1109                return -EIO;
1110        if (!tty || !tty->driver->write || (test_bit(TTY_IO_ERROR, &tty->flags)))
1111                return -EIO;
1112
1113        ld = tty_ldisc_ref_wait(tty);           
1114        if (!ld->write)
1115                ret = -EIO;
1116        else
1117                ret = do_tty_write(ld->write, tty, file, buf, count);
1118        tty_ldisc_deref(ld);
1119        return ret;
1120}
1121
1122ssize_t redirected_tty_write(struct file * file, const char __user * buf, size_t count,
1123                         loff_t *ppos)
1124{
1125        struct file *p = NULL;
1126
1127        spin_lock(&redirect_lock);
1128        if (redirect) {
1129                get_file(redirect);
1130                p = redirect;
1131        }
1132        spin_unlock(&redirect_lock);
1133
1134        if (p) {
1135                ssize_t res;
1136                res = vfs_write(p, buf, count, &p->f_pos);
1137                fput(p);
1138                return res;
1139        }
1140
1141        return tty_write(file, buf, count, ppos);
1142}
1143
1144static char ptychar[] = "pqrstuvwxyzabcde";
1145
1146static inline void pty_line_name(struct tty_driver *driver, int index, char *p)
1147{
1148        int i = index + driver->name_base;
1149        /* ->name is initialized to "ttyp", but "tty" is expected */
1150        sprintf(p, "%s%c%x",
1151                        driver->subtype == PTY_TYPE_SLAVE ? "tty" : driver->name,
1152                        ptychar[i >> 4 & 0xf], i & 0xf);
1153}
1154
1155static inline void tty_line_name(struct tty_driver *driver, int index, char *p)
1156{
1157        sprintf(p, "%s%d", driver->name, index + driver->name_base);
1158}
1159
1160/*
1161 * WSH 06/09/97: Rewritten to remove races and properly clean up after a
1162 * failed open.  The new code protects the open with a semaphore, so it's
1163 * really quite straightforward.  The semaphore locking can probably be
1164 * relaxed for the (most common) case of reopening a tty.
1165 */
1166static int init_dev(struct tty_driver *driver, int idx,
1167        struct tty_struct **ret_tty)
1168{
1169        struct tty_struct *tty, *o_tty;
1170        struct termios *tp, **tp_loc, *o_tp, **o_tp_loc;
1171        struct termios *ltp, **ltp_loc, *o_ltp, **o_ltp_loc;
1172        int retval=0;
1173
1174        /* 
1175         * Check whether we need to acquire the tty semaphore to avoid
1176         * race conditions.  For now, play it safe.
1177         */
1178        down(&tty_sem);
1179
1180        /* check whether we're reopening an existing tty */
1181        if (driver->flags & TTY_DRIVER_DEVPTS_MEM) {
1182                tty = devpts_get_tty(idx);
1183                if (tty && driver->subtype == PTY_TYPE_MASTER)
1184                        tty = tty->link;
1185        } else {
1186                tty = driver->ttys[idx];
1187        }
1188        if (tty) goto fast_track;
1189
1190        /*
1191         * First time open is complex, especially for PTY devices.
1192         * This code guarantees that either everything succeeds and the
1193         * TTY is ready for operation, or else the table slots are vacated
1194         * and the allocated memory released.  (Except that the termios 
1195         * and locked termios may be retained.)
1196         */
1197
1198        if (!try_module_get(driver->owner)) {
1199                retval = -ENODEV;
1200                goto end_init;
1201        }
1202
1203        o_tty = NULL;
1204        tp = o_tp = NULL;
1205        ltp = o_ltp = NULL;
1206
1207        tty = alloc_tty_struct();
1208        if(!tty)
1209                goto fail_no_mem;
1210        initialize_tty_struct(tty);
1211        tty->driver = driver;
1212        tty->index = idx;
1213        tty_line_name(driver, idx, tty->name);
1214
1215        if (driver->flags & TTY_DRIVER_DEVPTS_MEM) {
1216                tp_loc = &tty->termios;
1217                ltp_loc = &tty->termios_locked;
1218        } else {
1219                tp_loc = &driver->termios[idx];
1220                ltp_loc = &driver->termios_locked[idx];
1221        }
1222
1223        if (!*tp_loc) {
1224                tp = (struct termios *) kmalloc(sizeof(struct termios),
1225                                                GFP_KERNEL);
1226                if (!tp)
1227                        goto free_mem_out;
1228                *tp = driver->init_termios;
1229        }
1230
1231        if (!*ltp_loc) {
1232                ltp = (struct termios *) kmalloc(sizeof(struct termios),
1233                                                 GFP_KERNEL);
1234                if (!ltp)
1235                        goto free_mem_out;
1236                memset(ltp, 0, sizeof(struct termios));
1237        }
1238
1239        if (driver->type == TTY_DRIVER_TYPE_PTY) {
1240                o_tty = alloc_tty_struct();
1241                if (!o_tty)
1242                        goto free_mem_out;
1243                initialize_tty_struct(o_tty);
1244                o_tty->driver = driver->other;
1245                o_tty->index = idx;
1246                tty_line_name(driver->other, idx, o_tty->name);
1247
1248                if (driver->flags & TTY_DRIVER_DEVPTS_MEM) {
1249                        o_tp_loc = &o_tty->termios;
1250                        o_ltp_loc = &o_tty->termios_locked;
1251                } else {
1252                        o_tp_loc = &driver->other->termios[idx];
1253                        o_ltp_loc = &driver->other->termios_locked[idx];
1254                }
1255
1256                if (!*o_tp_loc) {
1257                        o_tp = (struct termios *)
1258                                kmalloc(sizeof(struct termios), GFP_KERNEL);
1259                        if (!o_tp)
1260                                goto free_mem_out;
1261                        *o_tp = driver->other->init_termios;
1262                }
1263
1264                if (!*o_ltp_loc) {
1265                        o_ltp = (struct termios *)
1266                                kmalloc(sizeof(struct termios), GFP_KERNEL);
1267                        if (!o_ltp)
1268                                goto free_mem_out;
1269                        memset(o_ltp, 0, sizeof(struct termios));
1270                }
1271
1272                /*
1273                 * Everything allocated ... set up the o_tty structure.
1274                 */
1275                if (!(driver->other->flags & TTY_DRIVER_DEVPTS_MEM)) {
1276                        driver->other->ttys[idx] = o_tty;
1277                }
1278                if (!*o_tp_loc)
1279                        *o_tp_loc = o_tp;
1280                if (!*o_ltp_loc)
1281                        *o_ltp_loc = o_ltp;
1282                o_tty->termios = *o_tp_loc;
1283                o_tty->termios_locked = *o_ltp_loc;
1284                driver->other->refcount++;
1285                if (driver->subtype == PTY_TYPE_MASTER)
1286                        o_tty->count++;
1287
1288                /* Establish the links in both directions */
1289                tty->link   = o_tty;
1290                o_tty->link = tty;
1291        }
1292
1293        /* 
1294         * All structures have been allocated, so now we install them.
1295         * Failures after this point use release_mem to clean up, so 
1296         * there's no need to null out the local pointers.
1297         */
1298        if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
1299                driver->ttys[idx] = tty;
1300        }
1301        
1302        if (!*tp_loc)
1303                *tp_loc = tp;
1304        if (!*ltp_loc)
1305                *ltp_loc = ltp;
1306        tty->termios = *tp_loc;
1307        tty->termios_locked = *ltp_loc;
1308        driver->refcount++;
1309        tty->count++;
1310
1311        /* 
1312         * Structures all installed ... call the ldisc open routines.
1313         * If we fail here just call release_mem to clean up.  No need
1314         * to decrement the use counts, as release_mem doesn't care.
1315         */
1316
1317        if (tty->ldisc.open) {
1318                retval = (tty->ldisc.open)(tty);
1319                if (retval)
1320                        goto release_mem_out;
1321        }
1322        if (o_tty && o_tty->ldisc.open) {
1323                retval = (o_tty->ldisc.open)(o_tty);
1324                if (retval) {
1325                        if (tty->ldisc.close)
1326                                (tty->ldisc.close)(tty);
1327                        goto release_mem_out;
1328                }
1329                tty_ldisc_enable(o_tty);
1330        }
1331        tty_ldisc_enable(tty);
1332        goto success;
1333
1334        /*
1335         * This fast open can be used if the tty is already open.
1336         * No memory is allocated, and the only failures are from
1337         * attempting to open a closing tty or attempting multiple
1338         * opens on a pty master.
1339         */
1340fast_track:
1341        if (test_bit(TTY_CLOSING, &tty->flags)) {
1342                retval = -EIO;
1343                goto end_init;
1344        }
1345        if (driver->type == TTY_DRIVER_TYPE_PTY &&
1346            driver->subtype == PTY_TYPE_MASTER) {
1347                /*
1348                 * special case for PTY masters: only one open permitted, 
1349                 * and the slave side open count is incremented as well.
1350                 */
1351                if (tty->count) {
1352                        retval = -EIO;
1353                        goto end_init;
1354                }
1355                tty->link->count++;
1356        }
1357        tty->count++;
1358        tty->driver = driver; /* N.B. why do this every time?? */
1359
1360        /* FIXME */
1361        if(!test_bit(TTY_LDISC, &tty->flags))
1362                printk(KERN_ERR "init_dev but no ldisc\n");
1363success:
1364        *ret_tty = tty;
1365        
1366        /* All paths come through here to release the semaphore */
1367end_init:
1368        up(&tty_sem);
1369        return retval;
1370
1371        /* Release locally allocated memory ... nothing placed in slots */
1372free_mem_out:
1373        if (o_tp)
1374                kfree(o_tp);
1375        if (o_tty)
1376                free_tty_struct(o_tty);
1377        if (ltp)
1378                kfree(ltp);
1379        if (tp)
1380                kfree(tp);
1381        free_tty_struct(tty);
1382
1383fail_no_mem:
1384        module_put(driver->owner);
1385        retval = -ENOMEM;
1386        goto end_init;
1387
1388        /* call the tty release_mem routine to clean out this slot */
1389release_mem_out:
1390        printk(KERN_INFO "init_dev: ldisc open failed, "
1391                         "clearing slot %d\n", idx);
1392        release_mem(tty, idx);
1393        goto end_init;
1394}
1395
1396/*
1397 * Releases memory associated with a tty structure, and clears out the
1398 * driver table slots.
1399 */
1400static void release_mem(struct tty_struct *tty, int idx)
1401{
1402        struct tty_struct *o_tty;
1403        struct termios *tp;
1404        int devpts = tty->driver->flags & TTY_DRIVER_DEVPTS_MEM;
1405
1406        if ((o_tty = tty->link) != NULL) {
1407                if (!devpts)
1408                        o_tty->driver->ttys[idx] = NULL;
1409                if (o_tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
1410                        tp = o_tty->termios;
1411                        if (!devpts)
1412                                o_tty->driver->termios[idx] = NULL;
1413                        kfree(tp);
1414
1415                        tp = o_tty->termios_locked;
1416                        if (!devpts)
1417                                o_tty->driver->termios_locked[idx] = NULL;
1418                        kfree(tp);
1419                }
1420                o_tty->magic = 0;
1421                o_tty->driver->refcount--;
1422                file_list_lock();
1423                list_del_init(&o_tty->tty_files);
1424                file_list_unlock();
1425                free_tty_struct(o_tty);
1426        }
1427
1428        if (!devpts)
1429                tty->driver->ttys[idx] = NULL;
1430        if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
1431                tp = tty->termios;
1432                if (!devpts)
1433                        tty->driver->termios[idx] = NULL;
1434                kfree(tp);
1435
1436                tp = tty->termios_locked;
1437                if (!devpts)
1438                        tty->driver->termios_locked[idx] = NULL;
1439                kfree(tp);
1440        }
1441
1442        tty->magic = 0;
1443        tty->driver->refcount--;
1444        file_list_lock();
1445        list_del_init(&tty->tty_files);
1446        file_list_unlock();
1447        module_put(tty->driver->owner);
1448        free_tty_struct(tty);
1449}
1450
1451/*
1452 * Even releasing the tty structures is a tricky business.. We have
1453 * to be very careful that the structures are all released at the
1454 * same time, as interrupts might otherwise get the wrong pointers.
1455 *
1456 * WSH 09/09/97: rewritten to avoid some nasty race conditions that could
1457 * lead to double frees or releasing memory still in use.
1458 */
1459static void release_dev(struct file * filp)
1460{
1461        struct tty_struct *tty, *o_tty;
1462        int     pty_master, tty_closing, o_tty_closing, do_sleep;
1463        int     devpts_master, devpts;
1464        int     idx;
1465        char    buf[64];
1466        unsigned long flags;
1467        
1468        tty = (struct tty_struct *)filp->private_data;
1469        if (tty_paranoia_check(tty, filp->f_dentry->d_inode, "release_dev"))
1470                return;
1471
1472        check_tty_count(tty, "release_dev");
1473
1474        tty_fasync(-1, filp, 0);
1475
1476        idx = tty->index;
1477        pty_master = (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
1478                      tty->driver->subtype == PTY_TYPE_MASTER);
1479        devpts = (tty->driver->flags & TTY_DRIVER_DEVPTS_MEM) != 0;
1480        devpts_master = pty_master && devpts;
1481        o_tty = tty->link;
1482
1483#ifdef TTY_PARANOIA_CHECK
1484        if (idx < 0 || idx >= tty->driver->num) {
1485                printk(KERN_DEBUG "release_dev: bad idx when trying to "
1486                                  "free (%s)\n", tty->name);
1487                return;
1488        }
1489        if (!(tty->driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
1490                if (tty != tty->driver->ttys[idx]) {
1491                        printk(KERN_DEBUG "release_dev: driver.table[%d] not tty "
1492                               "for (%s)\n", idx, tty->name);
1493                        return;
1494                }
1495                if (tty->termios != tty->driver->termios[idx]) {
1496                        printk(KERN_DEBUG "release_dev: driver.termios[%d] not termios "
1497                               "for (%s)\n",
1498                               idx, tty->name);
1499                        return;
1500                }
1501                if (tty->termios_locked != tty->driver->termios_locked[idx]) {
1502                        printk(KERN_DEBUG "release_dev: driver.termios_locked[%d] not "
1503                               "termios_locked for (%s)\n",
1504                               idx, tty->name);
1505                        return;
1506                }
1507        }
1508#endif
1509
1510#ifdef TTY_DEBUG_HANGUP
1511        printk(KERN_DEBUG "release_dev of %s (tty count=%d)...",
1512               tty_name(tty, buf), tty->count);
1513#endif
1514
1515#ifdef TTY_PARANOIA_CHECK
1516        if (tty->driver->other &&
1517             !(tty->driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
1518                if (o_tty != tty->driver->other->ttys[idx]) {
1519                        printk(KERN_DEBUG "release_dev: other->table[%d] "
1520                                          "not o_tty for (%s)\n",
1521                               idx, tty->name);
1522                        return;
1523                }
1524                if (o_tty->termios != tty->driver->other->termios[idx]) {
1525                        printk(KERN_DEBUG "release_dev: other->termios[%d] "
1526                                          "not o_termios for (%s)\n",
1527                               idx, tty->name);
1528                        return;
1529                }
1530                if (o_tty->termios_locked != 
1531                      tty->driver->other->termios_locked[idx]) {
1532                        printk(KERN_DEBUG "release_dev: other->termios_locked["
1533                                          "%d] not o_termios_locked for (%s)\n",
1534                               idx, tty->name);
1535                        return;
1536                }
1537                if (o_tty->link != tty) {
1538                        printk(KERN_DEBUG "release_dev: bad pty pointers\n");
1539                        return;
1540                }
1541        }
1542#endif
1543        if (tty->driver->close)
1544                tty->driver->close(tty, filp);
1545
1546        /*
1547         * Sanity check: if tty->count is going to zero, there shouldn't be
1548         * any waiters on tty->read_wait or tty->write_wait.  We test the
1549         * wait queues and kick everyone out _before_ actually starting to
1550         * close.  This ensures that we won't block while releasing the tty
1551         * structure.
1552         *
1553         * The test for the o_tty closing is necessary, since the master and
1554         * slave sides may close in any order.  If the slave side closes out
1555         * first, its count will be one, since the master side holds an open.
1556         * Thus this test wouldn't be triggered at the time the slave closes,
1557         * so we do it now.
1558         *
1559         * Note that it's possible for the tty to be opened again while we're
1560         * flushing out waiters.  By recalculating the closing flags before
1561         * each iteration we avoid any problems.
1562         */
1563        while (1) {
1564                tty_closing = tty->count <= 1;
1565                o_tty_closing = o_tty &&
1566                        (o_tty->count <= (pty_master ? 1 : 0));
1567                do_sleep = 0;
1568
1569                if (tty_closing) {
1570                        if (waitqueue_active(&tty->read_wait)) {
1571                                wake_up(&tty->read_wait);
1572                                do_sleep++;
1573                        }
1574                        if (waitqueue_active(&tty->write_wait)) {
1575                                wake_up(&tty->write_wait);
1576                                do_sleep++;
1577                        }
1578                }
1579                if (o_tty_closing) {
1580                        if (waitqueue_active(&o_tty->read_wait)) {
1581                                wake_up(&o_tty->read_wait);
1582                                do_sleep++;
1583                        }
1584                        if (waitqueue_active(&o_tty->write_wait)) {
1585                                wake_up(&o_tty->write_wait);
1586                                do_sleep++;
1587                        }
1588                }
1589                if (!do_sleep)
1590                        break;
1591
1592                printk(KERN_WARNING "release_dev: %s: read/write wait queue "
1593                                    "active!\n", tty_name(tty, buf));
1594                schedule();
1595        }       
1596
1597        /*
1598         * The closing flags are now consistent with the open counts on 
1599         * both sides, and we've completed the last operation that could 
1600         * block, so it's safe to proceed with closing.
1601         */
1602        if (pty_master) {
1603                if (--o_tty->count < 0) {
1604                        printk(KERN_WARNING "release_dev: bad pty slave count "
1605                                            "(%d) for %s\n",
1606                               o_tty->count, tty_name(o_tty, buf));
1607                        o_tty->count = 0;
1608                }
1609        }
1610        if (--tty->count < 0) {
1611                printk(KERN_WARNING "release_dev: bad tty->count (%d) for %s\n",
1612                       tty->count, tty_name(tty, buf));
1613                tty->count = 0;
1614        }
1615
1616        /*
1617         * We've decremented tty->count, so we need to remove this file
1618         * descriptor off the tty->tty_files list; this serves two
1619         * purposes:
1620         *  - check_tty_count sees the correct number of file descriptors
1621         *    associated with this tty.
1622         *  - do_tty_hangup no longer sees this file descriptor as
1623         *    something that needs to be handled for hangups.
1624         */
1625        file_kill(filp);
1626        filp->private_data = NULL;
1627
1628        /*
1629         * Perform some housekeeping before deciding whether to return.
1630         *
1631         * Set the TTY_CLOSING flag if this was the last open.  In the
1632         * case of a pty we may have to wait around for the other side
1633         * to close, and TTY_CLOSING makes sure we can't be reopened.
1634         */
1635        if(tty_closing)
1636                set_bit(TTY_CLOSING, &tty->flags);
1637        if(o_tty_closing)
1638                set_bit(TTY_CLOSING, &o_tty->flags);
1639
1640        /*
1641         * If _either_ side is closing, make sure there aren't any
1642         * processes that still think tty or o_tty is their controlling
1643         * tty.
1644         */
1645        if (tty_closing || o_tty_closing) {
1646                struct task_struct *p;
1647
1648                read_lock(&tasklist_lock);
1649                do_each_task_pid(tty->session, PIDTYPE_SID, p) {
1650                        p->signal->tty = NULL;
1651                } while_each_task_pid(tty->session, PIDTYPE_SID, p);
1652                if (o_tty)
1653                        do_each_task_pid(o_tty->session, PIDTYPE_SID, p) {
1654                                p->signal->tty = NULL;
1655                        } while_each_task_pid(o_tty->session, PIDTYPE_SID, p);
1656                read_unlock(&tasklist_lock);
1657        }
1658
1659        /* check whether both sides are closing ... */
1660        if (!tty_closing || (o_tty && !o_tty_closing))
1661                return;
1662        
1663#ifdef TTY_DEBUG_HANGUP
1664        printk(KERN_DEBUG "freeing tty structure...");
1665#endif
1666        /*
1667         * Prevent flush_to_ldisc() from rescheduling the work for later.  Then
1668         * kill any delayed work. As this is the final close it does not
1669         * race with the set_ldisc code path.
1670         */
1671        clear_bit(TTY_LDISC, &tty->flags);
1672        clear_bit(TTY_DONT_FLIP, &tty->flags);
1673        cancel_delayed_work(&tty->flip.work);
1674
1675        /*
1676         * Wait for ->hangup_work and ->flip.work handlers to terminate
1677         */
1678         
1679        flush_scheduled_work();
1680        
1681        /*
1682         * Wait for any short term users (we know they are just driver
1683         * side waiters as the file is closing so user count on the file
1684         * side is zero.
1685         */
1686        spin_lock_irqsave(&tty_ldisc_lock, flags);
1687        while(tty->ldisc.refcount)
1688        {
1689                spin_unlock_irqrestore(&tty_ldisc_lock, flags);
1690                wait_event(tty_ldisc_wait, tty->ldisc.refcount == 0);
1691                spin_lock_irqsave(&tty_ldisc_lock, flags);
1692        }
1693        spin_unlock_irqrestore(&tty_ldisc_lock, flags);
1694        /*
1695         * Shutdown the current line discipline, and reset it to N_TTY.
1696         * N.B. why reset ldisc when we're releasing the memory??
1697         *
1698         * FIXME: this MUST get fixed for the new reflocking
1699         */
1700        if (tty->ldisc.close)
1701                (tty->ldisc.close)(tty);
1702        tty_ldisc_put(tty->ldisc.num);
1703        
1704        /*
1705         *      Switch the line discipline back
1706         */
1707        tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
1708        tty_set_termios_ldisc(tty,N_TTY); 
1709        if (o_tty) {
1710                /* FIXME: could o_tty be in setldisc here ? */
1711                clear_bit(TTY_LDISC, &o_tty->flags);
1712                if (o_tty->ldisc.close)
1713                        (o_tty->ldisc.close)(o_tty);
1714                tty_ldisc_put(o_tty->ldisc.num);
1715                tty_ldisc_assign(o_tty, tty_ldisc_get(N_TTY));
1716                tty_set_termios_ldisc(o_tty,N_TTY); 
1717        }
1718        /*
1719         * The release_mem function takes care of the details of clearing
1720         * the slots and preserving the termios structure.
1721         */
1722        release_mem(tty, idx);
1723
1724#ifdef CONFIG_UNIX98_PTYS
1725        /* Make this pty number available for reallocation */
1726        if (devpts) {
1727                down(&allocated_ptys_lock);
1728                idr_remove(&allocated_ptys, idx);
1729                up(&allocated_ptys_lock);
1730        }
1731#endif
1732
1733}
1734
1735/*
1736 * tty_open and tty_release keep up the tty count that contains the
1737 * number of opens done on a tty. We cannot use the inode-count, as
1738 * different inodes might point to the same tty.
1739 *
1740 * Open-counting is needed for pty masters, as well as for keeping
1741 * track of serial lines: DTR is dropped when the last close happens.
1742 * (This is not done solely through tty->count, now.  - Ted 1/27/92)
1743 *
1744 * The termios state of a pty is reset on first open so that
1745 * settings don't persist across reuse.
1746 */
1747static int tty_open(struct inode * inode, struct file * filp)
1748{
1749        struct tty_struct *tty;
1750        int noctty, retval;
1751        struct tty_driver *driver;
1752        int index;
1753        dev_t device = inode->i_rdev;
1754        unsigned short saved_flags = filp->f_flags;
1755
1756        nonseekable_open(inode, filp);
1757        
1758retry_open:
1759        noctty = filp->f_flags & O_NOCTTY;
1760        index  = -1;
1761        retval = 0;
1762
1763        if (device == MKDEV(TTYAUX_MAJOR,0)) {
1764                if (!current->signal->tty)
1765                        return -ENXIO;
1766                driver = current->signal->tty->driver;
1767                index = current->signal->tty->index;
1768                filp->f_flags |= O_NONBLOCK; /* Don't let /dev/tty block */
1769                /* noctty = 1; */
1770                goto got_driver;
1771        }
1772#ifdef CONFIG_VT
1773        if (device == MKDEV(TTY_MAJOR,0)) {
1774                extern int fg_console;
1775                extern struct tty_driver *console_driver;
1776                driver = console_driver;
1777                index = fg_console;
1778                noctty = 1;
1779                goto got_driver;
1780        }
1781#endif
1782        if (device == MKDEV(TTYAUX_MAJOR,1)) {
1783                driver = console_device(&index);
1784                if (driver) {
1785                        /* Don't let /dev/console block */
1786                        filp->f_flags |= O_NONBLOCK;
1787                        noctty = 1;
1788                        goto got_driver;
1789                }
1790                return -ENODEV;
1791        }
1792
1793        driver = get_tty_driver(device, &index);
1794        if (!driver)
1795                return -ENODEV;
1796got_driver:
1797        retval = init_dev(driver, index, &tty);
1798        if (retval)
1799                return retval;
1800
1801        filp->private_data = tty;
1802        file_move(filp, &tty->tty_files);
1803        check_tty_count(tty, "tty_open");
1804        if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
1805            tty->driver->subtype == PTY_TYPE_MASTER)
1806                noctty = 1;
1807#ifdef TTY_DEBUG_HANGUP
1808        printk(KERN_DEBUG "opening %s...", tty->name);
1809#endif
1810        if (!retval) {
1811                if (tty->driver->open)
1812                        retval = tty->driver->open(tty, filp);
1813                else
1814                        retval = -ENODEV;
1815        }
1816        filp->f_flags = saved_flags;
1817
1818        if (!retval && test_bit(TTY_EXCLUSIVE, &tty->flags) && !capable(CAP_SYS_ADMIN))
1819                retval = -EBUSY;
1820
1821        if (retval) {
1822#ifdef TTY_DEBUG_HANGUP
1823                printk(KERN_DEBUG "error %d in opening %s...", retval,
1824                       tty->name);
1825#endif
1826                release_dev(filp);
1827                if (retval != -ERESTARTSYS)
1828                        return retval;
1829                if (signal_pending(current))
1830                        return retval;
1831                schedule();
1832                /*
1833                 * Need to reset f_op in case a hangup happened.
1834                 */
1835                if (filp->f_op == &hung_up_tty_fops)
1836                        filp->f_op = &tty_fops;
1837                goto retry_open;
1838        }
1839        if (!noctty &&
1840            current->signal->leader &&
1841            !current->signal->tty &&
1842            tty->session == 0) {
1843                task_lock(current);
1844                current->signal->tty = tty;
1845                task_unlock(current);
1846                current->signal->tty_old_pgrp = 0;
1847                tty->session = current->signal->session;
1848                tty->pgrp = process_group(current);
1849        }
1850        return 0;
1851}
1852
1853#ifdef CONFIG_UNIX98_PTYS
1854static int ptmx_open(struct inode * inode, struct file * filp)
1855{
1856        struct tty_struct *tty;
1857        int retval;
1858        int index;
1859        int idr_ret;
1860
1861        nonseekable_open(inode, filp);
1862
1863        /* find a device that is not in use. */
1864        down(&allocated_ptys_lock);
1865        if (!idr_pre_get(&allocated_ptys, GFP_KERNEL)) {
1866                up(&allocated_ptys_lock);
1867                return -ENOMEM;
1868        }
1869        idr_ret = idr_get_new(&allocated_ptys, NULL, &index);
1870        if (idr_ret < 0) {
1871                up(&allocated_ptys_lock);
1872                if (idr_ret == -EAGAIN)
1873                        return -ENOMEM;
1874                return -EIO;
1875        }
1876        if (index >= pty_limit) {
1877                idr_remove(&allocated_ptys, index);
1878                up(&allocated_ptys_lock);
1879                return -EIO;
1880        }
1881        up(&allocated_ptys_lock);
1882
1883        retval = init_dev(ptm_driver, index, &tty);
1884        if (retval)
1885                goto out;
1886
1887        set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */
1888        filp->private_data = tty;
1889        file_move(filp, &tty->tty_files);
1890
1891        retval = -ENOMEM;
1892        if (devpts_pty_new(tty->link))
1893                goto out1;
1894
1895        check_tty_count(tty, "tty_open");
1896        retval = ptm_driver->open(tty, filp);
1897        if (!retval)
1898                return 0;
1899out1:
1900        release_dev(filp);
1901out:
1902        down(&allocated_ptys_lock);
1903        idr_remove(&allocated_ptys, index);
1904        up(&allocated_ptys_lock);
1905        return retval;
1906}
1907#endif
1908
1909static int tty_release(struct inode * inode, struct file * filp)
1910{
1911        lock_kernel();
1912        release_dev(filp);
1913        unlock_kernel();
1914        return 0;
1915}
1916
1917/* No kernel lock held - fine */
1918static unsigned int tty_poll(struct file * filp, poll_table * wait)
1919{
1920        struct tty_struct * tty;
1921        struct tty_ldisc *ld;
1922        int ret = 0;
1923
1924        tty = (struct tty_struct *)filp->private_data;
1925        if (tty_paranoia_check(tty, filp->f_dentry->d_inode, "tty_poll"))
1926                return 0;
1927                
1928        ld = tty_ldisc_ref_wait(tty);
1929        if (ld->poll)
1930                ret = (ld->poll)(tty, filp, wait);
1931        tty_ldisc_deref(ld);
1932        return ret;
1933}
1934
1935static int tty_fasync(int fd, struct file * filp, int on)
1936{
1937        struct tty_struct * tty;
1938        int retval;
1939
1940        tty = (struct tty_struct *)filp->private_data;
1941        if (tty_paranoia_check(tty, filp->f_dentry->d_inode, "tty_fasync"))
1942                return 0;
1943        
1944        retval = fasync_helper(fd, filp, on, &tty->fasync);
1945        if (retval <= 0)
1946                return retval;
1947
1948        if (on) {
1949                if (!waitqueue_active(&tty->read_wait))
1950                        tty->minimum_to_wake = 1;
1951                retval = f_setown(filp, (-tty->pgrp) ? : current->pid, 0);
1952                if (retval)
1953                        return retval;
1954        } else {
1955                if (!tty->fasync && !waitqueue_active(&tty->read_wait))
1956                        tty->minimum_to_wake = N_TTY_BUF_SIZE;
1957        }
1958        return 0;
1959}
1960
1961static int tiocsti(struct tty_struct *tty, char __user *p)
1962{
1963        char ch, mbz = 0;
1964        struct tty_ldisc *ld;
1965        
1966        if ((current->signal->tty != tty) && !capable(CAP_SYS_ADMIN))
1967                return -EPERM;
1968        if (get_user(ch, p))
1969                return -EFAULT;
1970        ld = tty_ldisc_ref_wait(tty);
1971        ld->receive_buf(tty, &ch, &mbz, 1);
1972        tty_ldisc_deref(ld);
1973        return 0;
1974}
1975
1976static int tiocgwinsz(struct tty_struct *tty, struct winsize __user * arg)
1977{
1978        if (copy_to_user(arg, &tty->winsize, sizeof(*arg)))
1979                return -EFAULT;
1980        return 0;
1981}
1982
1983static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty,
1984        struct winsize __user * arg)
1985{
1986        struct winsize tmp_ws;
1987
1988        if (copy_from_user(&tmp_ws, arg, sizeof(*arg)))
1989                return -EFAULT;
1990        if (!memcmp(&tmp_ws, &tty->winsize, sizeof(*arg)))
1991                return 0;
1992#ifdef CONFIG_VT
1993        if (tty->driver->type == TTY_DRIVER_TYPE_CONSOLE) {
1994                unsigned int currcons = tty->index;
1995                int rc;
1996
1997                acquire_console_sem();
1998                rc = vc_resize(currcons, tmp_ws.ws_col, tmp_ws.ws_row);
1999                release_console_sem();
2000                if (rc)
2001                        return -ENXIO;
2002        }
2003#endif
2004        if (tty->pgrp > 0)
2005                kill_pg(tty->pgrp, SIGWINCH, 1);
2006        if ((real_tty->pgrp != tty->pgrp) && (real_tty->pgrp > 0))
2007                kill_pg(real_tty->pgrp, SIGWINCH, 1);
2008        tty->winsize = tmp_ws;
2009        real_tty->winsize = tmp_ws;
2010        return 0;
2011}
2012
2013static int tioccons(struct file *file)
2014{
2015        if (!capable(CAP_SYS_ADMIN))
2016                return -EPERM;
2017        if (file->f_op->write == redirected_tty_write) {
2018                struct file *f;
2019                spin_lock(&redirect_lock);
2020                f = redirect;
2021                redirect = NULL;
2022                spin_unlock(&redirect_lock);
2023                if (f)
2024                        fput(f);
2025                return 0;
2026        }
2027        spin_lock(&redirect_lock);
2028        if (redirect) {
2029                spin_unlock(&redirect_lock);
2030                return -EBUSY;
2031        }
2032        get_file(file);
2033        redirect = file;
2034        spin_unlock(&redirect_lock);
2035        return 0;
2036}
2037
2038
2039static int fionbio(struct file *file, int __user *p)
2040{
2041        int nonblock;
2042
2043        if (get_user(nonblock, p))
2044                return -EFAULT;
2045
2046        if (nonblock)
2047                file->f_flags |= O_NONBLOCK;
2048        else
2049                file->f_flags &= ~O_NONBLOCK;
2050        return 0;
2051}
2052
2053static int tiocsctty(struct tty_struct *tty, int arg)
2054{
2055        task_t *p;
2056
2057        if (current->signal->leader &&
2058            (current->signal->session == tty->session))
2059                return 0;
2060        /*
2061         * The process must be a session leader and
2062         * not have a controlling tty already.
2063         */
2064        if (!current->signal->leader || current->signal->tty)
2065                return -EPERM;
2066        if (tty->session > 0) {
2067                /*
2068                 * This tty is already the controlling
2069                 * tty for another session group!
2070                 */
2071                if ((arg == 1) && capable(CAP_SYS_ADMIN)) {
2072                        /*
2073                         * Steal it away
2074                         */
2075
2076                        read_lock(&tasklist_lock);
2077                        do_each_task_pid(tty->session, PIDTYPE_SID, p) {
2078                                p->signal->tty = NULL;
2079                        } while_each_task_pid(tty->session, PIDTYPE_SID, p);
2080                        read_unlock(&tasklist_lock);
2081                } else
2082                        return -EPERM;
2083        }
2084        task_lock(current);
2085        current->signal->tty = tty;
2086        task_unlock(current);
2087        current->signal->tty_old_pgrp = 0;
2088        tty->session = current->signal->session;
2089        tty->pgrp = process_group(current);
2090        return 0;
2091}
2092
2093static int tiocgpgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
2094{
2095        /*
2096         * (tty == real_tty) is a cheap way of
2097         * testing if the tty is NOT a master pty.
2098         */
2099        if (tty == real_tty && current->signal->tty != real_tty)
2100                return -ENOTTY;
2101        return put_user(real_tty->pgrp, p);
2102}
2103
2104static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
2105{
2106        pid_t pgrp;
2107        int retval = tty_check_change(real_tty);
2108
2109        if (retval == -EIO)
2110                return -ENOTTY;
2111        if (retval)
2112                return retval;
2113        if (!current->signal->tty ||
2114            (current->signal->tty != real_tty) ||
2115            (real_tty->session != current->signal->session))
2116                return -ENOTTY;
2117        if (get_user(pgrp, p))
2118                return -EFAULT;
2119        if (pgrp < 0)
2120                return -EINVAL;
2121        if (session_of_pgrp(pgrp) != current->signal->session)
2122                return -EPERM;
2123        real_tty->pgrp = pgrp;
2124        return 0;
2125}
2126
2127static int tiocgsid(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
2128{
2129        /*
2130         * (tty == real_tty) is a cheap way of
2131         * testing if the tty is NOT a master pty.
2132        */
2133        if (tty == real_tty && current->signal->tty != real_tty)
2134                return -ENOTTY;
2135        if (real_tty->session <= 0)
2136                return -ENOTTY;
2137        return put_user(real_tty->session, p);
2138}
2139
2140static int tiocsetd(struct tty_struct *tty, int __user *p)
2141{
2142        int ldisc;
2143
2144        if (get_user(ldisc, p))
2145                return -EFAULT;
2146        return tty_set_ldisc(tty, ldisc);
2147}
2148
2149static int send_break(struct tty_struct *tty, int duration)
2150{
2151        tty->driver->break_ctl(tty, -1);
2152        if (!signal_pending(current)) {
2153                set_current_state(TASK_INTERRUPTIBLE);
2154                schedule_timeout(duration);
2155        }
2156        tty->driver->break_ctl(tty, 0);
2157        if (signal_pending(current))
2158                return -EINTR;
2159        return 0;
2160}
2161
2162static int
2163tty_tiocmget(struct tty_struct *tty, struct file *file, int __user *p)
2164{
2165        int retval = -EINVAL;
2166
2167        if (tty->driver->tiocmget) {
2168                retval = tty->driver->tiocmget(tty, file);
2169
2170                if (retval >= 0)
2171                        retval = put_user(retval, p);
2172        }
2173        return retval;
2174}
2175
2176static int
2177tty_tiocmset(struct tty_struct *tty, struct file *file, unsigned int cmd,
2178             unsigned __user *p)
2179{
2180        int retval = -EINVAL;
2181
2182        if (tty->driver->tiocmset) {
2183                unsigned int set, clear, val;
2184
2185                retval = get_user(val, p);
2186                if (retval)
2187                        return retval;
2188
2189                set = clear = 0;
2190                switch (cmd) {
2191                case TIOCMBIS:
2192                        set = val;
2193                        break;
2194                case TIOCMBIC:
2195                        clear = val;
2196                        break;
2197                case TIOCMSET:
2198                        set = val;
2199                        clear = ~val;
2200                        break;
2201                }
2202
2203                set &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP;
2204                clear &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP;
2205
2206                retval = tty->driver->tiocmset(tty, file, set, clear);
2207        }
2208        return retval;
2209}
2210
2211/*
2212 * Split this up, as gcc can choke on it otherwise..
2213 */
2214int tty_ioctl(struct inode * inode, struct file * file,
2215              unsigned int cmd, unsigned long arg)
2216{
2217        struct tty_struct *tty, *real_tty;
2218        void __user *p = (void __user *)arg;
2219        int retval;
2220        struct tty_ldisc *ld;
2221        
2222        tty = (struct tty_struct *)file->private_data;
2223        if (tty_paranoia_check(tty, inode, "tty_ioctl"))
2224                return -EINVAL;
2225
2226        real_tty = tty;
2227        if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
2228            tty->driver->subtype == PTY_TYPE_MASTER)
2229                real_tty = tty->link;
2230
2231        /*
2232         * Break handling by driver
2233         */
2234        if (!tty->driver->break_ctl) {
2235                switch(cmd) {
2236                case TIOCSBRK:
2237                case TIOCCBRK:
2238                        if (tty->driver->ioctl)
2239                                return tty->driver->ioctl(tty, file, cmd, arg);
2240                        return -EINVAL;
2241                        
2242                /* These two ioctl's always return success; even if */
2243                /* the driver doesn't support them. */
2244                case TCSBRK:
2245                case TCSBRKP:
2246                        if (!tty->driver->ioctl)
2247                                return 0;
2248                        retval = tty->driver->ioctl(tty, file, cmd, arg);
2249                        if (retval == -ENOIOCTLCMD)
2250                                retval = 0;
2251                        return retval;
2252                }
2253        }
2254
2255        /*
2256         * Factor out some common prep work
2257         */
2258        switch (cmd) {
2259        case TIOCSETD:
2260        case TIOCSBRK:
2261        case TIOCCBRK:
2262        case TCSBRK:
2263        case TCSBRKP:                   
2264                retval = tty_check_change(tty);
2265                if (retval)
2266                        return retval;
2267                if (cmd != TIOCCBRK) {
2268                        tty_wait_until_sent(tty, 0);
2269                        if (signal_pending(current))
2270                                return -EINTR;
2271                }
2272                break;
2273        }
2274
2275        switch (cmd) {
2276                case TIOCSTI:
2277                        return tiocsti(tty, p);
2278                case TIOCGWINSZ:
2279                        return tiocgwinsz(tty, p);
2280                case TIOCSWINSZ:
2281                        return tiocswinsz(tty, real_tty, p);
2282                case TIOCCONS:
2283                        return real_tty!=tty ? -EINVAL : tioccons(file);
2284                case FIONBIO:
2285                        return fionbio(file, p);
2286                case TIOCEXCL:
2287                        set_bit(TTY_EXCLUSIVE, &tty->flags);
2288                        return 0;
2289                case TIOCNXCL:
2290                        clear_bit(TTY_EXCLUSIVE, &tty->flags);
2291                        return 0;
2292                case TIOCNOTTY:
2293                        if (current->signal->tty != tty)
2294                                return -ENOTTY;
2295                        if (current->signal->leader)
2296                                disassociate_ctty(0);
2297                        task_lock(current);
2298                        current->signal->tty = NULL;
2299                        task_unlock(current);
2300                        return 0;
2301                case TIOCSCTTY:
2302                        return tiocsctty(tty, arg);
2303                case TIOCGPGRP:
2304                        return tiocgpgrp(tty, real_tty, p);
2305                case TIOCSPGRP:
2306                        return tiocspgrp(tty, real_tty, p);
2307                case TIOCGSID:
2308                        return tiocgsid(tty, real_tty, p);
2309                case TIOCGETD:
2310                        /* FIXME: check this is ok */
2311                        return put_user(tty->ldisc.num, (int __user *)p);
2312                case TIOCSETD:
2313                        return tiocsetd(tty, p);
2314#ifdef CONFIG_VT
2315                case TIOCLINUX:
2316                        return tioclinux(tty, arg);
2317#endif
2318                /*
2319                 * Break handling
2320                 */
2321                case TIOCSBRK:  /* Turn break on, unconditionally */
2322                        tty->driver->break_ctl(tty, -1);
2323                        return 0;
2324                        
2325                case TIOCCBRK:  /* Turn break off, unconditionally */
2326                        tty->driver->break_ctl(tty, 0);
2327                        return 0;
2328                case TCSBRK:   /* SVID version: non-zero arg --> no break */
2329                        /*
2330                         * XXX is the above comment correct, or the
2331                         * code below correct?  Is this ioctl used at
2332                         * all by anyone?
2333                         */
2334                        if (!arg)
2335                                return send_break(tty, HZ/4);
2336                        return 0;
2337                case TCSBRKP:   /* support for POSIX tcsendbreak() */   
2338                        return send_break(tty, arg ? arg*(HZ/10) : HZ/4);
2339
2340                case TIOCMGET:
2341                        return tty_tiocmget(tty, file, p);
2342
2343                case TIOCMSET:
2344                case TIOCMBIC:
2345                case TIOCMBIS:
2346                        return tty_tiocmset(tty, file, cmd, p);
2347        }
2348        if (tty->driver->ioctl) {
2349                retval = (tty->driver->ioctl)(tty, file, cmd, arg);
2350                if (retval != -ENOIOCTLCMD)
2351                        return retval;
2352        }
2353        ld = tty_ldisc_ref_wait(tty);
2354        retval = -EINVAL;
2355        if (ld->ioctl) {
2356                retval = ld->ioctl(tty, file, cmd, arg);
2357                if (retval == -ENOIOCTLCMD)
2358                        retval = -EINVAL;
2359        }
2360        tty_ldisc_deref(ld);
2361        return retval;
2362}
2363
2364
2365/*
2366 * This implements the "Secure Attention Key" ---  the idea is to
2367 * prevent trojan horses by killing all processes associated with this
2368 * tty when the user hits the "Secure Attention Key".  Required for
2369 * super-paranoid applications --- see the Orange Book for more details.
2370 * 
2371 * This code could be nicer; ideally it should send a HUP, wait a few
2372 * seconds, then send a INT, and then a KILL signal.  But you then
2373 * have to coordinate with the init process, since all processes associated
2374 * with the current tty must be dead before the new getty is allowed
2375 * to spawn.
2376 *
2377 * Now, if it would be correct ;-/ The current code has a nasty hole -
2378 * it doesn't catch files in flight. We may send the descriptor to ourselves
2379 * via AF_UNIX socket, close it and later fetch from socket. FIXME.
2380 *
2381 * Nasty bug: do_SAK is being called in interrupt context.  This can
2382 * deadlock.  We punt it up to process context.  AKPM - 16Mar2001
2383 */
2384static void __do_SAK(void *arg)
2385{
2386#ifdef TTY_SOFT_SAK
2387        tty_hangup(tty);
2388#else
2389        struct tty_struct *tty = arg;
2390        struct task_struct *p;
2391        int session;
2392        int             i;
2393        struct file     *filp;
2394        struct tty_ldisc *disc;
2395        
2396        if (!tty)
2397                return;
2398        session  = tty->session;
2399        
2400        /* We don't want an ldisc switch during this */
2401        disc = tty_ldisc_ref(tty);
2402        if (disc && disc->flush_buffer)
2403                disc->flush_buffer(tty);
2404        tty_ldisc_deref(disc);
2405
2406        if (tty->driver->flush_buffer)
2407                tty->driver->flush_buffer(tty);
2408        
2409        read_lock(&tasklist_lock);
2410        do_each_task_pid(session, PIDTYPE_SID, p) {
2411                if (p->signal->tty == tty || session > 0) {
2412                        printk(KERN_NOTICE "SAK: killed process %d"
2413                            " (%s): p->signal->session==tty->session\n",
2414                            p->pid, p->comm);
2415                        send_sig(SIGKILL, p, 1);
2416                        continue;
2417                }
2418                task_lock(p);
2419                if (p->files) {
2420                        spin_lock(&p->files->file_lock);
2421                        for (i=0; i < p->files->max_fds; i++) {
2422                                filp = fcheck_files(p->files, i);
2423                                if (!filp)
2424                                        continue;
2425                                if (filp->f_op->read == tty_read &&
2426                                    filp->private_data == tty) {
2427                                        printk(KERN_NOTICE "SAK: killed process %d"
2428                                            " (%s): fd#%d opened to the tty\n",
2429                                            p->pid, p->comm, i);
2430                                        send_sig(SIGKILL, p, 1);
2431                                        break;
2432                                }
2433                        }
2434                        spin_unlock(&p->files->file_lock);
2435                }
2436                task_unlock(p);
2437        } while_each_task_pid(session, PIDTYPE_SID, p);
2438        read_unlock(&tasklist_lock);
2439#endif
2440}
2441
2442/*
2443 * The tq handling here is a little racy - tty->SAK_work may already be queued.
2444 * Fortunately we don't need to worry, because if ->SAK_work is already queued,
2445 * the values which we write to it will be identical to the values which it
2446 * already has. --akpm
2447 */
2448void do_SAK(struct tty_struct *tty)
2449{
2450        if (!tty)
2451                return;
2452        PREPARE_WORK(&tty->SAK_work, __do_SAK, tty);
2453        schedule_work(&tty->SAK_work);
2454}
2455
2456EXPORT_SYMBOL(do_SAK);
2457
2458/*
2459 * This routine is called out of the software interrupt to flush data
2460 * from the flip buffer to the line discipline. 
2461 */
2462 
2463static void flush_to_ldisc(void *private_)
2464{
2465        struct tty_struct *tty = (struct tty_struct *) private_;
2466        unsigned char   *cp;
2467        char            *fp;
2468        int             count;
2469        unsigned long   flags;
2470        struct tty_ldisc *disc;
2471
2472        disc = tty_ldisc_ref(tty);
2473        if (disc == NULL)       /*  !TTY_LDISC */
2474                return;
2475
2476        if (test_bit(TTY_DONT_FLIP, &tty->flags)) {
2477                /*
2478                 * Do it after the next timer tick:
2479                 */
2480                schedule_delayed_work(&tty->flip.work, 1);
2481                goto out;
2482        }
2483        spin_lock_irqsave(&tty->read_lock, flags);
2484        if (tty->flip.buf_num) {
2485                cp = tty->flip.char_buf + TTY_FLIPBUF_SIZE;
2486                fp = tty->flip.flag_buf + TTY_FLIPBUF_SIZE;
2487                tty->flip.buf_num = 0;
2488                tty->flip.char_buf_ptr = tty->flip.char_buf;
2489                tty->flip.flag_buf_ptr = tty->flip.flag_buf;
2490        } else {
2491                cp = tty->flip.char_buf;
2492                fp = tty->flip.flag_buf;
2493                tty->flip.buf_num = 1;
2494                tty->flip.char_buf_ptr = tty->flip.char_buf + TTY_FLIPBUF_SIZE;
2495                tty->flip.flag_buf_ptr = tty->flip.flag_buf + TTY_FLIPBUF_SIZE;
2496        }
2497        count = tty->flip.count;
2498        tty->flip.count = 0;
2499        spin_unlock_irqrestore(&tty->read_lock, flags);
2500
2501        disc->receive_buf(tty, cp, fp, count);
2502out:
2503        tty_ldisc_deref(disc);
2504}
2505
2506/*
2507 *      Call the ldisc flush directly from a driver. This function may
2508 *      return an error and need retrying by the user.
2509 */
2510
2511int tty_push_data(struct tty_struct *tty, unsigned char *cp, unsigned char *fp, int count)
2512{
2513        int ret = 0;
2514        struct tty_ldisc *disc;
2515        
2516        disc = tty_ldisc_ref(tty);
2517        if(test_bit(TTY_DONT_FLIP, &tty->flags))
2518                ret = -EAGAIN;
2519        else if(disc == NULL)
2520                ret = -EIO;
2521        else
2522                disc->receive_buf(tty, cp, fp, count);
2523        tty_ldisc_deref(disc);
2524        return ret;
2525        
2526}
2527
2528/*
2529 * Routine which returns the baud rate of the tty
2530 *
2531 * Note that the baud_table needs to be kept in sync with the
2532 * include/asm/termbits.h file.
2533 */
2534static int baud_table[] = {
2535        0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
2536        9600, 19200, 38400, 57600, 115200, 230400, 460800,
2537#ifdef __sparc__
2538        76800, 153600, 307200, 614400, 921600
2539#else
2540        500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000,
2541        2500000, 3000000, 3500000, 4000000
2542#endif
2543};
2544
2545static int n_baud_table = ARRAY_SIZE(baud_table);
2546
2547/**
2548 *      tty_termios_baud_rate
2549 *      @termios: termios structure
2550 *
2551 *      Convert termios baud rate data into a speed. This should be called
2552 *      with the termios lock held if this termios is a terminal termios
2553 *      structure. May change the termios data.
2554 */
2555 
2556int tty_termios_baud_rate(struct termios *termios)
2557{
2558        unsigned int cbaud;
2559        
2560        cbaud = termios->c_cflag & CBAUD;
2561
2562        if (cbaud & CBAUDEX) {
2563                cbaud &= ~CBAUDEX;
2564
2565                if (cbaud < 1 || cbaud + 15 > n_baud_table)
2566                        termios->c_cflag &= ~CBAUDEX;
2567                else
2568                        cbaud += 15;
2569        }
2570        return baud_table[cbaud];
2571}
2572
2573EXPORT_SYMBOL(tty_termios_baud_rate);
2574
2575/**
2576 *      tty_get_baud_rate       -       get tty bit rates
2577 *      @tty: tty to query
2578 *
2579 *      Returns the baud rate as an integer for this terminal. The
2580 *      termios lock must be held by the caller and the terminal bit
2581 *      flags may be updated.
2582 */
2583 
2584int tty_get_baud_rate(struct tty_struct *tty)
2585{
2586        int baud = tty_termios_baud_rate(tty->termios);
2587
2588        if (baud == 38400 && tty->alt_speed) {
2589                if (!tty->warned) {
2590                        printk(KERN_WARNING "Use of setserial/setrocket to "
2591                                            "set SPD_* flags is deprecated\n");
2592                        tty->warned = 1;
2593                }
2594                baud = tty->alt_speed;
2595        }
2596        
2597        return baud;
2598}
2599
2600EXPORT_SYMBOL(tty_get_baud_rate);
2601
2602/**
2603 *      tty_flip_buffer_push    -       terminal
2604 *      @tty: tty to push
2605 *
2606 *      Queue a push of the terminal flip buffers to the line discipline. This
2607 *      function must not be called from IRQ context if tty->low_latency is set.
2608 *
2609 *      In the event of the queue being busy for flipping the work will be
2610 *      held off and retried later.
2611 */
2612
2613void tty_flip_buffer_push(struct tty_struct *tty)
2614{
2615        if (tty->low_latency)
2616                flush_to_ldisc((void *) tty);
2617        else
2618                schedule_delayed_work(&tty->flip.work, 1);
2619}
2620
2621EXPORT_SYMBOL(tty_flip_buffer_push);
2622
2623/*
2624 * This subroutine initializes a tty structure.
2625 */
2626static void initialize_tty_struct(struct tty_struct *tty)
2627{
2628        memset(tty, 0, sizeof(struct tty_struct));
2629        tty->magic = TTY_MAGIC;
2630        tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
2631        tty->pgrp = -1;
2632        tty->flip.char_buf_ptr = tty->flip.char_buf;
2633        tty->flip.flag_buf_ptr = tty->flip.flag_buf;
2634        INIT_WORK(&tty->flip.work, flush_to_ldisc, tty);
2635        init_MUTEX(&tty->flip.pty_sem);
2636        init_MUTEX(&tty->termios_sem);
2637        init_waitqueue_head(&tty->write_wait);
2638        init_waitqueue_head(&tty->read_wait);
2639        INIT_WORK(&tty->hangup_work, do_tty_hangup, tty);
2640        sema_init(&tty->atomic_read, 1);
2641        sema_init(&tty->atomic_write, 1);
2642        spin_lock_init(&tty->read_lock);
2643        INIT_LIST_HEAD(&tty->tty_files);
2644        INIT_WORK(&tty->SAK_work, NULL, NULL);
2645}
2646
2647/*
2648 * The default put_char routine if the driver did not define one.
2649 */
2650static void tty_default_put_char(struct tty_struct *tty, unsigned char ch)
2651{
2652        tty->driver->write(tty, &ch, 1);
2653}
2654
2655static struct class_simple *tty_class;
2656
2657/**
2658 * tty_register_device - register a tty device
2659 * @driver: the tty driver that describes the tty device
2660 * @index: the index in the tty driver for this tty device
2661 * @device: a struct device that is associated with this tty device.
2662 *      This field is optional, if there is no known struct device for this
2663 *      tty device it can be set to NULL safely.
2664 *
2665 * This call is required to be made to register an individual tty device if
2666 * the tty driver's flags have the TTY_DRIVER_NO_DEVFS bit set.  If that
2667 * bit is not set, this function should not be called.
2668 */
2669void tty_register_device(struct tty_driver *driver, unsigned index,
2670                         struct device *device)
2671{
2672        char name[64];
2673        dev_t dev = MKDEV(driver->major, driver->minor_start) + index;
2674
2675        if (index >= driver->num) {
2676                printk(KERN_ERR "Attempt to register invalid tty line number "
2677                       " (%d).\n", index);
2678                return;
2679        }
2680
2681        devfs_mk_cdev(dev, S_IFCHR | S_IRUSR | S_IWUSR,
2682                        "%s%d", driver->devfs_name, index + driver->name_base);
2683
2684        if (driver->type == TTY_DRIVER_TYPE_PTY)
2685                pty_line_name(driver, index, name);
2686        else
2687                tty_line_name(driver, index, name);
2688        class_simple_device_add(tty_class, dev, device, name);
2689}
2690
2691/**
2692 * tty_unregister_device - unregister a tty device
2693 * @driver: the tty driver that describes the tty device
2694 * @index: the index in the tty driver for this tty device
2695 *
2696 * If a tty device is registered with a call to tty_register_device() then
2697 * this function must be made when the tty device is gone.
2698 */
2699void tty_unregister_device(struct tty_driver *driver, unsigned index)
2700{
2701        devfs_remove("%s%d", driver->devfs_name, index + driver->name_base);
2702        class_simple_device_remove(MKDEV(driver->major, driver->minor_start) + index);
2703}
2704
2705EXPORT_SYMBOL(tty_register_device);
2706EXPORT_SYMBOL(tty_unregister_device);
2707
2708struct tty_driver *alloc_tty_driver(int lines)
2709{
2710        struct tty_driver *driver;
2711
2712        driver = kmalloc(sizeof(struct tty_driver), GFP_KERNEL);
2713        if (driver) {
2714                memset(driver, 0, sizeof(struct tty_driver));
2715                driver->magic = TTY_DRIVER_MAGIC;
2716                driver->num = lines;
2717                /* later we'll move allocation of tables here */
2718        }
2719        return driver;
2720}
2721
2722void put_tty_driver(struct tty_driver *driver)
2723{
2724        kfree(driver);
2725}
2726
2727void tty_set_operations(struct tty_driver *driver, struct tty_operations *op)
2728{
2729        driver->open = op->open;
2730        driver->close = op->close;
2731        driver->write = op->write;
2732        driver->put_char = op->put_char;
2733        driver->flush_chars = op->flush_chars;
2734        driver->write_room = op->write_room;
2735        driver->chars_in_buffer = op->chars_in_buffer;
2736        driver->ioctl = op->ioctl;
2737        driver->set_termios = op->set_termios;
2738        driver->throttle = op->throttle;
2739        driver->unthrottle = op->unthrottle;
2740        driver->stop = op->stop;
2741        driver->start = op->start;
2742        driver->hangup = op->hangup;
2743        driver->break_ctl = op->break_ctl;
2744        driver->flush_buffer = op->flush_buffer;
2745        driver->set_ldisc = op->set_ldisc;
2746        driver->wait_until_sent = op->wait_until_sent;
2747        driver->send_xchar = op->send_xchar;
2748        driver->read_proc = op->read_proc;
2749        driver->write_proc = op->write_proc;
2750        driver->tiocmget = op->tiocmget;
2751        driver->tiocmset = op->tiocmset;
2752}
2753
2754
2755EXPORT_SYMBOL(alloc_tty_driver);
2756EXPORT_SYMBOL(put_tty_driver);
2757EXPORT_SYMBOL(tty_set_operations);
2758
2759/*
2760 * Called by a tty driver to register itself.
2761 */
2762int tty_register_driver(struct tty_driver *driver)
2763{
2764        int error;
2765        int i;
2766        dev_t dev;
2767        void **p = NULL;
2768
2769        if (driver->flags & TTY_DRIVER_INSTALLED)
2770                return 0;
2771
2772        if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
2773                p = kmalloc(driver->num * 3 * sizeof(void *), GFP_KERNEL);
2774                if (!p)
2775                        return -ENOMEM;
2776                memset(p, 0, driver->num * 3 * sizeof(void *));
2777        }
2778
2779        if (!driver->major) {
2780                error = alloc_chrdev_region(&dev, driver->minor_start, driver->num,
2781                                                (char*)driver->name);
2782                if (!error) {
2783                        driver->major = MAJOR(dev);
2784                        driver->minor_start = MINOR(dev);
2785                }
2786        } else {
2787                dev = MKDEV(driver->major, driver->minor_start);
2788                error = register_chrdev_region(dev, driver->num,
2789                                                (char*)driver->name);
2790        }
2791        if (error < 0) {
2792                kfree(p);
2793                return error;
2794        }
2795
2796        if (p) {
2797                driver->ttys = (struct tty_struct **)p;
2798                driver->termios = (struct termios **)(p + driver->num);
2799                driver->termios_locked = (struct termios **)(p + driver->num * 2);
2800        } else {
2801                driver->ttys = NULL;
2802                driver->termios = NULL;
2803                driver->termios_locked = NULL;
2804        }
2805
2806        cdev_init(&driver->cdev, &tty_fops);
2807        driver->cdev.owner = driver->owner;
2808        error = cdev_add(&driver->cdev, dev, driver->num);
2809        if (error) {
2810                cdev_del(&driver->cdev);
2811                unregister_chrdev_region(dev, driver->num);
2812                driver->ttys = NULL;
2813                driver->termios = driver->termios_locked = NULL;
2814                kfree(p);
2815                return error;
2816        }
2817
2818        if (!driver->put_char)
2819                driver->put_char = tty_default_put_char;
2820        
2821        list_add(&driver->tty_drivers, &tty_drivers);
2822        
2823        if ( !(driver->flags & TTY_DRIVER_NO_DEVFS) ) {
2824                for(i = 0; i < driver->num; i++)
2825                    tty_register_device(driver, i, NULL);
2826        }
2827        proc_tty_register_driver(driver);
2828        return 0;
2829}
2830
2831EXPORT_SYMBOL(tty_register_driver);
2832
2833/*
2834 * Called by a tty driver to unregister itself.
2835 */
2836int tty_unregister_driver(struct tty_driver *driver)
2837{
2838        int i;
2839        struct termios *tp;
2840        void *p;
2841
2842        if (driver->refcount)
2843                return -EBUSY;
2844
2845        unregister_chrdev_region(MKDEV(driver->major, driver->minor_start),
2846                                driver->num);
2847
2848        list_del(&driver->tty_drivers);
2849
2850        /*
2851         * Free the termios and termios_locked structures because
2852         * we don't want to get memory leaks when modular tty
2853         * drivers are removed from the kernel.
2854         */
2855        for (i = 0; i < driver->num; i++) {
2856                tp = driver->termios[i];
2857                if (tp) {
2858                        driver->termios[i] = NULL;
2859                        kfree(tp);
2860                }
2861                tp = driver->termios_locked[i];
2862                if (tp) {
2863                        driver->termios_locked[i] = NULL;
2864                        kfree(tp);
2865                }
2866                if (!(driver->flags & TTY_DRIVER_NO_DEVFS))
2867                        tty_unregister_device(driver, i);
2868        }
2869        p = driver->ttys;
2870        proc_tty_unregister_driver(driver);
2871        driver->ttys = NULL;
2872        driver->termios = driver->termios_locked = NULL;
2873        kfree(p);
2874        cdev_del(&driver->cdev);
2875        return 0;
2876}
2877
2878EXPORT_SYMBOL(tty_unregister_driver);
2879
2880
2881/*
2882 * Initialize the console device. This is called *early*, so
2883 * we can't necessarily depend on lots of kernel help here.
2884 * Just do some early initializations, and do the complex setup
2885 * later.
2886 */
2887void __init console_init(void)
2888{
2889        initcall_t *call;
2890
2891        /* Setup the default TTY line discipline. */
2892        (void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);
2893
2894        /*
2895         * set up the console device so that later boot sequences can 
2896         * inform about problems etc..
2897         */
2898#ifdef CONFIG_EARLY_PRINTK
2899        disable_early_printk();
2900#endif
2901#ifdef CONFIG_SERIAL_68360
2902        /* This is not a console initcall. I know not what it's doing here.
2903           So I haven't moved it. dwmw2 */
2904        rs_360_init();
2905#endif
2906        call = &__con_initcall_start;
2907        while (call < &__con_initcall_end) {
2908                (*call)();
2909                call++;
2910        }
2911}
2912
2913#ifdef CONFIG_VT
2914extern int vty_init(void);
2915#endif
2916
2917static int __init tty_class_init(void)
2918{
2919        tty_class = class_simple_create(THIS_MODULE, "tty");
2920        if (IS_ERR(tty_class))
2921                return PTR_ERR(tty_class);
2922        return 0;
2923}
2924
2925postcore_initcall(tty_class_init);
2926
2927/* 3/2004 jmc: why do these devices exist? */
2928
2929static struct cdev tty_cdev, console_cdev;
2930#ifdef CONFIG_UNIX98_PTYS
2931static struct cdev ptmx_cdev;
2932#endif
2933#ifdef CONFIG_VT
2934static struct cdev vc0_cdev;
2935#endif
2936
2937/*
2938 * Ok, now we can initialize the rest of the tty devices and can count
2939 * on memory allocations, interrupts etc..
2940 */
2941static int __init tty_init(void)
2942{
2943        cdev_init(&tty_cdev, &tty_fops);
2944        if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) ||
2945            register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)
2946                panic("Couldn't register /dev/tty driver\n");
2947        devfs_mk_cdev(MKDEV(TTYAUX_MAJOR, 0), S_IFCHR|S_IRUGO|S_IWUGO, "tty");
2948        class_simple_device_add(tty_class, MKDEV(TTYAUX_MAJOR, 0), NULL, "tty");
2949
2950        cdev_init(&console_cdev, &console_fops);
2951        if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) ||
2952            register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)
2953                panic("Couldn't register /dev/console driver\n");
2954        devfs_mk_cdev(MKDEV(TTYAUX_MAJOR, 1), S_IFCHR|S_IRUSR|S_IWUSR, "console");
2955        class_simple_device_add(tty_class, MKDEV(TTYAUX_MAJOR, 1), NULL, "console");
2956
2957#ifdef CONFIG_UNIX98_PTYS
2958        cdev_init(&ptmx_cdev, &ptmx_fops);
2959        if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) ||
2960            register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0)
2961                panic("Couldn't register /dev/ptmx driver\n");
2962        devfs_mk_cdev(MKDEV(TTYAUX_MAJOR, 2), S_IFCHR|S_IRUGO|S_IWUGO, "ptmx");
2963        class_simple_device_add(tty_class, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx");
2964#endif
2965
2966#ifdef CONFIG_VT
2967        cdev_init(&vc0_cdev, &console_fops);
2968        if (cdev_add(&vc0_cdev, MKDEV(TTY_MAJOR, 0), 1) ||
2969            register_chrdev_region(MKDEV(TTY_MAJOR, 0), 1, "/dev/vc/0") < 0)
2970                panic("Couldn't register /dev/tty0 driver\n");
2971        devfs_mk_cdev(MKDEV(TTY_MAJOR, 0), S_IFCHR|S_IRUSR|S_IWUSR, "vc/0");
2972        class_simple_device_add(tty_class, MKDEV(TTY_MAJOR, 0), NULL, "tty0");
2973
2974        vty_init();
2975#endif
2976        return 0;
2977}
2978module_init(tty_init);
2979
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.