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

source_changes at macosforge.org source_changes at macosforge.org
Wed Jan 10 10:38:28 PST 2007


Revision: 23007
          http://trac.macosforge.org/projects/launchd/changeset/23007
Author:   zarzycki at apple.com
Date:     2007-01-10 10:38:28 -0800 (Wed, 10 Jan 2007)

Log Message:
-----------
<rdar://problem/4884164> support loading jobs into the loginwindow context

Modified Paths:
--------------
    trunk/launchd/src/launchd_core_logic.c
    trunk/launchd/src/liblaunch.c
    trunk/launchd/src/liblaunch_private.h
    trunk/launchd/src/libvproc.c
    trunk/launchd/src/libvproc_internal.h

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2007-01-05 22:03:52 UTC (rev 23006)
+++ trunk/launchd/src/launchd_core_logic.c	2007-01-10 18:38:28 UTC (rev 23007)
@@ -298,7 +298,7 @@
 static void job_setup_fd(job_t j, int target_fd, const char *path, int flags);
 static void job_postfork_become_user(job_t j);
 static void job_force_sampletool(job_t j);
-static void job_reparent_to_aqua_hack(job_t j);
+static void job_reparent_hack(job_t j, const char *where);
 static void job_callback(void *obj, struct kevent *kev);
 static launch_data_t job_export2(job_t j, bool subjobs);
 static job_t job_new_spawn(job_t j, const char *label, const char *path, const char *workingdir, const char *const *argv, const char *const *env, mode_t *u_mask, bool w4d);
@@ -840,7 +840,7 @@
 		return NULL;
 	}
 
-	job_reparent_to_aqua_hack(jr);
+	job_reparent_hack(jr, "Aqua");
 
 	if (getpid() == 1) {
 		struct ldcred ldc;
@@ -1115,7 +1115,9 @@
 			return;
 		} else if (strcasecmp(key, LAUNCH_JOBKEY_LIMITLOADTOSESSIONTYPE) == 0) {
 			if (strcmp(value, "Aqua") == 0) {
-				job_reparent_to_aqua_hack(j);
+				job_reparent_hack(j, "Aqua");
+			} else if (strcmp(value, "LoginWindow") == 0) {
+				job_reparent_hack(j, "LoginWindow");
 			}
 			return;
 		}
@@ -3179,7 +3181,7 @@
 		return NULL;
 	}
 
-	jmr = calloc(1, sizeof(struct jobmgr_s) + strlen("100000") + 1);
+	jmr = calloc(1, sizeof(struct jobmgr_s) + strlen("LoginWindow") + 1);
 	
 	if (jmr == NULL) {
 		return NULL;
@@ -3832,6 +3834,9 @@
 	}
 
 	switch (key) {
+	case GSK_LOGINWINDOW_CONTEXT:
+		strcpy(j->mgr->name, "LoginWindow");
+		break;
 	case GLOBAL_ON_DEMAND:
 		kr = job_set_global_on_demand(j, (bool)val) ? 0 : 1;
 		break;
@@ -4166,14 +4171,13 @@
 	return BOOTSTRAP_NO_MEMORY;
 }
 
-
 void
