X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fdiscover-server.c;h=2509457376e021d6bbdc20501d4bf358a5195fb8;hp=ca20113a22267d8ca23b0bd25c472234bd3682b7;hb=7ff0c4b65517737a4aca2c1df7325a586bbd2ebf;hpb=64c7065659bd939564356d688dcd24c65e02d57f diff --git a/discover/discover-server.c b/discover/discover-server.c index ca20113..2509457 100644 --- a/discover/discover-server.c +++ b/discover/discover-server.c @@ -31,6 +31,7 @@ struct discover_server { struct client { struct discover_server *server; struct list_item list; + struct waiter *waiter; int fd; }; @@ -55,6 +56,9 @@ static int client_destructor(void *arg) if (client->fd >= 0) close(client->fd); + if (client->waiter) + waiter_remove(client->waiter); + list_remove(&client->list); return 0; @@ -172,8 +176,11 @@ static int discover_server_process_message(void *arg) message = pb_protocol_read_message(client, client->fd); - if (!message) + if (!message) { + talloc_free(client); return 0; + } + if (message->action != PB_PROTOCOL_ACTION_BOOT) { pb_log("%s: invalid action %d\n", __func__, message->action); @@ -201,13 +208,13 @@ static int discover_server_process_connection(void *arg) /* accept the incoming connection */ fd = accept(server->socket, NULL, 0); - if (!fd) { + if (fd < 0) { pb_log("accept: %s\n", strerror(errno)); return 0; } /* add to our list of clients */ - client = talloc(server, struct client); + client = talloc_zero(server, struct client); list_add(&server->clients, &client->list); talloc_set_destructor(client, client_destructor); @@ -229,8 +236,8 @@ static int discover_server_process_connection(void *arg) opt->option); } - waiter_register(server->waitset, client->fd, WAIT_IN, - discover_server_process_message, client); + client->waiter = waiter_register(server->waitset, client->fd, WAIT_IN, + discover_server_process_message, client); return 0; }