tty.h revision 130261
1/*- 2 * Copyright (c) 1982, 1986, 1993 3 * The Regents of the University of California. All rights reserved. 4 * (c) UNIX System Laboratories, Inc. 5 * All or some portions of this file are derived from material licensed 6 * to the University of California by American Telephone and Telegraph 7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with 8 * the permission of UNIX System Laboratories, Inc. 9 * 10 * Copyright (c) 2002 Networks Associates Technologies, Inc. 11 * All rights reserved. 12 * 13 * Portions of this software were developed for the FreeBSD Project by 14 * ThinkSec AS and NAI Labs, the Security Research Division of Network 15 * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 16 * ("CBOSS"), as part of the DARPA CHATS research program. 17 * 18 * Redistribution and use in source and binary forms, with or without 19 * modification, are permitted provided that the following conditions 20 * are met: 21 * 1. Redistributions of source code must retain the above copyright 22 * notice, this list of conditions and the following disclaimer. 23 * 2. Redistributions in binary form must reproduce the above copyright 24 * notice, this list of conditions and the following disclaimer in the 25 * documentation and/or other materials provided with the distribution. 26 * 4. Neither the name of the University nor the names of its contributors 27 * may be used to endorse or promote products derived from this software 28 * without specific prior written permission. 29 * 30 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 31 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 32 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 33 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 34 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 35 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 36 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 37 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 38 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 39 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 40 * SUCH DAMAGE. 41 * 42 * @(#)tty.h 8.6 (Berkeley) 1/21/94 43 * $FreeBSD: head/sys/sys/tty.h 130261 2004-06-09 09:41:30Z phk $ 44 */ 45 46#ifndef _SYS_TTY_H_ 47#define _SYS_TTY_H_ 48 49#include <sys/termios.h> 50#include <sys/queue.h> 51#include <sys/selinfo.h> 52#include <sys/_lock.h> 53#include <sys/_mutex.h> 54 55/* 56 * Clists are character lists, which is a variable length linked list 57 * of cblocks, with a count of the number of characters in the list. 58 */ 59struct clist { 60 int c_cc; /* Number of characters in the clist. */ 61 int c_cbcount; /* Number of cblocks. */ 62 int c_cbmax; /* Max # cblocks allowed for this clist. */ 63 int c_cbreserved; /* # cblocks reserved for this clist. */ 64 char *c_cf; /* Pointer to the first cblock. */ 65 char *c_cl; /* Pointer to the last cblock. */ 66}; 67 68/* 69 * Per-tty structure. 70 * 71 * Should be split in two, into device and tty drivers. 72 * Glue could be masks of what to echo and circular buffer 73 * (low, high, timeout). 74 */ 75struct tty { 76 struct clist t_rawq; /* Device raw input queue. */ 77 long t_rawcc; /* Raw input queue statistics. */ 78 struct clist t_canq; /* Device canonical queue. */ 79 long t_cancc; /* Canonical queue statistics. */ 80 struct clist t_outq; /* Device output queue. */ 81 long t_outcc; /* Output queue statistics. */ 82 int t_line; /* Interface to device drivers. */ 83 union { 84 dev_t t_kdev; /* Device. */ 85 udev_t t_udev; /* Userland (sysctl) instance. */ 86 void *t_devp; /* Keep user/kernel size in sync. */ 87 } ttyu; 88 int t_state; /* Device and driver (TS*) state. */ 89 int t_flags; /* Tty flags. */ 90 int t_timeout; /* Timeout for ttywait() */ 91 struct pgrp *t_pgrp; /* Foreground process group. */ 92 struct session *t_session; /* Enclosing session. */ 93 struct sigio *t_sigio; /* Information for async I/O. */ 94 struct selinfo t_rsel; /* Tty read/oob select. */ 95 struct selinfo t_wsel; /* Tty write select. */ 96 struct termios t_termios; /* Termios state. */ 97 struct winsize t_winsize; /* Window size. */ 98 /* Start output. */ 99 void (*t_oproc)(struct tty *); 100 /* Stop output. */ 101 void (*t_stop)(struct tty *, int); 102 /* Set hardware state. */ 103 int (*t_param)(struct tty *, struct termios *); 104 void *t_sc; /* XXX: net/if_sl.c:sl_softc. */ 105 int t_column; /* Tty output column. */ 106 int t_rocount, t_rocol; /* Tty. */ 107 int t_ififosize; /* Total size of upstream fifos. */ 108 int t_ihiwat; /* High water mark for input. */ 109 int t_ilowat; /* Low water mark for input. */ 110 speed_t t_ispeedwat; /* t_ispeed override for watermarks. */ 111 int t_ohiwat; /* High water mark for output. */ 112 int t_olowat; /* Low water mark for output. */ 113 speed_t t_ospeedwat; /* t_ospeed override for watermarks. */ 114 int t_gen; /* Generation number. */ 115 TAILQ_ENTRY(tty) t_list; /* Global chain of ttys for pstat(8) */ 116 117 struct mtx t_mtx; 118 int t_refcnt; 119}; 120 121#define t_cc t_termios.c_cc 122#define t_cflag t_termios.c_cflag 123#define t_dev ttyu.t_kdev 124#define t_iflag t_termios.c_iflag 125#define t_ispeed t_termios.c_ispeed 126#define t_lflag t_termios.c_lflag 127#define t_min t_termios.c_min 128#define t_oflag t_termios.c_oflag 129#define t_ospeed t_termios.c_ospeed 130#define t_time t_termios.c_time 131 132#define TTIPRI (PSOCK + 1) /* Sleep priority for tty reads. */ 133#define TTOPRI (PSOCK + 2) /* Sleep priority for tty writes. */ 134 135/* 136 * Userland version of struct tty, for sysctl. 137 */ 138struct xtty { 139 size_t xt_size; /* Structure size. */ 140 long xt_rawcc; /* Raw input queue statistics. */ 141 long xt_cancc; /* Canonical queue statistics. */ 142 long xt_outcc; /* Output queue statistics. */ 143 int xt_line; /* Interface to device drivers. */ 144 udev_t xt_dev; /* Userland (sysctl) instance. */ 145 int xt_state; /* Device and driver (TS*) state. */ 146 int xt_flags; /* Tty flags. */ 147 int xt_timeout; /* Timeout for ttywait(). */ 148 pid_t xt_pgid; /* Process group ID. */ 149 pid_t xt_sid; /* Session ID. */ 150 struct termios xt_termios; /* Termios state. */ 151 struct winsize xt_winsize; /* Window size. */ 152 int xt_column; /* Tty output column. */ 153 int xt_rocount, xt_rocol; /* Tty. */ 154 int xt_ififosize; /* Total size of upstream fifos. */ 155 int xt_ihiwat; /* High water mark for input. */ 156 int xt_ilowat; /* Low water mark for input. */ 157 speed_t xt_ispeedwat; /* t_ispeed override for watermarks. */ 158 int xt_ohiwat; /* High water mark for output. */ 159 int xt_olowat; /* Low water mark for output. */ 160 speed_t xt_ospeedwat; /* t_ospeed override for watermarks. */ 161}; 162 163/* 164 * User data unfortunately has to be copied through buffers on the way to 165 * and from clists. The buffers are on the stack so their sizes must be 166 * fairly small. 167 */ 168#define IBUFSIZ 384 /* Should be >= max value of MIN. */ 169#define OBUFSIZ 100 170 171#ifndef TTYHOG 172#define TTYHOG 8192 173#endif 174 175#ifdef _KERNEL 176#define TTMAXHIWAT roundup(2048, CBSIZE) 177#define TTMINHIWAT roundup(100, CBSIZE) 178#define TTMAXLOWAT 256 179#define TTMINLOWAT 32 180#endif 181 182/* These flags are kept in t_state. */ 183#define TS_SO_OLOWAT 0x00001 /* Wake up when output <= low water. */ 184#define TS_ASYNC 0x00002 /* Tty in async I/O mode. */ 185#define TS_BUSY 0x00004 /* Draining output. */ 186#define TS_CARR_ON 0x00008 /* Carrier is present. */ 187#define TS_FLUSH 0x00010 /* Outq has been flushed during DMA. */ 188#define TS_ISOPEN 0x00020 /* Open has completed. */ 189#define TS_TBLOCK 0x00040 /* Further input blocked. */ 190#define TS_TIMEOUT 0x00080 /* Wait for output char processing. */ 191#define TS_TTSTOP 0x00100 /* Output paused. */ 192#ifdef notyet 193#define TS_WOPEN 0x00200 /* Open in progress. */ 194#endif 195#define TS_XCLUDE 0x00400 /* Tty requires exclusivity. */ 196 197/* State for intra-line fancy editing work. */ 198#define TS_BKSL 0x00800 /* State for lowercase \ work. */ 199#define TS_CNTTB 0x01000 /* Counting tab width, ignore FLUSHO. */ 200#define TS_ERASE 0x02000 /* Within a \.../ for PRTRUB. */ 201#define TS_LNCH 0x04000 /* Next character is literal. */ 202#define TS_TYPEN 0x08000 /* Retyping suspended input (PENDIN). */ 203#define TS_LOCAL (TS_BKSL | TS_CNTTB | TS_ERASE | TS_LNCH | TS_TYPEN) 204 205/* Extras. */ 206#define TS_CAN_BYPASS_L_RINT 0x010000 /* Device in "raw" mode. */ 207#define TS_CONNECTED 0x020000 /* Connection open. */ 208#define TS_SNOOP 0x040000 /* Device is being snooped on. */ 209#define TS_SO_OCOMPLETE 0x080000 /* Wake up when output completes. */ 210#define TS_ZOMBIE 0x100000 /* Connection lost. */ 211 212/* Hardware flow-control-invoked bits. */ 213#define TS_CAR_OFLOW 0x200000 /* For MDMBUF (XXX handle in driver). */ 214#ifdef notyet 215#define TS_CTS_OFLOW 0x400000 /* For CCTS_OFLOW. */ 216#define TS_DSR_OFLOW 0x800000 /* For CDSR_OFLOW. */ 217#endif 218 219/* Character type information. */ 220#define ORDINARY 0 221#define CONTROL 1 222#define BACKSPACE 2 223#define NEWLINE 3 224#define TAB 4 225#define VTAB 5 226#define RETURN 6 227 228struct speedtab { 229 int sp_speed; /* Speed. */ 230 int sp_code; /* Code. */ 231}; 232 233/* Modem control commands (driver). */ 234#define DMSET 0 235#define DMBIS 1 236#define DMBIC 2 237#define DMGET 3 238 239/* Flags on a character passed to ttyinput. */ 240#define TTY_CHARMASK 0x000000ff /* Character mask */ 241#define TTY_QUOTE 0x00000100 /* Character quoted */ 242#define TTY_ERRORMASK 0xff000000 /* Error mask */ 243#define TTY_FE 0x01000000 /* Framing error */ 244#define TTY_PE 0x02000000 /* Parity error */ 245#define TTY_OE 0x04000000 /* Overrun error */ 246#define TTY_BI 0x08000000 /* Break condition */ 247 248/* Is tp controlling terminal for p? */ 249#define isctty(p, tp) \ 250 ((p)->p_session == (tp)->t_session && (p)->p_flag & P_CONTROLT) 251 252/* Is p in background of tp? */ 253#define isbackground(p, tp) \ 254 (isctty((p), (tp)) && (p)->p_pgrp != (tp)->t_pgrp) 255 256/* Unique sleep addresses. */ 257#define TSA_CARR_ON(tp) ((void *)&(tp)->t_rawq) 258#define TSA_HUP_OR_INPUT(tp) ((void *)&(tp)->t_rawq.c_cf) 259#define TSA_OCOMPLETE(tp) ((void *)&(tp)->t_outq.c_cl) 260#define TSA_OLOWAT(tp) ((void *)&(tp)->t_outq) 261 262#ifdef _KERNEL 263#ifdef MALLOC_DECLARE 264MALLOC_DECLARE(M_TTYS); 265#endif 266extern struct msgbuf consmsgbuf; /* Message buffer for constty. */ 267extern struct tty *constty; /* Temporary virtual console. */ 268extern long tk_cancc; 269extern long tk_nin; 270extern long tk_nout; 271extern long tk_rawcc; 272 273int b_to_q(char *cp, int cc, struct clist *q); 274void catq(struct clist *from, struct clist *to); 275void clist_alloc_cblocks(struct clist *q, int ccmax, int ccres); 276void clist_free_cblocks(struct clist *q); 277void constty_set(struct tty *tp); 278void constty_clear(void); 279int getc(struct clist *q); 280void ndflush(struct clist *q, int cc); 281char *nextc(struct clist *q, char *cp, int *c); 282void nottystop(struct tty *tp, int rw); 283int putc(int c, struct clist *q); 284int q_to_b(struct clist *q, char *cp, int cc); 285void termioschars(struct termios *t); 286int tputchar(int c, struct tty *tp); 287int ttcompat(struct tty *tp, u_long com, caddr_t data, int flag); 288int ttioctl(struct tty *tp, u_long com, void *data, int flag); 289int ttread(struct tty *tp, struct uio *uio, int flag); 290void ttrstrt(void *tp); 291int ttsetcompat(struct tty *tp, u_long *com, caddr_t data, 292 struct termios *term); 293void ttsetwater(struct tty *tp); 294int ttspeedtab(int speed, struct speedtab *table); 295int ttstart(struct tty *tp); 296void ttwakeup(struct tty *tp); 297int ttwrite(struct tty *tp, struct uio *uio, int flag); 298void ttwwakeup(struct tty *tp); 299void ttyblock(struct tty *tp); 300void ttychars(struct tty *tp); 301int ttycheckoutq(struct tty *tp, int wait); 302int ttyclose(struct tty *tp); 303void ttyflush(struct tty *tp, int rw); 304void ttyinfo(struct tty *tp); 305int ttyinput(int c, struct tty *tp); 306int ttylclose(struct tty *tp, int flag); 307int ttyldoptim(struct tty *tp); 308struct tty *ttymalloc(struct tty *tp); 309int ttymodem(struct tty *tp, int flag); 310int ttyopen(dev_t device, struct tty *tp); 311int ttyref(struct tty *tp); 312int ttyrel(struct tty *tp); 313int ttysleep(struct tty *tp, void *chan, int pri, char *wmesg, int timo); 314int ttywait(struct tty *tp); 315int unputc(struct clist *q); 316 317/* 318 * XXX: temporary 319 */ 320#include <sys/linedisc.h> 321 322#endif /* _KERNEL */ 323 324#endif /* !_SYS_TTY_H_ */ 325