From 4bfe1dc39c1e70698983b10783d9e07ac5064e66 Mon Sep 17 00:00:00 2001 From: overflowerror Date: Wed, 13 Mar 2019 17:18:15 +0100 Subject: [PATCH] the server is now useable --- demo.conf | 17 ++++++ src/main.c | 173 ++++++++++++++++++++++------------------------------- 2 files changed, 89 insertions(+), 101 deletions(-) create mode 100644 demo.conf diff --git a/demo.conf b/demo.conf new file mode 100644 index 0000000..74b892f --- /dev/null +++ b/demo.conf @@ -0,0 +1,17 @@ +bind 0.0.0.0:1337 { + site { + root = ./home/ + handler / { + type = file + index = index.html + } + handler /cgi-bin/ { + type = cgi + } + } +} +logging { + access = access.log + server = server.log + verbosity = info +} diff --git a/src/main.c b/src/main.c index 48708d6..295d921 100644 --- a/src/main.c +++ b/src/main.c @@ -2,37 +2,35 @@ #include #include #include +#include #include "networking.h" #include "logging.h" #include "headers.h" -#include "files.h" -#include "cgi.h" #include "util.h" #include "signals.h" +#include "config.h" #ifdef SSL_SUPPORT #include "ssl.h" #endif -struct headers headers; -char* documentRoot = NULL; -FILE* accesslog; +struct networkingConfig networkingConfig; +struct config* config; + +const char* configFile = NULL; void shutdownHandler() { info("main: shutting down"); - headers_free(&headers); + headers_free(&(networkingConfig.defaultHeaders)); - if (documentRoot != NULL) - free(documentRoot); + config_destroy(config); #ifdef SSL_SUPPORT ssl_destroy(); #endif - fclose(accesslog); - exit(0); } @@ -41,113 +39,86 @@ void sigHandler(int signo) { shutdownHandler(); } -struct handlerSettings { - struct fileSettings fileSettings; - struct cgiSettings cgiSettings; - const char* cgiBin; -}; - -struct handler handlerGetter(struct metaData metaData, const char* host, struct bind* bind) { - struct handlerSettings* settings = (struct handlerSettings*) bind->settings.ptr; - - info("%s", metaData.path); - - union userData data; - - if (isInDir(metaData.path, settings->cgiBin)) { - data.ptr = &(settings->cgiSettings); - - return (struct handler) { - .handler = &cgiHandler, - .data = data - }; - } else { - data.ptr = &(settings->fileSettings); - - return (struct handler) { - .handler = &fileHandler, - .data = data - }; - } -} - -int main(int argc, char** argv) { - accesslog = fopen("access.log", "a"); - setbuf(accesslog, NULL); - - setLogging(stderr, DEBUG, true); - setLogging(accesslog, HTTP_ACCESS, false); - setCriticalHandler(NULL); +void setup() { + setLogging(stdout, ERROR, true); + setCriticalHandler(&shutdownHandler); signal_setup(SIGINT, &sigHandler); signal_setup(SIGTERM, &sigHandler); - documentRoot = realpath("./home/", NULL); - - struct handlerSettings handlerSettings = { - .fileSettings = { - .documentRoot = documentRoot, - .index = true, - .indexfiles = { - .number = 2, - .files = (const char* []) { - "index.html", - "index.htm" - } - } - }, - .cgiSettings = { - .documentRoot = documentRoot - }, - .cgiBin = "/cgi-bin/" - }; - union userData settingsData; - settingsData.ptr = &handlerSettings; - - headers = headers_create(); - headers_mod(&headers, "Server", "CFloor 0.1"); + networkingConfig.defaultHeaders.number = 0; #ifdef SSL_SUPPORT ssl_init(); - - struct ssl_settings ssl_settings = (struct ssl_settings) { - .privateKey = "certs/hiro.key", - .certificate = "certs/hiro.crt" - }; - - if (ssl_initSettings(&(ssl_settings)) < 0) { - error("main: error setting up ssl settings"); - return 1; - } #endif +} +void help(const char* progname) { + printf("Usage: %s -c CONFIG_FILE\n", progname); +} - struct networkingConfig config = { - .maxConnections = 1024, - .connectionTimeout = 2000, - .binds = { - .number = 1, - .binds = (struct bind[]) { - { - .address = "0.0.0.0", - .port = "1337", - .settings = settingsData, +int parseArguments(int argc, char** argv) { + int opt; + while((opt = getopt(argc, argv, "c:")) != -1) { + switch(opt) { + case 'c': + configFile = optarg; + break; + default: + help(argv[0]); + return -1; + } + } + if (optind < argc) { + help(argv[0]); + return -1; + } - #ifdef SSL_SUPPORT - .ssl_settings = &ssl_settings - #endif - } - } - }, - .defaultHeaders = headers, - .getHandler = &handlerGetter - }; + if (configFile == NULL) { + help(argv[0]); + return -1; + } - networking_init(config); + return 0; +} + +int main(int argc, char** argv) { + setup(); + + if (parseArguments(argc, argv) < 0) { + shutdownHandler(); + return 0; + } + + FILE* file = fopen(configFile, "r"); + if (file == NULL) { + error("main: couldn't open config file: %s", strerror(errno)); + shutdownHandler(); + return 0; + } + + config = config_parse(file); + + fclose(file); + + if (config == NULL) { + shutdownHandler(); + return 0; + } + config_setLogging(config); + + if (config_getNetworkingConfig(config, &networkingConfig) == NULL) { + shutdownHandler(); + return 0; + } + + networking_init(networkingConfig); while(true) { sleep(0xffff); } shutdownHandler(); + + return 0; }