diff --git a/gpsdate.c b/gpsdate.c index c424330..9ea0808 100644 --- a/gpsdate.c +++ b/gpsdate.c @@ -34,7 +34,10 @@ #include #include #include + #include +#include +#include #include @@ -73,6 +76,53 @@ static void callback(struct gps_data_t *gpsdata) } } +static 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; +} + int main(int argc, char **argv) { char *host = "localhost"; @@ -98,6 +148,8 @@ int main(int argc, char **argv) exit(EXIT_FAILURE); } + osmo_daemonize(); + gps_stream(&gpsdata, WATCH_ENABLE|WATCH_JSON, NULL); gps_mainloop(&gpsdata, 5000000, callback);