Revision: 22959 http://trac.macosforge.org/projects/launchd/changeset/22959 Author: zarzycki@apple.com Date: 2006-11-28 16:04:29 -0800 (Tue, 28 Nov 2006) Log Message: ----------- Part one of a series of patches to move launchd globals to the jobmgr_t object. Yes, the 'jobmgr_s.jm_stdout' and 'jobmgr_s.jm_stderr' elements are not fully implemented yet. The part that is missing is the setter API, but since the keys are optional, the lack of the setter isn't fatal. Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2006-11-17 23:08:31 UTC (rev 22958) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-29 00:04:29 UTC (rev 22959) @@ -197,6 +197,9 @@ mach_port_t req_port; jobmgr_t parentmgr; job_t anonj; + char *jm_stdout; + char *jm_stderr; + unsigned int global_on_demand_cnt; unsigned int transfer_bstrap:1; char name[0]; }; @@ -218,6 +221,8 @@ static void jobmgr_log(jobmgr_t jm, int pri, const char *msg, ...) __attribute__((format(printf, 3, 4))); /* static void jobmgr_log_error(jobmgr_t jm, int pri, const char *msg, ...) __attribute__((format(printf, 3, 4))); */ static void jobmgr_log_bug(jobmgr_t jm, const char *rcs_rev, const char *path, unsigned int line, const char *test); +static char *jobmgr_get_stdout(jobmgr_t jm); +static char *jobmgr_get_stderr(jobmgr_t jm); struct job_s { kq_callback kqjob_callback; @@ -332,7 +337,6 @@ static int dir_has_files(job_t j, const char *path); static char **mach_cmd2argv(const char *string); -static size_t global_on_demand_cnt; jobmgr_t root_jobmgr; jobmgr_t gc_this_jobmgr; size_t total_children; @@ -564,6 +568,14 @@ jobmgr_assumes(jm, launchd_mport_close_recv(jm->jm_port) == KERN_SUCCESS); } } + + if (jm->jm_stdout) { + free(jm->jm_stdout); + } + + if (jm->jm_stderr) { + free(jm->jm_stderr); + } free(jm); } @@ -707,13 +719,13 @@ } if ((j->forced_peers_to_demand_mode = val)) { - global_on_demand_cnt++; + j->mgr->global_on_demand_cnt++; } else { - global_on_demand_cnt--; + j->mgr->global_on_demand_cnt--; } - if (global_on_demand_cnt == 0) { - jobmgr_dispatch_all(root_jobmgr); + if (j->mgr->global_on_demand_cnt == 0) { + jobmgr_dispatch_all(j->mgr); } return true; @@ -2027,8 +2039,8 @@ } job_setup_fd(j, STDIN_FILENO, j->stdinpath, O_RDONLY); - job_setup_fd(j, STDOUT_FILENO, j->stdoutpath, O_WRONLY|O_APPEND|O_CREAT); - job_setup_fd(j, STDERR_FILENO, j->stderrpath, O_WRONLY|O_APPEND|O_CREAT); + job_setup_fd(j, STDOUT_FILENO, j->stdoutpath ? j->stdoutpath : jobmgr_get_stdout(j->mgr), O_WRONLY|O_APPEND|O_CREAT); + job_setup_fd(j, STDERR_FILENO, j->stderrpath ? j->stderrpath : jobmgr_get_stderr(j->mgr), O_WRONLY|O_APPEND|O_CREAT); jobmgr_setup_env_from_other_jobs(j->mgr); @@ -2688,7 +2700,7 @@ bool good_exit = (WIFEXITED(j->last_exit_status) && WEXITSTATUS(j->last_exit_status) == 0); bool dispatch_others = false; - if (global_on_demand_cnt > 0) { + if (j->mgr->global_on_demand_cnt > 0) { return false; } @@ -2988,6 +3000,30 @@ } } +char * +jobmgr_get_stdout(jobmgr_t jm) +{ + if (jm->jm_stdout) { + return jm->jm_stdout; + } else if (jm->parentmgr == NULL) { + return NULL; + } + + return jobmgr_get_stdout(jm->parentmgr); +} + +char * +jobmgr_get_stderr(jobmgr_t jm) +{ + if (jm->jm_stderr) { + return jm->jm_stderr; + } else if (jm->parentmgr == NULL) { + return NULL; + } + + return jobmgr_get_stderr(jm->parentmgr); +} + jobmgr_t jobmgr_parent(jobmgr_t jm) {