about summary refs log tree commit diff
path: root/buc.c
blob: 626fa2e12f8ab2e141e5d7db3de7c954c4847b55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <poll.h>

char buf[512]; progress;
atoi(), err(), exit(), read(), write();

#define	readbuf(sock)	((((progress = read((sock), buf, sizeof(buf))) == -1) && err(1, "read()") || !progress && exit(0)), progress)
#define	sendbuf(sock, size)	(write(sock, buf, size) == -1 && err(1, "write()"))

main(argc, argv) char **argv; {
	struct sockaddr_in addr = {AF_INET, htons(argc > 2 ? atoi(argv[2]) : 8604), inet_addr(argc > 1 ? argv[1] : "127.0.0.1")};
	struct pollfd fds[2] = {{0, POLLIN}, {0, POLLIN}};
	for (	(fds[1].fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 && err(1, "socket()"),
	     	connect(fds[1].fd, (void *)&addr, sizeof(addr)) == -1 && err(1, "connect()");
	;)   	poll(fds, 2, -1) == -1 && err(1, "poll()"),
	     	fds[0].revents & POLLIN && sendbuf(fds[1].fd, readbuf(0)),
	     	fds[1].revents & POLLIN && sendbuf(1, readbuf(fds[1].fd));
}