in src/native/unix/native/jsvc-unix.c [1057:1155]
static void set_output(char *outfile, char *errfile, bool redirectstdin, char *procname)
{
int out_pipe[2] = { -1, -1 };
int err_pipe[2] = { -1, -1 };
int fork_needed = 0;
if (redirectstdin == true) {
freopen("/dev/null", "r", stdin);
}
log_debug("redirecting stdout to %s and stderr to %s", outfile, errfile);
/* make sure the debug goes out */
if (log_debug_flag == true && strcmp(errfile, "/dev/null") == 0)
return;
if (strcmp(outfile, "&1") == 0 && strcmp(errfile, "&2") == 0)
return;
if (strcmp(outfile, "SYSLOG") == 0) {
freopen("/dev/null", "a", stdout);
/* Send stdout to syslog through a logger process */
if (pipe(out_pipe) == -1) {
log_error("cannot create stdout pipe: %s", strerror(errno));
}
else {
fork_needed = 1;
log_stdout_syslog_flag = true;
}
}
else if (strcmp(outfile, "&2")) {
if (strcmp(outfile, "&1")) {
/* Redirect stdout to a file */
loc_freopen(outfile, "a", stdout);
}
}
if (strcmp(errfile, "SYSLOG") == 0) {
freopen("/dev/null", "a", stderr);
/* Send stderr to syslog through a logger process */
if (pipe(err_pipe) == -1) {
log_error("cannot create stderr pipe: %s", strerror(errno));
}
else {
fork_needed = 1;
log_stderr_syslog_flag = true;
}
}
else if (strcmp(errfile, "&1")) {
if (strcmp(errfile, "&2")) {
/* Redirect stderr to a file */
loc_freopen(errfile, "a", stderr);
}
}
if (strcmp(errfile, "&1") == 0 && strcmp(outfile, "&1")) {
/*
* -errfile &1 -outfile foo
* Redirect stderr to stdout
*/
close(2);
dup2(1, 2);
}
if (strcmp(outfile, "&2") == 0 && strcmp(errfile, "&2")) {
/*
* -outfile &2 -errfile foo
* Redirect stdout to stderr
*/
close(1);
dup2(2, 1);
}
if (fork_needed) {
pid_t pid = fork();
if (pid == -1) {
log_error("cannot create logger process: %s", strerror(errno));
}
else {
if (pid != 0) {
/* Parent process.
* Close child pipe endpoints.
*/
logger_pid = pid;
if (out_pipe[0] != -1) {
close(out_pipe[0]);
if (dup2(out_pipe[1], 1) == -1) {
log_error("cannot redirect stdout to pipe for syslog: %s", strerror(errno));
}
}
if (err_pipe[0] != -1) {
close(err_pipe[0]);
if (dup2(err_pipe[1], 2) == -1) {
log_error("cannot redirect stderr to pipe for syslog: %s", strerror(errno));
}
}
}
else {
exit(logger_child(out_pipe[0], err_pipe[0], procname));
}
}
}
}