summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/db.c11
-rw-r--r--src/server/server.c70
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);
}