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_handler = handler;
|
||||||
action.sa_mask = sigset;
|
action.sa_mask = sigset;
|
||||||
action.sa_flags = SA_NODEFER;
|
action.sa_flags = SA_NODEFER;
|
||||||
sigaction(SIGCHLD, &action, NULL);
|
sigaction(signal, &action, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
@@ -136,10 +136,11 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
mainfd = socket(AF_UNIX, SOCK_STREAM, 0);
|
mainfd = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||||
addr.sun_family = AF_UNIX;
|
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
|
strncpy(addr.sun_path, SERVER_PATH, sizeof(addr.sun_path) - 1);
|
||||||
* though. */
|
|
||||||
addr.sun_path[sizeof(addr.sun_path) - 1] = '\0';
|
addr.sun_path[sizeof(addr.sun_path) - 1] = '\0';
|
||||||
|
createTmpName(addr.sun_path);
|
||||||
|
|
||||||
bind(mainfd, (struct sockaddr *) &addr, sizeof(addr));
|
bind(mainfd, (struct sockaddr *) &addr, sizeof(addr));
|
||||||
listen(mainfd, processes);
|
listen(mainfd, processes);
|
||||||
|
|
||||||
@@ -148,8 +149,23 @@ int main(int argc, char **argv) {
|
|||||||
createProcess(i);
|
createProcess(i);
|
||||||
|
|
||||||
setsignal(SIGPIPE, SIG_IGN);
|
setsignal(SIGPIPE, SIG_IGN);
|
||||||
setsignal(SIGKILL, exitClean);
|
setsignal(SIGHUP, exitClean);
|
||||||
setsignal(SIGINT, 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);
|
setsignal(SIGCHLD, remakeChild);
|
||||||
|
|
||||||
createLog("swebs started");
|
createLog("swebs started");
|
||||||
|
|||||||
@@ -31,9 +31,6 @@
|
|||||||
#include <swebs/responses.h>
|
#include <swebs/responses.h>
|
||||||
#include <swebs/responseutil.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) {
|
static int readResponse(Connection *conn, char *path) {
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
struct stat statbuf;
|
struct stat statbuf;
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
/* HEADER GUARD, DO NOT REMOVE*/
|
/* HEADER GUARD, DO NOT REMOVE*/
|
||||||
|
|
||||||
#define DYNAMIC_LINKED_PAGES 1
|
#define DYNAMIC_LINKED_PAGES 1
|
||||||
|
#define SERVER_PATH "/tmp/swebs-serverXXXXX"
|
||||||
|
/* Where the UNIX server goes */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
/* HEADER GUARD, DO NOT REMOVE*/
|
/* HEADER GUARD, DO NOT REMOVE*/
|
||||||
|
|||||||
@@ -35,4 +35,19 @@ RequestType getType(char *str);
|
|||||||
|
|
||||||
void sendFd(int fd, int dest);
|
void sendFd(int fd, int dest);
|
||||||
int recvFd(int source);
|
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
|
#endif
|
||||||
|
|||||||
26
src/util.c
26
src/util.c
@@ -19,8 +19,10 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include <sys/shm.h>
|
#include <sys/shm.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
|
||||||
@@ -165,3 +167,27 @@ int recvFd(int source) {
|
|||||||
memcpy(&ret, CMSG_DATA(cmsg), sizeof(ret));
|
memcpy(&ret, CMSG_DATA(cmsg), sizeof(ret));
|
||||||
return 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