-job_reparent_to_aqua_hack(job_t j)
+job_reparent_hack(job_t j, const char *where)
 {
 	jobmgr_t jmi = NULL;
 
 	SLIST_FOREACH(jmi, &root_jobmgr->submgrs, sle) {
-		if (strcmp(jmi->name, "Aqua") == 0) {
+		if (strcmp(jmi->name, where) == 0) {
 			break;
 		}
 	}

Modified: trunk/launchd/src/liblaunch.c
===================================================================
--- trunk/launchd/src/liblaunch.c	2007-01-05 22:03:52 UTC (rev 23006)
+++ trunk/launchd/src/liblaunch.c	2007-01-10 18:38:28 UTC (rev 23007)
@@ -1186,6 +1186,30 @@
 	_exit(EXIT_FAILURE);
 }
 
+void
+load_launchd_jobs_at_loginwindow_prompt(int flags, ...)
+{
+	char *largv[] = { "/bin/launchctl", "load", "-S", "LoginWindow", "-D", "all", "/etc/mach_init_per_login_session.d", NULL };
+	int wstatus;
+	pid_t p;
+
+	if (flags & LOAD_ONLY_SAFEMODE_LAUNCHAGENTS) {
+		largv[5] = "system";
+	}
+
+	if (__vproc_tag_loginwindow_context()) {
+		return;
+	}
+
+	if ((p = fexecv_as_user("root", 0, 0, largv)) == -1) {
+		return;
+	}
+
+	if (waitpid(p, &wstatus, 0) != p) {
+		return;
+	}
+}
+
 pid_t
 create_and_switch_to_per_session_launchd(const char *login, int flags, ...)
 {

Modified: trunk/launchd/src/liblaunch_private.h
===================================================================
--- trunk/launchd/src/liblaunch_private.h	2007-01-05 22:03:52 UTC (rev 23006)
+++ trunk/launchd/src/liblaunch_private.h	2007-01-10 18:38:28 UTC (rev 23007)
@@ -73,14 +73,18 @@
  *
  * After this call, the task's bootstrap port is set to the per session launchd.
  *
- * This returns the PID on of the per session launchd, and -1 on failure.
- * 
- * If launchd terminates, loginwindow should exit.
- * If loginwindow terminates, launchd will exit.
+ * This returns 1 on success (it used to return otherwise), and -1 on failure.
  */
 #define	LOAD_ONLY_SAFEMODE_LAUNCHAGENTS	1
 pid_t create_and_switch_to_per_session_launchd(const char *login, int flags, ...);
 
+/* Also for LoginWindow.
+ *
+ * This is will load jobs at the LoginWindow prompt.
+ */
+void load_launchd_jobs_at_loginwindow_prompt(int flags, ...);
+
+
 /* batch jobs will be implicity re-enabled when the last application who
  * disabled them exits.
  *

Modified: trunk/launchd/src/libvproc.c
===================================================================
--- trunk/launchd/src/libvproc.c	2007-01-05 22:03:52 UTC (rev 23006)
+++ trunk/launchd/src/libvproc.c	2007-01-10 18:38:28 UTC (rev 23007)
@@ -208,6 +208,16 @@
 }
 
 vproc_err_t
+__vproc_tag_loginwindow_context(void)
+{
+	if (vproc_mig_set_integer(bootstrap_port, GSK_LOGINWINDOW_CONTEXT, 1) == 0) {
+		return NULL;
+	}
+
+	return (vproc_err_t)__vproc_tag_loginwindow_context;
+}
+
+vproc_err_t
 _vproc_set_global_on_demand(bool state)
 {
 	int64_t val = state ? ~0 : 0;

Modified: trunk/launchd/src/libvproc_internal.h
===================================================================
--- trunk/launchd/src/libvproc_internal.h	2007-01-05 22:03:52 UTC (rev 23006)
+++ trunk/launchd/src/libvproc_internal.h	2007-01-10 18:38:28 UTC (rev 23007)
@@ -31,6 +31,7 @@
 typedef enum {
 	LAST_EXIT_STATUS = 1,
 	GLOBAL_ON_DEMAND,
+	GSK_LOGINWINDOW_CONTEXT,
 } get_set_int_key_t;
 
 #ifdef protocol_vproc_MSG_COUNT
@@ -52,6 +53,8 @@
 		name_array_t *service_names, mach_msg_type_number_t *service_namesCnt,
 		mach_port_array_t *ports, mach_msg_type_number_t *portCnt);
 
+vproc_err_t __vproc_tag_loginwindow_context(void);
+
 kern_return_t _vprocmgr_getsocket(name_t);
 
 vproc_err_t _vproc_move_subset_to_user(void);

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


More information about the launchd-changes mailing list