2 #include <sys/socket.h>
8 #include <netinet/in.h>
18 #define WRITE_WAIT_TIME 8 /* unit: sec */
19 #define READ_WAIT_MIN 6 /* unit: sec */
22 usage(const char *cmd)
24 fprintf(stderr, "%s -p port\n", cmd);
29 connect_client(int port)
31 struct sockaddr_in in;
34 s = socket(AF_INET, SOCK_STREAM, 0);
36 err(1, "client socket failed");
38 memset(&in, 0, sizeof(in));
39 in.sin_family = AF_INET;
40 in.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
41 in.sin_port = htons(port);
42 if (connect(s, (const struct sockaddr *)&in, sizeof(in)) < 0)
43 err(1, "connect failed");
45 sleep(WRITE_WAIT_TIME);
46 write(s, &dummy, sizeof(dummy));
53 main(int argc, char *argv[])
55 struct sockaddr_in in;
57 int opt, port, dummy, n, status, panic, ex;
58 struct timespec stime, etime;
65 while ((opt = getopt(argc, argv, "p:")) != -1) {
70 port = strtol(optarg, &endptr, 0);
72 errx(1, "invalid -p");
82 serv_s = socket(AF_INET, SOCK_STREAM, 0);
84 err(1, "socket failed");
86 memset(&in, 0, sizeof(in));
87 in.sin_family = AF_INET;
88 in.sin_port = htons(port);
89 if (bind(serv_s, (const struct sockaddr *)&in, sizeof(in)) < 0)
90 err(1, "bind failed");
92 if (listen(serv_s, 0) < 0)
93 err(1, "listen failed");
97 err(1, "fork failed");
98 } else if (pid == 0) {
103 s = accept(serv_s, NULL, NULL);
105 warn("accept failed");
110 clock_gettime(CLOCK_MONOTONIC, &stime);
111 n = read(s, &dummy, sizeof(dummy));
115 } else if (n != sizeof(dummy)) {
116 warnx("read size mismatch");
119 clock_gettime(CLOCK_MONOTONIC, &etime);
121 if (etime.tv_sec - stime.tv_sec < READ_WAIT_MIN) {
122 warnx("invalid wait time %ld", etime.tv_sec - stime.tv_sec);
128 fprintf(stderr, "passed\n");
131 waitpid(pid, &status, 0);