xref: /openbsd-src/regress/sys/kern/pledge/generic/test_tty.c (revision 45d3fdc76907af12134b16c34632d320627f6564)
1*45d3fdc7Stb /*	$OpenBSD: test_tty.c,v 1.5 2017/02/21 15:46:25 tb Exp $ */
24586e8ffSsemarie /*
34586e8ffSsemarie  * Copyright (c) 2015 Sebastien Marie <semarie@openbsd.org>
44586e8ffSsemarie  *
54586e8ffSsemarie  * Permission to use, copy, modify, and distribute this software for any
64586e8ffSsemarie  * purpose with or without fee is hereby granted, provided that the above
74586e8ffSsemarie  * copyright notice and this permission notice appear in all copies.
84586e8ffSsemarie  *
94586e8ffSsemarie  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
104586e8ffSsemarie  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
114586e8ffSsemarie  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
124586e8ffSsemarie  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
134586e8ffSsemarie  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
144586e8ffSsemarie  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
154586e8ffSsemarie  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
164586e8ffSsemarie  */
174586e8ffSsemarie 
184586e8ffSsemarie #include <sys/ioctl.h>
194586e8ffSsemarie #include <sys/termios.h>
204586e8ffSsemarie #include <sys/ttycom.h>
214586e8ffSsemarie 
224586e8ffSsemarie #include <errno.h>
234586e8ffSsemarie #include <fcntl.h>
244586e8ffSsemarie #include <unistd.h>
254586e8ffSsemarie #include <stdio.h>
264586e8ffSsemarie #include <stdlib.h>
27*45d3fdc7Stb #include <util.h>
284586e8ffSsemarie 
294586e8ffSsemarie 
304586e8ffSsemarie void
test_request_tty()314586e8ffSsemarie test_request_tty()
324586e8ffSsemarie {
33*45d3fdc7Stb 	int amaster, fd;
344586e8ffSsemarie 	struct termios ts; /* sys/termios.h */
354586e8ffSsemarie 	struct winsize ws; /* sys/ttycom.h */
364586e8ffSsemarie 
37*45d3fdc7Stb 	/* get a tty */
38*45d3fdc7Stb 	if (openpty(&amaster, &fd, NULL, NULL, NULL) == -1)
39*45d3fdc7Stb 		_exit(errno);
40*45d3fdc7Stb 	close(amaster);
414586e8ffSsemarie 
42feae6f75Ssemarie 	/* tests that need tty+proc (stdio for pledge(2) */
43feae6f75Ssemarie 	if (pledge("stdio tty proc", NULL) == -1)
444586e8ffSsemarie 		_exit(errno);
454586e8ffSsemarie 
464586e8ffSsemarie 	/* TIOCSPGRP (tty+proc) */
474586e8ffSsemarie 	if ((tcsetpgrp(fd, 1) == -1) && (errno != ENOTTY))
484586e8ffSsemarie 		_exit(errno);
494586e8ffSsemarie 	errno = 0; /* discard error */
504586e8ffSsemarie 
518a3e8671Ssemarie 	/* tests that only need tty (and stdio for calling ioctl(2)) */
528a3e8671Ssemarie 	if (pledge("stdio tty", NULL) == -1)
534586e8ffSsemarie 		_exit(errno);
544586e8ffSsemarie 
554586e8ffSsemarie 
564586e8ffSsemarie 	/* TIOCGETA */
574586e8ffSsemarie 	if (ioctl(fd, TIOCGETA, &ts) == -1)
584586e8ffSsemarie 		_exit(errno);
594586e8ffSsemarie 
604586e8ffSsemarie 	/* TIOCGWINSZ */
614586e8ffSsemarie 	if (ioctl(fd, TIOCGWINSZ, &ws) == -1)
624586e8ffSsemarie 		_exit(errno);
634586e8ffSsemarie 
644586e8ffSsemarie 	/* TIOCSBRK */
654586e8ffSsemarie 	if ((ioctl(fd, TIOCSBRK, NULL) == -1) && (errno != ENOTTY))
664586e8ffSsemarie 		_exit(errno);
674586e8ffSsemarie 	errno = 0; /* discard error */
684586e8ffSsemarie 
694586e8ffSsemarie 	/* TIOCCDTR */
704586e8ffSsemarie 	if ((ioctl(fd, TIOCCDTR, NULL) == -1) && (errno != ENOTTY))
714586e8ffSsemarie 		_exit(errno);
724586e8ffSsemarie 	errno = 0; /* discard error */
734586e8ffSsemarie 
744586e8ffSsemarie 	/* TIOCSETA */
754586e8ffSsemarie 	if (tcsetattr(fd, TCSANOW, &ts) == -1)
764586e8ffSsemarie 		_exit(errno);
774586e8ffSsemarie 
784586e8ffSsemarie 	/* TIOCSETAW */
794586e8ffSsemarie 	if (tcsetattr(fd, TCSADRAIN, &ts) == -1)
804586e8ffSsemarie 		_exit(errno);
814586e8ffSsemarie 
824586e8ffSsemarie 	/* TIOCSETAF */
834586e8ffSsemarie 	if (tcsetattr(fd, TCSAFLUSH, &ts) == -1)
844586e8ffSsemarie 		_exit(errno);
854586e8ffSsemarie }
86