diff options
| author | David Sommerseth <dazo@users.sourceforge.net> | 2010-11-26 22:05:28 +0100 |
|---|---|---|
| committer | David Sommerseth <dazo@users.sourceforge.net> | 2010-11-26 22:05:28 +0100 |
| commit | 525d75316848f79208101e48a54e21396464c98b (patch) | |
| tree | 9475b2a3821d317a55ad118903839fed163e10d7 /plugin/firewall | |
| parent | 5581ba10af35b94e750596312a9782255084aaeb (diff) | |
| download | eurephia-525d75316848f79208101e48a54e21396464c98b.tar.gz eurephia-525d75316848f79208101e48a54e21396464c98b.tar.xz eurephia-525d75316848f79208101e48a54e21396464c98b.zip | |
Move daemonize() code to be called in the firewall child thread only
The eurephia plug-in would daemonize the OpenVPN process by calling
daemonize() too early. This patch renames daemoinze() to efw_daemonize()
and calls it only in the firewall child process.
Signed-off-by: David Sommerseth <dazo@users.sourceforge.net>
Diffstat (limited to 'plugin/firewall')
| -rw-r--r-- | plugin/firewall/eurephiafw.c | 28 | ||||
| -rw-r--r-- | plugin/firewall/eurephiafw.h | 2 |
2 files changed, 28 insertions, 2 deletions
diff --git a/plugin/firewall/eurephiafw.c b/plugin/firewall/eurephiafw.c index 12fb697..9ae126e 100644 --- a/plugin/firewall/eurephiafw.c +++ b/plugin/firewall/eurephiafw.c @@ -130,12 +130,35 @@ int eFW_load(eurephiaCTX *ctx, const char *intf) { /** + * daemonize the firewall thread if "daemon" environment variable is set. + * preserves stderr access after being daemonized, but + * only if "daemon_log_direct" environment variable is set. + * + * @param ctx eurephiaCTX - Used for error logging only + * @param logdir Set to 1 if logging should be redirected + */ +static void efw_daemonize(eurephiaCTX *ctx, const int logredir) +{ + int fd = -1; + if( logredir ) { + fd = dup (2); + } + if( daemon(0, 0) < 0 ) { + eurephia_log(ctx, LOG_WARNING, 0, "efw_daemonize() failed"); + } else if( fd >= 3 ) { + dup2(fd, 2); + close(fd); + } +} + + +/** * Starts the firewall thread. It is started as a separate process, to make sure it will run with * root privileges. * * @param ctx eurephiaCTX */ -void eFW_StartFirewall(eurephiaCTX *ctx) { +void eFW_StartFirewall(eurephiaCTX *ctx, const int daemon, const int logredir) { struct mq_attr mqattr; eurephiaCTX *shadowctx = NULL; eFWupdateRequest updreq; @@ -220,6 +243,9 @@ void eFW_StartFirewall(eurephiaCTX *ctx) { } switch( ctx->fwcfg->fwproc_pid ) { case 0: // Child process + if( daemon ) { + efw_daemonize(ctx, logredir); + } eDBdisconnect(ctx); eFW_RunFirewall(&(*ctx->fwcfg).thrdata); exit(-1); // If our child process exits abnormally. diff --git a/plugin/firewall/eurephiafw.h b/plugin/firewall/eurephiafw.h index 7703fe5..72dc9bd 100644 --- a/plugin/firewall/eurephiafw.h +++ b/plugin/firewall/eurephiafw.h @@ -35,7 +35,7 @@ int eFW_load(eurephiaCTX *ctx, const char *intf); int eFW_unload(eurephiaCTX *ctx); -void eFW_StartFirewall(eurephiaCTX *ctx); +void eFW_StartFirewall(eurephiaCTX *ctx, const int daemon, const int logredir); void eFW_StopFirewall(eurephiaCTX *ctx); int eFW_UpdateFirewall(eurephiaCTX *ctx, eFWupdateRequest *request); |
