diff options
| author | Jesper Jensen <jesper@jnsn.dev> | 2026-02-19 21:30:45 +0100 |
|---|---|---|
| committer | Jesper Jensen <jesper@jnsn.dev> | 2026-02-19 21:46:21 +0100 |
| commit | f2ff8883b298e23119729b75f5b908abeddde095 (patch) | |
| tree | 325e10c5ae079366db4fb70e9bef1140f50f9baa /src | |
| parent | b0e992e99bf0f6bcb3602f6f4fd4874cc510cfaa (diff) | |
Prepare for server deployment
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.c | 24 | ||||
| -rw-r--r-- | src/web.c | 37 | ||||
| -rw-r--r-- | src/web.h | 2 |
3 files changed, 60 insertions, 3 deletions
@@ -1,7 +1,15 @@ #include "web.h" +#include <signal.h> #include <stdio.h> #include <stdlib.h> +#include <unistd.h> + +static volatile sig_atomic_t shutdown_requested = 0; + +static void signal_shutdown(int sig) { + shutdown_requested = 1; +} int main(int argc, char ** argv) { if (argc != 2) { @@ -17,15 +25,27 @@ int main(int argc, char ** argv) { return 1; } + const char *local = getenv("SQLITE_PATH"); + if(local == NULL) { + local = "/var/lib/borgflag/data.db"; + } + struct App app = { - .dbname = "borgflag.db" + .dbname = local, }; struct Server server; server.app = &app; + signal(SIGTERM, signal_shutdown); + signal(SIGINT, signal_shutdown); + prepare_database(&app); web_begin(&server, atoi(argv[1]), admin_user, admin_pass); - getchar(); + + while (!shutdown_requested) { + pause(); + } + web_join(&server); } @@ -2,6 +2,9 @@ #include "mytime.h" #include <assert.h> +#include <errno.h> +#include <linux/limits.h> +#include <libgen.h> #include <sys/socket.h> #include <string.h> #include <sys/stat.h> @@ -60,6 +63,33 @@ static int is_authenticated(struct App *app, struct MHD_Connection *connection) return strcmp(cookie, expected) == 0; } +// https://stackoverflow.com/questions/2336242/recursive-mkdir-system-call-on-unix +static void _mkdir(const char *dir) { + char tmp[PATH_MAX]; + char *p = NULL; + size_t len; + int rc; + + snprintf(tmp, sizeof(tmp),"%s",dir); + len = strlen(tmp); + if (tmp[len - 1] == '/') + tmp[len - 1] = 0; + for (p = tmp + 1; *p; p++) + if (*p == '/') { + *p = 0; + rc = mkdir(tmp, S_IRWXU); + if(rc != 0 && errno != EEXIST) { + abort(); + } + *p = '/'; + } + rc = mkdir(tmp, S_IRWXU); + if(rc != 0 && errno != EEXIST) { + abort(); + } + +} + void prepare_database(struct App *app) { // @CLEANUP: Move this to main? doesn't belong here at least sqlite3_config(SQLITE_CONFIG_LOG, sqliteError, NULL); @@ -69,6 +99,13 @@ void prepare_database(struct App *app) { printf("Running migrations against %s\n", app->dbname); + if(memcmp("file::memory", app->dbname, 12) != 0) { + char *full = strdup(app->dbname); + char *dbdir = dirname(full); + _mkdir(dbdir); + free(full); + } + sqlite3 *conn; if((err = sqlite3_open(app->dbname, &conn)) != SQLITE_OK) { fprintf(stderr, "(%d) %s\n", err, sqlite3_errmsg(conn)); @@ -9,7 +9,7 @@ struct MHD_PostProcessor; #define CLIENT_SECRET_LEN 33 struct App { - char* dbname; + const char* dbname; char session_secret[CLIENT_SECRET_LEN]; const char *admin_user; const char *admin_pass; |
