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