From 195dc3cb9aba698ea4bc4bcab5111feed69fb5d1 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Tue, 2 Feb 2021 12:21:36 +0100 Subject: [PATCH] Rename routes.{c,g} -> api.{c,h} and reduce locking where this is not needed to gain more speed for the API Signed-off-by: DL6ER --- src/FTL.h | 2 +- src/api/CMakeLists.txt | 4 +- src/api/{routes.c => api.c} | 57 +++++++++++++++++++---- src/api/{routes.h => api.h} | 0 src/api/auth.c | 2 +- src/api/dns.c | 13 ++++-- src/api/docs/docs.h | 2 +- src/api/ftl.c | 43 ++++++++++++------ src/api/history.c | 2 +- src/api/list.c | 39 ++++++++++++++-- src/api/network.c | 2 +- src/api/settings.c | 2 +- src/api/stats.c | 2 +- src/api/stats_database.c | 91 +------------------------------------ src/api/version.c | 2 +- src/datastructure.h | 1 + src/webserver/webserver.c | 2 +- 17 files changed, 132 insertions(+), 134 deletions(-) rename src/api/{routes.c => api.c} (85%) rename src/api/{routes.h => api.h} (100%) diff --git a/src/FTL.h b/src/FTL.h index 3db24b58..823bd17b 100644 --- a/src/FTL.h +++ b/src/FTL.h @@ -161,7 +161,7 @@ extern pthread_t DNSclientthread; extern pthread_t timerthread; // Intentionally ignore result of function declared warn_unused_result -#define igr(x) {__typeof__(x) __attribute__((unused)) d=(x);} +#define igr(x) {__typeof__(x) __attribute__((unused)) d=(x);} #define max(a,b) ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a > _b ? _a : _b; }) #define min(a,b) ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a < _b ? _a : _b; }) diff --git a/src/api/CMakeLists.txt b/src/api/CMakeLists.txt index 687c0a8d..89d47d73 100644 --- a/src/api/CMakeLists.txt +++ b/src/api/CMakeLists.txt @@ -9,6 +9,8 @@ # Please see LICENSE file for your rights under this license. set(sources + api.h + api.c auth.c dns.c dns.h @@ -16,8 +18,6 @@ set(sources history.c list.c network.c - routes.c - routes.h settings.c stats_database.c stats.c diff --git a/src/api/routes.c b/src/api/api.c similarity index 85% rename from src/api/routes.c rename to src/api/api.c index 655321b9..c6a262a1 100644 --- a/src/api/routes.c +++ b/src/api/api.c @@ -13,17 +13,12 @@ #include "../civetweb/civetweb.h" #include "../webserver/http-common.h" #include "../webserver/json_macros.h" -#include "routes.h" -#include "../shmem.h" +#include "api.h" #include "../config.h" +#include "../shmem.h" int api_handler(struct mg_connection *conn, void *ignored) { - // Lock during API access - lock_shm(); - - int ret = 0; - // Prepare API info struct struct ftl_conn api = { conn, @@ -41,47 +36,58 @@ int api_handler(struct mg_connection *conn, void *ignored) api.request->local_uri, api.request->query_string); + int ret = 0; /******************************** /api/dns ********************************/ if(startsWith("/api/dns/blocking", &api)) { + // Locks handled internally ret = api_dns_blocking(&api); } else if(startsWith("/api/dns/cache", &api)) { + // Locks handled internally ret = api_dns_cache(&api); } /************ /api/domains, /api/groups, /api/lists, /api/clients ********/ else if(startsWith("/api/domains", &api)) { + // Locks handled internally ret = api_list(&api); } else if(startsWith("/api/groups", &api)) { + // Locks handled internally ret = api_list(&api); } else if(startsWith("/api/lists", &api)) { + // Locks handled internally ret = api_list(&api); } else if(startsWith("/api/clients", &api)) { + // Locks handled internally ret = api_list(&api); } /******************************** /api/ftl ****************************/ else if(startsWith("/api/ftl/client", &api)) { + // Locks not needed ret = api_ftl_client(&api); } else if(startsWith("/api/ftl/logs/dns", &api)) { + // Locks handled internally ret = api_ftl_logs_dns(&api); } else if(startsWith("/api/ftl/sysinfo", &api)) { + // Locks not needed ret = api_ftl_sysinfo(&api); } else if(startsWith("/api/ftl/dbinfo", &api)) { + // Locks not needed ret = api_ftl_dbinfo(&api); } /******************************** /api/network ****************************/ @@ -92,99 +98,133 @@ int api_handler(struct mg_connection *conn, void *ignored) /******************************** /api/history **************************/ else if(startsWith("/api/history/clients", &api)) { + lock_shm(); ret = api_history_clients(&api); + unlock_shm(); } else if(startsWith("/api/history/queries", &api)) { + lock_shm(); ret = api_history_queries(&api); + unlock_shm(); } else if(startsWith("/api/history", &api)) { + lock_shm(); ret = api_history(&api); + unlock_shm(); } /******************************** /api/stats **************************/ else if(startsWith("/api/stats/summary", &api)) { + lock_shm(); ret = api_stats_summary(&api); + unlock_shm(); } else if(startsWith("/api/stats/query_types", &api)) { + lock_shm(); ret = api_stats_query_types(&api); + unlock_shm(); } else if(startsWith("/api/stats/upstreams", &api)) { + lock_shm(); ret = api_stats_upstreams(&api); + unlock_shm(); } else if(startsWith("/api/stats/top_domains", &api)) { + lock_shm(); ret = api_stats_top_domains(false, &api); + unlock_shm(); } else if(startsWith("/api/stats/top_blocked", &api)) { + lock_shm(); ret = api_stats_top_domains(true, &api); + unlock_shm(); } else if(startsWith("/api/stats/top_clients", &api)) { + lock_shm(); ret = api_stats_top_clients(false, &api); + unlock_shm(); } else if(startsWith("/api/stats/top_blocked_clients", &api)) { + lock_shm(); ret = api_stats_top_clients(true, &api); + unlock_shm(); } else if(startsWith("/api/stats/recent_blocked", &api)) { + lock_shm(); ret = api_stats_recentblocked(&api); + unlock_shm(); } else if(startsWith("/api/stats/database/overTime/history", &api)) { + // Locks not needed ret = api_stats_database_overTime_history(&api); } else if(startsWith("/api/stats/database/top_domains", &api)) { + // Locks not needed ret = api_stats_database_top_items(false, true, &api); } else if(startsWith("/api/stats/database/top_blocked", &api)) { + // Locks not needed ret = api_stats_database_top_items(true, true, &api); } else if(startsWith("/api/stats/database/top_clients", &api)) { + // Locks not needed ret = api_stats_database_top_items(false, false, &api); } else if(startsWith("/api/stats/database/summary", &api)) { + // Locks not needed ret = api_stats_database_summary(&api); } else if(startsWith("/api/stats/database/overTime/clients", &api)) { + // Locks not needed ret = api_stats_database_overTime_clients(&api); } else if(startsWith("/api/stats/database/query_types", &api)) { + // Locks not needed ret = api_stats_database_query_types(&api); } else if(startsWith("/api/stats/database/upstreams", &api)) { + // Locks not needed ret = api_stats_database_upstreams(&api); } /******************************** /api/version ****************************/ else if(startsWith("/api/version", &api)) { + // Locks not needed ret = api_version(&api); } /******************************** /api/auth ****************************/ else if(startsWith("/api/auth", &api)) { + // Locks not needed ret = api_auth(&api); } /******************************** /api/settings ****************************/ else if(startsWith("/api/settings/web", &api)) { + // Locks not needed ret = api_settings_web(&api); } /******************************** /api/settings ****************************/ else if((api.item = startsWith("/api/docs", &api)) != NULL) { + // Locks not needed ret = api_docs(&api); } /******************************** not found or invalid request**************/ @@ -210,8 +250,5 @@ int api_handler(struct mg_connection *conn, void *ignored) api.action_path = NULL; } - // Unlock after API access - unlock_shm(); - return ret; } diff --git a/src/api/routes.h b/src/api/api.h similarity index 100% rename from src/api/routes.h rename to src/api/api.h diff --git a/src/api/auth.c b/src/api/auth.c index 35c146ed..b5e34d2f 100644 --- a/src/api/auth.c +++ b/src/api/auth.c @@ -11,7 +11,7 @@ #include "../FTL.h" #include "../webserver/http-common.h" #include "../webserver/json_macros.h" -#include "routes.h" +#include "api.h" #include "../log.h" #include "../config.h" // read_setupVarsconf() diff --git a/src/api/dns.c b/src/api/dns.c index 15a57bd9..c0c536db 100644 --- a/src/api/dns.c +++ b/src/api/dns.c @@ -12,11 +12,12 @@ #include "dns.h" #include "../webserver/http-common.h" #include "../webserver/json_macros.h" -#include "routes.h" +#include "api.h" // {s,g}et_blockingstatus() #include "../setupVars.h" // set_blockingmode_timer() #include "../timers.h" +#include "../shmem.h" static int get_blocking(struct ftl_conn *api) { @@ -97,11 +98,17 @@ int api_dns_blocking(struct ftl_conn *api) { if(api->method == HTTP_GET) { - return get_blocking(api); + lock_shm(); + const int ret = get_blocking(api); + unlock_shm(); + return ret; } else if(api->method == HTTP_POST) { - return set_blocking(api); + lock_shm(); + const int ret = set_blocking(api); + unlock_shm(); + return ret; } else { diff --git a/src/api/docs/docs.h b/src/api/docs/docs.h index e21b6adc..d480aeec 100644 --- a/src/api/docs/docs.h +++ b/src/api/docs/docs.h @@ -14,7 +14,7 @@ #include "../../civetweb/civetweb.h" #include "../../webserver/http-common.h" #include "../../webserver/json_macros.h" -#include "../routes.h" +#include "../api.h" static const char index_html[] = { #include "hex/index.html" diff --git a/src/api/ftl.c b/src/api/ftl.c index b84eac28..a43861c0 100644 --- a/src/api/ftl.c +++ b/src/api/ftl.c @@ -11,7 +11,7 @@ #include "../FTL.h" #include "../webserver/http-common.h" #include "../webserver/json_macros.h" -#include "routes.h" +#include "api.h" // struct fifologData #include "../fifo.h" // sysinfo() @@ -299,7 +299,7 @@ int get_system_obj(struct ftl_conn *api, cJSON *system) // option is to use the MemAvailable (as opposed to MemFree) entry in // /proc/meminfo instead. long mem_total = -1, mem_used = -1, mem_free = -1, mem_avail = -1; - GetRamInKB(&mem_total, &mem_used, &mem_free, &mem_avail); + GetRamInKB(&mem_total, &mem_used, &mem_free, &mem_avail); // Total usable main memory size JSON_OBJ_ADD_NUMBER(ram, "total", mem_total); // Free memory size @@ -312,7 +312,7 @@ int get_system_obj(struct ftl_conn *api, cJSON *system) // says: "Many programs check /proc/meminfo to estimate how much free // memory is available. They generally do this by adding up "free" and // "cached", which was fine ten years ago, but is pretty much guaranteed - // to be wrong today." + // to be wrong today." JSON_OBJ_ADD_NUMBER(ram, "available", mem_avail); JSON_OBJ_ADD_ITEM(memory, "ram", ram); @@ -390,18 +390,17 @@ int get_system_obj(struct ftl_conn *api, cJSON *system) int get_ftl_obj(struct ftl_conn *api, cJSON *ftl) { cJSON *database = JSON_NEW_OBJ(); - JSON_OBJ_ADD_NUMBER(database, "gravity", counters->database.gravity); - JSON_OBJ_ADD_NUMBER(database, "groups", counters->database.groups); - JSON_OBJ_ADD_NUMBER(database, "lists", counters->database.lists); - JSON_OBJ_ADD_NUMBER(database, "clients", counters->database.clients); - cJSON *domains = JSON_NEW_OBJ(); - JSON_OBJ_ADD_NUMBER(domains, "allowed", counters->database.domains.allowed); - JSON_OBJ_ADD_NUMBER(domains, "denied", counters->database.domains.denied); - JSON_OBJ_ADD_ITEM(database, "domains", domains); - JSON_OBJ_ADD_ITEM(ftl, "database", database); - - JSON_OBJ_ADD_NUMBER(ftl, "privacy_level", config.privacylevel); + // Source from shared objects within lock + lock_shm(); + const int db_gravity = counters->database.gravity; + const int db_groups = counters->database.groups; + const int db_lists = counters->database.lists; + const int db_clients = counters->database.clients; + const int db_allowed = counters->database.domains.allowed; + const int db_denied = counters->database.domains.denied; + const int clients_total = counters->clients; + const int privacylevel = config.privacylevel; // unique_clients: count only clients that have been active within the most recent 24 hours int activeclients = 0; @@ -415,9 +414,23 @@ int get_ftl_obj(struct ftl_conn *api, cJSON *ftl) if(client->count > 0) activeclients++; } + unlock_shm(); + + JSON_OBJ_ADD_NUMBER(database, "gravity", db_gravity); + JSON_OBJ_ADD_NUMBER(database, "groups", db_groups); + JSON_OBJ_ADD_NUMBER(database, "lists", db_lists); + JSON_OBJ_ADD_NUMBER(database, "clients", db_clients); + + cJSON *domains = JSON_NEW_OBJ(); + JSON_OBJ_ADD_NUMBER(domains, "allowed", db_allowed); + JSON_OBJ_ADD_NUMBER(domains, "denied", db_denied); + JSON_OBJ_ADD_ITEM(database, "domains", domains); + JSON_OBJ_ADD_ITEM(ftl, "database", database); + + JSON_OBJ_ADD_NUMBER(ftl, "privacy_level", privacylevel); cJSON *clients = JSON_NEW_OBJ(); - JSON_OBJ_ADD_NUMBER(clients, "total", counters->clients); + JSON_OBJ_ADD_NUMBER(clients, "total",clients_total); JSON_OBJ_ADD_NUMBER(clients, "active", activeclients); JSON_OBJ_ADD_ITEM(ftl, "clients", clients); diff --git a/src/api/history.c b/src/api/history.c index b8d4bbbf..18c5a61b 100644 --- a/src/api/history.c +++ b/src/api/history.c @@ -11,7 +11,7 @@ #include "../FTL.h" #include "../webserver/http-common.h" #include "../webserver/json_macros.h" -#include "routes.h" +#include "api.h" #include "../shmem.h" #include "../datastructure.h" // overTime data diff --git a/src/api/list.c b/src/api/list.c index 8b05b573..21ac90a7 100644 --- a/src/api/list.c +++ b/src/api/list.c @@ -11,9 +11,10 @@ #include "../FTL.h" #include "../webserver/http-common.h" #include "../webserver/json_macros.h" -#include "routes.h" +#include "api.h" #include "../database/gravity-db.h" #include "../events.h" +#include "../shmem.h" // getNameFromIP() #include "../database/network-table.h" @@ -415,7 +416,13 @@ int api_list(struct ftl_conn *api) if(api->method == HTTP_GET) { // Read list item identified by URI (or read them all) - return api_list_read(api, 200, listtype, api->item); + // We would not actually need the SHM lock here, however, we do + // this for simplicity to ensure nobody else is editing the + // lists while we're doing this here + lock_shm(); + const int ret = api_list_read(api, 200, listtype, api->item); + unlock_shm(); + return ret; } else if(can_modify && api->method == HTTP_PUT) { @@ -428,7 +435,15 @@ int api_list(struct ftl_conn *api) NULL); } else - return api_list_write(api, listtype, api->item, payload); + { + // We would not actually need the SHM lock here, + // however, we do this for simplicity to ensure nobody + // else is editing the lists while we're doing this here + lock_shm(); + const int ret = api_list_write(api, listtype, api->item, payload); + unlock_shm(); + return ret; + } } else if(can_modify && api->method == HTTP_POST) { @@ -441,12 +456,26 @@ int api_list(struct ftl_conn *api) NULL); } else - return api_list_write(api, listtype, api->item, payload); + { + // We would not actually need the SHM lock here, + // however, we do this for simplicity to ensure nobody + // else is editing the lists while we're doing this here + lock_shm(); + const int ret = api_list_write(api, listtype, api->item, payload); + unlock_shm(); + return ret; + } } else if(can_modify && api->method == HTTP_DELETE) { // Delete item from list - return api_list_remove(api, listtype, api->item); + // We would not actually need the SHM lock here, however, we do + // this for simplicity to ensure nobody else is editing the + // lists while we're doing this here + lock_shm(); + const int ret = api_list_remove(api, listtype, api->item); + unlock_shm(); + return ret; } else if(!can_modify) { diff --git a/src/api/network.c b/src/api/network.c index ebcd7611..f133bc82 100644 --- a/src/api/network.c +++ b/src/api/network.c @@ -11,7 +11,7 @@ #include "../FTL.h" #include "../webserver/http-common.h" #include "../webserver/json_macros.h" -#include "routes.h" +#include "api.h" // networkrecord #include "../database/network-table.h" diff --git a/src/api/settings.c b/src/api/settings.c index 3932669d..82e22ff2 100644 --- a/src/api/settings.c +++ b/src/api/settings.c @@ -11,7 +11,7 @@ #include "../FTL.h" #include "../webserver/http-common.h" #include "../webserver/json_macros.h" -#include "routes.h" +#include "api.h" int api_settings_web(struct ftl_conn *api) { diff --git a/src/api/stats.c b/src/api/stats.c index 681c9df6..bb065476 100644 --- a/src/api/stats.c +++ b/src/api/stats.c @@ -11,7 +11,7 @@ #include "../FTL.h" #include "../webserver/http-common.h" #include "../webserver/json_macros.h" -#include "routes.h" +#include "api.h" #include "../shmem.h" #include "../datastructure.h" // read_setupVarsconf() diff --git a/src/api/stats_database.c b/src/api/stats_database.c index dad6c6a3..ecbaecc6 100644 --- a/src/api/stats_database.c +++ b/src/api/stats_database.c @@ -11,8 +11,7 @@ #include "../FTL.h" #include "../webserver/http-common.h" #include "../webserver/json_macros.h" -#include "routes.h" -#include "../shmem.h" +#include "api.h" // querytypes[] #include "../datastructure.h" // logg() @@ -39,9 +38,6 @@ int api_stats_database_overTime_history(struct ftl_conn *api) NULL); } - // Unlock shared memory (DNS resolver can continue to work while we're preforming database queries) - unlock_shm(); - // Open the database (this also locks the database) dbopen(); @@ -69,9 +65,6 @@ int api_stats_database_overTime_history(struct ftl_conn *api) sqlite3_finalize(stmt); dbclose(); - // Relock shared memory - lock_shm(); - return send_json_error(api, 500, "internal_error", "Failed to bind interval", @@ -87,9 +80,6 @@ int api_stats_database_overTime_history(struct ftl_conn *api) sqlite3_finalize(stmt); dbclose(); - // Relock shared memory - lock_shm(); - return send_json_error(api, 500, "internal_error", "Failed to bind from", @@ -105,9 +95,6 @@ int api_stats_database_overTime_history(struct ftl_conn *api) sqlite3_finalize(stmt); dbclose(); - // Relock shared memory - lock_shm(); - return send_json_error(api, 500, "internal_error", "Failed to bind until", @@ -164,8 +151,6 @@ int api_stats_database_overTime_history(struct ftl_conn *api) sqlite3_finalize(stmt); dbclose(); - // Re-lock shared memory before returning back to router subroutine - lock_shm(); JSON_SEND_OBJECT(json); } @@ -196,9 +181,6 @@ int api_stats_database_top_items(bool blocked, bool domains, struct ftl_conn *ap NULL); } - // Unlock shared memory (DNS resolver can continue to work while we're preforming database queries) - unlock_shm(); - // Open the database (this also locks the database) dbopen(); @@ -253,9 +235,6 @@ int api_stats_database_top_items(bool blocked, bool domains, struct ftl_conn *ap dbclose(); - // Relock shared memory - lock_shm(); - return send_json_error(api, 500, "internal_error", "Failed to prepare query string", @@ -271,9 +250,6 @@ int api_stats_database_top_items(bool blocked, bool domains, struct ftl_conn *ap sqlite3_finalize(stmt); dbclose(); - // Relock shared memory - lock_shm(); - return send_json_error(api, 500, "internal_error", "Failed to bind from", @@ -289,9 +265,6 @@ int api_stats_database_top_items(bool blocked, bool domains, struct ftl_conn *ap sqlite3_finalize(stmt); dbclose(); - // Relock shared memory - lock_shm(); - return send_json_error(api, 500, "internal_error", "Failed to bind until", @@ -307,9 +280,6 @@ int api_stats_database_top_items(bool blocked, bool domains, struct ftl_conn *ap sqlite3_finalize(stmt); dbclose(); - // Relock shared memory - lock_shm(); - return send_json_error(api, 500, "internal_error", "Failed to bind show", @@ -339,9 +309,6 @@ int api_stats_database_top_items(bool blocked, bool domains, struct ftl_conn *ap sqlite3_finalize(stmt); dbclose(); - // Re-lock shared memory before returning back to router subroutine - lock_shm(); - cJSON *json = JSON_NEW_OBJ(); JSON_OBJ_ADD_ITEM(json, (domains ? "top_domains" : "top_clients"), top_items); JSON_OBJ_ADD_NUMBER(json, (blocked ? "blocked_queries" : "total_queries"), total); @@ -366,9 +333,6 @@ int api_stats_database_summary(struct ftl_conn *api) NULL); } - // Unlock shared memory (DNS resolver can continue to work while we're preforming database queries) - unlock_shm(); - // Open the database (this also locks the database) dbopen(); @@ -395,9 +359,6 @@ int api_stats_database_summary(struct ftl_conn *api) // Close (= unlock) database connection dbclose(); - // Relock shared memory - lock_shm(); - return send_json_error(api, 500, "internal_error", "Internal server error", @@ -415,9 +376,6 @@ int api_stats_database_summary(struct ftl_conn *api) // Close (= unlock) database connection dbclose(); - // Re-lock shared memory before returning back to router subroutine - lock_shm(); - // Send JSON object JSON_SEND_OBJECT(json); } @@ -441,9 +399,6 @@ int api_stats_database_overTime_clients(struct ftl_conn *api) NULL); } - // Unlock shared memory (DNS resolver can continue to work while we're preforming database queries) - unlock_shm(); - // Open the database (this also locks the database) dbopen(); @@ -458,9 +413,6 @@ int api_stats_database_overTime_clients(struct ftl_conn *api) logg("api_stats_database_overTime_clients() - SQL error prepare outer (%i): %s", rc, sqlite3_errmsg(FTL_db)); - // Relock shared memory - lock_shm(); - return send_json_error(api, 500, "internal_error", "Failed to prepare outer statement", @@ -476,9 +428,6 @@ int api_stats_database_overTime_clients(struct ftl_conn *api) sqlite3_finalize(stmt); dbclose(); - // Relock shared memory - lock_shm(); - return send_json_error(api, 500, "internal_error", "Failed to bind from", @@ -494,9 +443,6 @@ int api_stats_database_overTime_clients(struct ftl_conn *api) sqlite3_finalize(stmt); dbclose(); - // Relock shared memory - lock_shm(); - return send_json_error(api, 500, "internal_error", "Failed to bind until", @@ -528,9 +474,6 @@ int api_stats_database_overTime_clients(struct ftl_conn *api) logg("api_stats_database_overTime_clients() - SQL error prepare (%i): %s", rc, sqlite3_errmsg(FTL_db)); - // Relock shared memory - lock_shm(); - return send_json_error(api, 500, "internal_error", "Failed to prepare inner statement", @@ -546,9 +489,6 @@ int api_stats_database_overTime_clients(struct ftl_conn *api) sqlite3_finalize(stmt); dbclose(); - // Relock shared memory - lock_shm(); - return send_json_error(api, 500, "internal_error", "Failed to bind interval", @@ -564,9 +504,6 @@ int api_stats_database_overTime_clients(struct ftl_conn *api) sqlite3_finalize(stmt); dbclose(); - // Relock shared memory - lock_shm(); - return send_json_error(api, 500, "internal_error", "Failed to bind from", @@ -582,9 +519,6 @@ int api_stats_database_overTime_clients(struct ftl_conn *api) sqlite3_finalize(stmt); dbclose(); - // Relock shared memory - lock_shm(); - return send_json_error(api, 500, "internal_error", "Failed to bind until", @@ -650,8 +584,6 @@ int api_stats_database_overTime_clients(struct ftl_conn *api) sqlite3_finalize(stmt); dbclose(); - // Re-lock shared memory before returning back to router subroutine - lock_shm(); cJSON *json = JSON_NEW_OBJ(); JSON_OBJ_ADD_ITEM(json, "over_time", over_time); JSON_OBJ_ADD_ITEM(json, "clients", clients); @@ -676,9 +608,6 @@ int api_stats_database_query_types(struct ftl_conn *api) NULL); } - // Unlock shared memory (DNS resolver can continue to work while we're preforming database queries) - unlock_shm(); - // Open the database (this also locks the database) dbopen(); @@ -699,9 +628,6 @@ int api_stats_database_query_types(struct ftl_conn *api) // Close (= unlock) database connection dbclose(); - // Re-lock shared memory before returning back to router subroutine - lock_shm(); - // Send JSON object cJSON *json = JSON_NEW_OBJ(); JSON_OBJ_ADD_ITEM(json, "types", types); @@ -727,9 +653,6 @@ int api_stats_database_upstreams(struct ftl_conn *api) NULL); } - // Unlock shared memory (DNS resolver can continue to work while we're preforming database queries) - unlock_shm(); - // Open the database (this also locks the database) dbopen(); @@ -760,9 +683,6 @@ int api_stats_database_upstreams(struct ftl_conn *api) logg("api_stats_database_overTime_clients() - SQL error prepare (%i): %s", rc, sqlite3_errmsg(FTL_db)); - // Relock shared memory - lock_shm(); - return send_json_error(api, 500, "internal_error", "Failed to prepare statement", @@ -778,9 +698,6 @@ int api_stats_database_upstreams(struct ftl_conn *api) sqlite3_finalize(stmt); dbclose(); - // Relock shared memory - lock_shm(); - return send_json_error(api, 500, "internal_error", "Failed to bind from", @@ -796,9 +713,6 @@ int api_stats_database_upstreams(struct ftl_conn *api) sqlite3_finalize(stmt); dbclose(); - // Relock shared memory - lock_shm(); - return send_json_error(api, 500, "internal_error", "Failed to bind until", @@ -840,9 +754,6 @@ int api_stats_database_upstreams(struct ftl_conn *api) // Close (= unlock) database connection dbclose(); - // Re-lock shared memory before returning back to router subroutine - lock_shm(); - // Send JSON object cJSON *json = JSON_NEW_OBJ(); JSON_OBJ_ADD_ITEM(json, "upstreams", upstreams); diff --git a/src/api/version.c b/src/api/version.c index 1b3c0e58..772a41ef 100644 --- a/src/api/version.c +++ b/src/api/version.c @@ -11,7 +11,7 @@ #include "../FTL.h" #include "../webserver/http-common.h" #include "../webserver/json_macros.h" -#include "routes.h" +#include "api.h" // get_FTL_version() #include "../log.h" #include "../version.h" diff --git a/src/datastructure.h b/src/datastructure.h index d3c72d2f..179e00cd 100644 --- a/src/datastructure.h +++ b/src/datastructure.h @@ -15,6 +15,7 @@ // enum privacy_level #include "enums.h" + // assert_sizeof #include "static_assert.h" diff --git a/src/webserver/webserver.c b/src/webserver/webserver.c index 74aa136a..8ea369a0 100644 --- a/src/webserver/webserver.c +++ b/src/webserver/webserver.c @@ -9,7 +9,7 @@ * Please see LICENSE file for your rights under this license. */ #include "../FTL.h" -#include "../api/routes.h" +#include "../api/api.h" // send_http() #include "http-common.h" // struct httpsettings