When a client disconnects, the read from the client's fd will return
EOF. We should destroy the client in this situation.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
struct client {
struct discover_server *server;
struct list_item list;
struct client {
struct discover_server *server;
struct list_item list;
if (client->fd >= 0)
close(client->fd);
if (client->fd >= 0)
close(client->fd);
+ if (client->waiter)
+ waiter_remove(client->waiter);
+
list_remove(&client->list);
return 0;
list_remove(&client->list);
return 0;
message = pb_protocol_read_message(client, client->fd);
message = pb_protocol_read_message(client, client->fd);
+ if (!message) {
+ talloc_free(client);
if (message->action != PB_PROTOCOL_ACTION_BOOT) {
pb_log("%s: invalid action %d\n", __func__, message->action);
if (message->action != PB_PROTOCOL_ACTION_BOOT) {
pb_log("%s: invalid action %d\n", __func__, message->action);
}
/* add to our list of clients */
}
/* 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);
list_add(&server->clients, &client->list);
talloc_set_destructor(client, client_destructor);
- 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);