#include #include #include #include #include #include #include void fail(const char *e) { perror(e); exit(1); } int main(int argc, char **argv) { struct sockaddr sa; socklen_t sl; int p[2]; int l, s, r; char buffer[4097]; l = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (l < 0) fail("L: socket()"); if (listen(l, 1) < 0) fail("L: listen()"); sl = sizeof(sa); if (getsockname(l, &sa, &sl) < 0) fail("L: getsockname()"); if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) fail("S: socket()"); if (connect(s, &sa, sl) < 0) fail("S: connect()"); sl = sizeof(sa); if ((r = accept(l, &sa, &sl)) < 0) fail("R: accept()"); pipe(p); send(s, buffer, sizeof(buffer), MSG_DONTWAIT); l = splice(r, NULL, p[1], NULL, 1048576, 3); splice(p[0], NULL, s, NULL, l, 3); exit(0); }