server: improve exit handling

Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/server.c b/server.c
index f204c28..dee164d 100644
--- a/server.c
+++ b/server.c
@@ -269,7 +269,7 @@
 	return fio_send_data(sk, &cmd, sizeof(cmd));
 }
 
-static int send_quit_command(void)
+static int fio_server_send_quit_cmd(void)
 {
 	dprint(FD_NET, "server: sending quit\n");
 	return fio_net_send_simple_cmd(server_fd, FIO_NET_CMD_QUIT, 0);
@@ -286,7 +286,7 @@
 	fio_net_send_simple_cmd(server_fd, FIO_NET_CMD_START, 0);
 
 	ret = exec_run();
-	send_quit_command();
+	fio_server_send_quit_cmd();
 	reset_fio_state();
 	return ret;
 }
@@ -308,7 +308,7 @@
 	fio_net_send_simple_cmd(server_fd, FIO_NET_CMD_START, 0);
 
 	ret = exec_run();
-	send_quit_command();
+	fio_server_send_quit_cmd();
 	reset_fio_state();
 	return ret;
 }
@@ -335,7 +335,6 @@
 	switch (cmd->opcode) {
 	case FIO_NET_CMD_QUIT:
 		fio_terminate_threads(TERMINATE_ALL);
-		send_quit_command();
 		return -1;
 	case FIO_NET_CMD_EXIT:
 		exit_backend = 1;
@@ -662,10 +661,34 @@
 	return ret;
 }
 
+static void sig_int(int sig)
+{
+	fio_terminate_threads(TERMINATE_ALL);
+	exit_backend = 1;
+}
+
+static void server_signal_handler(void)
+{
+	struct sigaction act;
+
+	memset(&act, 0, sizeof(act));
+	act.sa_handler = sig_int;
+	act.sa_flags = SA_RESTART;
+	sigaction(SIGINT, &act, NULL);
+
+	memset(&act, 0, sizeof(act));
+	act.sa_handler = sig_int;
+	act.sa_flags = SA_RESTART;
+	sigaction(SIGTERM, &act, NULL);
+}
+
+
 int fio_start_server(int daemonize)
 {
 	pid_t pid;
 
+	server_signal_handler();
+
 	if (!daemonize)
 		return fio_server();