diff options
| author | Franklin Wei <git@fwei.tk> | 2016-01-17 20:15:31 -0500 |
|---|---|---|
| committer | Franklin Wei <git@fwei.tk> | 2016-01-17 20:15:31 -0500 |
| commit | 7c98d81dafd9b8bc8745d897603a424aee328c1c (patch) | |
| tree | 01986b70644af5a80f963fcfc8d99b5239d6718d /src/server.c | |
| parent | 9a98c157ebdc6e400f076485a4d78e9026ea1a16 (diff) | |
| download | netcosm-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.c | 39 |
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) |