diff --git a/src/connections.c b/src/connections.c index 7007718..f3c2f97 100644 --- a/src/connections.c +++ b/src/connections.c @@ -97,8 +97,8 @@ void freeConnection(Connection *conn) { free(conn->currLine); free(conn->body); for (i = 0; i < conn->fieldCount; i++) { - free(conn->pathFields[i].var.data); - free(conn->pathFields[i].value.data); + free(conn->fields[i].field); + free(conn->fields[i].value); } for (i = 0; i < conn->pathFieldCount; i++) { free(conn->pathFields[i].var.data); @@ -367,7 +367,8 @@ static int processChar(Connection *conn, char c, Sitefile *site) { } if (conn->progress == RECEIVE_BODY && conn->receivedBody >= conn->bodylen) - sendResponse(conn, site); + if (sendResponse(conn, site)) + return 1; return 0; } diff --git a/src/main.c b/src/main.c index b6aaa08..3d67b9e 100644 --- a/src/main.c +++ b/src/main.c @@ -51,7 +51,7 @@ static ConnInfo *conninfo; * are needed. */ static const int signals[] = { SIGPIPE, SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGTRAP, SIGABRT, SIGBUS, SIGFPE, - SIGKILL, SIGSEGV, SIGTERM, SIGTTIN, SIGTTOU, SIGURG, SIGXCPU, SIGXFSZ, SIGPIPE, + SIGKILL, SIGSEGV, SIGTERM, SIGTTIN, SIGTTOU, SIGURG, SIGXCPU, SIGXFSZ, }; static void exitClean(int signal) { @@ -60,26 +60,6 @@ static void exitClean(int signal) { exit(EXIT_SUCCESS); } -static void setsignal(int signal, void (*handler)(int)) { - struct sigaction action; - sigset_t sigset; - sigemptyset(&sigset); - action.sa_handler = handler; - action.sa_mask = sigset; - action.sa_flags = SA_NODEFER; - sigaction(signal, &action, NULL); -} - -static void unsetsignal(int signal) { - struct sigaction action; - sigset_t sigset; - sigemptyset(&sigset); - action.sa_handler = SIG_DFL; - action.sa_mask = sigset; - action.sa_flags = SA_NODEFER; - sigaction(signal, &action, NULL); -} - static void createProcess(int id) { pid_t pid; int connfd; @@ -156,6 +136,7 @@ int main(int argc, char **argv) { if (listeners[i] == NULL) { fprintf(stderr, "Failed to listen on port %hu\n", site->ports[i].num); + exit(EXIT_FAILURE); } pollfds[i].fd = listenerfd(listeners[i]); pollfds[i].events = POLLIN; diff --git a/src/responses.c b/src/responses.c index 1fa5b62..ab7fbb9 100644 --- a/src/responses.c +++ b/src/responses.c @@ -180,23 +180,25 @@ foundport: if (fullmatch(&site->content[i].path, conn->path.data) == 0) { switch (site->content[i].command) { case READ: - readResponse(conn, - site->content[i].arg); + if (readResponse(conn, + site->content[i].arg)) + return 1; break; case THROW: - sendErrorResponse(conn->stream, - site->content[i].arg); + if (sendErrorResponse(conn->stream, + site->content[i].arg)) + return 1; break; case LINKED: #if DYNAMIC_LINKED_PAGES if (!site->getResponse) sendErrorResponse(conn->stream, ERROR_500); - else - linkedResponse(conn, - site->getResponse); + else if (linkedResponse(conn, + site->getResponse)) + return 1; #else - /* Unreachable state */ + /* Unreachable state (filtered by startup) */ sendErrorResponse(conn->stream, ERROR_500); #endif diff --git a/src/responseutil.c b/src/responseutil.c index 9282c60..564e2eb 100644 --- a/src/responseutil.c +++ b/src/responseutil.c @@ -22,6 +22,7 @@ #include +#include #include #define CONST_FIELDS "Server: swebs/0.1\r\n" @@ -29,8 +30,12 @@ static int resilientSend(Stream *stream, void *data, size_t len) { char *buffer = (char *) data; size_t left = len; + while (left) { - ssize_t sent = sendStream(stream, buffer, left); + ssize_t sent; + + sent = sendStream(stream, buffer, left); + if (sent < 0) return 1; if (sent == 0) diff --git a/src/runner.c b/src/runner.c index 8fe0c42..a335b92 100644 --- a/src/runner.c +++ b/src/runner.c @@ -97,8 +97,11 @@ void runServer(int connfd, Sitefile *site, int *pending, int id, } for (i = 1; i < connCount; i++) { - if (updateConnection(connections + i, site)) - goto remove; + if (fds[i].revents & POLLIN) { + createFormatLog("Connection %d has data", i); + if (updateConnection(connections + i, site)) + goto remove; + } continue; remove: freeConnection(connections + i); @@ -115,6 +118,7 @@ remove: Stream *newstream; int newfd; int portind; + createLog("Main fd has data"); newfd = recvFd(connfd); if (newfd < 0) { createLog("Message received that included an invalid fd, quitting"); diff --git a/src/swebs/util.h b/src/swebs/util.h index ea1f9ce..1edbab9 100644 --- a/src/swebs/util.h +++ b/src/swebs/util.h @@ -58,4 +58,8 @@ int createTmpName(char *path); * * Returns non-zero on error, uses rand() * */ + +void setsignal(int signal, void (*handler)(int)); +void unsetsignal(int signal); + #endif diff --git a/src/util.c b/src/util.c index 62bcf94..b5a6754 100644 --- a/src/util.c +++ b/src/util.c @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -257,3 +258,23 @@ int createTmpName(char *path) { return 0; } } + +void setsignal(int signal, void (*handler)(int)) { + struct sigaction action; + sigset_t sigset; + sigemptyset(&sigset); + action.sa_handler = handler; + action.sa_mask = sigset; + action.sa_flags = 0; + sigaction(signal, &action, NULL); +} + +void unsetsignal(int signal) { + struct sigaction action; + sigset_t sigset; + sigemptyset(&sigset); + action.sa_handler = SIG_DFL; + action.sa_mask = sigset; + action.sa_flags = SA_NODEFER; + sigaction(signal, &action, NULL); +}