diff options
author | Simo Sorce <simo@redhat.com> | 2014-01-03 12:10:36 -0500 |
---|---|---|
committer | Simo Sorce <simo@redhat.com> | 2014-01-04 10:26:53 -0500 |
commit | 393570b45816b690cb16fd1286d0705142ef2d62 (patch) | |
tree | f2d5bcd95c4ddc062f6ff30e28e8b59a9d51701a /proxy/src/gp_init.c | |
parent | 8f9db4fcd44df680029ed5a493cda7cdcd9c91ee (diff) | |
download | gss-proxy-usermode.tar.gz gss-proxy-usermode.tar.xz gss-proxy-usermode.zip |
Block parent process until child is initialized.usermode
This way the init system will not proceed starting dependencies until gssproxy
is actually ready to serve requests.
In particular this is used to make sure the nfsd proc file has been touched
before the nfsd server is started.
Resolves: https://fedorahosted.org/gss-proxy/ticket/114
Signed-off-by: Simo Sorce <simo@redhat.com>
Diffstat (limited to 'proxy/src/gp_init.c')
-rw-r--r-- | proxy/src/gp_init.c | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/proxy/src/gp_init.c b/proxy/src/gp_init.c index 830ae16..6207a78 100644 --- a/proxy/src/gp_init.c +++ b/proxy/src/gp_init.c @@ -37,12 +37,22 @@ #include <grp.h> #include "gp_proxy.h" -void init_server(bool daemonize) +void init_server(bool daemonize, int *wait_fd) { pid_t pid, sid; int ret; + *wait_fd = -1; + if (daemonize) { + int pipefd[2]; + char buf[1]; + + /* create parent-child pipe */ + ret = pipe(pipefd); + if (ret == -1) { + exit(EXIT_FAILURE); + } pid = fork(); if (pid == -1) { @@ -50,10 +60,22 @@ void init_server(bool daemonize) exit(EXIT_FAILURE); } if (pid != 0) { - /* ok kill the parent */ - exit(EXIT_SUCCESS); + /* wait for child to signal it is ready */ + close(pipefd[1]); + ret = gp_safe_read(pipefd[0], buf, 1); + if (ret == 1) { + /* child signaled all ok */ + exit(EXIT_SUCCESS); + } else { + /* lost child, something went wrong */ + exit(EXIT_FAILURE); + } } + /* child */ + close(pipefd[0]); + *wait_fd = pipefd[1]; + sid = setsid(); if (sid == -1) { /* setsid error ? abort */ @@ -78,6 +100,20 @@ void init_server(bool daemonize) gp_logging_init(); } +void init_done(int wait_fd) +{ + char buf = 0; + int ret; + + if (wait_fd != -1) { + ret = gp_safe_write(wait_fd, &buf, 1); + if (ret != 1) { + exit(EXIT_FAILURE); + } + close(wait_fd); + } +} + void fini_server(void) { closelog(); |