chiark / gitweb /
logging: Persistent children include pid in their log messages
[secnet.git] / secnet.h
index 54f5d073b8f27f8e3f6cccf62e6b016a883b5d51..eb250a4a4fc3c38b3ababaef20ba595d23b9fa09 100644 (file)
--- a/secnet.h
+++ b/secnet.h
@@ -14,6 +14,7 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include <errno.h>
+#include <fnmatch.h>
 #include <sys/poll.h>
 #include <sys/types.h>
 #include <sys/wait.h>
@@ -63,6 +64,12 @@ void afterfork(void);
 /* Must be called before exec in every child made after
    start_signal_handling.  Safe to call in earlier children too. */
 
+void childpersist_closefd_hook(void *fd_p, uint32_t newphase);
+/* Convenience hook function for use with add_hook PHASE_CHILDPERSIST.
+   With `int fd' in your state struct, pass fd_p=&fd.  The hook checks
+   whether fd>=0, so you can use it for an fd which is only sometimes
+   open.  This function will set fd to -1, so it is idempotent. */
+
 /***** CONFIGURATION support *****/
 
 extern bool_t just_check_config; /* If True then we're going to exit after
@@ -257,10 +264,18 @@ enum phase {
     PHASE_DROPPRIV,            /* Last chance for privileged operations */
     PHASE_RUN,
     PHASE_SHUTDOWN,            /* About to die; delete key material, etc. */
+    PHASE_CHILDPERSIST,        /* Forked long-term child: close fds, etc. */
     /* Keep this last: */
     NR_PHASES,
 };
 
+/* Each module should, in its CHILDPERSIST hooks, close all fds which
+   constitute ownership of important operating system resources, or
+   which are used for IPC with other processes who want to get the
+   usual disconnection effects if the main secnet process dies.
+   CHILDPERSIST hooks are not run if the child is going to exec;
+   so fds such as described above should be CLOEXEC too. */
+
 typedef void hook_fn(void *self, uint32_t newphase);
 bool_t add_hook(uint32_t phase, hook_fn *f, void *state);
 bool_t remove_hook(uint32_t phase, hook_fn *f, void *state);
@@ -269,6 +284,7 @@ extern uint32_t current_phase;
 extern void enter_phase(uint32_t new_phase);
 
 void phase_hooks_init(void); /* for main() only */
+void clear_phase_hooks(uint32_t phase); /* for afterfork() */
 
 /* Some features (like netlink 'soft' routes) require that secnet
    retain root privileges.  They should indicate that here when
@@ -295,6 +311,7 @@ extern void init_builtin_modules(dict_t *dict);
 extern init_module resolver_module;
 extern init_module random_module;
 extern init_module udp_module;
+extern init_module polypath_module;
 extern init_module util_module;
 extern init_module site_module;
 extern init_module transform_eax_module;