[launchd-changes] [22966] trunk/launchd/src

source_changes at macosforge.org source_changes at macosforge.org
Mon Dec 4 09:34:49 PST 2006


Revision: 22966
          http://trac.macosforge.org/projects/launchd/changeset/22966
Author:   zarzycki at apple.com
Date:     2006-12-04 09:34:49 -0800 (Mon, 04 Dec 2006)

Log Message:
-----------
Less globals and no more need for a mount table update callback from the kernel (via kqueue).

Now we can have stdout/stderr per jobmgr.

Modified Paths:
--------------
    trunk/launchd/src/launchctl.c
    trunk/launchd/src/launchd.c
    trunk/launchd/src/launchd_core_logic.c
    trunk/launchd/src/launchd_core_logic.h

Modified: trunk/launchd/src/launchctl.c
===================================================================
--- trunk/launchd/src/launchctl.c	2006-12-04 17:26:23 UTC (rev 22965)
+++ trunk/launchd/src/launchctl.c	2006-12-04 17:34:49 UTC (rev 22966)
@@ -1719,22 +1719,16 @@
 stdio_cmd(int argc, char *const argv[])
 {
 	launch_data_t resp, msg, tmp;
-	int e, fd = -1, r = 0;
+	int e, r = 0;
 
 	if (argc != 2) {
 		fprintf(stderr, "usage: %s %s <path>\n", getprogname(), argv[0]);
 		return 1;
 	}
 
-	fd = open(argv[1], O_CREAT|O_APPEND|O_WRONLY|O_NOCTTY, DEFFILEMODE);
-
 	msg = launch_data_alloc(LAUNCH_DATA_DICTIONARY);
 
-	if (fd == -1) {
-		tmp = launch_data_new_string(argv[1]);
-	} else {
-		tmp = launch_data_new_fd(fd);
-	}
+	tmp = launch_data_new_string(argv[1]);
 
 	if (!strcmp(argv[0], "stdout")) {
 		launch_data_dict_insert(msg, tmp, LAUNCH_KEY_SETSTDOUT);
@@ -1758,9 +1752,6 @@
 		r = 1;
 	}
 
-	if (fd != -1)
-		close(fd);
-
 	launch_data_free(resp);
 
 	return r;

Modified: trunk/launchd/src/launchd.c
===================================================================
--- trunk/launchd/src/launchd.c	2006-12-04 17:26:23 UTC (rev 22965)
+++ trunk/launchd/src/launchd.c	2006-12-04 17:34:49 UTC (rev 22966)
@@ -81,12 +81,10 @@
 extern char **environ;
 
 static void signal_callback(void *, struct kevent *);
-static void fs_callback(void);
 static void ppidexit_callback(void);
 static void pfsystem_callback(void *, struct kevent *);
 
 static kq_callback kqsignal_callback = signal_callback;
-static kq_callback kqfs_callback = (kq_callback)fs_callback;
 static kq_callback kqppidexit_callback = (kq_callback)ppidexit_callback;
 static kq_callback kqpfsystem_callback = pfsystem_callback;
 
@@ -101,8 +99,6 @@
 static void handle_pid1_crashes_separately(void);
 
 static bool re_exec_in_single_user_mode = false;
-static char *pending_stdout = NULL;
-static char *pending_stderr = NULL;
 static job_t rlcj = NULL;
 static jmp_buf doom_doom_doom;
 static void *crash_addr;
@@ -269,9 +265,6 @@
 
 	monitor_networking_state();
 
-	/* do this after pid1_magic_init() to not catch ourselves mounting stuff */
-	launchd_assumes(kevent_mod(0, EVFILT_FS, EV_ADD, 0, 0, &kqfs_callback) != -1);
-
 	if (session_type) {
 		pid_t pp = getppid();
 
@@ -475,29 +468,6 @@
 }
 
 void
-fs_callback(void)
-{
-	if (pending_stdout) {
-		int fd = open(pending_stdout, O_CREAT|O_APPEND|O_WRONLY|O_NOCTTY, DEFFILEMODE);
-		if (fd != -1) {
-			launchd_assumes(dup2(fd, STDOUT_FILENO) != -1);
-			launchd_assumes(close(fd) == 0);
-			free(pending_stdout);
-			pending_stdout = NULL;
-		}
-	}
-	if (pending_stderr) {
-		int fd = open(pending_stderr, O_CREAT|O_APPEND|O_WRONLY|O_NOCTTY, DEFFILEMODE);
-		if (fd != -1) {
-			launchd_assumes(dup2(fd, STDERR_FILENO) != -1);
-			launchd_assumes(close(fd) == 0);
-			free(pending_stderr);
-			pending_stderr = NULL;
-		}
-	}
-}
-
-void
 launchd_SessionCreate(void)
 {
 	OSStatus (*sescr)(SessionCreationFlags flags, SessionAttributeBits attributes);
@@ -534,17 +504,17 @@
 	launch_data_t resp = launch_data_new_errno(0);
 
 	if (launch_data_get_type(o) == LAUNCH_DATA_STRING) {
-		char **where = &pending_stderr;
-
-		if (d == STDOUT_FILENO) {
-			where = &pending_stdout;
+		switch (d) {
+		case STDOUT_FILENO:
+			jobmgr_set_stdout(root_jobmgr, launch_data_get_string(o));
+			break;
+		case STDERR_FILENO:
+			jobmgr_set_stderr(root_jobmgr, launch_data_get_string(o));
+			break;
+		default:
+			launch_data_set_errno(resp, EINVAL);
+			break;
 		}
-		if (*where) {
-			free(*where);
-		}
-		*where = strdup(launch_data_get_string(o));
-	} else if (launch_data_get_type(o) == LAUNCH_DATA_FD) {
-		launchd_assumes(dup2(launch_data_get_fd(o), d) != -1);
 	} else {
 		launch_data_set_errno(resp, EINVAL);
 	}

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2006-12-04 17:26:23 UTC (rev 22965)
+++ trunk/launchd/src/launchd_core_logic.c	2006-12-04 17:34:49 UTC (rev 22966)
@@ -3018,6 +3018,26 @@
 	return true;
 }
 
+void
+jobmgr_set_stdout(jobmgr_t jm, const char *what)
+{
+	if (jm->jm_stdout) {
+		free(jm->jm_stdout);
+	}
+
+	jm->jm_stdout = strdup(what);
+}
+
+void
+jobmgr_set_stderr(jobmgr_t jm, const char *what)
+{
+	if (jm->jm_stderr) {
+		free(jm->jm_stderr);
+	}
+
+	jm->jm_stderr = strdup(what);
+}
+
 char *
 jobmgr_get_stdout(jobmgr_t jm)
 {

Modified: trunk/launchd/src/launchd_core_logic.h
===================================================================
--- trunk/launchd/src/launchd_core_logic.h	2006-12-04 17:26:23 UTC (rev 22965)
+++ trunk/launchd/src/launchd_core_logic.h	2006-12-04 17:34:49 UTC (rev 22966)
@@ -29,6 +29,8 @@
 extern jobmgr_t root_jobmgr;
 extern jobmgr_t gc_this_jobmgr;
 
+void jobmgr_set_stdout(jobmgr_t jm, const char *what);
+void jobmgr_set_stderr(jobmgr_t jm, const char *what);
 bool jobmgr_is_idle(jobmgr_t jm);
 void jobmgr_remove_all_inactive(jobmgr_t jm);
 void jobmgr_dispatch_all_other_semaphores(jobmgr_t jm, job_t nj);

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


More information about the launchd-changes mailing list