[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