robustify error handling
diff --git a/telnet-proxy.c b/telnet-proxy.c
index 640a9ba..af7ddad 100644
--- a/telnet-proxy.c
+++ b/telnet-proxy.c
@@ -126,6 +126,7 @@
 void libtelnet_send_cb(struct libtelnet_t *telnet, unsigned char *buffer,
 		unsigned int size, void *user_data) {
 	struct conn_t *conn = (struct conn_t*)user_data;
+	int rs;
 
 	/* DONT SPAM
 	printf("%s SEND: ", conn->name);
@@ -134,7 +135,19 @@
 	*/
 
 	/* send data */
-	send(conn->sock, buffer, size, 0);
+	while (size > 0) {
+		if ((rs = send(conn->sock, buffer, size, 0)) == -1) {
+			fprintf(stderr, "send() failed: %s\n", strerror(errno));
+			exit(1);
+		} else if (rs == 0) {
+			fprintf(stderr, "send() unexpectedly returned 0\n");
+			exit(1);
+		}
+
+		/* update pointer and size to see if we've got more to send */
+		buffer += rs;
+		size -= rs;
+	}
 }
 
 void libtelnet_command_cb(struct libtelnet_t *telnet, unsigned char cmd,
@@ -202,11 +215,11 @@
 		return 1;
 	}
 
-	/* re-use addr */
+	/* reuse address option */
 	rs = 1;
 	setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &rs, sizeof(rs));
 
-	/* bind */
+	/* bind to listening addr/port */
 	memset(&addr, 0, sizeof(addr));
 	addr.sin_family = AF_INET;
 	addr.sin_addr.s_addr = INADDR_ANY;
@@ -216,13 +229,11 @@
 		return 1;
 	}
 
-	/* listen */
+	/* wait for client */
 	if (listen(listen_sock, 5) == -1) {
 		fprintf(stderr, "listen() failed: %s\n", strerror(errno));
 		return 1;
 	}
-
-	/* wait for client connection */
 	if ((client.sock = accept(listen_sock, (struct sockaddr *)&addr, &addrlen)) == -1) {
 		fprintf(stderr, "accept() failed: %s\n", strerror(errno));
 		return 1;
@@ -234,15 +245,13 @@
 		return 1;
 	}
 
-	/* bind */
+	/* connect to server */
 	memset(&addr, 0, sizeof(addr));
 	addr.sin_family = AF_INET;
 	if (bind(server.sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
 		fprintf(stderr, "bind() failed: %s\n", strerror(errno));
 		return 1;
 	}
-
-	/* connect */
 	memset(&addr, 0, sizeof(addr));
 	if (inet_pton(AF_INET, argv[1], &addr.sin_addr) != 1) {
 		fprintf(stderr, "inet_pton() failed: %s\n", strerror(errno));
@@ -268,27 +277,37 @@
 	/* initialize poll descriptors */
 	memset(pfd, 0, sizeof(pfd));
 	pfd[0].fd = server.sock;
-	pfd[0].events = POLLIN | POLLHUP;
+	pfd[0].events = POLLIN;
 	pfd[1].fd = client.sock;
-	pfd[1].events = POLLIN | POLLHUP;
+	pfd[1].events = POLLIN;
 
 	/* loop while both connections are open */
 	while (poll(pfd, 2, -1) != -1) {
 		/* read from server */
 		if (pfd[0].revents & POLLIN) {
-			if ((rs = recv(pfd[0].fd, buffer, sizeof(buffer), 0)) > 0)
+			if ((rs = recv(server.sock, buffer, sizeof(buffer), 0)) > 0) {
 				libtelnet_push(&server.telnet, buffer, rs, (void*)&server);
+			} else if (rs == 0) {
+				printf("%s DISCONNECTED\e[0m\n", server.name);
+				break;
+			} else {
+				fprintf(stderr, "recv(server) failed: %s\n", strerror(errno));
+				exit(1);
+			}
 		}
-		if (pfd[0].revents & POLLHUP)
-			break;
 
 		/* read from client */
 		if (pfd[1].revents & POLLIN) {
-			if ((rs = recv(pfd[1].fd, buffer, sizeof(buffer), 0)) > 0)
+			if ((rs = recv(client.sock, buffer, sizeof(buffer), 0)) > 0) {
 				libtelnet_push(&client.telnet, buffer, rs, (void*)&client);
+			} else if (rs == 0) {
+				printf("%s DISCONNECTED\e[0m\n", client.name);
+				break;
+			} else {
+				fprintf(stderr, "recv(client) failed: %s\n", strerror(errno));
+				exit(1);
+			}
 		}
-		if (pfd[1].revents & POLLHUP)
-			break;
 	}
 
 	/* clean up */