xref: /titanic_50/usr/src/uts/common/sys/termios.h (revision fca543ca45b12c44a243625bce68b645ba8ed791)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
22 /*	  All Rights Reserved  	*/
23 
24 
25 /*
26  * Copyright 2014 Garrett D'Amore <garrett@damore.org>
27  *
28  * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
29  */
30 
31 #ifndef _SYS_TERMIOS_H
32 #define	_SYS_TERMIOS_H
33 
34 #include <sys/feature_tests.h>
35 
36 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
37 #include <sys/ttydev.h>
38 #include <sys/time.h>
39 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
40 
41 #include <sys/types.h>
42 
43 #ifdef	__cplusplus
44 extern "C" {
45 #endif
46 
47 /*
48  * _POSIX_VDISABLE has been defined in <sys/termios.h> since the
49  * introduction of the header. The POSIX standard, IEEE Std.
50  * 1003.1-1988 also required  the existence of _POSIX_VDISABLE in
51  * this header. Subsequent versions of the IEEE Standard as well
52  * as the X/Open specifications required that _POSIX_VDISABLE be
53  * defined in <unistd.h> while still allowing for it's existence
54  * here. With the introduction of XPG6, _POSIX_VDISABLE can only
55  * be defined in <unistd.h>.
56  */
57 #if !defined(_XPG6) || defined(__EXTENSIONS__)
58 #ifndef _POSIX_VDISABLE
59 #define	_POSIX_VDISABLE 0 /* Disable special character functions */
60 #endif
61 #endif /* !defined(_XPG6) || defined(__EXTENSIONS__) */
62 
63 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
64 #define	CTRL(c)	((c)&037)
65 #define	IBSHIFT 16
66 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
67 
68 /* required by termio.h and VCEOF/VCEOL */
69 #define	_NCC	8
70 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
71 #define	NCC	_NCC
72 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
73 
74 /* some defines required by POSIX */
75 #define	NCCS	19
76 
77 /*
78  * types defined by POSIX. These are better off in types.h, but
79  * the standard says that they have to be in termios.h.
80  */
81 typedef unsigned int tcflag_t;
82 typedef unsigned char cc_t;
83 typedef unsigned int speed_t;
84 
85 /*
86  * Ioctl control packet
87  */
88 struct termios {
89 	tcflag_t	c_iflag;	/* input modes */
90 	tcflag_t	c_oflag;	/* output modes */
91 	tcflag_t	c_cflag;	/* control modes */
92 	tcflag_t	c_lflag;	/* line discipline modes */
93 	cc_t		c_cc[NCCS];	/* control chars */
94 };
95 
96 /*
97  * POSIX termios functions
98  * These functions get mapped into ioctls.
99  */
100 
101 #ifndef _KERNEL
102 
103 extern speed_t cfgetospeed(const struct termios *);
104 extern int cfsetospeed(struct termios *, speed_t);
105 extern speed_t cfgetispeed(const struct termios *);
106 extern int cfsetispeed(struct termios *, speed_t);
107 extern int tcgetattr(int, struct termios *);
108 extern int tcsetattr(int, int, const struct termios *);
109 extern int tcsendbreak(int, int);
110 extern int tcdrain(int);
111 extern int tcflush(int, int);
112 extern int tcflow(int, int);
113 
114 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG4_2) || defined(__EXTENSIONS__)
115 
116 extern pid_t tcgetsid(int);
117 
118 #endif /* !defined(__XOPEN_OR_POSIX) || defined(_XPG4_2) ... */
119 
120 #endif
121 
122 /* control characters */
123 #define	VINTR	0
124 #define	VQUIT	1
125 #define	VERASE	2
126 #define	VKILL	3
127 #define	VEOF	4
128 #define	VEOL	5
129 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
130 #define	VEOL2	6
131 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
132 #define	VMIN	4
133 #define	VTIME	5
134 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
135 #define	VSWTCH	7
136 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
137 #define	VSTART		8
138 #define	VSTOP		9
139 #define	VSUSP		10
140 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
141 #define	VDSUSP		11
142 #define	VREPRINT	12
143 #define	VDISCARD	13
144 #define	VWERASE		14
145 #define	VLNEXT		15
146 #define	VSTATUS		16
147 /* 17 through 19 reserved for future use */
148 
149 /*
150  * control characters form Xenix termio.h
151  */
152 #define	VCEOF	NCC		/* RESERVED true EOF char (V7 compatability) */
153 #define	VCEOL	(NCC + 1)	/* RESERVED true EOL char */
154 
155 #define	CNUL	0
156 #define	CDEL	0177
157 
158 /* S5 default control chars */
159 /* CINTR, CERASE and CKILL modified to SunOS traditional values */
160 #define	CESC	'\\'
161 #define	CINTR	CTRL('c')
162 #define	CQUIT	034	/* FS, cntl | */
163 #define	CERASE	0177	/* DEL */
164 #define	CKILL	CTRL('u')
165 #define	CEOT	04
166 #define	CEOL	0
167 #define	CEOL2	0
168 #define	CEOF	04	/* cntl d */
169 #define	CSTART	021	/* cntl q */
170 #define	CSTOP	023	/* cntl s */
171 #define	CSWTCH	032	/* cntl z */
172 #define	CNSWTCH	0
173 #define	CSUSP	CTRL('z')
174 #define	CDSUSP	CTRL('y')
175 #define	CRPRNT	CTRL('r')
176 #define	CFLUSH	CTRL('o')
177 #define	CWERASE	CTRL('w')
178 #define	CLNEXT	CTRL('v')
179 #define	CSTATUS	CTRL('t')
180 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
181 
182 
183 /* input modes */
184 #define	IGNBRK	0000001
185 #define	BRKINT	0000002
186 #define	IGNPAR	0000004
187 #define	PARMRK	0000010
188 #define	INPCK	0000020
189 #define	ISTRIP	0000040
190 #define	INLCR	0000100
191 #define	IGNCR	0000200
192 #define	ICRNL	0000400
193 #if !defined(_POSIX_C_SOURCE) || \
194 	(defined(_XOPEN_SOURCE) && !defined(_XPG6)) || \
195 	defined(__EXTENSIONS__)
196 #define	IUCLC	0001000
197 #endif /* !defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE)... */
198 #define	IXON	0002000
199 #if !defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || \
200 	defined(__EXTENSIONS__)
201 #define	IXANY	0004000
202 #endif /* !defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE)... */
203 #define	IXOFF	0010000
204 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
205 #define	IMAXBEL 0020000
206 #define	DOSMODE	0100000  /* for 386 compatibility */
207 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
208 
209 /* output modes */
210 #define	OPOST	0000001
211 #if !defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || \
212 	defined(__EXTENSIONS__)
213 #if !defined(_XPG6) || defined(__EXTENSIONS__)
214 #define	OLCUC	0000002
215 #endif
216 #define	ONLCR	0000004
217 #define	OCRNL	0000010
218 #define	ONOCR	0000020
219 #define	ONLRET	0000040
220 #define	OFILL	0000100
221 #define	OFDEL	0000200
222 #define	NLDLY	0000400
223 #define	NL0	0
224 #define	NL1	0000400
225 #define	CRDLY	0003000
226 #define	CR0	0
227 #define	CR1	0001000
228 #define	CR2	0002000
229 #define	CR3	0003000
230 #define	TABDLY	0014000
231 #define	TAB0	0
232 #define	TAB1	0004000
233 #define	TAB2	0010000
234 #define	TAB3	0014000
235 #endif /* !defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE)... */
236 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
237 #define	XTABS	0014000
238 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
239 #if !defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || \
240 	defined(__EXTENSIONS__)
241 #define	BSDLY	0020000
242 #define	BS0	0
243 #define	BS1	0020000
244 #define	VTDLY	0040000
245 #define	VT0	0
246 #define	VT1	0040000
247 #define	FFDLY	0100000
248 #define	FF0	0
249 #define	FF1	0100000
250 #endif /* !defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE)... */
251 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
252 #define	PAGEOUT 0200000
253 #define	WRAP	0400000
254 
255 /* control modes */
256 #define	CBAUD	0000017
257 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
258 #define	CSIZE	0000060
259 #define	CS5	0
260 #define	CS6	0000020
261 #define	CS7	0000040
262 #define	CS8	0000060
263 #define	CSTOPB	0000100
264 #define	CREAD	0000200
265 #define	PARENB	0000400
266 #define	PARODD	0001000
267 #define	HUPCL	0002000
268 #define	CLOCAL	0004000
269 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
270 #define	RCV1EN	0010000
271 #define	XMT1EN	0020000
272 #define	LOBLK	0040000
273 #define	XCLUDE	0100000		/* *V7* exclusive use coming fron XENIX */
274 #define	CRTSXOFF 010000000000
275 #define	CRTSCTS	020000000000
276 #define	CIBAUD	03600000
277 #define	PAREXT	04000000
278 #define	CBAUDEXT 010000000
279 #define	CIBAUDEXT 020000000
280 
281 /*
282  * 4.4BSD hardware flow control flags
283  */
284 #define	CRTS_IFLOW 010000000000
285 #define	CCTS_OFLOW 020000000000
286 
287 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
288 
289 /* line discipline 0 modes */
290 #define	ISIG	0000001
291 #define	ICANON	0000002
292 #if !defined(_POSIX_C_SOURCE) || \
293 	(defined(_XOPEN_SOURCE) && !defined(_XPG6)) || \
294 	defined(__EXTENSIONS__)
295 #define	XCASE	0000004
296 #endif /* !defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE)... */
297 #define	ECHO	0000010
298 #define	ECHOE	0000020
299 #define	ECHOK	0000040
300 #define	ECHONL	0000100
301 #define	NOFLSH	0000200
302 #define	TOSTOP	0000400
303 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
304 #define	ECHOCTL	0001000
305 #define	ECHOPRT	0002000
306 #define	ECHOKE	0004000
307 #define	DEFECHO	0010000
308 #define	FLUSHO	0020000
309 #define	PENDIN	0040000
310 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
311 
312 #define	IEXTEN	0100000  /* POSIX flag - enable POSIX extensions */
313 #define	_TIOC	('T'<<8)
314 
315 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
316 
317 #define	TIOC	_TIOC
318 
319 #define	TCGETA	(_TIOC|1)
320 #define	TCSETA	(_TIOC|2)
321 #define	TCSETAW	(_TIOC|3)
322 #define	TCSETAF	(_TIOC|4)
323 #define	TCSBRK	(_TIOC|5)
324 #define	TCXONC	(_TIOC|6)
325 #define	TCFLSH	(_TIOC|7)
326 
327 /* Slots reserved for 386/XENIX compatibility - keyboard control */
328 
329 #define	TIOCKBON	(_TIOC|8)
330 #define	TIOCKBOF 	(_TIOC|9)
331 #define	KBENABLED 	(_TIOC|10)
332 
333 #ifndef IOCTYPE
334 #define	IOCTYPE	0xff00
335 #endif
336 
337 #define	TCDSET	(_TIOC|32)
338 #define	RTS_TOG	(_TIOC|33)	/* 386 - "RTS" toggle define 8A1 protocol */
339 
340 #define	TIOCGWINSZ (_TIOC|104)
341 #define	TIOCSWINSZ (_TIOC|103)
342 
343 /*
344  * Softcarrier ioctls
345  */
346 #define	TIOCGSOFTCAR (_TIOC|105)
347 #define	TIOCSSOFTCAR (_TIOC|106)
348 
349 
350 /* termios ioctls */
351 
352 #define	TCGETS		(_TIOC|13)
353 #define	TCSETS		(_TIOC|14)
354 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
355 #define	TCSANOW		(_TIOC|14) /* same as TCSETS */
356 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
357 #define	TCSETSW		(_TIOC|15)
358 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
359 #define	TCSADRAIN	(_TIOC|15) /* same as TCSETSW */
360 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
361 #define	TCSETSF		(_TIOC|16)
362 
363 /*
364  * NTP PPS ioctls
365  */
366 #define	TIOCGPPS	(_TIOC|125)
367 #define	TIOCSPPS	(_TIOC|126)
368 #define	TIOCGPPSEV	(_TIOC|127)
369 
370 /* Argument filled in by TIOCGPPSEV */
371 struct ppsclockev {
372 	struct timeval tv;
373 	uint_t serial;
374 };
375 
376 #if defined(_SYSCALL32)
377 struct ppsclockev32 {
378 	struct timeval32 tv;
379 	uint32_t serial;
380 };
381 #endif /* _SYSCALL32 */
382 
383 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
384 
385 #define	TCSAFLUSH	(_TIOC|16) /* same as TCSETSF */
386 
387 /* termios option flags */
388 
389 #define	TCIFLUSH	0  /* flush data received but not read */
390 #define	TCOFLUSH	1  /* flush data written but not transmitted */
391 #define	TCIOFLUSH	2  /* flush both data both input and output queues */
392 
393 #define	TCOOFF		0  /* suspend output */
394 #define	TCOON		1  /* restart suspended output */
395 #define	TCIOFF		2  /* suspend input */
396 #define	TCION		3  /* restart suspended input */
397 
398 /* TIOC ioctls for BSD, ptys, job control and modem control */
399 
400 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
401 #define	tIOC	('t'<<8)
402 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
403 
404 /* Slots for 386/XENIX compatibility */
405 /* BSD includes these ioctls in ttold.h */
406 
407 #ifndef _SYS_TTOLD_H
408 
409 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
410 #define	TIOCGETD	(tIOC|0)
411 #define	TIOCSETD	(tIOC|1)
412 #define	TIOCHPCL	(tIOC|2)
413 #define	TIOCGETP	(tIOC|8)
414 #define	TIOCSETP  	(tIOC|9)
415 #define	TIOCSETN	(tIOC|10)
416 #define	TIOCEXCL	(tIOC|13)
417 #define	TIOCNXCL	(tIOC|14)
418 #define	TIOCFLUSH	(tIOC|16)
419 #define	TIOCSETC	(tIOC|17)
420 #define	TIOCGETC	(tIOC|18)
421 /*
422  * BSD ioctls that are not the same as XENIX are included here.
423  * There are also some relevant ioctls from SUN/BSD sys/ttycom.h
424  * BSD pty ioctls like TIOCPKT are not supported in SVR4.
425  */
426 
427 #define	TIOCLBIS	(tIOC|127)	/* bis local mode bits */
428 #define	TIOCLBIC	(tIOC|126)	/* bic local mode bits */
429 #define	TIOCLSET	(tIOC|125)	/* set entire local mode word */
430 #define	TIOCLGET	(tIOC|124)	/* get local modes */
431 #define	TIOCSBRK	(tIOC|123)	/* set break bit */
432 #define	TIOCCBRK	(tIOC|122)	/* clear break bit */
433 #define	TIOCSDTR	(tIOC|121)	/* set data terminal ready */
434 #define	TIOCCDTR	(tIOC|120)	/* clear data terminal ready */
435 #define	TIOCSLTC	(tIOC|117)	/* set local special chars */
436 #define	TIOCGLTC	(tIOC|116)	/* get local special chars */
437 #define	TIOCOUTQ	(tIOC|115)	/* driver output queue size */
438 #define	TIOCNOTTY	(tIOC|113)	/* void tty association */
439 #define	TIOCSCTTY	(tIOC|132)	/* get a ctty */
440 #define	TIOCSTOP	(tIOC|111)	/* stop output, like ^S */
441 #define	TIOCSTART	(tIOC|110)	/* start output, like ^Q */
442 #define	TIOCSILOOP	(tIOC|109)	/* private to Sun; do not use */
443 #define	TIOCCILOOP	(tIOC|108)	/* private to Sun; do not use */
444 
445 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
446 
447 #endif /* end _SYS_TTOLD_H */
448 
449 /* POSIX job control ioctls */
450 
451 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
452 #define	TIOCGPGRP	(tIOC|20)	/* get pgrp of tty */
453 #define	TIOCSPGRP	(tIOC|21)	/* set pgrp of tty */
454 #define	TIOCGSID	(tIOC|22)	/* get session id on ctty */
455 
456 /* Miscellaneous */
457 #define	TIOCSTI		(tIOC|23)	/* simulate terminal input */
458 
459 /* Modem control */
460 #define	TIOCMSET	(tIOC|26)	/* set all modem bits */
461 #define	TIOCMBIS	(tIOC|27)	/* bis modem bits */
462 #define	TIOCMBIC	(tIOC|28)	/* bic modem bits */
463 #define	TIOCMGET	(tIOC|29)	/* get all modem bits */
464 #define		TIOCM_LE	0001		/* line enable */
465 #define		TIOCM_DTR	0002		/* data terminal ready */
466 #define		TIOCM_RTS	0004		/* request to send */
467 #define		TIOCM_ST	0010		/* secondary transmit */
468 #define		TIOCM_SR	0020		/* secondary receive */
469 #define		TIOCM_CTS	0040		/* clear to send */
470 #define		TIOCM_CAR	0100		/* carrier detect */
471 #define		TIOCM_CD	TIOCM_CAR
472 #define		TIOCM_RNG	0200		/* ring */
473 #define		TIOCM_RI	TIOCM_RNG
474 #define		TIOCM_DSR	0400		/* data set ready */
475 
476 /* pseudo-tty */
477 
478 #define	TIOCREMOTE	(tIOC|30)	/* remote input editing */
479 #define	TIOCSIGNAL	(tIOC|31)	/* pty: send signal to slave */
480 
481 
482 /* Some more 386 xenix stuff */
483 
484 #define	LDIOC	('D'<<8)
485 
486 #define	LDOPEN	(LDIOC|0)
487 #define	LDCLOSE	(LDIOC|1)
488 #define	LDCHG	(LDIOC|2)
489 #define	LDGETT	(LDIOC|8)
490 #define	LDSETT	(LDIOC|9)
491 
492 /* Slots for 386 compatibility */
493 
494 #define	LDSMAP	(LDIOC|110)
495 #define	LDGMAP	(LDIOC|111)
496 #define	LDNMAP	(LDIOC|112)
497 #define	LDEMAP	(LDIOC|113)
498 #define	LDDMAP	(LDIOC|114)
499 
500 /*
501  * These are retained for 386/XENIX compatibility.
502  */
503 
504 #define	DIOC		('d'<<8)
505 #define	DIOCGETP	(DIOC|8)		/* V7 */
506 #define	DIOCSETP	(DIOC|9)		/* V7 */
507 
508 /*
509  * Returns a non-zero value if there
510  * are characters in the input queue.
511  *
512  * XXX - somebody is confused here.  V7 had no such "ioctl", although XENIX may
513  * have added it; 4BSD had FIONREAD, which returned the number of characters
514  * waiting, and was supposed to work on all descriptors (i.e., every driver
515  * should make a stab at implementing it).
516  */
517 #define	FIORDCHK	(('f'<<8)|3)		/* V7 */
518 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
519 
520 /*
521  * Speeds
522  */
523 #define	B0	0
524 #define	B50	1
525 #define	B75	2
526 #define	B110	3
527 #define	B134	4
528 #define	B150	5
529 #define	B200	6
530 #define	B300	7
531 #define	B600	8
532 #define	B1200	9
533 #define	B1800	10
534 #define	B2400	11
535 #define	B4800	12
536 #define	B9600	13
537 #define	B19200	14
538 #define	B38400	15
539 #define	B57600	16
540 #define	B76800	17
541 #define	B115200	18
542 #define	B153600	19
543 #define	B230400	20
544 #define	B307200	21
545 #define	B460800	22
546 #define	B921600	23
547 
548 #ifndef _SYS_TTOLD_H
549 
550 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
551 /* Windowing structure to support JWINSIZE/TIOCSWINSZ/TIOCGWINSZ */
552 struct winsize {
553 	unsigned short ws_row;	/* rows, in characters */
554 	unsigned short ws_col;	/* columns, in character */
555 	unsigned short ws_xpixel;	/* horizontal size, pixels */
556 	unsigned short ws_ypixel;	/* vertical size, pixels */
557 };
558 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
559 
560 #endif /* end _SYS_TTOLD_H */
561 
562 #ifdef	__cplusplus
563 }
564 #endif
565 
566 #endif	/* _SYS_TERMIOS_H */
567