the server is now useable

This commit is contained in:
overflowerror 2019-03-13 17:18:15 +01:00
parent d9f1f709df
commit 4bfe1dc39c
2 changed files with 89 additions and 101 deletions

17
demo.conf Normal file
View file

@ -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
}

View file

@ -2,37 +2,35 @@
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#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
struct networkingConfig config = {
.maxConnections = 1024,
.connectionTimeout = 2000,
.binds = {
.number = 1,
.binds = (struct bind[]) {
{
.address = "0.0.0.0",
.port = "1337",
.settings = settingsData,
#ifdef SSL_SUPPORT
.ssl_settings = &ssl_settings
#endif
}
}
},
.defaultHeaders = headers,
.getHandler = &handlerGetter
};
networking_init(config);
void help(const char* progname) {
printf("Usage: %s -c CONFIG_FILE\n", progname);
}
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;
}
if (configFile == NULL) {
help(argv[0]);
return -1;
}
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;
}