Free remaining pollers before exiting

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
diff --git a/console-server.c b/console-server.c
index 3defd65..e0b4249 100644
--- a/console-server.c
+++ b/console-server.c
@@ -428,7 +428,7 @@
 int main(int argc, char **argv)
 {
 	struct console *console;
-	int rc;
+	int rc, i;
 
 	console = malloc(sizeof(struct console));
 	memset(console, 0, sizeof(*console));
@@ -494,6 +494,8 @@
 	handlers_fini(console);
 
 out_free:
+	free(console->pollers);
+	free(console->pollfds);
 	free(console->tty_sysfs_devnode);
 	free(console->tty_dev);
 	free(console);
diff --git a/socket-handler.c b/socket-handler.c
index 8e0cebc..d7ef00c 100644
--- a/socket-handler.c
+++ b/socket-handler.c
@@ -21,6 +21,7 @@
 struct socket_handler {
 	struct handler	handler;
 	struct console	*console;
+	struct poller	*poller;
 	int		sd;
 
 	struct client	*clients;
@@ -140,8 +141,8 @@
 		return -1;
 	}
 
-	console_register_poller(console, handler, socket_poll, sh->sd, POLLIN,
-			NULL);
+	sh->poller = console_register_poller(console, handler, socket_poll,
+			sh->sd, POLLIN, NULL);
 
 	return 0;
 }
@@ -161,6 +162,14 @@
 static void socket_fini(struct handler *handler)
 {
 	struct socket_handler *sh = to_socket_handler(handler);
+	int i;
+
+	for (i = 0; i < sh->n_clients; i++)
+		client_close(sh, &sh->clients[i]);
+
+	if (sh->poller)
+		console_unregister_poller(sh->console, sh->poller);
+
 	close(sh->sd);
 }