server: attempt to handle client ctrl-c

Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/server.c b/server.c
index 93f5d8e..d0ff25a 100644
--- a/server.c
+++ b/server.c
@@ -120,6 +120,30 @@
 	void *pdu = NULL;
 
 	do {
+		struct pollfd pfd;
+
+		pfd.fd = sk;
+		pfd.events = POLLIN;
+		ret = 0;
+		do {
+			ret = poll(&pfd, 1, 100);
+			if (ret < 0) {
+				log_err("fio: poll: %s\n", strerror(errno));
+				break;
+			} else if (!ret)
+				continue;
+
+			if (pfd.revents & POLLIN)
+				break;
+			if (pfd.revents & (POLLERR|POLLHUP)) {
+				ret = 1;
+				break;
+			}
+		} while (ret >= 0);
+
+		if (ret < 0)
+			break;
+
 		ret = fio_recv_data(sk, &cmd, sizeof(cmd));
 		if (ret)
 			break;
@@ -168,9 +192,7 @@
 	if (ret) {
 		free(cmdret);
 		cmdret = NULL;
-	}
-
-	if (cmdret)
+	} else if (cmdret)
 		cmdret->flags &= ~FIO_NET_CMD_F_MORE;
 
 	return cmdret;
@@ -216,7 +238,7 @@
 	return ret;
 }
 
-static int send_simple_command(int sk, uint16_t opcode, uint64_t serial)
+int fio_net_send_simple_cmd(int sk, uint16_t opcode, uint64_t serial)
 {
 	struct fio_net_cmd cmd = {
 		.version	= __cpu_to_le16(FIO_SERVER_VER1),
@@ -229,29 +251,10 @@
 	return fio_send_data(sk, &cmd, sizeof(cmd));
 }
 
-/*
- * Send an ack for this command
- */
-static int ack_command(int sk, struct fio_net_cmd *cmd)
-{
-#if 0
-	return send_simple_command(sk, FIO_NET_CMD_ACK, cmd->serial);
-#else
-	return 0;
-#endif
-}
-
-#if 0
-static int nak_command(int sk, struct fio_net_cmd *cmd)
-{
-	return send_simple_command(sk, FIO_NET_CMD_NAK, cmd->serial);
-}
-#endif
-
 static int send_quit_command(void)
 {
 	dprint(FD_NET, "server: sending quit\n");
-	return send_simple_command(server_fd, FIO_NET_CMD_QUIT, 0);
+	return fio_net_send_simple_cmd(server_fd, FIO_NET_CMD_QUIT, 0);
 }
 
 static int handle_cur_job(struct fio_net_cmd *cmd)
@@ -274,6 +277,7 @@
 
 	switch (cmd->opcode) {
 	case FIO_NET_CMD_QUIT:
+		fio_terminate_threads(TERMINATE_ALL);
 		return 1;
 	case FIO_NET_CMD_EXIT:
 		exit_backend = 1;
@@ -306,10 +310,6 @@
 			break;
 		}
 
-		ret = ack_command(sk, cmd);
-		if (ret)
-			break;
-
 		ret = handle_command(cmd);
 		if (ret)
 			break;
@@ -324,6 +324,12 @@
 	return ret;
 }
 
+void fio_server_idle_loop(void)
+{
+	if (server_fd != -1)
+		handle_connection(server_fd);
+}
+
 static int accept_loop(int listen_sk)
 {
 	struct sockaddr addr;
@@ -364,8 +370,12 @@
 
 	server_fd = sk;
 
+	printf("handle\n");
+
 	exitval = handle_connection(sk);
 
+	printf("out, exit %d\n", exitval);
+
 	server_fd = -1;
 	close(sk);