diff options
Diffstat (limited to 'src/util/server.c')
-rw-r--r-- | src/util/server.c | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/src/util/server.c b/src/util/server.c index 1e8b148d..41c0d97a 100644 --- a/src/util/server.c +++ b/src/util/server.c @@ -25,6 +25,7 @@ #define _GNU_SOURCE #include <sys/types.h> +#include <sys/wait.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> @@ -67,18 +68,43 @@ static void close_low_fds(void) #endif } +static void deamon_parent_sigterm(int sig) +{ + _exit(0); +} + /** Become a daemon, discarding the controlling terminal. **/ void become_daemon(bool Fork) { - int ret; + pid_t pid; + int status; + int ret; if (Fork) { - if (fork()) { - _exit(0); - } + pid = fork(); + if (pid != 0) { + /* Terminate parent process on demand so we can hold systemd + * or initd from starting next service until sssd in initialized. + * We use signals directly here because we don't have a tevent + * context yet. */ + CatchSignal(SIGTERM, deamon_parent_sigterm); + + /* or exit when sssd monitor is terminated */ + waitpid(pid, &status, 0); + + /* return error if we didn't exited normally */ + ret = 1; + + if (WIFEXITED(status)) { + /* but return our exit code otherwise */ + ret = WEXITSTATUS(status); + } + + _exit(ret); + } } /* detach from the terminal */ @@ -430,6 +456,7 @@ int server_setup(const char *name, int flags, return ENOMEM; } + ctx->parent_pid = getppid(); ctx->event_ctx = event_ctx; conf_db = talloc_asprintf(ctx, "%s/%s", DB_PATH, CONFDB_FILE); |