2 #include <sys/socket.h>
8 #include <netinet/in.h>
19 usage(const char *cmd)
21 fprintf(stderr, "%s -p port\n", cmd);
26 connect_client(int port, int ctrl_s)
28 struct sockaddr_in in;
31 s = socket(AF_INET, SOCK_STREAM, 0);
33 err(1, "client socket failed");
35 memset(&in, 0, sizeof(in));
36 in.sin_family = AF_INET;
37 in.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
38 in.sin_port = htons(port);
39 if (connect(s, (const struct sockaddr *)&in, sizeof(in)) < 0)
40 err(1, "connect failed");
43 write(ctrl_s, &dummy, sizeof(dummy));
50 main(int argc, char *argv[])
52 struct sockaddr_in in;
53 int serv_s, s, ctrl_s[2];
54 int opt, port, dummy, n, status, panic, ex;
61 while ((opt = getopt(argc, argv, "p:")) != -1) {
66 port = strtol(optarg, &endptr, 0);
68 errx(1, "invalid -p");
78 if (socketpair(AF_UNIX, SOCK_DGRAM, 0, ctrl_s) < 0)
79 err(1, "socketpair failed");
81 serv_s = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
83 err(1, "socket failed");
85 memset(&in, 0, sizeof(in));
86 in.sin_family = AF_INET;
87 in.sin_port = htons(port);
88 if (bind(serv_s, (const struct sockaddr *)&in, sizeof(in)) < 0)
89 err(1, "bind failed");
91 if (listen(serv_s, 0) < 0)
92 err(1, "listen failed");
96 err(1, "fork failed");
97 } else if (pid == 0) {
99 connect_client(port, ctrl_s[1]);
103 /* Wait for the connect */
104 read(ctrl_s[0], &dummy, sizeof(dummy));
106 s = accept(serv_s, NULL, NULL);
108 warn("accept failed");
113 n = read(s, &dummy, sizeof(dummy));
117 if (error != EAGAIN) {
118 warnx("invaid errno %d\n", error);
128 fprintf(stderr, "passed\n");
131 waitpid(pid, &status, 0);