diff --git a/Makefile b/Makefile index c00fe4f..2817739 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ LDFLAGS = -lpthread -lrt BIN_NAME = cfloor -OBJS = obj/networking.o obj/linked.o obj/logging.o obj/signals.o obj/headers.o obj/misc.o obj/status.o obj/files.o obj/mime.o obj/cgi.o +OBJS = obj/networking.o obj/linked.o obj/logging.o obj/signals.o obj/headers.o obj/misc.o obj/status.o obj/files.o obj/mime.o obj/cgi.o obj/util.o DEPS = $(OBJS:%.o=%.d) all: $(BIN_NAME) diff --git a/src/cgi.c b/src/cgi.c index 6af12a2..3675336 100644 --- a/src/cgi.c +++ b/src/cgi.c @@ -8,6 +8,7 @@ #include "cgi.h" #include "misc.h" +#include "util.h" #include "files.h" #include "status.h" #include "logging.h" diff --git a/src/files.c b/src/files.c index 1514297..f6220db 100644 --- a/src/files.c +++ b/src/files.c @@ -12,6 +12,7 @@ #include "files.h" #include "misc.h" +#include "util.h" #include "logging.h" #include "status.h" #include "mime.h" diff --git a/src/headers.c b/src/headers.c index e8c02b0..ad0cc6f 100644 --- a/src/headers.c +++ b/src/headers.c @@ -3,6 +3,7 @@ #include "headers.h" #include "misc.h" +#include "util.h" #include "logging.h" struct headers headers_create() { diff --git a/src/main.c b/src/main.c index a255251..5fea1df 100644 --- a/src/main.c +++ b/src/main.c @@ -8,6 +8,7 @@ #include "headers.h" #include "files.h" #include "cgi.h" +#include "util.h" struct handlerSettings { struct fileSettings fileSettings; @@ -20,20 +21,7 @@ struct handler handlerGetter(struct metaData metaData, const char* host, struct union userData data; - bool isCgiBin = false; - int cgiBinLength = strlen(settings->cgiBin); - - if (settings->cgiBin[cgiBinLength - 1] == '/') - cgiBinLength--; - - if (strncmp(metaData.path, settings->cgiBin, cgiBinLength) == 0) { - if (metaData.path[cgiBinLength] == '\0') - isCgiBin = true; - if (metaData.path[cgiBinLength] == '/') - isCgiBin = true; - } - - if (isCgiBin) { + if (isInDir(metaData.path, settings->cgiBin)) { data.ptr = &(settings->cgiSettings); return (struct handler) { diff --git a/src/misc.c b/src/misc.c index 6d9fa0d..45927a7 100644 --- a/src/misc.c +++ b/src/misc.c @@ -1,56 +1,5 @@ -#include -#include -#include -#include -#include -#include #include "misc.h" -int startCopyThread(int from, int to, bool closeWriteFd, pthread_t* thread) { - struct fileCopy* files = malloc(sizeof(struct fileCopy)); - if (files < 0) - return -1; - files->readFd = from; - files->writeFd = to; - files->closeWriteFd = closeWriteFd; - - return pthread_create(thread, NULL, &fileCopyThread, files); -} - -void* fileCopyThread(void* data) { - struct fileCopy* files = (struct fileCopy*) data; - char c; - - while(read(files->readFd, &c, 1) > 0) { - write(files->writeFd, &c, 1); - } - - if (files->closeWriteFd) - close(files->writeFd); - - free(files); - - return NULL; -} - -char* strclone(const char* string) { - char* result = malloc(strlen(string) + 1); - if (result == NULL) - return NULL; - strcpy(result, string); - return result; -} - -int strlenOfNumber(long long number) { - int result = 1; - - while(number > 9) { - number /= 10; - result++; - } - - return result; -} diff --git a/src/misc.h b/src/misc.h index 67584d4..4faea0a 100644 --- a/src/misc.h +++ b/src/misc.h @@ -76,16 +76,4 @@ struct handler { union userData data; }; -struct fileCopy { - int readFd; - int writeFd; - bool closeWriteFd; -}; -int startCopyThread(int from, int to, bool closeWriteFd, pthread_t* thread); -void* fileCopyThread(void* data); - -char* strclone(const char* string); - -int strlenOfNumber(long long number); - #endif diff --git a/src/networking.c b/src/networking.c index 748952e..0675c45 100644 --- a/src/networking.c +++ b/src/networking.c @@ -17,6 +17,7 @@ #include "logging.h" #include "signals.h" #include "status.h" +#include "util.h" struct networkingConfig networkingConfig; diff --git a/src/util.c b/src/util.c new file mode 100644 index 0000000..d0ec229 --- /dev/null +++ b/src/util.c @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include +#include + +#include + +#include "util.h" + +bool isInDir(const char* file, const char* dir) { + int length = strlen(dir); + + if (dir[length - 1] == '/') + length--; + + if (strncmp(file, dir, length) == 0) { + if (file[length] == '\0') + return true; + if (file[length] == '/') + return true; + } + + return false; +} + +int startCopyThread(int from, int to, bool closeWriteFd, pthread_t* thread) { + struct fileCopy* files = malloc(sizeof(struct fileCopy)); + if (files < 0) + return -1; + + files->readFd = from; + files->writeFd = to; + files->closeWriteFd = closeWriteFd; + + return pthread_create(thread, NULL, &fileCopyThread, files); +} + +void* fileCopyThread(void* data) { + struct fileCopy* files = (struct fileCopy*) data; + char c; + + while(read(files->readFd, &c, 1) > 0) { + write(files->writeFd, &c, 1); + } + + if (files->closeWriteFd) + close(files->writeFd); + + free(files); + + return NULL; +} + +char* strclone(const char* string) { + char* result = malloc(strlen(string) + 1); + if (result == NULL) + return NULL; + strcpy(result, string); + return result; +} + +int strlenOfNumber(long long number) { + int result = 1; + + while(number > 9) { + number /= 10; + result++; + } + + return result; +} diff --git a/src/util.h b/src/util.h new file mode 100644 index 0000000..2687f65 --- /dev/null +++ b/src/util.h @@ -0,0 +1,21 @@ +#ifndef UTIL_H +#define UTIL_H + +#include +#include + +bool isInDir(const char* filename, const char* dirname); + +struct fileCopy { + int readFd; + int writeFd; + bool closeWriteFd; +}; +int startCopyThread(int from, int to, bool closeWriteFd, pthread_t* thread); +void* fileCopyThread(void* data); + +char* strclone(const char* string); + +int strlenOfNumber(long long number); + +#endif