diff --git a/src/main.c b/src/main.c index ab30176..2b1e500 100644 --- a/src/main.c +++ b/src/main.c @@ -113,7 +113,7 @@ static void setsignal(int signal, void (*handler)(int)) { action.sa_handler = handler; action.sa_mask = sigset; action.sa_flags = SA_NODEFER; - sigaction(SIGCHLD, &action, NULL); + sigaction(signal, &action, NULL); } int main(int argc, char **argv) { @@ -136,10 +136,11 @@ int main(int argc, char **argv) { mainfd = socket(AF_UNIX, SOCK_STREAM, 0); addr.sun_family = AF_UNIX; - strncpy(addr.sun_path, tmpnam(NULL), sizeof(addr.sun_path) - 1); - /* I know that tmpname is deprecated, I think this usage is safe - * though. */ + + strncpy(addr.sun_path, SERVER_PATH, sizeof(addr.sun_path) - 1); addr.sun_path[sizeof(addr.sun_path) - 1] = '\0'; + createTmpName(addr.sun_path); + bind(mainfd, (struct sockaddr *) &addr, sizeof(addr)); listen(mainfd, processes); @@ -148,8 +149,23 @@ int main(int argc, char **argv) { createProcess(i); setsignal(SIGPIPE, SIG_IGN); - setsignal(SIGKILL, exitClean); + setsignal(SIGHUP, exitClean); setsignal(SIGINT, exitClean); + setsignal(SIGQUIT, exitClean); + setsignal(SIGILL, exitClean); + setsignal(SIGTRAP, exitClean); + setsignal(SIGABRT, exitClean); + setsignal(SIGBUS, exitClean); + setsignal(SIGFPE, exitClean); + setsignal(SIGKILL, exitClean); + setsignal(SIGSEGV, exitClean); + setsignal(SIGTERM, exitClean); + setsignal(SIGTTIN, exitClean); + setsignal(SIGTTOU, exitClean); + setsignal(SIGURG, exitClean); + setsignal(SIGXCPU, exitClean); + setsignal(SIGXFSZ, exitClean); + setsignal(SIGPIPE, exitClean); setsignal(SIGCHLD, remakeChild); createLog("swebs started"); diff --git a/src/responses.c b/src/responses.c index 0b0653c..4e9b00b 100644 --- a/src/responses.c +++ b/src/responses.c @@ -31,9 +31,6 @@ #include #include -char *realpath(char *, char *); -/* I don't know why, but realpath breaks on debian. */ - static int readResponse(Connection *conn, char *path) { int fd = -1; struct stat statbuf; diff --git a/src/swebs/config.h b/src/swebs/config.h index f06f695..78687c1 100644 --- a/src/swebs/config.h +++ b/src/swebs/config.h @@ -9,6 +9,8 @@ /* HEADER GUARD, DO NOT REMOVE*/ #define DYNAMIC_LINKED_PAGES 1 +#define SERVER_PATH "/tmp/swebs-serverXXXXX" +/* Where the UNIX server goes */ #endif /* HEADER GUARD, DO NOT REMOVE*/ diff --git a/src/swebs/util.h b/src/swebs/util.h index 66435ff..20335be 100644 --- a/src/swebs/util.h +++ b/src/swebs/util.h @@ -35,4 +35,19 @@ RequestType getType(char *str); void sendFd(int fd, int dest); int recvFd(int source); + +int createTmpName(char *path); +/* WIll set the 5 characters at the end of path to random data so that that + * file does not exist. For example: + * + * char *path = "/some/path/to/some/dataXXXXX"; + * createTmpName(path); + * puts(path); + * + * could output + * + * /some/path/to/some/data12ab6 + * + * Returns non-zero on error, uses rand() + * */ #endif diff --git a/src/util.c b/src/util.c index 354c4de..1e93e85 100644 --- a/src/util.c +++ b/src/util.c @@ -19,8 +19,10 @@ #include #include #include +#include #include +#include #include #include @@ -165,3 +167,27 @@ int recvFd(int source) { memcpy(&ret, CMSG_DATA(cmsg), sizeof(ret)); return ret; } + +int createTmpName(char *path) { + size_t len; + char possibleChars[] = + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789"; + len = strlen(path); + if (len < 5) + return 1; + + for (;;) { + int i; + for (i = 0; i < 5; i++) + path[len - i - 1] = + possibleChars[rand() % sizeof(possibleChars)]; + + if (!faccessat(-1, path, F_OK, AT_EACCESS)) + continue; + if (faccessat(-1, path, R_OK | W_OK, AT_EACCESS)) + return 1; + return 0; + } +}