aboutsummaryrefslogtreecommitdiff
path: root/src/server.c
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2016-01-17 20:15:31 -0500
committerFranklin Wei <git@fwei.tk>2016-01-17 20:15:31 -0500
commit7c98d81dafd9b8bc8745d897603a424aee328c1c (patch)
tree01986b70644af5a80f963fcfc8d99b5239d6718d /src/server.c
parent9a98c157ebdc6e400f076485a4d78e9026ea1a16 (diff)
downloadnetcosm-7c98d81dafd9b8bc8745d897603a424aee328c1c.zip
netcosm-7c98d81dafd9b8bc8745d897603a424aee328c1c.tar.gz
netcosm-7c98d81dafd9b8bc8745d897603a424aee328c1c.tar.bz2
netcosm-7c98d81dafd9b8bc8745d897603a424aee328c1c.tar.xz
rewrite message-passing, no signals needed!
Diffstat (limited to 'src/server.c')
-rw-r--r--src/server.c39
1 files changed, 10 insertions, 29 deletions
diff --git a/src/server.c b/src/server.c
index 50f055f..e651f59 100644
--- a/src/server.c
+++ b/src/server.c
@@ -106,7 +106,9 @@ static void __attribute__((noreturn)) serv_cleanup(void)
/* kill all our children (usually init claims them and wait()'s
for them, but not always) */
struct sigaction sa;
- sigfillset(&sa.sa_mask); sigaddset(&sa.sa_mask, SIGCHLD);
+ sigfillset(&sa.sa_mask);
+ sigaddset(&sa.sa_mask, SIGCHLD);
+ sa.sa_handler = SIG_IGN;
sigaction(SIGCHLD, &sa, NULL); /* kill all children */
void *ptr = child_map, *save;
do {
@@ -164,29 +166,6 @@ static void init_signals(void)
error("sigaction");
if(sigaction(SIGTERM, &sa, NULL) < 0)
error("sigaction");
-
- sigemptyset(&sa.sa_mask);
- sigaddset(&sa.sa_mask, SIGRTMIN+1);
- sa.sa_sigaction = master_ack_handler;
- sa.sa_flags = SA_SIGINFO | SA_RESTART;
- if(sigaction(SIGRTMIN+1, &sa, NULL) < 0)
- error("sigaction");
-
- sigemptyset(&sa.sa_mask);
- sigaddset(&sa.sa_mask, SIGPIPE);
- sa.sa_handler = SIG_IGN;
- sa.sa_flags = SA_RESTART;
- if(sigaction(SIGPIPE, &sa, NULL) < 0)
- error("sigaction");
-
- /* we set this now so there's no race condition after a fork() */
- sigemptyset(&sa.sa_mask);
- sigaddset(&sa.sa_mask, SIGRTMIN);
- sigaddset(&sa.sa_mask, SIGPIPE);
- sa.sa_sigaction = sig_rt_0_handler;
- sa.sa_flags = SA_RESTART | SA_SIGINFO;
- if(sigaction(SIGRTMIN, &sa, NULL) < 0)
- error("sigaction");
}
static void check_userfile(void)
@@ -251,11 +230,13 @@ static void childreq_cb(EV_P_ ev_io *w, int revents)
{
(void) EV_A;
(void) w;
- (void) revents;
/* data from a child's pipe */
- if(!handle_child_req(w->fd))
+ if(revents & EV_READ)
{
- handle_disconnects();
+ if(!handle_child_req(w->fd))
+ {
+ handle_disconnects();
+ }
}
}
@@ -276,9 +257,9 @@ static void new_connection_cb(EV_P_ ev_io *w, int revents)
int outpipe [2]; /* parent->child */
if(pipe2(readpipe, O_DIRECT) < 0)
- error("pipe");
+ error("error creating pipe, need linux kernel >= 3.4");
if(pipe2(outpipe, O_NONBLOCK | O_DIRECT) < 0)
- error("pipe");
+ error("error creating pipe, need linux kernel >= 3.4");
pid_t pid = fork();
if(pid < 0)