[launchd-changes] [22959] trunk/launchd/src/launchd_core_logic.c

source_changes at macosforge.org source_changes at macosforge.org
Tue Nov 28 16:04:29 PST 2006


Revision: 22959
          http://trac.macosforge.org/projects/launchd/changeset/22959
Author:   zarzycki at 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)
 {

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061128/eb57004a/attachment.html


More information about the launchd-changes mailing list