home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 4 / hacker04 / 04_HACK04.ISO / darwin / darwinx86.iso / usr / include / sys / tty.h < prev    next >
Encoding:
C/C++ Source or Header  |  2001-09-30  |  12.7 KB  |  340 lines

  1. /*
  2.  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
  3.  *
  4.  * @APPLE_LICENSE_HEADER_START@
  5.  * 
  6.  * The contents of this file constitute Original Code as defined in and
  7.  * are subject to the Apple Public Source License Version 1.1 (the
  8.  * "License").  You may not use this file except in compliance with the
  9.  * License.  Please obtain a copy of the License at
  10.  * http://www.apple.com/publicsource and read it before using this file.
  11.  * 
  12.  * This Original Code and all software distributed under the License are
  13.  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  14.  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  15.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
  16.  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
  17.  * License for the specific language governing rights and limitations
  18.  * under the License.
  19.  * 
  20.  * @APPLE_LICENSE_HEADER_END@
  21.  */
  22. /* Copyright (c) 1997 Apple Computer, Inc. All Rights Reserved */
  23. /*-
  24.  * Copyright (c) 1982, 1986, 1993
  25.  *    The Regents of the University of California.  All rights reserved.
  26.  * (c) UNIX System Laboratories, Inc.
  27.  * All or some portions of this file are derived from material licensed
  28.  * to the University of California by American Telephone and Telegraph
  29.  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
  30.  * the permission of UNIX System Laboratories, Inc.
  31.  *
  32.  * Redistribution and use in source and binary forms, with or without
  33.  * modification, are permitted provided that the following conditions
  34.  * are met:
  35.  * 1. Redistributions of source code must retain the above copyright
  36.  *    notice, this list of conditions and the following disclaimer.
  37.  * 2. Redistributions in binary form must reproduce the above copyright
  38.  *    notice, this list of conditions and the following disclaimer in the
  39.  *    documentation and/or other materials provided with the distribution.
  40.  * 3. All advertising materials mentioning features or use of this software
  41.  *    must display the following acknowledgement:
  42.  *      This product includes software developed by the University of
  43.  *      California, Berkeley and its contributors.
  44.  * 4. Neither the name of the University nor the names of its contributors
  45.  *    may be used to endorse or promote products derived from this software
  46.  *    without specific prior written permission.
  47.  *
  48.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  49.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  50.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  51.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  52.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  53.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  54.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  55.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  56.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  57.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  58.  * SUCH DAMAGE.
  59.  *
  60.  *    @(#)tty.h    8.6 (Berkeley) 1/21/94
  61.  */
  62.  
  63. #ifndef _SYS_TTY_H_
  64. #define    _SYS_TTY_H_
  65.  
  66. #include <sys/cdefs.h>
  67.  
  68. #include <sys/termios.h>
  69. #include <sys/select.h>        /* For struct selinfo. */
  70.  
  71. #ifndef __APPLE__
  72. /*
  73.  * Clists are character lists, which is a variable length linked list
  74.  * of cblocks, with a count of the number of characters in the list.
  75.  */
  76. struct clist {
  77.     int    c_cc;        /* Number of characters in the clist. */
  78.     int    c_cbcount;    /* Number of cblocks. */
  79.     int    c_cbmax;    /* Max # cblocks allowed for this clist. */
  80.     int    c_cbreserved;    /* # cblocks reserved for this clist. */
  81.     char    *c_cf;        /* Pointer to the first cblock. */
  82.     char    *c_cl;        /* Pointer to the last cblock. */
  83. };
  84. #else /* __APPLE__ */
  85. /*
  86.  * NetBSD Clists are actually ring buffers. The c_cc, c_cf, c_cl fields have
  87.  * exactly the same behaviour as in true clists.
  88.  * if c_cq is NULL, the ring buffer has no TTY_QUOTE functionality
  89.  * (but, saves memory and cpu time)
  90.  * 
  91.  * *DON'T* play with c_cs, c_ce, c_cq, or c_cl outside tty_subr.c!!!
  92.  */
  93. struct clist {
  94.     int    c_cc;        /* count of characters in queue */
  95.     int    c_cn;        /* total ring buffer length */
  96.     u_char    *c_cf;        /* points to first character */
  97.     u_char    *c_cl;        /* points to next open character */
  98.     u_char    *c_cs;        /* start of ring buffer */
  99.     u_char    *c_ce;        /* c_ce + c_len */
  100.     u_char    *c_cq;        /* N bits/bytes long, see tty_subr.c */
  101. };
  102.  
  103. #ifndef TTYCLSIZE
  104. #define TTYCLSIZE 1024
  105. #endif
  106.  
  107. #endif /* __APPLE__ */
  108.  
  109. /*
  110.  * Per-tty structure.
  111.  *
  112.  * Should be split in two, into device and tty drivers.
  113.  * Glue could be masks of what to echo and circular buffer
  114.  * (low, high, timeout).
  115.  */
  116. struct tty {
  117.     struct    clist t_rawq;        /* Device raw input queue. */
  118.     long    t_rawcc;        /* Raw input queue statistics. */
  119.     struct    clist t_canq;        /* Device canonical queue. */
  120.     long    t_cancc;        /* Canonical queue statistics. */
  121.     struct    clist t_outq;        /* Device output queue. */
  122.     long    t_outcc;        /* Output queue statistics. */
  123.     int    t_line;            /* Interface to device drivers. */
  124.     dev_t    t_dev;            /* Device. */
  125.     int    t_state;        /* Device and driver (TS*) state. */
  126.     int    t_flags;        /* Tty flags. */
  127.     int     t_timeout;              /* Timeout for ttywait() */
  128.     struct    pgrp *t_pgrp;        /* Foreground process group. */
  129.     struct    session *t_session;    /* Enclosing session. */
  130.     struct    selinfo t_rsel;        /* Tty read/oob select. */
  131.     struct    selinfo t_wsel;        /* Tty write select. */
  132.     struct    termios t_termios;    /* Termios state. */
  133.     struct    winsize t_winsize;    /* Window size. */
  134.                     /* Start output. */
  135.     void    (*t_oproc) __P((struct tty *));
  136.                     /* Stop output. */
  137.     void    (*t_stop) __P((struct tty *, int));
  138.                     /* Set hardware state. */
  139.     int    (*t_param) __P((struct tty *, struct termios *));
  140.     void    *t_sc;            /* XXX: net/if_sl.c:sl_softc. */
  141.     int    t_column;        /* Tty output column. */
  142.     int    t_rocount, t_rocol;    /* Tty. */
  143.     int    t_hiwat;        /* High water mark. */
  144.     int    t_lowat;        /* Low water mark. */
  145.     int    t_gen;            /* Generation number. */
  146. };
  147.  
  148. #define    t_cc        t_termios.c_cc
  149. #define    t_cflag        t_termios.c_cflag
  150. #define    t_iflag        t_termios.c_iflag
  151. #define    t_ispeed    t_termios.c_ispeed
  152. #define    t_lflag        t_termios.c_lflag
  153. #define    t_min        t_termios.c_min
  154. #define    t_oflag        t_termios.c_oflag
  155. #define    t_ospeed    t_termios.c_ospeed
  156. #define    t_time        t_termios.c_time
  157.  
  158. #define    TTIPRI    25            /* Sleep priority for tty reads. */
  159. #define    TTOPRI    26            /* Sleep priority for tty writes. */
  160.  
  161. /*
  162.  * User data unfortunately has to be copied through buffers on the way to
  163.  * and from clists.  The buffers are on the stack so their sizes must be
  164.  * fairly small.
  165.  */
  166. #define    IBUFSIZ    384            /* Should be >= max value of MIN. */
  167. #define    OBUFSIZ    100
  168.  
  169. #ifndef TTYHOG
  170. #define    TTYHOG    1024
  171. #endif
  172.  
  173. #ifdef KERNEL
  174. #define    TTMAXHIWAT    roundup(2048, CBSIZE)
  175. #define    TTMINHIWAT    roundup(100, CBSIZE)
  176. #define    TTMAXLOWAT    256
  177. #define    TTMINLOWAT    32
  178. #endif /* KERNEL */
  179.  
  180. /* These flags are kept in t_state. */
  181. #define    TS_SO_OLOWAT    0x00001        /* Wake up when output <= low water. */
  182. #define    TS_ASYNC    0x00002        /* Tty in async I/O mode. */
  183. #define    TS_BUSY        0x00004        /* Draining output. */
  184. #define    TS_CARR_ON    0x00008        /* Carrier is present. */
  185. #define    TS_FLUSH    0x00010        /* Outq has been flushed during DMA. */
  186. #define    TS_ISOPEN    0x00020        /* Open has completed. */
  187. #define    TS_TBLOCK    0x00040        /* Further input blocked. */
  188. #define    TS_TIMEOUT    0x00080        /* Wait for output char processing. */
  189. #define    TS_TTSTOP    0x00100        /* Output paused. */
  190. #ifdef notyet
  191. #define    TS_WOPEN    0x00200        /* Open in progress. */
  192. #endif
  193. #define    TS_XCLUDE    0x00400        /* Tty requires exclusivity. */
  194.  
  195. /* State for intra-line fancy editing work. */
  196. #define    TS_BKSL        0x00800        /* State for lowercase \ work. */
  197. #define    TS_CNTTB    0x01000        /* Counting tab width, ignore FLUSHO. */
  198. #define    TS_ERASE    0x02000        /* Within a \.../ for PRTRUB. */
  199. #define    TS_LNCH        0x04000        /* Next character is literal. */
  200. #define    TS_TYPEN    0x08000        /* Retyping suspended input (PENDIN). */
  201. #define    TS_LOCAL    (TS_BKSL | TS_CNTTB | TS_ERASE | TS_LNCH | TS_TYPEN)
  202.  
  203. /* Extras. */
  204. #define    TS_CAN_BYPASS_L_RINT 0x010000    /* Device in "raw" mode. */
  205. #define    TS_CONNECTED    0x020000    /* Connection open. */
  206. #define    TS_SNOOP    0x040000    /* Device is being snooped on. */
  207. #define    TS_SO_OCOMPLETE    0x080000    /* Wake up when output completes. */
  208. #define    TS_ZOMBIE    0x100000    /* Connection lost. */
  209.  
  210. /* Hardware flow-control-invoked bits. */
  211. #define    TS_CAR_OFLOW    0x200000    /* For MDMBUF (XXX handle in driver). */
  212. #ifdef notyet
  213. #define    TS_CTS_OFLOW    0x400000    /* For CCTS_OFLOW. */
  214. #define    TS_DSR_OFLOW    0x800000    /* For CDSR_OFLOW. */
  215. #endif
  216.  
  217. /* Character type information. */
  218. #define    ORDINARY    0
  219. #define    CONTROL        1
  220. #define    BACKSPACE    2
  221. #define    NEWLINE        3
  222. #define    TAB        4
  223. #define    VTAB        5
  224. #define    RETURN        6
  225.  
  226. struct speedtab {
  227.     int sp_speed;            /* Speed. */
  228.     int sp_code;            /* Code. */
  229. };
  230.  
  231. /* Modem control commands (driver). */
  232. #define    DMSET        0
  233. #define    DMBIS        1
  234. #define    DMBIC        2
  235. #define    DMGET        3
  236.  
  237. /* Flags on a character passed to ttyinput. */
  238. #define    TTY_CHARMASK    0x000000ff    /* Character mask */
  239. #define    TTY_QUOTE    0x00000100    /* Character quoted */
  240. #define    TTY_ERRORMASK    0xff000000    /* Error mask */
  241. #define    TTY_FE        0x01000000    /* Framing error */
  242. #define    TTY_PE        0x02000000    /* Parity error */
  243. #define    TTY_OE        0x04000000    /* Overrun error */
  244. #define    TTY_BI        0x08000000    /* Break condition */
  245.  
  246. /* Is tp controlling terminal for p? */
  247. #define    isctty(p, tp)                            \
  248.     ((p)->p_session == (tp)->t_session && (p)->p_flag & P_CONTROLT)
  249.  
  250. /* Is p in background of tp? */
  251. #define    isbackground(p, tp)                        \
  252.     (isctty((p), (tp)) && (p)->p_pgrp != (tp)->t_pgrp)
  253.  
  254. /* Unique sleep addresses. */
  255. #define    TSA_CARR_ON(tp)        ((void *)&(tp)->t_rawq)
  256. #define    TSA_HUP_OR_INPUT(tp)    ((void *)&(tp)->t_rawq.c_cf)
  257. #define    TSA_OCOMPLETE(tp)    ((void *)&(tp)->t_outq.c_cl)
  258. #define    TSA_OLOWAT(tp)        ((void *)&(tp)->t_outq)
  259. #define    TSA_PTC_READ(tp)    ((void *)&(tp)->t_outq.c_cf)
  260. #define    TSA_PTC_WRITE(tp)    ((void *)&(tp)->t_rawq.c_cl)
  261. #define    TSA_PTS_READ(tp)    ((void *)&(tp)->t_canq)
  262.  
  263. #ifdef KERNEL
  264. __BEGIN_DECLS
  265.  
  266. #ifndef __APPLE__
  267. extern    struct tty *constty;    /* Temporary virtual console. */
  268.  
  269. int     b_to_q __P((char *cp, int cc, struct clist *q));
  270. void     catq __P((struct clist *from, struct clist *to));
  271. void     clist_alloc_cblocks __P((struct clist *q, int ccmax, int ccres));
  272. void     clist_free_cblocks __P((struct clist *q));
  273. /* void     clist_init __P((void)); */ /* defined in systm.h for main() */
  274. int     getc __P((struct clist *q));
  275. void     ndflush __P((struct clist *q, int cc));
  276. int     ndqb __P((struct clist *q, int flag));
  277. char    *nextc __P((struct clist *q, char *cp, int *c));
  278. int     putc __P((int c, struct clist *q));
  279. int     q_to_b __P((struct clist *q, char *cp, int cc));
  280. int     unputc __P((struct clist *q));
  281.  
  282. int    ttcompat __P((struct tty *tp, int com, caddr_t data, int flag));
  283. int     ttsetcompat __P((struct tty *tp, int *com, caddr_t data, struct termios *term));
  284. #else /* __APPLE__ */
  285. int     b_to_q __P((u_char *cp, int cc, struct clist *q));
  286. void     catq __P((struct clist *from, struct clist *to));
  287. void     clist_init __P((void));
  288. int     getc __P((struct clist *q));
  289. void     ndflush __P((struct clist *q, int cc));
  290. int     ndqb __P((struct clist *q, int flag));
  291. u_char    *firstc           __P((struct clist *clp, int *c));
  292. u_char    *nextc __P((struct clist *q, u_char *cp, int *c));
  293. int     putc __P((int c, struct clist *q));
  294. int     q_to_b __P((struct clist *q, u_char *cp, int cc));
  295. int     unputc __P((struct clist *q));
  296. int     clalloc __P((struct clist *clp, int size, int quot));
  297. void     clfree __P((struct clist *clp));
  298.  
  299. #endif /* __APPLE__ */
  300.  
  301. void     termioschars __P((struct termios *t));
  302. int     tputchar __P((int c, struct tty *tp));
  303. #ifndef __APPLE__
  304. int     ttioctl __P((struct tty *tp, int com, void *data, int flag));
  305. #else
  306. int     ttioctl __P((struct tty *tp, u_long com, caddr_t data, int flag,
  307.         struct proc *p));
  308. #endif
  309. int     ttread __P((struct tty *tp, struct uio *uio, int flag));
  310. void     ttrstrt __P((void *tp));
  311. int     ttyselect __P((struct tty *tp, int rw, void * wql, struct proc *p));
  312. int     ttselect __P((dev_t dev, int rw, void * wql, struct proc *p));
  313. void     ttsetwater __P((struct tty *tp));
  314. int     ttspeedtab __P((int speed, struct speedtab *table));
  315. int     ttstart __P((struct tty *tp));
  316. void     ttwakeup __P((struct tty *tp));
  317. int     ttwrite __P((struct tty *tp, struct uio *uio, int flag));
  318. void     ttwwakeup __P((struct tty *tp));
  319. void     ttyblock __P((struct tty *tp));
  320. void     ttychars __P((struct tty *tp));
  321. int     ttycheckoutq __P((struct tty *tp, int wait));
  322. int     ttyclose __P((struct tty *tp));
  323. void     ttyflush __P((struct tty *tp, int rw));
  324. void     ttyinfo __P((struct tty *tp));
  325. int     ttyinput __P((int c, struct tty *tp));
  326. int     ttylclose __P((struct tty *tp, int flag));
  327. int     ttymodem __P((struct tty *tp, int flag));
  328. int     ttyopen __P((dev_t device, struct tty *tp));
  329. int     ttysleep __P((struct tty *tp,
  330.         void *chan, int pri, char *wmesg, int timeout));
  331. int     ttywait __P((struct tty *tp));
  332. struct tty *ttymalloc __P((void));
  333. void     ttyfree __P((struct tty *));
  334.  
  335. __END_DECLS
  336.  
  337. #endif /* KERNEL */
  338.  
  339. #endif /* !_SYS_TTY_H_ */
  340.