Improved signal handling, removed tmpnam()
This commit is contained in:
26
src/main.c
26
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");
|
||||
|
||||
@@ -31,9 +31,6 @@
|
||||
#include <swebs/responses.h>
|
||||
#include <swebs/responseutil.h>
|
||||
|
||||
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;
|
||||
|
||||
@@ -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*/
|
||||
|
||||
@@ -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
|
||||
|
||||
26
src/util.c
26
src/util.c
@@ -19,8 +19,10 @@
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/shm.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user