diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/db.c | 11 | ||||
| -rw-r--r-- | src/server/server.c | 70 |
2 files changed, 65 insertions, 16 deletions
diff --git a/src/server/db.c b/src/server/db.c index 4cc449e..e2ad808 100644 --- a/src/server/db.c +++ b/src/server/db.c @@ -65,14 +65,5 @@ bool camu_db_open(struct camu_server *server, str *path) void camu_db_close(struct camu_server *server) { - struct camu_user *user; - al_array_foreach(server->users, i, user) { - al_str_free(&user->name); - } - al_array_free(server->users); - struct lia_list *list; - al_array_foreach(server->lists, i, list) { - lia_list_free(list); - } - al_array_free(server->lists); + (void)server; } diff --git a/src/server/server.c b/src/server/server.c index d75146e..cef05b0 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -292,6 +292,7 @@ static void list_callback(void *userdata, u8 op, struct lia_list_entry *entry, v break; } case LIANA_UNLOAD_ENTRY: + lia_node_close(resource->node); break; case LIANA_LIST_META: switch (*(u8 *)opaque) { @@ -566,6 +567,7 @@ static void handle_add_command(struct camu_server *server, struct lia_list *list #endif } al_assert(resource); + al_array_push(server->data.resources, resource); if (entry) { resource->entry = entry; resource->node = lia_server_create_node(&server->data.server, resource->entry); @@ -750,6 +752,7 @@ void camu_server_init(struct camu_server *server, struct nn_event_loop *loop) nn_rpc_add_command(&server->server, &commands[i]); } + al_array_init(server->data.resources); lia_server_init(&server->data.server, server->loop); #ifdef CAMU_HAVE_PORTAL @@ -778,6 +781,10 @@ void camu_server_close(struct camu_server *server) #ifdef CAMU_HAVE_PORTAL camu_portal_close(&server->bridge); #endif + struct lia_list *list; + al_array_foreach(server->lists, i, list) { + lia_list_close(list); + } lia_server_close(&server->data.server); #ifdef CAMU_DIRECT_MODE nn_multiplex_direct_close(); @@ -788,14 +795,65 @@ void camu_server_close(struct camu_server *server) void camu_server_free(struct camu_server *server) { - // This needs to happen in flight. - // Too many things can block us before we get here. - //struct camu_server_resource *resource; - //al_array_foreach(server->data.resources, i, resource) { - // cch_entry_free(&resource->entry); - //} + al_array_free(server->nodes); + al_array_free(server->clients); + al_array_free(server->sinks); + + struct camu_user *user; + al_array_foreach(server->users, i, user) { + al_str_free(&user->name); + al_free(user); + } + al_array_free(server->users); + + struct camu_resource *resource; + al_array_foreach(server->data.resources, i, resource) { + al_array_free(resource->pending); + switch (resource->type) { + case CAMU_RESOURCE_FILE: { + struct camu_resource_file *file = (struct camu_resource_file *)resource; + al_str_free(&file->path); + al_free(file); + break; + } +#ifdef NAUNET_HAS_CURL + case CAMU_RESOURCE_HTTP: + break; +#endif +#ifdef CACHE_HAVE_CDIO + case CAMU_RESOURCE_CDIO: + break; +#endif +#ifdef CAMU_HAVE_PORTAL + case CAMU_RESOURCE_PORTAL: { + struct camu_resource_portal *portal = (struct camu_resource_portal *)resource; + al_free(portal); + break; + } + case CAMU_RESOURCE_SIMPLE_SEARCH: { + struct camu_resource_portal *portal = (struct camu_resource_portal *)resource; + al_free(portal); + break; + } +#endif + } + } al_array_free(server->data.resources); + + struct lia_list *list; + al_array_foreach(server->lists, i, list) { + lia_list_free(list); + al_free(list); + } + al_array_free(server->lists); + lia_server_free(&server->data.server); + +#ifdef CAMU_HAVE_PORTAL + camu_post_cache_free(&server->cache); + camu_portal_free(&server->bridge); +#endif + nn_rpc_free(&server->server); al_str_free(&server->addr); } |