X-Git-Url: https://git.distorted.org.uk/~mdw/secnet/blobdiff_plain/4f5e39ecfaa49376b0a5c3a4c384e91a828c1105..7c006408372213194fce572e390d8f474db9cebc:/secnet.c diff --git a/secnet.c b/secnet.c index a21e52b..4c3ec8f 100644 --- a/secnet.c +++ b/secnet.c @@ -15,26 +15,18 @@ extern char version[]; #include "process.h" /* XXX should be from autoconf */ -static char *configfile="/etc/secnet/secnet.conf"; -static char *sites_key="sites"; +static const char *configfile="/etc/secnet/secnet.conf"; +static const char *sites_key="sites"; bool_t just_check_config=False; static char *userid=NULL; static uid_t uid=0; bool_t background=True; static char *pidfile=NULL; bool_t require_root_privileges=False; -string_t require_root_privileges_explanation=NULL; +cstring_t require_root_privileges_explanation=NULL; static pid_t secnet_pid; -/* from log.c */ -extern uint32_t message_level; -extern bool_t secnet_is_daemon; -extern struct log_if *system_log; - -/* from process.c */ -extern void start_signal_handling(void); - /* Structures dealing with poll() call */ struct poll_interest { beforepoll_fn *before; @@ -42,7 +34,7 @@ struct poll_interest { void *state; uint32_t max_nfds; uint32_t nfds; - string_t desc; + cstring_t desc; struct poll_interest *next; }; static struct poll_interest *reg=NULL; @@ -229,7 +221,7 @@ static void setup(dict_t *config) } void register_for_poll(void *st, beforepoll_fn *before, - afterpoll_fn *after, uint32_t max_nfds, string_t desc) + afterpoll_fn *after, uint32_t max_nfds, cstring_t desc) { struct poll_interest *i; @@ -263,10 +255,7 @@ static void run(void) int timeout; struct pollfd *fds; - fds=alloca(sizeof(*fds)*total_nfds); - if (!fds) { - fatal("run: couldn't alloca"); - } + fds=safe_malloc(sizeof(*fds)*total_nfds, "run"); Message(M_NOTICE,"%s [%d]: starting\n",version,secnet_pid); @@ -309,12 +298,14 @@ static void run(void) } } while (rv<0); } while (!finished); + free(fds); } static void droppriv(void) { FILE *pf=NULL; pid_t p; + int errfds[2]; add_hook(PHASE_SHUTDOWN,system_phase_hook,NULL); @@ -349,15 +340,20 @@ static void droppriv(void) } else if (p==0) { /* Child process - all done, just carry on */ if (pf) fclose(pf); - /* Close stdin, stdout and stderr; we don't need them any more */ - /* XXX we must leave stderr pointing to something useful - - a pipe to a log destination, for example, or just leave - it alone. */ + /* Close stdin and stdout; we don't need them any more. + stderr is redirected to the system/log facility */ + if (pipe(errfds)!=0) { + fatal_perror("can't create pipe for stderr"); + } close(0); close(1); - /* XXX close(2); */ + close(2); + dup2(errfds[1],0); + dup2(errfds[1],1); + dup2(errfds[1],2); secnet_is_daemon=True; setsid(); + log_from_fd(errfds[0],"stderr",system_log); } else { /* Error */ fatal_perror("cannot fork"); @@ -404,8 +400,9 @@ int main(int argc, char **argv) droppriv(); start_signal_handling(); - request_signal_notification(SIGTERM,finish,"SIGTERM"); - if (!background) request_signal_notification(SIGINT,finish,"SIGINT"); + request_signal_notification(SIGTERM,finish,safe_strdup("SIGTERM","run")); + if (!background) request_signal_notification(SIGINT,finish, + safe_strdup("SIGINT","run")); request_signal_notification(SIGHUP,ignore_hup,NULL); enter_phase(PHASE_RUN); run();