2 * Splice from network to stdout
11 #include <netinet/in.h>
12 #include <arpa/inet.h>
20 static int usage(char *name)
22 fprintf(stderr, "%s: port\n", name);
26 static int splice_from_net(int fd)
35 ret = poll(&pfd, 1, -1);
41 if (!(pfd.revents & POLLIN))
44 ret = splice(fd, NULL, STDOUT_FILENO, NULL, SPLICE_SIZE, 0);
47 return error("splice");
55 static int get_connect(int fd, struct sockaddr_in *addr)
57 socklen_t socklen = sizeof(*addr);
66 ret = poll(&pfd, 1, -1);
72 connfd = accept(fd, (struct sockaddr *) addr, &socklen);
74 return error("accept");
81 int main(int argc, char *argv[])
83 struct sockaddr_in addr;
88 return usage(argv[0]);
90 if (check_output_pipe())
91 return usage(argv[0]);
95 fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
97 return error("socket");
100 if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0)
101 return error("setsockopt");
103 memset(&addr, 0, sizeof(addr));
104 addr.sin_family = AF_INET;
105 addr.sin_addr.s_addr = htonl(INADDR_ANY);
106 addr.sin_port = htons(port);
108 if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0)
109 return error("bind");
110 if (listen(fd, 1) < 0)
111 return error("listen");
113 connfd = get_connect(fd, &addr);
117 return splice_from_net(connfd);