blob: 98ee07d8289546620a2f1c2731f06b95c42bde7c [file] [log] [blame]
/* -*- Mode: C; tab-width: 8; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
#include "util.h"
int main(void) {
int fd;
int ret;
struct termios* tc;
struct termio* tio;
pid_t* pgrp;
int* navail;
int* outq;
struct winsize* w;
pid_t* sid;
int* nread;
int sockets[2];
signal(SIGTTOU, SIG_IGN);
fd = open("/dev/tty", O_RDWR);
if (fd < 0) {
atomic_puts("Can't open tty, aborting test");
atomic_puts("EXIT-SUCCESS");
return 0;
}
ALLOCATE_GUARD(tc, 'a');
test_assert(0 == ioctl(fd, TCGETS, tc));
VERIFY_GUARD(tc);
atomic_printf("TCGETS returned { iflag=0x%x, oflag=0x%x, cflag=0x%x, "
"lflag=0x%x }\n",
tc->c_iflag, tc->c_oflag, tc->c_cflag, tc->c_lflag);
test_assert(0 == ioctl(fd, TCSETS, tc));
test_assert(0 == ioctl(fd, TCSETSW, tc));
test_assert(0 == ioctl(fd, TCSETSF, tc));
ALLOCATE_GUARD(tio, 'b');
test_assert(0 == ioctl(fd, TCGETA, tio));
VERIFY_GUARD(tio);
atomic_printf("TCGETA returned { iflag=0x%x, oflag=0x%x, cflag=0x%x, "
"lflag=0x%x }\n",
tio->c_iflag, tio->c_oflag, tio->c_cflag, tio->c_lflag);
test_assert(0 == ioctl(fd, TCSETA, tio));
test_assert(0 == ioctl(fd, TCSETAW, tio));
test_assert(0 == ioctl(fd, TCSETAF, tio));
test_assert(0 == ioctl(fd, TIOCGLCKTRMIOS, tc));
VERIFY_GUARD(tc);
atomic_printf("TIOCGLCKTRMIOS returned { iflag=0x%x, oflag=0x%x, cflag=0x%x, "
"lflag=0x%x }\n",
tio->c_iflag, tio->c_oflag, tio->c_cflag, tio->c_lflag);
ret = ioctl(fd, TIOCSLCKTRMIOS, tc);
test_assert(ret >= 0 || errno == EPERM);
test_assert(0 == ioctl(fd, TCSBRK, 0));
test_assert(0 == ioctl(fd, TCSBRKP, 0));
test_assert(0 == ioctl(fd, TIOCSBRK, 0));
test_assert(0 == ioctl(fd, TIOCCBRK, 0));
ALLOCATE_GUARD(pgrp, 'c');
test_assert(0 == ioctl(fd, TIOCGPGRP, pgrp));
VERIFY_GUARD(pgrp);
if (*pgrp != 0) {
atomic_printf("TIOCGPGRP returned process group %d\n", *pgrp);
test_assert(0 == ioctl(fd, TIOCSPGRP, pgrp));
} else {
atomic_printf("Skipping TIOCSPGRP test - controlling tty outside PID ns.");
}
ALLOCATE_GUARD(navail, 'd');
test_assert(0 == ioctl(fd, TIOCINQ, navail));
VERIFY_GUARD(navail);
atomic_printf("TIOCINQ returned navail=%d\n", *navail);
ALLOCATE_GUARD(outq, 'e');
test_assert(0 == ioctl(fd, TIOCOUTQ, outq));
VERIFY_GUARD(outq);
atomic_printf("TIOCOUTQ returned outq=%d\n", *outq);
ALLOCATE_GUARD(w, 'f');
test_assert(0 == ioctl(fd, TIOCGWINSZ, w));
VERIFY_GUARD(w);
atomic_printf("TIOCGWINSZ returned {row:%d col:%d}\n", w->ws_row, w->ws_col);
test_assert(0 == ioctl(fd, TIOCSWINSZ, w));
ALLOCATE_GUARD(sid, 'g');
test_assert(0 == ioctl(fd, TIOCGSID, sid));
VERIFY_GUARD(sid);
atomic_printf("TIOCGSID returned %d\n", *sid);
socketpair(AF_UNIX, SOCK_STREAM, 0, sockets);
ALLOCATE_GUARD(nread, 'h');
test_assert(0 == ioctl(sockets[0], FIONREAD, nread));
VERIFY_GUARD(nread);
atomic_printf("FIONREAD returned nread=%d\n", *nread);
atomic_puts("EXIT-SUCCESS");
return 0;
}