1*73610d44SSepherosa Ziehau #include <sys/types.h>
2*73610d44SSepherosa Ziehau #include <sys/socket.h>
3*73610d44SSepherosa Ziehau #include <sys/wait.h>
4*73610d44SSepherosa Ziehau 
5*73610d44SSepherosa Ziehau #include <arpa/inet.h>
6*73610d44SSepherosa Ziehau #include <netinet/in.h>
7*73610d44SSepherosa Ziehau 
8*73610d44SSepherosa Ziehau #include <err.h>
9*73610d44SSepherosa Ziehau #include <errno.h>
10*73610d44SSepherosa Ziehau #include <stdio.h>
11*73610d44SSepherosa Ziehau #include <stdlib.h>
12*73610d44SSepherosa Ziehau #include <unistd.h>
13*73610d44SSepherosa Ziehau 
14*73610d44SSepherosa Ziehau #define CHECKFD_CMD	"checkfd"
15*73610d44SSepherosa Ziehau #define CHECKFD_PATH	"/usr/local/bin/" CHECKFD_CMD
16*73610d44SSepherosa Ziehau 
17*73610d44SSepherosa Ziehau int
main(void)18*73610d44SSepherosa Ziehau main(void)
19*73610d44SSepherosa Ziehau {
20*73610d44SSepherosa Ziehau 	pid_t pid;
21*73610d44SSepherosa Ziehau 	int s, status, ecode;
22*73610d44SSepherosa Ziehau 
23*73610d44SSepherosa Ziehau 	s = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
24*73610d44SSepherosa Ziehau 	if (s < 0)
25*73610d44SSepherosa Ziehau 		err(1, "socket failed");
26*73610d44SSepherosa Ziehau 
27*73610d44SSepherosa Ziehau 	pid = fork();
28*73610d44SSepherosa Ziehau 	if (pid < 0) {
29*73610d44SSepherosa Ziehau 		err(1, "fork failed");
30*73610d44SSepherosa Ziehau 	} else if (pid == 0) {
31*73610d44SSepherosa Ziehau 		char fd[8];
32*73610d44SSepherosa Ziehau 
33*73610d44SSepherosa Ziehau 		snprintf(fd, sizeof(fd), "%d", s);
34*73610d44SSepherosa Ziehau 		if (execl(CHECKFD_PATH, CHECKFD_CMD, fd, NULL) < 0)
35*73610d44SSepherosa Ziehau 			err(3, "execl failed");
36*73610d44SSepherosa Ziehau 	}
37*73610d44SSepherosa Ziehau 
38*73610d44SSepherosa Ziehau 	if (waitpid(pid, &status, 0) < 0)
39*73610d44SSepherosa Ziehau 		err(1, "waitpid failed");
40*73610d44SSepherosa Ziehau 
41*73610d44SSepherosa Ziehau 	if (!WIFEXITED(status))
42*73610d44SSepherosa Ziehau 		errx(1, CHECKFD_CMD " did not exit");
43*73610d44SSepherosa Ziehau 
44*73610d44SSepherosa Ziehau 	ecode = WEXITSTATUS(status);
45*73610d44SSepherosa Ziehau 	if (ecode != 0) {
46*73610d44SSepherosa Ziehau 		warnx("exit code %d", ecode);
47*73610d44SSepherosa Ziehau 		abort();
48*73610d44SSepherosa Ziehau 	}
49*73610d44SSepherosa Ziehau 
50*73610d44SSepherosa Ziehau 	fprintf(stderr, "passed\n");
51*73610d44SSepherosa Ziehau 	exit(0);
52*73610d44SSepherosa Ziehau }
53