X-Git-Url: http://git.rot13.org/?p=osmocom-bb.git;a=blobdiff_plain;f=src%2Fapplication.c;h=5f8f4471a79c67fbd4b5f903d0c1cef88806f960;hp=96b4204ee6a9e83b7a95be51aa320c6639aab4de;hb=32e1f239b3b8f04c8f26c80ea87c978040c122bf;hpb=2a68c7c8cd2eca65c58c0898d0e1716e9d4c3ecd diff --git a/src/application.c b/src/application.c index 96b4204..5f8f447 100644 --- a/src/application.c +++ b/src/application.c @@ -1,5 +1,6 @@ /* Utility functions to setup applications */ /* + * (C) 2010 by Harald Welte * (C) 2011 by Holger Hans Peter Freyther * * All Rights Reserved @@ -24,6 +25,11 @@ #include #include +#include +#include +#include +#include +#include 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; +}