1/*
2 * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28/* Copyright (c) 1997 Apple Computer, Inc. All Rights Reserved */
29/*
30 * Copyright (c) 1988, 1989, 1993, 1994
31 *	The Regents of the University of California.  All rights reserved.
32 *
33 * Redistribution and use in source and binary forms, with or without
34 * modification, are permitted provided that the following conditions
35 * are met:
36 * 1. Redistributions of source code must retain the above copyright
37 *    notice, this list of conditions and the following disclaimer.
38 * 2. Redistributions in binary form must reproduce the above copyright
39 *    notice, this list of conditions and the following disclaimer in the
40 *    documentation and/or other materials provided with the distribution.
41 * 3. All advertising materials mentioning features or use of this software
42 *    must display the following acknowledgement:
43 *      This product includes software developed by the University of
44 *      California, Berkeley and its contributors.
45 * 4. Neither the name of the University nor the names of its contributors
46 *    may be used to endorse or promote products derived from this software
47 *    without specific prior written permission.
48 *
49 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
50 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
51 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
52 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
53 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
54 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
55 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
56 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
57 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
58 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
59 * SUCH DAMAGE.
60 *
61 *	@(#)termios.h	8.3 (Berkeley) 3/28/94
62 */
63
64#ifndef _SYS_TERMIOS_H_
65#define _SYS_TERMIOS_H_
66
67#include <sys/cdefs.h>
68
69/*
70 * Special Control Characters
71 *
72 * Index into c_cc[] character array.
73 *
74 *	Name	     Subscript	Enabled by
75 */
76#define	VEOF		0	/* ICANON */
77#define	VEOL		1	/* ICANON */
78#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
79#define	VEOL2		2	/* ICANON together with IEXTEN */
80#endif
81#define	VERASE		3	/* ICANON */
82#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
83#define VWERASE 	4	/* ICANON together with IEXTEN */
84#endif
85#define VKILL		5	/* ICANON */
86#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
87#define	VREPRINT 	6	/* ICANON together with IEXTEN */
88#endif
89/*			7	   spare 1 */
90#define VINTR		8	/* ISIG */
91#define VQUIT		9	/* ISIG */
92#define VSUSP		10	/* ISIG */
93#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
94#define VDSUSP		11	/* ISIG together with IEXTEN */
95#endif
96#define VSTART		12	/* IXON, IXOFF */
97#define VSTOP		13	/* IXON, IXOFF */
98#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
99#define	VLNEXT		14	/* IEXTEN */
100#define	VDISCARD	15	/* IEXTEN */
101#endif
102#define VMIN		16	/* !ICANON */
103#define VTIME		17	/* !ICANON */
104#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
105#define VSTATUS		18	/* ICANON together with IEXTEN */
106/*			19	   spare 2 */
107#endif
108#define	NCCS		20
109
110#ifndef _POSIX_VDISABLE
111#define	_POSIX_VDISABLE	0xff
112#endif
113
114#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
115#define	CCEQ(val, c)	((c) == (val) ? (val) != _POSIX_VDISABLE : 0)
116#endif
117
118/*
119 * Input flags - software input processing
120 */
121#define	IGNBRK		0x00000001	/* ignore BREAK condition */
122#define	BRKINT		0x00000002	/* map BREAK to SIGINTR */
123#define	IGNPAR		0x00000004	/* ignore (discard) parity errors */
124#define	PARMRK		0x00000008	/* mark parity and framing errors */
125#define	INPCK		0x00000010	/* enable checking of parity errors */
126#define	ISTRIP		0x00000020	/* strip 8th bit off chars */
127#define	INLCR		0x00000040	/* map NL into CR */
128#define	IGNCR		0x00000080	/* ignore CR */
129#define	ICRNL		0x00000100	/* map CR to NL (ala CRMOD) */
130#define	IXON		0x00000200	/* enable output flow control */
131#define	IXOFF		0x00000400	/* enable input flow control */
132#define	IXANY		0x00000800	/* any char will restart after stop */
133#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
134#define IMAXBEL		0x00002000	/* ring bell on input queue full */
135#define	IUTF8		0x00004000	/* maintain state for UTF-8 VERASE */
136#endif  /*(_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
137
138/*
139 * Output flags - software output processing
140 */
141#define	OPOST		0x00000001	/* enable following output processing */
142#define ONLCR		0x00000002	/* map NL to CR-NL (ala CRMOD) */
143#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
144#define OXTABS		0x00000004	/* expand tabs to spaces */
145#define ONOEOT		0x00000008	/* discard EOT's (^D) on output) */
146#endif  /*(_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
147/*
148 * The following block of features is unimplemented.  Use of these flags in
149 * programs will currently result in unexpected behaviour.
150 *
151 * - Begin unimplemented features
152 */
153#define	OCRNL		0x00000010	/* map CR to NL on output */
154#define	ONOCR		0x00000020	/* no CR output at column 0 */
155#define	ONLRET		0x00000040	/* NL performs CR function */
156#define	OFILL		0x00000080	/* use fill characters for delay */
157#define	NLDLY		0x00000300	/* \n delay */
158#define	TABDLY		0x00000c04	/* horizontal tab delay */
159#define	CRDLY		0x00003000	/* \r delay */
160#define	FFDLY		0x00004000	/* form feed delay */
161#define	BSDLY		0x00008000	/* \b delay */
162#define	VTDLY		0x00010000	/* vertical tab delay */
163#define	OFDEL		0x00020000	/* fill is DEL, else NUL */
164#if !defined(_SYS_IOCTL_COMPAT_H_) || __DARWIN_UNIX03
165/*
166 * These manifest constants have the same names as those in the header
167 * <sys/ioctl_compat.h>, so you are not permitted to have both definitions
168 * in scope simultaneously in the same compilation unit.  Nevertheless,
169 * they are required to be in scope when _POSIX_C_SOURCE is requested;
170 * this means that including the <sys/ioctl_compat.h> header before this
171 * one when _POSIX_C_SOURCE is in scope will result in redefintions.  We
172 * attempt to maintain these as the same values so as to avoid this being
173 * an outright error in most compilers.
174 */
175#define		NL0	0x00000000
176#define		NL1	0x00000100
177#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
178#define		NL2	0x00000200
179#define		NL3	0x00000300
180#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
181#define		TAB0	0x00000000
182#define		TAB1	0x00000400
183#define		TAB2	0x00000800
184/* not in sys/ioctl_compat.h, use OXTABS value */
185#define		TAB3	0x00000004
186#define		CR0	0x00000000
187#define		CR1	0x00001000
188#define		CR2	0x00002000
189#define		CR3	0x00003000
190#define		FF0	0x00000000
191#define		FF1	0x00004000
192#define		BS0	0x00000000
193#define		BS1	0x00008000
194#define		VT0	0x00000000
195#define		VT1	0x00010000
196#endif	/* !_SYS_IOCTL_COMPAT_H_ */
197/*
198 * + End unimplemented features
199 */
200
201/*
202 * Control flags - hardware control of terminal
203 */
204#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
205#define	CIGNORE		0x00000001	/* ignore control flags */
206#endif
207#define CSIZE		0x00000300	/* character size mask */
208#define     CS5		    0x00000000	    /* 5 bits (pseudo) */
209#define     CS6		    0x00000100	    /* 6 bits */
210#define     CS7		    0x00000200	    /* 7 bits */
211#define     CS8		    0x00000300	    /* 8 bits */
212#define CSTOPB		0x00000400	/* send 2 stop bits */
213#define CREAD		0x00000800	/* enable receiver */
214#define PARENB		0x00001000	/* parity enable */
215#define PARODD		0x00002000	/* odd parity, else even */
216#define HUPCL		0x00004000	/* hang up on last close */
217#define CLOCAL		0x00008000	/* ignore modem status lines */
218#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
219#define CCTS_OFLOW	0x00010000	/* CTS flow control of output */
220#define CRTSCTS		(CCTS_OFLOW | CRTS_IFLOW)
221#define CRTS_IFLOW	0x00020000	/* RTS flow control of input */
222#define	CDTR_IFLOW	0x00040000	/* DTR flow control of input */
223#define CDSR_OFLOW	0x00080000	/* DSR flow control of output */
224#define	CCAR_OFLOW	0x00100000	/* DCD flow control of output */
225#define	MDMBUF		0x00100000	/* old name for CCAR_OFLOW */
226#endif
227
228
229/*
230 * "Local" flags - dumping ground for other state
231 *
232 * Warning: some flags in this structure begin with
233 * the letter "I" and look like they belong in the
234 * input flag.
235 */
236
237#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
238#define	ECHOKE		0x00000001	/* visual erase for line kill */
239#endif  /*(_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
240#define	ECHOE		0x00000002	/* visually erase chars */
241#define	ECHOK		0x00000004	/* echo NL after line kill */
242#define ECHO		0x00000008	/* enable echoing */
243#define	ECHONL		0x00000010	/* echo NL even if ECHO is off */
244#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
245#define	ECHOPRT		0x00000020	/* visual erase mode for hardcopy */
246#define ECHOCTL  	0x00000040	/* echo control chars as ^(Char) */
247#endif  /*(_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
248#define	ISIG		0x00000080	/* enable signals INTR, QUIT, [D]SUSP */
249#define	ICANON		0x00000100	/* canonicalize input lines */
250#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
251#define ALTWERASE	0x00000200	/* use alternate WERASE algorithm */
252#endif  /*(_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
253#define	IEXTEN		0x00000400	/* enable DISCARD and LNEXT */
254#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
255#define EXTPROC         0x00000800      /* external processing */
256#endif  /*(_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
257#define TOSTOP		0x00400000	/* stop background jobs from output */
258#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
259#define FLUSHO		0x00800000	/* output being flushed (state) */
260#define	NOKERNINFO	0x02000000	/* no kernel output from VSTATUS */
261#define PENDIN		0x20000000	/* XXX retype pending input (state) */
262#endif  /*(_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
263#define	NOFLSH		0x80000000	/* don't flush after interrupt */
264
265typedef unsigned long	tcflag_t;
266typedef unsigned char	cc_t;
267typedef unsigned long	speed_t;
268
269struct termios {
270	tcflag_t	c_iflag;	/* input flags */
271	tcflag_t	c_oflag;	/* output flags */
272	tcflag_t	c_cflag;	/* control flags */
273	tcflag_t	c_lflag;	/* local flags */
274	cc_t		c_cc[NCCS];	/* control chars */
275	speed_t		c_ispeed;	/* input speed */
276	speed_t		c_ospeed;	/* output speed */
277};
278
279#ifdef KERNEL
280typedef __uint64_t	user_tcflag_t;
281typedef __uint64_t	user_speed_t;
282
283/*
284 * LP64 version of struct termios.  tcflag_t and speed_t are long and must
285 * grow when we're dealing with a 64-bit process.
286 * WARNING - keep in sync with struct termios
287 */
288
289struct user_termios {
290	user_tcflag_t	c_iflag;	/* input flags */
291	user_tcflag_t	c_oflag;	/* output flags */
292	user_tcflag_t	c_cflag;	/* control flags */
293	user_tcflag_t	c_lflag;	/* local flags */
294	cc_t		c_cc[NCCS];	/* control chars */
295	user_speed_t	c_ispeed __attribute((aligned(8)));	/* input speed */
296	user_speed_t	c_ospeed;	/* output speed */
297};
298
299/* 32 bit version */
300struct termios32 {
301	__uint32_t	c_iflag;	/* input flags */
302	__uint32_t	c_oflag;	/* output flags */
303	__uint32_t	c_cflag;	/* control flags */
304	__uint32_t	c_lflag;	/* local flags */
305	cc_t		c_cc[NCCS];	/* control chars */
306	__uint32_t	c_ispeed;	/* input speed */
307	__uint32_t	c_ospeed;	/* output speed */
308};
309
310#endif	/* KERNEL */
311
312/*
313 * Commands passed to tcsetattr() for setting the termios structure.
314 */
315#define	TCSANOW		0		/* make change immediate */
316#define	TCSADRAIN	1		/* drain output, then change */
317#define	TCSAFLUSH	2		/* drain output, flush input */
318#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
319#define TCSASOFT	0x10		/* flag - don't alter h.w. state */
320#endif
321
322/*
323 * Standard speeds
324 */
325#define B0	0
326#define B50	50
327#define B75	75
328#define B110	110
329#define B134	134
330#define B150	150
331#define B200	200
332#define B300	300
333#define B600	600
334#define B1200	1200
335#define	B1800	1800
336#define B2400	2400
337#define B4800	4800
338#define B9600	9600
339#define B19200	19200
340#define B38400	38400
341#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
342#define B7200	7200
343#define B14400	14400
344#define B28800	28800
345#define B57600	57600
346#define B76800	76800
347#define B115200	115200
348#define B230400	230400
349#define EXTA	19200
350#define EXTB	38400
351#endif  /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
352
353#ifndef KERNEL
354
355#define	TCIFLUSH	1
356#define	TCOFLUSH	2
357#define TCIOFLUSH	3
358#define	TCOOFF		1
359#define	TCOON		2
360#define TCIOFF		3
361#define TCION		4
362
363#include <sys/cdefs.h>
364
365__BEGIN_DECLS
366speed_t	cfgetispeed(const struct termios *);
367speed_t	cfgetospeed(const struct termios *);
368int	cfsetispeed(struct termios *, speed_t);
369int	cfsetospeed(struct termios *, speed_t);
370int	tcgetattr(int, struct termios *);
371int	tcsetattr(int, int, const struct termios *);
372int	tcdrain(int) __DARWIN_ALIAS_C(tcdrain);
373int	tcflow(int, int);
374int	tcflush(int, int);
375int	tcsendbreak(int, int);
376
377#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
378void	cfmakeraw(struct termios *);
379int	cfsetspeed(struct termios *, speed_t);
380#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
381__END_DECLS
382
383#endif /* !KERNEL */
384
385#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
386
387/*
388 * Include tty ioctl's that aren't just for backwards compatibility
389 * with the old tty driver.  These ioctl definitions were previously
390 * in <sys/ioctl.h>.
391 */
392#include <sys/ttycom.h>
393#endif
394
395/*
396 * END OF PROTECTED INCLUDE.
397 */
398#endif /* !_SYS_TERMIOS_H_ */
399
400#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
401#include <sys/ttydefaults.h>
402#endif
403