11 #include <netinet/in.h>
12 #include <arpa/inet.h>
20 static int usage(char *name)
22 fprintf(stderr, "%s: target port\n", name);
26 int main(int argc, char *argv[])
28 struct sockaddr_in addr;
34 return usage(argv[0]);
36 if (fstat(STDIN_FILENO, &sb) < 0)
38 if (!S_ISFIFO(sb.st_mode)) {
39 fprintf(stderr, "stdin must be a pipe\n");
40 return usage(argv[0]);
45 memset(&addr, 0, sizeof(addr));
46 addr.sin_family = AF_INET;
47 addr.sin_port = htons(port);
49 if (inet_aton(argv[1], &addr.sin_addr) != 1) {
50 struct hostent *hent = gethostbyname(argv[1]);
53 return error("gethostbyname");
55 memcpy(&addr.sin_addr, hent->h_addr, 4);
58 printf("Connecting to %s/%d\n", argv[1], port);
60 fd = socket(AF_INET, SOCK_STREAM, 0);
62 return error("socket");
64 if (connect(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0)
65 return error("connect");
68 ret = splice(STDIN_FILENO, NULL, fd, NULL, SPLICE_SIZE, SPLICE_F_NONBLOCK);
70 if (errno == EAGAIN) {
74 return error("splice");