On Thu, 2012-11-01 at 17:36 +0100, Pavel Březina wrote:
+void become_daemon(bool Fork, pid_t *ppid)
{
- int ret;
+ pid_t pid;
+ int status;
+ int ret;
- if (Fork) {
- if (fork()) {
- _exit(0);
- }
- }
+ if (Fork) {
+ pid = fork();
+ if (pid != 0) {
+ *ppid = 0;
Why care about ppid at all here? you never return from this branch as
you call _exit();
+ /* 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);
+ }
+ }
+
+ *ppid = getppid();
What's the point of making become_daemon() return a ppid if you assign
it unconditionally after the fork() ?
Isn't it the same than calling getppid() in the caller function ?
What am I missing ?
/* detach from the terminal */
- setsid();
+ setsid();
/* chdir to / to be sure we're not on a remote filesystem */
errno = 0;
@@ -93,8 +123,8 @@ void become_daemon(bool Fork)
return;
}
This ^^ remains indented odly.
- /* Close fd's 0,1,2. Needed if started by rsh */
- close_low_fds();
+ /* Close fd's 0,1,2. Needed if started by rsh */
+ close_low_fds();
}
Simo.
--
Simo Sorce * Red Hat, Inc * New York