Revision
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

Diff

Modified: trunk/launchd/src/launchd_core_logic.c (22958 => 22959)


--- 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)
 {