#include #include #include #include #include #include #include #include #include #include #ifdef NO_GC #include #define malloc(n) GC_malloc(n) #else #include #endif #include "resHeader.h" #include "reqHeader.h" #include "file.h" #include "log.h" #include "mime.h" int srvSocket; void safeExit(int sig) { info("Exiting...\n"); #ifdef NO_GC GC_gcollect(); #endif close(srvSocket); _exit(0); } void segfault(int sig) { warn("may or may not have segfaulted\n"); #ifdef NO_GC GC_gcollect(); #endif } int handle(int client) { ReqHeader request = readReqHeader(client); ResHeader rawHeader; if (errno == -1) { warn("somehow we got a NULL request????\n"); rawHeader.status = 500; rawHeader.notice = "Internal Server Error"; char* tmpHeader = malloc(1024); makeHeader(tmpHeader, &rawHeader); send(client, tmpHeader, strlen(tmpHeader), 0); close(client); return 0; } else { rawHeader.status = 200; rawHeader.notice = "OK"; } int useBinary = getMime(&rawHeader.mime, request.path); if (errno == -1) { rawHeader.status = 404; rawHeader.notice = "Not Found"; } else if (errno > 0 && !(hasTriedIndex == 2)) { rawHeader.status = 500; rawHeader.notice = "Internal Server Error"; } errno = 0; hasTriedIndex = 0; reqlog("%d %s\n", rawHeader.status, request.path); char tmpHeader[1024]; makeHeader(tmpHeader, &rawHeader); send(client, tmpHeader, strlen(tmpHeader), 0); void* file; if (!useBinary) { file = readFile(request.path); send(client, file, strlen(file), 0); } else { int len; file = readFileBin(&len, request.path); send(client, file, len, 0); } close(client); return 0; } int srv(char* ADDR, int PORT) { struct sockaddr_in srvAddr; srvSocket = socket(AF_INET, SOCK_STREAM, 0); srvAddr.sin_family = AF_INET; srvAddr.sin_port = htons(PORT); srvAddr.sin_addr.s_addr = inet_addr(ADDR); int opt = 1; setsockopt(srvSocket, SOL_SOCKET, SO_REUSEADDR, (void *)opt, sizeof(int)); opt = 0; setsockopt(srvSocket, SOL_SOCKET, SO_LINGER, (void *)opt, sizeof(int)); if (bind( srvSocket, (struct sockaddr*)&srvAddr, sizeof(srvAddr) ) < 0) { error("Failed to bind to %s:%d.\n", ADDR, PORT); return 1; } if (listen(srvSocket, 10) < 0) { error("Unable to listen on %s:%d.\n", ADDR, PORT); return 1; } signal(SIGINT, safeExit); //signal(SIGSEGV, segfault); info("Server (probably) listening on http://%s:%d\n", ADDR, PORT); while(1) { int client = accept(srvSocket, NULL, NULL); handle(client); } }