X-Git-Url: https://git.distorted.org.uk/~mdw/secnet/blobdiff_plain/f54d5adadd831fd0fa55d70d3aaffe60636818f5..refs/heads/master:/process.c diff --git a/process.c b/process.c index 12e2caa..3444308 100644 --- a/process.c +++ b/process.c @@ -1,3 +1,22 @@ +/* + * This file is part of secnet. + * See README for full list of copyright holders. + * + * secnet is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * secnet is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * version 3 along with secnet; if not, see + * https://www.gnu.org/licenses/gpl.html. + */ + #define _GNU_SOURCE #include "secnet.h" #include @@ -45,7 +64,7 @@ pid_t makesubproc(process_entry_fn *entry, process_callback_fn *cb, struct child *c; pid_t p; - c=safe_malloc(sizeof(*c),"makesubproc"); + NEW(c); c->desc=desc; c->cb=cb; c->cst=cst; @@ -92,7 +111,7 @@ static void sigchld_handler(void *st, int signum) if (rv==i->pid) { i->finished=True; - nw=safe_malloc(sizeof(*nw),"sigchld_handler"); + NEW(nw); nw->pid=i->pid; nw->cb=i->cb; nw->cst=i->cst; @@ -218,6 +237,10 @@ void afterfork(void) sigset_t done; struct sigaction sa; + clear_phase_hooks(PHASE_SHUTDOWN); + /* Prevents calls to fatal() etc. in the child from running off + and doing a lot of unhelpful things */ + sigemptyset(&done); for (n=sigs; n; n=n->next) if (!sigismember(&done,n->signum)) { @@ -232,6 +255,16 @@ void afterfork(void) sigprocmask(SIG_SETMASK,&emptyset,NULL); } +void childpersist_closefd_hook(void *fd_vp, uint32_t newphase) +{ + int *fd_p=fd_vp; + int fd=*fd_p; + if (fd<0) return; + *fd_p=-1; + setnonblock(fd); /* in case close() might block */ + close(fd); /* discard errors - we don't care, in the child */ +} + static void signal_handler(int signum) { int saved_errno; @@ -277,7 +310,7 @@ void request_signal_notification(int signum, signal_notify_fn *notify, struct signotify *s; sigset_t old; - s=safe_malloc(sizeof(*s),"request_signal_notification"); + NEW(s); s->signum=signum; s->notify=notify; s->cst=cst; @@ -302,6 +335,7 @@ void start_signal_handling(void) spw=p[1]; spr=p[0]; setnonblock(spw); + setnonblock(spr); register_for_poll(NULL,signal_beforepoll,signal_afterpoll,"signal"); signal_handling=True;