Revision: 23007 http://trac.macosforge.org/projects/launchd/changeset/23007 Author: zarzycki@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);
participants (1)
-
source_changes@macosforge.org