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