xref: /netbsd/tests/lib/librumphijack/h_client.c (revision 3efe214b)
1*3efe214bSandvar /*	$NetBSD: h_client.c,v 1.10 2021/09/16 22:19:12 andvar Exp $	*/
2906bea29Spooka 
3906bea29Spooka /*
4906bea29Spooka  * Copyright (c) 2011 The NetBSD Foundation, Inc.
5906bea29Spooka  * All rights reserved.
6906bea29Spooka  *
7906bea29Spooka  * Redistribution and use in source and binary forms, with or without
8906bea29Spooka  * modification, are permitted provided that the following conditions
9906bea29Spooka  * are met:
10906bea29Spooka  * 1. Redistributions of source code must retain the above copyright
11906bea29Spooka  *    notice, this list of conditions and the following disclaimer.
12906bea29Spooka  * 2. Redistributions in binary form must reproduce the above copyright
13906bea29Spooka  *    notice, this list of conditions and the following disclaimer in the
14906bea29Spooka  *    documentation and/or other materials provided with the distribution.
15906bea29Spooka  *
16906bea29Spooka  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17906bea29Spooka  * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18906bea29Spooka  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19906bea29Spooka  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20906bea29Spooka  * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21906bea29Spooka  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22906bea29Spooka  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23906bea29Spooka  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24906bea29Spooka  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25906bea29Spooka  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26906bea29Spooka  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27906bea29Spooka  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28906bea29Spooka  */
29906bea29Spooka 
30906bea29Spooka #include <sys/types.h>
316ba70ec0Spooka #include <sys/poll.h>
32906bea29Spooka #include <sys/select.h>
33906bea29Spooka 
34906bea29Spooka #include <err.h>
35906bea29Spooka #include <errno.h>
366ba70ec0Spooka #include <fcntl.h>
37906bea29Spooka #include <stdio.h>
38906bea29Spooka #include <stdlib.h>
39906bea29Spooka #include <string.h>
40906bea29Spooka #include <unistd.h>
41906bea29Spooka 
42906bea29Spooka int
main(int argc,char * argv[])43906bea29Spooka main(int argc, char *argv[])
44906bea29Spooka {
45906bea29Spooka 
46906bea29Spooka 	if (argc != 2) {
47906bea29Spooka 		errx(1, "need testname as param");
48906bea29Spooka 	}
49906bea29Spooka 
50906bea29Spooka 	if (strcmp(argv[1], "select_timeout") == 0) {
51906bea29Spooka 		fd_set rfds;
52906bea29Spooka 		struct timeval tv;
536c8e5a93Spooka 		int pipefd[2];
54906bea29Spooka 		int rv;
55906bea29Spooka 
56906bea29Spooka 		tv.tv_sec = 0;
57906bea29Spooka 		tv.tv_usec = 1;
58906bea29Spooka 
596c8e5a93Spooka 		if (pipe(pipefd) == -1)
60fb0a05b3Sjruoho 			err(EXIT_FAILURE, "pipe");
61906bea29Spooka 		FD_ZERO(&rfds);
626c8e5a93Spooka 		FD_SET(pipefd[0], &rfds);
63906bea29Spooka 
646c8e5a93Spooka 		rv = select(pipefd[0]+1, &rfds, NULL, NULL, &tv);
65906bea29Spooka 		if (rv == -1)
66fb0a05b3Sjruoho 			err(EXIT_FAILURE, "select");
67906bea29Spooka 		if (rv != 0)
68*3efe214bSandvar 			errx(EXIT_FAILURE, "select successful");
69906bea29Spooka 
706c8e5a93Spooka 		if (FD_ISSET(pipefd[0], &rfds))
71fb0a05b3Sjruoho 			errx(EXIT_FAILURE, "stdin fileno is still set");
72fb0a05b3Sjruoho 		return EXIT_SUCCESS;
736d41bab9Spooka 	} else if (strcmp(argv[1], "select_allunset") == 0) {
7439c153dbSmrg 		fd_set rfds, wfds, efds;
756d41bab9Spooka 		struct timeval tv;
766d41bab9Spooka 		int rv;
776d41bab9Spooka 
786d41bab9Spooka 		tv.tv_sec = 0;
796d41bab9Spooka 		tv.tv_usec = 1;
806d41bab9Spooka 
8139c153dbSmrg 		FD_ZERO(&rfds);
8239c153dbSmrg 		FD_ZERO(&wfds);
8339c153dbSmrg 		FD_ZERO(&efds);
846d41bab9Spooka 
8539c153dbSmrg 		rv = select(100, &rfds, &wfds, &efds, &tv);
866d41bab9Spooka 		if (rv == -1)
87fb0a05b3Sjruoho 			err(EXIT_FAILURE, "select");
886d41bab9Spooka 		if (rv != 0)
89*3efe214bSandvar 			errx(EXIT_FAILURE, "select successful");
906d41bab9Spooka 
916d41bab9Spooka 		rv = select(0, NULL, NULL, NULL, &tv);
926d41bab9Spooka 		if (rv == -1)
93fb0a05b3Sjruoho 			err(EXIT_FAILURE, "select2");
946d41bab9Spooka 		if (rv != 0)
95*3efe214bSandvar 			errx(EXIT_FAILURE, "select2 successful");
966d41bab9Spooka 
97fb0a05b3Sjruoho 		return EXIT_SUCCESS;
986ba70ec0Spooka 	} else if (strcmp(argv[1], "invafd") == 0) {
996ba70ec0Spooka 		struct pollfd pfd[2];
100f35c89d4Spooka 		int fd, rv;
1016ba70ec0Spooka 
1026ba70ec0Spooka 		fd = open("/rump/dev/null", O_RDWR);
1036ba70ec0Spooka 		if (fd == -1)
104fb0a05b3Sjruoho 			err(EXIT_FAILURE, "open");
1056ba70ec0Spooka 		close(fd);
1066ba70ec0Spooka 
1076ba70ec0Spooka 		pfd[0].fd = STDIN_FILENO;
1086ba70ec0Spooka 		pfd[0].events = POLLIN;
1096ba70ec0Spooka 		pfd[1].fd = fd;
1106ba70ec0Spooka 		pfd[1].events = POLLIN;
1116ba70ec0Spooka 
112f35c89d4Spooka 		if ((rv = poll(pfd, 2, INFTIM)) != 1)
113fb0a05b3Sjruoho 			errx(EXIT_FAILURE, "poll unexpected rv %d (%d)",
114fb0a05b3Sjruoho 			    rv, errno);
1156ba70ec0Spooka 		if (pfd[1].revents != POLLNVAL || pfd[0].revents != 0)
116fb0a05b3Sjruoho 			errx(EXIT_FAILURE, "poll unexpected revents");
1176ba70ec0Spooka 
118fb0a05b3Sjruoho 		return EXIT_SUCCESS;
1194fd7b519Spooka 	} else if (strcmp(argv[1], "fdoff8") == 0) {
1200d02a313Sjruoho 
1210d02a313Sjruoho 		(void)closefrom(0);
1220d02a313Sjruoho 
1234fd7b519Spooka 		int fd;
1244fd7b519Spooka 
1250d02a313Sjruoho 		do {
1264fd7b519Spooka 			if ((fd = open("/dev/null", O_RDWR)) == -1)
127fb0a05b3Sjruoho 				err(EXIT_FAILURE, "open1");
1280d02a313Sjruoho 		} while (fd < 7);
1294fd7b519Spooka 		fd = open("/dev/null", O_RDWR);
1304fd7b519Spooka 		if (fd != -1 || errno != ENFILE)
131fb0a05b3Sjruoho 			errx(EXIT_FAILURE, "unexpected fd8 %d %d", fd, errno);
1324fd7b519Spooka 		if (fcntl(0, F_MAXFD) != 7)
133fb0a05b3Sjruoho 			errx(EXIT_FAILURE, "fd leak?");
1344fd7b519Spooka 		if ((fd = open("/rump/dev/null", O_RDWR)) != 8)
135fb0a05b3Sjruoho 			errx(EXIT_FAILURE, "rump open %d %d", fd, errno);
136fb0a05b3Sjruoho 		return EXIT_SUCCESS;
137906bea29Spooka 	} else {
138906bea29Spooka 		return ENOTSUP;
139906bea29Spooka 	}
140906bea29Spooka }
141