2 * Splice from network to stdout
11 #include <netinet/in.h>
12 #include <arpa/inet.h>
20 static unsigned int splice_size = SPLICE_SIZE;
21 static int wait_for_poll;
23 static int usage(char *name)
25 fprintf(stderr, "%s: [-s splice size] [-w wait for poll] port\n", name);
29 static int splice_from_net(int fd)
40 ret = poll(&pfd, 1, -1);
46 if (!(pfd.revents & POLLIN))
50 ret = ssplice(fd, NULL, STDOUT_FILENO, NULL, splice_size, 0);
53 return error("splice");
61 static int get_connect(int fd, struct sockaddr_in *addr)
63 socklen_t socklen = sizeof(*addr);
72 ret = poll(&pfd, 1, -1);
78 connfd = accept(fd, (struct sockaddr *) addr, &socklen);
80 return error("accept");
87 static int parse_options(int argc, char *argv[])
91 while ((c = getopt(argc, argv, "s:w:")) != -1) {
94 splice_size = atoi(optarg);
98 wait_for_poll = atoi(optarg);
110 int main(int argc, char *argv[])
112 struct sockaddr_in addr;
114 int connfd, opt, fd, index;
117 return usage(argv[0]);
119 if (check_output_pipe())
120 return usage(argv[0]);
122 index = parse_options(argc, argv);
123 if (index == -1 || index + 1 > argc)
124 return usage(argv[0]);
126 port = atoi(argv[index]);
128 fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
130 return error("socket");
133 if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0)
134 return error("setsockopt");
136 memset(&addr, 0, sizeof(addr));
137 addr.sin_family = AF_INET;
138 addr.sin_addr.s_addr = htonl(INADDR_ANY);
139 addr.sin_port = htons(port);
141 if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0)
142 return error("bind");
143 if (listen(fd, 1) < 0)
144 return error("listen");
146 connfd = get_connect(fd, &addr);
150 return splice_from_net(connfd);