diff options
author | Harald Welte <laforge@gnumonks.org> | 2011-06-26 13:07:18 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2011-06-26 14:14:05 +0200 |
commit | 32e1f239b3b8f04c8f26c80ea87c978040c122bf (patch) | |
tree | c3fbdf930782559737d621a9f07c999045b6bfd7 /src/application.c | |
parent | 2a68c7c8cd2eca65c58c0898d0e1716e9d4c3ecd (diff) |
merge process.[ch] with application.[ch]
Diffstat (limited to 'src/application.c')
-rw-r--r-- | src/application.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/application.c b/src/application.c index 96b4204e..5f8f4471 100644 --- a/src/application.c +++ b/src/application.c @@ -1,5 +1,6 @@ /* Utility functions to setup applications */ /* + * (C) 2010 by Harald Welte <laforge@gnumonks.org> * (C) 2011 by Holger Hans Peter Freyther * * All Rights Reserved @@ -24,6 +25,11 @@ #include <osmocom/core/logging.h> #include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <errno.h> +#include <sys/stat.h> struct log_target *osmo_stderr_target; @@ -47,3 +53,50 @@ int osmo_init_logging(const struct log_info *log_info) log_set_all_filter(osmo_stderr_target, 1); return 0; } + +int osmo_daemonize(void) +{ + int rc; + pid_t pid, sid; + + /* Check if parent PID == init, in which case we are already a daemon */ + if (getppid() == 1) + return -EEXIST; + + /* Fork from the parent process */ + pid = fork(); + if (pid < 0) { + /* some error happened */ + return pid; + } + + if (pid > 0) { + /* if we have received a positive PID, then we are the parent + * and can exit */ + exit(0); + } + + /* FIXME: do we really want this? */ + umask(0); + + /* Create a new session and set process group ID */ + sid = setsid(); + if (sid < 0) + return sid; + + /* Change to the /tmp directory, which prevents the CWD from being locked + * and unable to remove it */ + rc = chdir("/tmp"); + if (rc < 0) + return rc; + + /* Redirect stdio to /dev/null */ +/* since C89/C99 says stderr is a macro, we can safely do this! */ +#ifdef stderr + freopen("/dev/null", "r", stdin); + freopen("/dev/null", "w", stdout); + freopen("/dev/null", "w", stderr); +#endif + + return 0; +} |