[BACK]Return to tty.h CVS log [TXT][DIR] Up to [local] / sys / sys

Annotation of sys/sys/tty.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: tty.h,v 1.22 2006/08/17 06:27:05 miod Exp $   */
                      2: /*     $NetBSD: tty.h,v 1.30.4.1 1996/06/02 09:08:13 mrg Exp $ */
                      3:
                      4: /*-
                      5:  * Copyright (c) 1982, 1986, 1993
                      6:  *     The Regents of the University of California.  All rights reserved.
                      7:  * (c) UNIX System Laboratories, Inc.
                      8:  * All or some portions of this file are derived from material licensed
                      9:  * to the University of California by American Telephone and Telegraph
                     10:  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
                     11:  * the permission of UNIX System Laboratories, Inc.
                     12:  *
                     13:  * Redistribution and use in source and binary forms, with or without
                     14:  * modification, are permitted provided that the following conditions
                     15:  * are met:
                     16:  * 1. Redistributions of source code must retain the above copyright
                     17:  *    notice, this list of conditions and the following disclaimer.
                     18:  * 2. Redistributions in binary form must reproduce the above copyright
                     19:  *    notice, this list of conditions and the following disclaimer in the
                     20:  *    documentation and/or other materials provided with the distribution.
                     21:  * 3. Neither the name of the University nor the names of its contributors
                     22:  *    may be used to endorse or promote products derived from this software
                     23:  *    without specific prior written permission.
                     24:  *
                     25:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     26:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     27:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     28:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     29:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     30:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     31:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     32:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     33:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     34:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     35:  * SUCH DAMAGE.
                     36:  *
                     37:  *     @(#)tty.h       8.6 (Berkeley) 1/21/94
                     38:  */
                     39:
                     40: #include <sys/termios.h>
                     41: #include <sys/queue.h>
                     42: #include <sys/selinfo.h>               /* For struct selinfo. */
                     43: #include <sys/timeout.h>
                     44:
                     45: #define KERN_TTY_TKNIN         1       /* quad: input chars */
                     46: #define KERN_TTY_TKNOUT                2       /* quad: output chars */
                     47: #define KERN_TTY_TKRAWCC       3       /* quad: input chars, raw mode */
                     48: #define KERN_TTY_TKCANCC       4       /* quad: input char, cooked mode */
                     49: #define KERN_TTY_INFO          5       /* struct: tty stats */
                     50: #define KERN_TTY_MAXPTYS       6       /* int: max ptys */
                     51: #define KERN_TTY_NPTYS         7       /* int: number of allocated ptys */
                     52: #define KERN_TTY_MAXID         8
                     53:
                     54: #define CTL_KERN_TTY_NAMES { \
                     55:        { 0, 0 }, \
                     56:        { "tk_nin", CTLTYPE_QUAD }, \
                     57:        { "tk_nout", CTLTYPE_QUAD }, \
                     58:        { "tk_rawcc", CTLTYPE_QUAD }, \
                     59:        { "tk_cancc", CTLTYPE_QUAD }, \
                     60:        { "ttyinfo", CTLTYPE_STRUCT }, \
                     61:        { "maxptys", CTLTYPE_INT }, \
                     62:        { "nptys", CTLTYPE_INT }, \
                     63: }
                     64:
                     65: /* ptmget, for /dev/ptm pty getting ioctl PTMGET */
                     66:
                     67: struct ptmget {
                     68:        int     cfd;
                     69:        int     sfd;
                     70:        char    cn[16];
                     71:        char    sn[16];
                     72: };
                     73: #define PTMGET _IOR('t', 1, struct ptmget) /* get ptys */
                     74: #define PATH_PTMDEV    "/dev/ptm"
                     75: #define TTY_GID                4       /* XXX evil hardcoding of tty gid */
                     76:
                     77: /*
                     78:  * Clists are actually ring buffers. The c_cc, c_cf, c_cl fields have
                     79:  * exactly the same behaviour as in true clists.
                     80:  * if c_cq is NULL, the ring buffer has no TTY_QUOTE functionality
                     81:  * (but, saves memory and cpu time)
                     82:  *
                     83:  * *DON'T* play with c_cs, c_ce, c_cq, or c_cl outside tty_subr.c!!!
                     84:  */
                     85: struct clist {
                     86:        int     c_cc;           /* count of characters in queue */
                     87:        int     c_cn;           /* total ring buffer length */
                     88:        u_char  *c_cf;          /* points to first character */
                     89:        u_char  *c_cl;          /* points to next open character */
                     90:        u_char  *c_cs;          /* start of ring buffer */
                     91:        u_char  *c_ce;          /* c_ce + c_len */
                     92:        u_char  *c_cq;          /* N bits/bytes long, see tty_subr.c */
                     93: };
                     94:
                     95: /*
                     96:  * Per-tty structure.
                     97:  *
                     98:  * Should be split in two, into device and tty drivers.
                     99:  * Glue could be masks of what to echo and circular buffer
                    100:  * (low, high, timeout).
                    101:  */
                    102: struct tty {
                    103:        TAILQ_ENTRY(tty) tty_link;      /* Link in global tty list. */
                    104:        struct  clist t_rawq;           /* Device raw input queue. */
                    105:        long    t_rawcc;                /* Raw input queue statistics. */
                    106:        struct  clist t_canq;           /* Device canonical queue. */
                    107:        long    t_cancc;                /* Canonical queue statistics. */
                    108:        struct  clist t_outq;           /* Device output queue. */
                    109:        long    t_outcc;                /* Output queue statistics. */
                    110:        u_char  t_line;                 /* Interface to device drivers. */
                    111:        dev_t   t_dev;                  /* Device. */
                    112:        int     t_state;                /* Device and driver (TS*) state. */
                    113:        int     t_flags;                /* Tty flags. */
                    114:        struct  pgrp *t_pgrp;           /* Foreground process group. */
                    115:        struct  session *t_session;     /* Enclosing session. */
                    116:        struct  selinfo t_rsel;         /* Tty read/oob select. */
                    117:        struct  selinfo t_wsel;         /* Tty write select. */
                    118:        struct  termios t_termios;      /* Termios state. */
                    119:        struct  winsize t_winsize;      /* Window size. */
                    120:                                        /* Start output. */
                    121:        void    (*t_oproc)(struct tty *);
                    122:                                        /* Set hardware state. */
                    123:        int     (*t_param)(struct tty *, struct termios *);
                    124:                                        /* Set hardware flow control. */
                    125:        int     (*t_hwiflow)(struct tty *tp, int flag);
                    126:        void    *t_sc;                  /* XXX: net/if_sl.c:sl_softc. */
                    127:        short   t_column;               /* Tty output column. */
                    128:        short   t_rocount, t_rocol;     /* Tty. */
                    129:        short   t_hiwat;                /* High water mark. */
                    130:        short   t_lowat;                /* Low water mark. */
                    131:        short   t_gen;                  /* Generation number. */
                    132:        struct timeout t_rstrt_to;      /* restart timeout */
                    133:        struct timeval t_tv;            /* timestamp */
                    134: };
                    135:
                    136: /*
                    137:  * Small version of struct tty exported via sysctl KERN_TTY_INFO
                    138:  */
                    139: struct itty {
                    140:        dev_t   t_dev;
                    141:        int t_rawq_c_cc;
                    142:        int t_canq_c_cc;
                    143:        int t_outq_c_cc;
                    144:        short t_hiwat;
                    145:        short t_lowat;
                    146:        short t_column;
                    147:        int t_state;
                    148:        struct session *t_session;
                    149:        pid_t t_pgrp_pg_id;
                    150:        u_char t_line;
                    151: };
                    152:
                    153: #define        t_cc            t_termios.c_cc
                    154: #define        t_cflag         t_termios.c_cflag
                    155: #define        t_iflag         t_termios.c_iflag
                    156: #define        t_ispeed        t_termios.c_ispeed
                    157: #define        t_lflag         t_termios.c_lflag
                    158: #define        t_min           t_termios.c_min
                    159: #define        t_oflag         t_termios.c_oflag
                    160: #define        t_ospeed        t_termios.c_ospeed
                    161: #define        t_time          t_termios.c_time
                    162:
                    163: #define        TTIPRI  25                      /* Sleep priority for tty reads. */
                    164: #define        TTOPRI  26                      /* Sleep priority for tty writes. */
                    165:
                    166: #define        TTMASK  15
                    167: #define        OBUFSIZ 512
                    168: #define        TTYHOG  1024
                    169:
                    170: #ifdef _KERNEL
                    171: #define        TTMAXHIWAT      roundup(2048, CBSIZE)
                    172: #define        TTMINHIWAT      roundup(100, CBSIZE)
                    173: #define        TTMAXLOWAT      256
                    174: #define        TTMINLOWAT      32
                    175: #endif
                    176:
                    177: /* These flags are kept in t_state. */
                    178: #define        TS_ASLEEP       0x00001         /* Process waiting for tty. */
                    179: #define        TS_ASYNC        0x00002         /* Tty in async I/O mode. */
                    180: #define        TS_BUSY         0x00004         /* Draining output. */
                    181: #define        TS_CARR_ON      0x00008         /* Carrier is present. */
                    182: #define        TS_FLUSH        0x00010         /* Outq has been flushed during DMA. */
                    183: #define        TS_ISOPEN       0x00020         /* Open has completed. */
                    184: #define        TS_TBLOCK       0x00040         /* Further input blocked. */
                    185: #define        TS_TIMEOUT      0x00080         /* Wait for output char processing. */
                    186: #define        TS_TTSTOP       0x00100         /* Output paused. */
                    187: #define        TS_WOPEN        0x00200         /* Open in progress. */
                    188: #define        TS_XCLUDE       0x00400         /* Tty requires exclusivity. */
                    189:
                    190: /* State for intra-line fancy editing work. */
                    191: #define        TS_BKSL         0x00800         /* State for lowercase \ work. */
                    192: #define        TS_CNTTB        0x01000         /* Counting tab width, ignore FLUSHO. */
                    193: #define        TS_ERASE        0x02000         /* Within a \.../ for PRTRUB. */
                    194: #define        TS_LNCH         0x04000         /* Next character is literal. */
                    195: #define        TS_TYPEN        0x08000         /* Retyping suspended input (PENDIN). */
                    196: #define        TS_LOCAL        (TS_BKSL | TS_CNTTB | TS_ERASE | TS_LNCH | TS_TYPEN)
                    197:
                    198: #define TS_TSTAMPDCDSET        0x10000         /* update timestamp on DCD set */
                    199: #define TS_TSTAMPDCDCLR        0x20000         /* update timestamp on DCD clr */
                    200: #define TS_TSTAMPCTSSET        0x40000         /* update timestamp on CTS set */
                    201: #define TS_TSTAMPCTSCLR        0x80000         /* update timestamp on CTS clr */
                    202:
                    203: /* Character type information. */
                    204: #define        ORDINARY        0
                    205: #define        CONTROL         1
                    206: #define        BACKSPACE       2
                    207: #define        NEWLINE         3
                    208: #define        TAB             4
                    209: #define        VTAB            5
                    210: #define        RETURN          6
                    211:
                    212: struct speedtab {
                    213:        int sp_speed;                   /* Speed. */
                    214:        int sp_code;                    /* Code. */
                    215: };
                    216:
                    217: /* Modem control commands (driver). */
                    218: #define        DMSET           0
                    219: #define        DMBIS           1
                    220: #define        DMBIC           2
                    221: #define        DMGET           3
                    222:
                    223: /* Flags on a character passed to ttyinput. */
                    224: #define        TTY_CHARMASK    0x000000ff      /* Character mask */
                    225: #define        TTY_QUOTE       0x00000100      /* Character quoted */
                    226: #define        TTY_ERRORMASK   0xff000000      /* Error mask */
                    227: #define        TTY_FE          0x01000000      /* Framing error or BREAK condition */
                    228: #define        TTY_PE          0x02000000      /* Parity error */
                    229:
                    230: /* Is tp controlling terminal for p? */
                    231: #define        isctty(p, tp)                                                   \
                    232:        ((p)->p_session == (tp)->t_session && (p)->p_flag & P_CONTROLT)
                    233:
                    234: /* Is p in background of tp? */
                    235: #define        isbackground(p, tp)                                             \
                    236:        (isctty((p), (tp)) && (p)->p_pgrp != (tp)->t_pgrp)
                    237:
                    238: /*
                    239:  * ttylist_head is defined here so that user-land has access to it.
                    240:  */
                    241: TAILQ_HEAD(ttylist_head, tty);         /* the ttylist is a TAILQ */
                    242:
                    243: #ifdef _KERNEL
                    244:
                    245: extern int tty_count;                  /* number of ttys in global ttylist */
                    246: extern struct ttychars ttydefaults;
                    247:
                    248: /* Symbolic sleep message strings. */
                    249: extern  char ttyin[], ttyout[], ttopen[], ttclos[], ttybg[], ttybuf[];
                    250:
                    251: int    sysctl_tty(int *, u_int, void *, size_t *, void *, size_t);
                    252: int    sysctl_pty(int *, u_int, void *, size_t *, void *, size_t);
                    253:
                    254: int     b_to_q(u_char *cp, int cc, struct clist *q);
                    255: void    catq(struct clist *from, struct clist *to);
                    256: void    clist_init(void);
                    257: int     getc(struct clist *q);
                    258: void    ndflush(struct clist *q, int cc);
                    259: int     ndqb(struct clist *q, int flag);
                    260: u_char *nextc(struct clist *q, u_char *cp, int *c);
                    261: int     putc(int c, struct clist *q);
                    262: int     q_to_b(struct clist *q, u_char *cp, int cc);
                    263: int     unputc(struct clist *q);
                    264:
                    265: int     nullmodem(struct tty *tp, int flag);
                    266: int     tputchar(int c, struct tty *tp);
                    267: int     ttioctl(struct tty *tp, u_long com, caddr_t data, int flag,
                    268:            struct proc *p);
                    269: int     ttread(struct tty *tp, struct uio *uio, int flag);
                    270: void    ttrstrt(void *tp);
                    271: int     ttpoll(dev_t device, int events, struct proc *p);
                    272: int     ttkqfilter(dev_t dev, struct knote *kn);
                    273: void    ttsetwater(struct tty *tp);
                    274: int     ttspeedtab(int speed, const struct speedtab *table);
                    275: int     ttstart(struct tty *tp);
                    276: void    ttwakeup(struct tty *tp);
                    277: int     ttwrite(struct tty *tp, struct uio *uio, int flag);
                    278: void    ttychars(struct tty *tp);
                    279: int     ttycheckoutq(struct tty *tp, int wait);
                    280: int     ttyclose(struct tty *tp);
                    281: void    ttyflush(struct tty *tp, int rw);
                    282: void    ttyinfo(struct tty *tp);
                    283: int     ttyinput(int c, struct tty *tp);
                    284: int     ttylclose(struct tty *tp, int flag);
                    285: int     ttymodem(struct tty *tp, int flag);
                    286: int     ttyopen(dev_t device, struct tty *tp);
                    287: int     ttyoutput(int c, struct tty *tp);
                    288: void    ttypend(struct tty *tp);
                    289: void    ttyretype(struct tty *tp);
                    290: void    ttyrub(int c, struct tty *tp);
                    291: int     ttysleep(struct tty *tp,
                    292:            void *chan, int pri, char *wmesg, int timeout);
                    293: int     ttywait(struct tty *tp);
                    294: int     ttywflush(struct tty *tp);
                    295: void    ttytstamp(struct tty *tp, int octs, int ncts, int odcd, int ndcd);
                    296:
                    297: void   tty_init(void);
                    298: struct tty *ttymalloc(void);
                    299: void    ttyfree(struct tty *);
                    300: u_char *firstc(struct clist *clp, int *c);
                    301:
                    302: int    cttyopen(dev_t, int, int, struct proc *);
                    303: int    cttyread(dev_t, struct uio *, int);
                    304: int    cttywrite(dev_t, struct uio *, int);
                    305: int    cttyioctl(dev_t, u_long, caddr_t, int, struct proc *);
                    306: int    cttypoll(dev_t, int, struct proc *);
                    307:
                    308: int    clalloc(struct clist *, int, int);
                    309: void   clfree(struct clist *);
                    310:
                    311: #if defined(COMPAT_43) || defined(COMPAT_SUNOS) || defined(COMPAT_SVR4) || \
                    312:     defined(COMPAT_FREEBSD) || defined(COMPAT_OSF1)
                    313: # define COMPAT_OLDTTY
                    314: int    ttcompat(struct tty *, u_long, caddr_t, int, struct proc *);
                    315: #endif
                    316:
                    317: #endif

CVSweb