static void fork_and_print_environment (void) { int status; pid_t pid; int fd, i; if (run_foreground) { print_environment (); return; } pid = fork (); if (pid != 0) { /* Here we are in the initial process */ if (run_daemonized) { /* Initial process, waits for intermediate child */ if (pid == -1) exit (1); waitpid (pid, &status, 0); if (WEXITSTATUS (status) != 0) exit (WEXITSTATUS (status)); } else { /* Not double forking */ print_environment (); } /* The initial process exits successfully */ exit (0); } if (run_daemonized) { /* * Become session leader of a new session, process group leader of a new * process group, and detach from the controlling TTY, so that SIGHUP is * not sent to this process when the previous session leader dies */ setsid (); /* Double fork if need to daemonize properly */ pid = fork (); if (pid != 0) { /* Here we are in the intermediate child process */ /* * This process exits, so that the final child will inherit * init as parent to avoid zombies */ if (pid == -1) exit (1); /* We've done two forks. */ print_environment (); /* The intermediate child exits */ exit (0); } } /* Here we are in the resulting daemon or background process. */ for (i = 0; i < 3; ++i) { fd = open ("/dev/null", O_RDONLY); sane_dup2 (fd, i); close (fd); } }
int mz_sendmail_send_password_mail (const char *command_path, const char *from, const char *recipient, const char *body, unsigned int body_length, const char *boundary, const char *password, int timeout) { pid_t pid; int stdout_pipe[2]; int stderr_pipe[2]; int stdin_pipe[2]; if (pipe(stdout_pipe) < 0 || pipe(stderr_pipe) < 0 || pipe(stdin_pipe) < 0) { return -1; } pid = fork(); if (pid == -1) return -1; if (pid == 0) { close_pipe(stdout_pipe, READ); close_pipe(stderr_pipe, READ); close_pipe(stdin_pipe, WRITE); if (sane_dup2(stdin_pipe[READ], STDIN_FILENO) < 0 || sane_dup2(stdout_pipe[WRITE], STDOUT_FILENO) < 0 || sane_dup2(stderr_pipe[WRITE], STDERR_FILENO) < 0) { } if (stdin_pipe[READ] >= 3) close_pipe(stdin_pipe, READ); if (stdout_pipe[WRITE] >= 3) close_pipe(stdout_pipe, WRITE); if (stderr_pipe[WRITE] >= 3) close_pipe(stderr_pipe, WRITE); execl(command_path, command_path, recipient, (char*)NULL); _exit(-1); } else { int status; close_pipe(stdout_pipe, WRITE); close_pipe(stderr_pipe, WRITE); close_pipe(stdin_pipe, READ); output_headers(stdin_pipe[WRITE], from, recipient, boundary); output_password(stdin_pipe[WRITE], password, boundary); output_body(stdin_pipe[WRITE], body, body_length); while (waitpid(pid, &status, WNOHANG) <= 0); return status; } return 0; }
static void fork_and_print_environment (void) { int status; pid_t pid; int fd, i; if (run_foreground) { print_environment (getpid ()); return; } pid = fork (); if (pid != 0) { /* Here we are in the initial process */ if (run_daemonized) { /* Initial process, waits for intermediate child */ if (pid == -1) exit (1); waitpid (pid, &status, 0); if (WEXITSTATUS (status) != 0) exit (WEXITSTATUS (status)); } else { /* Not double forking, we know the PID */ print_environment (pid); } /* The initial process exits successfully */ exit (0); } if (run_daemonized) { /* Double fork if need to daemonize properly */ pid = fork (); if (pid != 0) { /* Here we are in the intermediate child process */ /* * This process exits, so that the final child will inherit * init as parent to avoid zombies */ if (pid == -1) exit (1); /* We've done two forks. Now we know the PID */ print_environment (pid); /* The intermediate child exits */ exit (0); } } /* Here we are in the resulting daemon or background process. */ for (i = 0; i < 3; ++i) { fd = open ("/dev/null", O_RDONLY); sane_dup2 (fd, i); close (fd); } }