2 #include <sys/socket.h>
6 #include <netinet/in.h>
16 #define CHECKFD_CMD "checkfd"
17 #define CHECKFD_PATH "/usr/local/bin/" CHECKFD_CMD
20 usage(const char *cmd
)
22 fprintf(stderr
, "%s -p port\n", cmd
);
27 connect_client(int port
)
29 struct sockaddr_in in
;
32 memset(&in
, 0, sizeof(in
));
33 in
.sin_family
= AF_INET
;
34 in
.sin_addr
.s_addr
= htonl(INADDR_LOOPBACK
);
35 in
.sin_port
= htons(port
);
37 s
= socket(AF_INET
, SOCK_STREAM
, 0);
39 err(1, "client socket failed");
40 if (connect(s
, (const struct sockaddr
*)&in
, sizeof(in
)) < 0)
41 err(1, "connect failed");
48 main(int argc
, char *argv
[])
51 struct sockaddr_in in
;
53 int opt
, port
, status
, ecode
, error
;
56 while ((opt
= getopt(argc
, argv
, "p:")) != -1) {
61 port
= strtol(optarg
, &endptr
, 0);
63 errx(1, "invalid -p %s", optarg
);
73 serv_s
= socket(AF_INET
, SOCK_STREAM
, 0);
75 err(1, "socket failed");
77 memset(&in
, 0, sizeof(in
));
78 in
.sin_family
= AF_INET
;
79 in
.sin_port
= htons(port
);
80 if (bind(serv_s
, (const struct sockaddr
*)&in
, sizeof(in
)) < 0)
81 err(1, "bind failed");
83 if (listen(serv_s
, 0) < 0)
84 err(1, "listen failed");
88 err(1, "fork failed");
89 } else if (pid
== 0) {
95 s
= accept4(serv_s
, NULL
, NULL
, SOCK_CLOEXEC
);
101 /* Kill connect_client */
103 waitpid(pid
, &status
, 0);
106 errc(1, error
, "accept4 failed");
110 err(1, "fork failed");
111 } else if (pid
== 0) {
114 snprintf(fd
, sizeof(fd
), "%d", s
);
115 execl(CHECKFD_PATH
, CHECKFD_CMD
, fd
, NULL
);
118 if (waitpid(pid
, &status
, 0) < 0)
119 err(1, "waitpid failed");
120 if (!WIFEXITED(status
))
121 errx(1, "not exited");
122 ecode
= WEXITSTATUS(status
);
124 warnx("exit code %d", ecode
);
128 fprintf(stderr
, "passed\n");