mirror of
https://github.com/sigmasternchen/CFloor
synced 2025-03-15 04:18:55 +00:00
the server is now useable
This commit is contained in:
parent
d9f1f709df
commit
4bfe1dc39c
2 changed files with 89 additions and 101 deletions
17
demo.conf
Normal file
17
demo.conf
Normal 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
|
||||
}
|
177
src/main.c
177
src/main.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue