X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=src%2Fapplication.c;h=b7e943d72054e1ff6b8e3246d79363b6660b569f;hb=b43bc048eb4c2c0855d4d7c4ad6b0b3c14e50eb2;hp=96b4204ee6a9e83b7a95be51aa320c6639aab4de;hpb=ba01fa44feb6deb0f0359f381eafe866991c06c1;p=osmocom-bb.git diff --git a/src/application.c b/src/application.c index 96b4204..b7e943d 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; @@ -38,7 +44,7 @@ void osmo_init_ignore_signals(void) int osmo_init_logging(const struct log_info *log_info) { - log_init(log_info); + log_init(log_info, NULL); osmo_stderr_target = log_target_create_stderr(); if (!osmo_stderr_target) return -1; @@ -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; +}