From source_changes at macosforge.org Wed Nov 1 13:33:33 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22929] trunk/launchd/src/launchd_core_logic.c Message-ID: <20061101213333.D068A27BB58@cvs.opensource.apple.com> Revision: 22929 http://trac.macosforge.org/projects/launchd/changeset/22929 Author: zarzycki@apple.com Date: 2006-11-01 13:33:33 -0800 (Wed, 01 Nov 2006) Log Message: ----------- 9A297: Stuck at Blue Screen after MacBuddy on M39 (DS and security agent very very busy) 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-10-31 22:00:53 UTC (rev 22928) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-01 21:33:33 UTC (rev 22929) @@ -269,7 +269,7 @@ static void job_export_all2(job_t j, launch_data_t where); static launch_data_t job_export2(job_t j, bool subjobs); static job_t job_find_by_pid(job_t j, pid_t p, bool recurse); -static job_t job_new_spawn(const char *label, const char *path, const char *workingdir, const char *const *argv, const char *const *env, mode_t *u_mask, bool w4d, bool fppc); +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, bool fppc); static job_t job_new_via_mach_init(job_t jbs, const char *cmd, uid_t uid, bool ond); static job_t job_new_bootstrap(job_t p, mach_port_t requestorport, mach_port_t checkin_port); static bool job_new_anonymous(job_t p); @@ -766,16 +766,16 @@ } job_t -job_new_spawn(const char *label, const char *path, const char *workingdir, const char *const *argv, const char *const *env, mode_t *u_mask, bool w4d, bool fppc) +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, bool fppc) { job_t jr; - if ((jr = job_find(root_job, label)) != NULL) { + if ((jr = job_find(j, label)) != NULL) { errno = EEXIST; return NULL; } - jr = job_new(root_job, label, path, argv, NULL, MACH_PORT_NULL); + jr = job_new(j, label, path, argv, NULL, MACH_PORT_NULL); if (!jr) { return NULL; @@ -4048,7 +4048,7 @@ } } - jr = job_new_spawn(label, path, workingdir, argv, env, flags & SPAWN_HAS_UMASK ? &mig_umask : NULL, + jr = job_new_spawn(job_get_bs(j), label, path, workingdir, argv, env, flags & SPAWN_HAS_UMASK ? &mig_umask : NULL, flags & SPAWN_WANTS_WAIT4DEBUGGER, flags & SPAWN_WANTS_FORCE_PPC); if (jr == NULL) switch (errno) { -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061101/112c4da9/attachment.html From source_changes at macosforge.org Wed Nov 1 13:43:30 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22930] tags/launchd-168/ Message-ID: <20061101214330.E184527BC8C@cvs.opensource.apple.com> Revision: 22930 http://trac.macosforge.org/projects/launchd/changeset/22930 Author: zarzycki@apple.com Date: 2006-11-01 13:43:30 -0800 (Wed, 01 Nov 2006) Log Message: ----------- "Tagging launchd-168 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-168/ Copied: tags/launchd-168 (from rev 22929, trunk) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061101/80dd12c7/attachment.html From source_changes at macosforge.org Thu Nov 2 13:22:06 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22931] trunk/launchd/src Message-ID: <20061102212206.E18D8283FDC@cvs.opensource.apple.com> Revision: 22931 http://trac.macosforge.org/projects/launchd/changeset/22931 Author: zarzycki@apple.com Date: 2006-11-02 13:22:06 -0800 (Thu, 02 Nov 2006) Log Message: ----------- Avoid sprintf() where we can. Modified Paths: -------------- trunk/launchd/src/launchd.c trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/launchd_runtime.c trunk/launchd/src/libvproc.c Modified: trunk/launchd/src/launchd.c =================================================================== --- trunk/launchd/src/launchd.c 2006-11-01 21:43:30 UTC (rev 22930) +++ trunk/launchd/src/launchd.c 2006-11-02 21:22:06 UTC (rev 22931) @@ -272,7 +272,7 @@ } if (h) { - sprintf(ldconf, "%s/%s", h, LAUNCHD_CONF); + snprintf(ldconf, sizeof(ldconf), "%s/%s", h, LAUNCHD_CONF); } rlcj = job_new(root_job, READCONF_LABEL, LAUNCHCTL_PATH, NULL, ldconf, MACH_PORT_NULL); Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2006-11-01 21:43:30 UTC (rev 22930) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-02 21:22:06 UTC (rev 22931) @@ -715,11 +715,11 @@ } /* preflight the string so we know how big it is */ - sprintf(buf, "%s.%s", sizeof(void *) == 8 ? "0xdeadbeeffeedface" : "0xbabecafe", basename((char *)argv[0])); + snprintf(buf, sizeof(buf), "%s.%s", sizeof(void *) == 8 ? "0xdeadbeeffeedface" : "0xbabecafe", basename((char *)argv[0])); j = job_new(jbs, buf, NULL, argv, NULL, MACH_PORT_NULL); - sprintf(j->label, "%p.%s", j, basename(j->argv[0])); + snprintf(j->label, strlen(j->label) + 1, "%p.%s", j, basename(j->argv[0])); free(argv); @@ -830,7 +830,7 @@ char newlabel[1000], *procname = "unknown"; job_t jr; - sprintf(newlabel, "%u.anonymous", MACH_PORT_INDEX(p->bs_port)); + snprintf(newlabel, sizeof(newlabel), "%u.anonymous", MACH_PORT_INDEX(p->bs_port)); if ((jr = job_new(p, newlabel, procname, NULL, NULL, MACH_PORT_NULL))) { jr->anonymous = true; @@ -1746,7 +1746,7 @@ if (sipc) { job_assumes(j, close(spair[0]) == 0); - sprintf(nbuf, "%d", spair[1]); + snprintf(nbuf, sizeof(nbuf), "%d", spair[1]); setenv(LAUNCHD_TRUSTED_FD_ENV, nbuf, 1); } job_start_child(j, execspair[1]); @@ -2133,9 +2133,9 @@ o = job_prep_log_preface(j, newmsg); if (err) { - sprintf(newmsg + o, ": %s: %s", msg, strerror(err)); + snprintf(newmsg + o, sizeof(newmsg) - o, ": %s: %s", msg, strerror(err)); } else { - sprintf(newmsg + o, ": %s", msg); + snprintf(newmsg + o, sizeof(newmsg) - o, ": %s", msg); } if (j->debug) { @@ -2409,7 +2409,7 @@ } for (i = 0; i < sg->fd_cnt; i++) - buf_off += sprintf(buf + buf_off, " %d", sg->fds[i]); + buf_off += snprintf(buf + buf_off, sizeof(buf) - buf_off, " %d", sg->fds[i]); job_log(j, LOG_DEBUG, "Ignoring Sockets:%s", buf); @@ -2428,7 +2428,7 @@ } for (i = 0; i < sg->fd_cnt; i++) - buf_off += sprintf(buf + buf_off, " %d", sg->fds[i]); + buf_off += snprintf(buf + buf_off, sizeof(buf) - buf_off, " %d", sg->fds[i]); job_log(j, LOG_DEBUG, "Watching sockets:%s", buf); @@ -2963,7 +2963,7 @@ goto out_bad; } - sprintf(j->label, "%d", MACH_PORT_INDEX(j->bs_port)); + snprintf(j->label, strlen(j->label) + 1, "%d", MACH_PORT_INDEX(j->bs_port)); /* Sigh... at the moment, MIG has maxsize == sizeof(reply union) */ mxmsgsz = sizeof(union __RequestUnion__job_mig_protocol_vproc_subsystem); @@ -3280,7 +3280,7 @@ char pidstr[100]; pid_t sp; - sprintf(pidstr, "%u", j->p); + snprintf(pidstr, sizeof(pidstr), "%u", j->p); switch ((sp = fork())) { case -1: Modified: trunk/launchd/src/launchd_runtime.c =================================================================== --- trunk/launchd/src/launchd_runtime.c 2006-11-01 21:43:30 UTC (rev 22930) +++ trunk/launchd/src/launchd_runtime.c 2006-11-02 21:22:06 UTC (rev 22931) @@ -678,7 +678,7 @@ return; } - sprintf(newmsg, "p%u pp%u\t", getpid(), getppid()); + snprintf(newmsg, sizeof(newmsg), "p%u pp%u\t", getpid(), getppid()); for (i = 0, j = strlen(newmsg); message[i];) { if (message[i] == '%' && message[i + 1] == 'm') { Modified: trunk/launchd/src/libvproc.c =================================================================== --- trunk/launchd/src/libvproc.c 2006-11-01 21:43:30 UTC (rev 22930) +++ trunk/launchd/src/libvproc.c 2006-11-02 21:22:06 UTC (rev 22931) @@ -193,8 +193,7 @@ { char flat_msg[3000]; - snprintf(flat_msg, sizeof(flat_msg) - 1, msg, ap); - flat_msg[sizeof(flat_msg) - 1] = '\0'; + vsnprintf(flat_msg, sizeof(flat_msg), msg, ap); vproc_mig_log(bootstrap_port, pri, err, flat_msg); } -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061102/c4140963/attachment.html From source_changes at macosforge.org Thu Nov 2 14:06:55 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22932] trunk/launchd/src Message-ID: <20061102220655.970182842D5@cvs.opensource.apple.com> Revision: 22932 http://trac.macosforge.org/projects/launchd/changeset/22932 Author: zarzycki@apple.com Date: 2006-11-02 14:06:55 -0800 (Thu, 02 Nov 2006) Log Message: ----------- Some progress is better than none. Part one of the per-user (not per-session) launchd concept. In this, we kick off an per-user launchd (on demand) whenever a user tries to talk directly to the root bootstrap. Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/launchd_mig_types.defs trunk/launchd/src/libbootstrap.c trunk/launchd/src/libvproc_internal.h trunk/launchd/src/libvproc_private.h trunk/launchd/src/protocol_job.defs Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2006-11-02 21:22:06 UTC (rev 22931) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-02 22:06:55 UTC (rev 22932) @@ -96,7 +96,7 @@ SLIST_ENTRY(machservice) sle; job_t job; mach_port_name_t port; - unsigned int isActive:1, reset:1, recv:1, hide:1, kUNCServer:1, __junk:27; + unsigned int isActive:1, reset:1, recv:1, hide:1, kUNCServer:1, must_match_uid:1; char name[0]; }; @@ -2761,7 +2761,6 @@ goto out_bad2; } *serviceport = ms->port; - ms->isActive = false; ms->recv = true; } else { ms->port = *serviceport; @@ -3648,6 +3647,71 @@ } kern_return_t +job_mig_lookup_per_user_context(job_t j, uid_t which_user, mach_port_t *up_cont) +{ + struct ldcred ldc; + job_t ji, jbs = root_job; + +#if 0 + jbs = job_get_bs(j); +#endif + + runtime_get_caller_creds(&ldc); + + if (ldc.uid != 0) { + which_user = ldc.uid; + } + + if (which_user == 0) { + return BOOTSTRAP_NOT_PRIVILEGED; + } + + *up_cont = MACH_PORT_NULL; + + SLIST_FOREACH(ji, &jbs->jobs, sle) { + if (ji->mach_uid != which_user) { + continue; + } + if (SLIST_EMPTY(&ji->machservices)) { + continue; + } + if (!SLIST_FIRST(&ji->machservices)->must_match_uid) { + continue; + } + break; + } + + if (ji == NULL) { + struct machservice *ms; + char lbuf[1024]; + + sprintf(lbuf, "com.apple.launchd.peruser.%u", which_user); + + ji = job_new(jbs, lbuf, "/sbin/launchd", NULL, NULL, 0); + + if (ji == NULL) { + return BOOTSTRAP_NO_MEMORY; + } + + ji->mach_uid = which_user; + + if ((ms = machservice_new(ji, lbuf, up_cont)) == NULL) { + job_remove(ji); + return BOOTSTRAP_NO_MEMORY; + } + + ms->must_match_uid = true; + ms->hide = true; + + job_dispatch(ji, false); + } + + *up_cont = machservice_port(SLIST_FIRST(&ji->machservices)); + + return 0; +} + +kern_return_t job_mig_check_in(job_t j, name_t servicename, mach_port_t *serviceportp) { static pid_t last_warned_pid = 0; @@ -3691,9 +3755,19 @@ runtime_get_caller_creds(&ldc); +#if 0 job_log(j, LOG_NOTICE, "bootstrap_register() is deprecated. PID: %u Service: %s", ldc.pid, servicename); +#endif job_log(j, LOG_DEBUG, "Mach service registration attempt: %s", servicename); + + if (j->anonymous && job_get_bs(j)->parent == NULL && ldc.uid != 0 && ldc.uid != getuid()) { + if (getpid() == 1) { + return VPROC_ERR_TRY_PER_USER; + } else { + return BOOTSTRAP_NOT_PRIVILEGED; + } + } ms = job_lookup_service(j, servicename, false); @@ -3728,10 +3802,16 @@ runtime_get_caller_creds(&ldc); + if (getpid() == 1 && j->anonymous && job_get_bs(j)->parent == NULL && ldc.uid != 0 && ldc.euid != 0) { + return VPROC_ERR_TRY_PER_USER; + } + ms = job_lookup_service(j, servicename, true); if (ms && machservice_hidden(ms) && !job_active(machservice_job(ms))) { ms = NULL; + } else if (ms && ms->must_match_uid) { + ms = NULL; } if (ms) { Modified: trunk/launchd/src/launchd_mig_types.defs =================================================================== --- trunk/launchd/src/launchd_mig_types.defs 2006-11-02 21:22:06 UTC (rev 22931) +++ trunk/launchd/src/launchd_mig_types.defs 2006-11-02 22:06:55 UTC (rev 22932) @@ -24,6 +24,8 @@ */ type pid_t = integer_t; +type uid_t = integer_t; +type gid_t = integer_t; type get_set_int_key_t = integer_t; type logmsg_t = c_string[*:2048]; type cmd_t = c_string[512]; Modified: trunk/launchd/src/libbootstrap.c =================================================================== --- trunk/launchd/src/libbootstrap.c 2006-11-02 21:22:06 UTC (rev 22931) +++ trunk/launchd/src/libbootstrap.c 2006-11-02 22:06:55 UTC (rev 22932) @@ -21,6 +21,9 @@ #include "config.h" #include "libbootstrap_public.h" +#include "libvproc_public.h" +#include "libvproc_private.h" + #include #include @@ -63,7 +66,18 @@ kern_return_t bootstrap_register(mach_port_t bp, name_t service_name, mach_port_t sp) { - return vproc_mig_register(bp, service_name, sp); + kern_return_t kr = vproc_mig_register(bp, service_name, sp); + + if (kr == VPROC_ERR_TRY_PER_USER) { + mach_port_t puc; + + if (vproc_mig_lookup_per_user_context(bp, 0, &puc) == 0) { + kr = vproc_mig_register(puc, service_name, sp); + mach_port_deallocate(mach_task_self(), puc); + } + } + + return kr; } kern_return_t @@ -81,7 +95,21 @@ kern_return_t bootstrap_look_up(mach_port_t bp, name_t service_name, mach_port_t *sp) { - return vproc_mig_look_up(bp, service_name, sp); + kern_return_t kr; + mach_port_t puc; + + if ((kr = vproc_mig_look_up(bp, service_name, sp)) != VPROC_ERR_TRY_PER_USER) { + return kr; + } + + if ((kr = vproc_mig_lookup_per_user_context(bp, 0, &puc)) != 0) { + return kr; + } + + kr = vproc_mig_look_up(puc, service_name, sp); + mach_port_deallocate(mach_task_self(), puc); + + return kr; } kern_return_t Modified: trunk/launchd/src/libvproc_internal.h =================================================================== --- trunk/launchd/src/libvproc_internal.h 2006-11-02 21:22:06 UTC (rev 22931) +++ trunk/launchd/src/libvproc_internal.h 2006-11-02 22:06:55 UTC (rev 22932) @@ -37,6 +37,8 @@ #include "launchd_core_logic.h" #endif +#define VPROC_ERR_TRY_PER_USER 1099 + #pragma GCC visibility push(default) #define SPAWN_HAS_PATH 0x0001 Modified: trunk/launchd/src/libvproc_private.h =================================================================== --- trunk/launchd/src/libvproc_private.h 2006-11-02 21:22:06 UTC (rev 22931) +++ trunk/launchd/src/libvproc_private.h 2006-11-02 22:06:55 UTC (rev 22932) @@ -21,6 +21,7 @@ */ #include +#include #include __BEGIN_DECLS Modified: trunk/launchd/src/protocol_job.defs =================================================================== --- trunk/launchd/src/protocol_job.defs 2006-11-02 21:22:06 UTC (rev 22931) +++ trunk/launchd/src/protocol_job.defs 2006-11-02 22:06:55 UTC (rev 22932) @@ -37,7 +37,7 @@ routine create_server( __bs_port : job_t; __server_cmd : cmd_t; - __server_uid : natural_t; + __server_uid : uid_t; __on_demand : boolean_t; out __server_port : mach_port_make_send_t); @@ -125,3 +125,8 @@ __pri : integer_t; __err : integer_t; __msg : logmsg_t); + +routine lookup_per_user_context( + __bs_port : job_t; + __wu : uid_t; + out __u_cont : mach_port_t); -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061102/8140da8c/attachment.html From source_changes at macosforge.org Fri Nov 3 10:07:24 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22933] trunk/launchd/src Message-ID: <20061103180724.0CB0128C31E@cvs.opensource.apple.com> Revision: 22933 http://trac.macosforge.org/projects/launchd/changeset/22933 Author: zarzycki@apple.com Date: 2006-11-03 10:07:24 -0800 (Fri, 03 Nov 2006) Log Message: ----------- Simplify an internal API. Modified Paths: -------------- trunk/launchd/src/liblaunch.c trunk/launchd/src/libvproc.c trunk/launchd/src/libvproc_internal.h Modified: trunk/launchd/src/liblaunch.c =================================================================== --- trunk/launchd/src/liblaunch.c 2006-11-02 22:06:55 UTC (rev 22932) +++ trunk/launchd/src/liblaunch.c 2006-11-03 18:07:24 UTC (rev 22933) @@ -1200,25 +1200,31 @@ u = pwe->pw_uid; g = pwe->pw_gid; - if ((ldp = fexecv_as_user(login, u, g, ldargv)) == -1) + if ((ldp = fexecv_as_user(login, u, g, ldargv)) == -1) { return -1; + } - while (_vprocmgr_getsocket(bootstrap_port, sp) != BOOTSTRAP_SUCCESS) + while (_vprocmgr_getsocket(sp) != BOOTSTRAP_SUCCESS) { usleep(20000); + } setenv(LAUNCHD_SOCKET_ENV, sp, 1); - if (flags & LOAD_ONLY_SAFEMODE_LAUNCHAGENTS) + if (flags & LOAD_ONLY_SAFEMODE_LAUNCHAGENTS) { largv[5] = "system"; + } - if ((p = fexecv_as_user(login, u, g, largv)) == -1) + if ((p = fexecv_as_user(login, u, g, largv)) == -1) { return -1; + } - if (waitpid(p, &wstatus, 0) != p) + if (waitpid(p, &wstatus, 0) != p) { return -1; + } - if (!(WIFEXITED(wstatus) && WEXITSTATUS(wstatus) == 0)) + if (!(WIFEXITED(wstatus) && WEXITSTATUS(wstatus) == 0)) { return -1; + } #define BEZEL_UI_PATH "/System/Library/LoginPlugins/BezelServices.loginPlugin/Contents/Resources/BezelUI/BezelUIServer" #define BEZEL_UI_PLIST "/System/Library/LaunchAgents/com.apple.BezelUIServer.plist" Modified: trunk/launchd/src/libvproc.c =================================================================== --- trunk/launchd/src/libvproc.c 2006-11-02 22:06:55 UTC (rev 22932) +++ trunk/launchd/src/libvproc.c 2006-11-03 18:07:24 UTC (rev 22933) @@ -158,9 +158,9 @@ } kern_return_t -_vprocmgr_getsocket(mach_port_t bp, name_t sockpath) +_vprocmgr_getsocket(name_t sockpath) { - return vproc_mig_getsocket(bp, sockpath); + return vproc_mig_getsocket(bootstrap_port, sockpath); } vproc_err_t Modified: trunk/launchd/src/libvproc_internal.h =================================================================== --- trunk/launchd/src/libvproc_internal.h 2006-11-02 22:06:55 UTC (rev 22932) +++ trunk/launchd/src/libvproc_internal.h 2006-11-03 18:07:24 UTC (rev 22933) @@ -52,7 +52,7 @@ name_array_t *service_names, mach_msg_type_number_t *service_namesCnt, mach_port_array_t *ports, mach_msg_type_number_t *portCnt); -kern_return_t _vprocmgr_getsocket(mach_port_t bp, name_t); +kern_return_t _vprocmgr_getsocket(name_t); void _vproc_logv(int pri, int err, const char *msg, va_list ap); -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061103/5c8f1f72/attachment.html From source_changes at macosforge.org Fri Nov 3 11:16:05 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22934] trunk/launchd/src Message-ID: <20061103191605.C191528C667@cvs.opensource.apple.com> Revision: 22934 http://trac.macosforge.org/projects/launchd/changeset/22934 Author: zarzycki@apple.com Date: 2006-11-03 11:16:05 -0800 (Fri, 03 Nov 2006) Log Message: ----------- sudo launchctl doesn't work as expected Modified Paths: -------------- trunk/launchd/src/launchd_unix_ipc.c trunk/launchd/src/liblaunch.c Modified: trunk/launchd/src/launchd_unix_ipc.c =================================================================== --- trunk/launchd/src/launchd_unix_ipc.c 2006-11-03 18:07:24 UTC (rev 22933) +++ trunk/launchd/src/launchd_unix_ipc.c 2006-11-03 19:16:05 UTC (rev 22934) @@ -134,7 +134,6 @@ goto out_bad; } snprintf(sun.sun_path, sizeof(sun.sun_path), "%s/sock", ourdir); - setenv(LAUNCHD_SOCKET_ENV, sun.sun_path, 1); } if (unlink(sun.sun_path) == -1 && errno != ENOENT) { Modified: trunk/launchd/src/liblaunch.c =================================================================== --- trunk/launchd/src/liblaunch.c 2006-11-03 18:07:24 UTC (rev 22933) +++ trunk/launchd/src/liblaunch.c 2006-11-03 19:16:05 UTC (rev 22934) @@ -160,6 +160,7 @@ char *where = getenv(LAUNCHD_SOCKET_ENV); char *_launchd_fd = getenv(LAUNCHD_TRUSTED_FD_ENV); int dfd, lfd = -1; + name_t spath; _lc = calloc(1, sizeof(struct _launch_client)); @@ -184,10 +185,14 @@ if (where && where[0] != '\0') { strncpy(sun.sun_path, where, sizeof(sun.sun_path)); - } else if (getuid() == 0) { + } else if (!getenv("SUDO_COMMAND") && _vprocmgr_getsocket(spath) == 0) { + size_t min_len; + + min_len = sizeof(sun.sun_path) < sizeof(spath) ? sizeof(sun.sun_path) : sizeof(spath); + + strncpy(sun.sun_path, spath, min_len); + } else { strncpy(sun.sun_path, LAUNCHD_SOCK_PREFIX "/sock", sizeof(sun.sun_path)); - } else { - goto out_bad; } if ((lfd = _fd(socket(AF_UNIX, SOCK_STREAM, 0))) == -1) @@ -1208,8 +1213,6 @@ usleep(20000); } - setenv(LAUNCHD_SOCKET_ENV, sp, 1); - if (flags & LOAD_ONLY_SAFEMODE_LAUNCHAGENTS) { largv[5] = "system"; } -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061103/4897ee1e/attachment.html From source_changes at macosforge.org Fri Nov 3 13:02:52 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22935] tags/launchd-169/ Message-ID: <20061103210252.3DDE328D1C0@cvs.opensource.apple.com> Revision: 22935 http://trac.macosforge.org/projects/launchd/changeset/22935 Author: zarzycki@apple.com Date: 2006-11-03 13:02:52 -0800 (Fri, 03 Nov 2006) Log Message: ----------- "Tagging launchd-169 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-169/ Copied: tags/launchd-169 (from rev 22934, trunk) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061103/2763a1c3/attachment.html From source_changes at macosforge.org Fri Nov 3 13:23:02 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22936] trunk/launchd/src Message-ID: <20061103212302.2AA5228D315@cvs.opensource.apple.com> Revision: 22936 http://trac.macosforge.org/projects/launchd/changeset/22936 Author: zarzycki@apple.com Date: 2006-11-03 13:23:01 -0800 (Fri, 03 Nov 2006) Log Message: ----------- Removing the bootstrap_look_up_array() function. This function never worked prior to Leopard, but we weren't sure if applications depended on it failing. After much research, we believe the answer is safely no. Modified Paths: -------------- trunk/launchd/src/libbootstrap.c trunk/launchd/src/libvproc_internal.h Modified: trunk/launchd/src/libbootstrap.c =================================================================== --- trunk/launchd/src/libbootstrap.c 2006-11-03 21:02:52 UTC (rev 22935) +++ trunk/launchd/src/libbootstrap.c 2006-11-03 21:23:01 UTC (rev 22936) @@ -113,37 +113,6 @@ } kern_return_t -bootstrap_look_up_array(mach_port_t bp, - name_array_t names, mach_msg_type_number_t name_cnt, - mach_port_array_t *ports, mach_msg_type_number_t *port_cnt, - boolean_t *all) -{ - unsigned int i; - kern_return_t r; - - if (name_cnt > BOOTSTRAP_MAX_LOOKUP_COUNT) - return BOOTSTRAP_BAD_COUNT; - - *port_cnt = name_cnt; - - r = vm_allocate(mach_task_self(), (vm_address_t *)&ports, name_cnt * sizeof(mach_port_t), true); - - if (r != KERN_SUCCESS) - return r; - - *all = true; - - for (i = 0; i < name_cnt; i++) { - if (bootstrap_look_up(bp, names[i], &((*ports)[i])) == BOOTSTRAP_SUCCESS) - continue; - *all = false; - ports[i] = MACH_PORT_NULL; - } - - return BOOTSTRAP_SUCCESS; -} - -kern_return_t bootstrap_status(mach_port_t bp, name_t service_name, bootstrap_status_t *service_active) { mach_port_t p; Modified: trunk/launchd/src/libvproc_internal.h =================================================================== --- trunk/launchd/src/libvproc_internal.h 2006-11-03 21:02:52 UTC (rev 22935) +++ trunk/launchd/src/libvproc_internal.h 2006-11-03 21:23:01 UTC (rev 22936) @@ -56,17 +56,7 @@ void _vproc_logv(int pri, int err, const char *msg, va_list ap); - kern_return_t -bootstrap_look_up_array( - mach_port_t bp, - name_array_t service_names, - mach_msg_type_number_t service_namesCnt, - mach_port_array_t *sps, - mach_msg_type_number_t *service_portsCnt, - boolean_t *all_services_known); - -kern_return_t bootstrap_info( mach_port_t bp, name_array_t *service_names, -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061103/30303110/attachment.html From source_changes at macosforge.org Mon Nov 6 17:31:27 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22937] trunk/launchd/src/launchd_core_logic.c Message-ID: <20061107013127.19D3B2B34F9@cvs.opensource.apple.com> Revision: 22937 http://trac.macosforge.org/projects/launchd/changeset/22937 Author: zarzycki@apple.com Date: 2006-11-06 17:31:26 -0800 (Mon, 06 Nov 2006) Log Message: ----------- SecurityAgent crashes in InitializeDragIPC 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-03 21:23:01 UTC (rev 22936) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-07 01:31:26 UTC (rev 22937) @@ -3761,7 +3761,12 @@ job_log(j, LOG_DEBUG, "Mach service registration attempt: %s", servicename); - if (j->anonymous && job_get_bs(j)->parent == NULL && ldc.uid != 0 && ldc.uid != getuid()) { + /* + * From a per-user/session launchd's perspective, SecurityAgent (UID + * 92) is a rogue application (not our UID, not root and not a child of + * us). We'll have to reconcile this design friction at a later date. + */ + if (j->anonymous && job_get_bs(j)->parent == NULL && ldc.uid != 0 && ldc.uid != getuid() && ldc.uid != 92) { if (getpid() == 1) { return VPROC_ERR_TRY_PER_USER; } else { -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061106/e22dbdd1/attachment.html From source_changes at macosforge.org Mon Nov 6 17:31:33 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22938] tags/launchd-170/ Message-ID: <20061107013133.6141C2B34FD@cvs.opensource.apple.com> Revision: 22938 http://trac.macosforge.org/projects/launchd/changeset/22938 Author: zarzycki@apple.com Date: 2006-11-06 17:31:33 -0800 (Mon, 06 Nov 2006) Log Message: ----------- "Tagging launchd-170 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-170/ Copied: tags/launchd-170 (from rev 22937, trunk) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061106/8106102e/attachment.html From source_changes at macosforge.org Thu Nov 9 08:13:53 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22939] trunk/launchd/src Message-ID: <20061109161353.D2DF52D0740@cvs.opensource.apple.com> Revision: 22939 http://trac.macosforge.org/projects/launchd/changeset/22939 Author: zarzycki@apple.com Date: 2006-11-09 08:13:53 -0800 (Thu, 09 Nov 2006) Log Message: ----------- BootRoot: launchd needs to call kextd early if is_bootrooted() Modified Paths: -------------- trunk/launchd/src/Makefile.am trunk/launchd/src/Makefile.in trunk/launchd/src/launchctl.c Modified: trunk/launchd/src/Makefile.am =================================================================== --- trunk/launchd/src/Makefile.am 2006-11-07 01:31:33 UTC (rev 22938) +++ trunk/launchd/src/Makefile.am 2006-11-09 16:13:53 UTC (rev 22939) @@ -37,7 +37,7 @@ sysconf_DATA = hostconfig rc.common rc.netboot rc.shutdown launchctl_CFLAGS = $(AM_CFLAGS) -I/System/Library/Frameworks/System.framework/PrivateHeaders -launchctl_LDFLAGS = -framework CoreFoundation -weak_library /usr/lib/libedit.dylib +launchctl_LDFLAGS = -framework CoreFoundation -framework IOKit -weak_library /usr/lib/libedit.dylib SystemStarter_CFLAGS = -mdynamic-no-pic $(AM_CFLAGS) SystemStarter_LDFLAGS = -framework CoreFoundation Modified: trunk/launchd/src/Makefile.in =================================================================== --- trunk/launchd/src/Makefile.in 2006-11-07 01:31:33 UTC (rev 22938) +++ trunk/launchd/src/Makefile.in 2006-11-09 16:13:53 UTC (rev 22939) @@ -238,7 +238,7 @@ @LIBS_ONLY_FALSE@sbin_SCRIPTS = service @LIBS_ONLY_FALSE@sysconf_DATA = hostconfig rc.common rc.netboot rc.shutdown @LIBS_ONLY_FALSE@launchctl_CFLAGS = $(AM_CFLAGS) -I/System/Library/Frameworks/System.framework/PrivateHeaders -@LIBS_ONLY_FALSE@launchctl_LDFLAGS = -framework CoreFoundation -weak_library /usr/lib/libedit.dylib +@LIBS_ONLY_FALSE@launchctl_LDFLAGS = -framework CoreFoundation -framework IOKit -weak_library /usr/lib/libedit.dylib @LIBS_ONLY_FALSE@SystemStarter_CFLAGS = -mdynamic-no-pic $(AM_CFLAGS) @LIBS_ONLY_FALSE@SystemStarter_LDFLAGS = -framework CoreFoundation @LIBS_ONLY_FALSE@SystemStarter_SOURCES = StartupItems.c IPC.c SystemStarter.c Modified: trunk/launchd/src/launchctl.c =================================================================== --- trunk/launchd/src/launchctl.c 2006-11-07 01:31:33 UTC (rev 22938) +++ trunk/launchd/src/launchctl.c 2006-11-09 16:13:53 UTC (rev 22939) @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -58,6 +59,8 @@ #include #include #include +#include +#include #include "libbootstrap_public.h" #include "libvproc_internal.h" @@ -133,6 +136,7 @@ static void workaround4465949(void); static void do_application_firewall_magic(int sfd, launch_data_t thejob); static void preheat_page_cache_hack(void); +static void do_bootroot_magic(void); static int bootstrap_cmd(int argc, char *const argv[]); static int load_and_unload_cmd(int argc, char *const argv[]); @@ -1202,6 +1206,8 @@ do_potential_fsck(); } + do_bootroot_magic(); + if (path_check("/var/account/acct")) { assumes(acct("/var/account/acct") != -1); } @@ -2762,3 +2768,42 @@ closedir(thedir); } + + +void +do_bootroot_magic(void) +{ + const char *kextcache_tool[] = { "kextcache", "-U", "/", NULL }; + CFTypeRef bootrootProp; + io_service_t chosen; + int wstatus; + pid_t p; + + chosen = IORegistryEntryFromPath(kIOMasterPortDefault, "IODeviceTree:/chosen"); + + if (!assumes(chosen)) { + return; + } + + bootrootProp = IORegistryEntryCreateCFProperty(chosen, CFSTR(kBootRootActiveKey), kCFAllocatorDefault, 0); + + IOObjectRelease(chosen); + + if (!bootrootProp) { + return; + } + + CFRelease(bootrootProp); + + if (!assumes((p = fwexec(kextcache_tool, false)) != -1)) { + return; + } + + if (!assumes(waitpid(p, &wstatus, 0) != -1)) { + return; + } + + if (!WIFEXITED(wstatus) && WEXITSTATUS(wstatus) == EX_OSFILE) { + assumes(reboot(RB_AUTOBOOT) != -1); + } +} -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061109/3f5cb47d/attachment.html From source_changes at macosforge.org Thu Nov 9 14:10:17 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22940] tags/launchd-171/ Message-ID: <20061109221017.AF52F2D1E8C@cvs.opensource.apple.com> Revision: 22940 http://trac.macosforge.org/projects/launchd/changeset/22940 Author: zarzycki@apple.com Date: 2006-11-09 14:10:17 -0800 (Thu, 09 Nov 2006) Log Message: ----------- "Tagging launchd-171 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-171/ Copied: tags/launchd-171 (from rev 22939, trunk) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061109/b441b0c0/attachment.html From source_changes at macosforge.org Mon Nov 13 09:53:17 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22941] trunk/launchd/src/launchd_core_logic.c Message-ID: <20061113175317.6F6222E91A2@cvs.opensource.apple.com> Revision: 22941 http://trac.macosforge.org/projects/launchd/changeset/22941 Author: zarzycki@apple.com Date: 2006-11-13 09:53:16 -0800 (Mon, 13 Nov 2006) Log Message: ----------- Applications 'open'ed in 'ssh' session belong to 'root' 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-09 22:10:17 UTC (rev 22940) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-13 17:53:16 UTC (rev 22941) @@ -441,6 +441,10 @@ launch_data_dict_insert(r, tmp, LAUNCH_JOBKEY_PROGRAMARGUMENTS); } + if (j->session_create && (tmp = launch_data_new_bool(true))) { + launch_data_dict_insert(r, tmp, LAUNCH_JOBKEY_SESSIONCREATE); + } + if (j->inetcompat && (tmp = launch_data_alloc(LAUNCH_DATA_DICTIONARY))) { if ((tmp2 = launch_data_new_bool(j->inetcompat_wait))) { launch_data_dict_insert(tmp, tmp2, LAUNCH_JOBINETDCOMPATIBILITY_WAIT); @@ -781,6 +785,13 @@ return NULL; } + if (getpid() == 1) { + struct ldcred ldc; + + runtime_get_caller_creds(&ldc); + jr->mach_uid = ldc.uid; + } + jr->unload_at_exit = true; jr->stall_before_exec = w4d; jr->force_ppc = fppc; @@ -4084,7 +4095,6 @@ pid_t *child_pid, mach_port_t *obsvr_port) { job_t jr; - struct ldcred ldc; size_t offset = 0; char *tmpp; const char **argv = NULL, **env = NULL; @@ -4093,8 +4103,6 @@ const char *workingdir = NULL; size_t argv_i = 0, env_i = 0; - runtime_get_caller_creds(&ldc); - #if 0 if (ldc.asid != inherited_asid) { job_log(j, LOG_ERR, "Security: PID %d (ASID %d) was denied a request to spawn a process in this session (ASID %d)", @@ -4143,10 +4151,6 @@ return BOOTSTRAP_NO_MEMORY; } - if (getuid() == 0) { - jr->mach_uid = ldc.uid; - } - if (!job_setup_machport(jr)) { job_remove(jr); return BOOTSTRAP_NO_MEMORY; -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061113/d8a6a477/attachment.html From source_changes at macosforge.org Mon Nov 13 09:54:12 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22942] branches/Leopard/ Message-ID: <20061113175412.DDF162E91C2@cvs.opensource.apple.com> Revision: 22942 http://trac.macosforge.org/projects/launchd/changeset/22942 Author: zarzycki@apple.com Date: 2006-11-13 09:54:12 -0800 (Mon, 13 Nov 2006) Log Message: ----------- "Branch for Leopard from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- branches/Leopard/ Copied: branches/Leopard (from rev 22941, trunk) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061113/c3deb39b/attachment.html From source_changes at macosforge.org Mon Nov 13 12:53:23 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22943] trunk/launchd/src Message-ID: <20061113205323.9B5F02E9FBA@cvs.opensource.apple.com> Revision: 22943 http://trac.macosforge.org/projects/launchd/changeset/22943 Author: zarzycki@apple.com Date: 2006-11-13 12:53:23 -0800 (Mon, 13 Nov 2006) Log Message: ----------- First pass at the jobmgr struct. Next step is to have a per jobmgr socket setup... 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 trunk/launchd/src/launchd_runtime.c trunk/launchd/src/launchd_unix_ipc.c trunk/launchd/src/liblaunch_public.h Modified: trunk/launchd/src/launchctl.c =================================================================== --- trunk/launchd/src/launchctl.c 2006-11-13 17:54:12 UTC (rev 22942) +++ trunk/launchd/src/launchctl.c 2006-11-13 20:53:23 UTC (rev 22943) @@ -108,7 +108,7 @@ static void let_go_of_mach_jobs(launch_data_t jobs); static void do_mgroup_join(int fd, int family, int socktype, int protocol, const char *mgroup); static mach_port_t str2bsport(const char *s); -static void print_jobs(launch_data_t j); +static void print_jobs(launch_data_t j, const char *key, void *context); static void print_obj(launch_data_t obj, const char *key, void *context); static bool is_legacy_mach_job(launch_data_t obj); static bool delay_to_second_pass(launch_data_t o); @@ -1568,15 +1568,14 @@ } void -print_jobs(launch_data_t j) +print_jobs(launch_data_t j, const char *key __attribute__((unused)), void *context __attribute__((unused))) { static size_t depth = 0; launch_data_t lo = launch_data_dict_lookup(j, LAUNCH_JOBKEY_LABEL); launch_data_t pido = launch_data_dict_lookup(j, LAUNCH_JOBKEY_PID); launch_data_t stato = launch_data_dict_lookup(j, LAUNCH_JOBKEY_LASTEXITSTATUS); - launch_data_t sjobs = launch_data_dict_lookup(j, LAUNCH_JOBKEY_SUBJOBS); const char *label = launch_data_get_string(lo); - size_t i, c; + size_t i; if (pido) { fprintf(stdout, "%lld\t-\t", launch_data_get_integer(pido)); @@ -1596,19 +1595,6 @@ fprintf(stdout, "\t"); fprintf(stdout, "%s\n", label); - - if (sjobs) { - launch_data_t oai; - - c = launch_data_array_get_count(sjobs); - - depth++; - for (i = 0; i < c; i++) { - oai = launch_data_array_get_index(sjobs, i); - print_jobs(oai); - } - depth--; - } } void @@ -1671,16 +1657,17 @@ int list_cmd(int argc, char *const argv[]) { - launch_data_t resp, msg = launch_data_alloc(LAUNCH_DATA_DICTIONARY); + launch_data_t resp, msg; int r = 0; if (argc > 2) { fprintf(stderr, "usage: %s list [label]\n", getprogname()); return 1; } else if (argc == 2) { + msg = launch_data_alloc(LAUNCH_DATA_DICTIONARY); launch_data_dict_insert(msg, launch_data_new_string(argv[1]), LAUNCH_KEY_GETJOB); } else { - launch_data_dict_insert(msg, launch_data_new_string(""), LAUNCH_KEY_GETJOB); + msg = launch_data_new_string(LAUNCH_KEY_GETJOBS); } resp = launch_msg(msg); @@ -1692,7 +1679,7 @@ } else if (launch_data_get_type(resp) == LAUNCH_DATA_DICTIONARY) { if (argc == 1) { fprintf(stdout, "PID\tStatus\tLabel\n"); - print_jobs(resp); + launch_data_dict_iterate(resp, print_jobs, NULL); } else { print_obj(resp, NULL, NULL); } Modified: trunk/launchd/src/launchd.c =================================================================== --- trunk/launchd/src/launchd.c 2006-11-13 17:54:12 UTC (rev 22942) +++ trunk/launchd/src/launchd.c 2006-11-13 20:53:23 UTC (rev 22943) @@ -275,11 +275,11 @@ snprintf(ldconf, sizeof(ldconf), "%s/%s", h, LAUNCHD_CONF); } - rlcj = job_new(root_job, READCONF_LABEL, LAUNCHCTL_PATH, NULL, ldconf, MACH_PORT_NULL); + rlcj = job_new(root_jobmgr, READCONF_LABEL, LAUNCHCTL_PATH, NULL, ldconf); launchd_assert(rlcj != NULL); if (argv[0]) { - fbj = job_new(root_job, FIRSTBORN_LABEL, NULL, (const char *const *)argv, NULL, MACH_PORT_NULL); + fbj = job_new(root_jobmgr, FIRSTBORN_LABEL, NULL, (const char *const *)argv, NULL); } if (NULL == getenv("PATH")) { @@ -432,14 +432,16 @@ shutdown_in_progress = true; if (stat("/var/db/debugShutdownHangs", &sb) != -1) { - // When this changes to a more sustainable API, update this: - // http://howto.apple.com/db.cgi?Debugging_Apps_Non-Responsive_At_Shutdown + /* + * When this changes to a more sustainable API, update this: + * http://howto.apple.com/db.cgi?Debugging_Apps_Non-Responsive_At_Shutdown + */ debug_shutdown_hangs = true; } rlcj = NULL; - job_remove_all_inactive(root_job); + jobmgr_remove_all_inactive(root_jobmgr); if (getpid() == 1) { catatonia(); @@ -650,7 +652,7 @@ if (new_networking_state != network_up) { network_up = new_networking_state; - job_dispatch_all_other_semaphores(root_job, NULL); + jobmgr_dispatch_all_other_semaphores(root_jobmgr, NULL); } } Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2006-11-13 17:54:12 UTC (rev 22942) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-13 20:53:23 UTC (rev 22943) @@ -192,7 +192,36 @@ static void semaphoreitem_setup(launch_data_t obj, const char *key, void *context); static void semaphoreitem_setup_paths(launch_data_t obj, const char *key, void *context); +struct jobmgr_s { + SLIST_ENTRY(jobmgr_s) sle; + SLIST_HEAD(, jobmgr_s) submgrs; + SLIST_HEAD(, job_s) jobs; + mach_port_t jm_port; + mach_port_t req_port; + jobmgr_t parentmgr; + job_t anonj; + unsigned int transfer_bstrap:1; + char name[0]; +}; +#define jobmgr_assumes(jm, e) \ + (__builtin_expect(!(e), 0) ? jobmgr_log_bug(jm, __rcs_file_version__, __FILE__, __LINE__, #e), false : true) + +static jobmgr_t jobmgr_new(jobmgr_t jm, mach_port_t requestorport, mach_port_t checkin_port); +static jobmgr_t jobmgr_parent(jobmgr_t jm); +static void jobmgr_dispatch_all(jobmgr_t jm); +static job_t jobmgr_new_anonymous(jobmgr_t jm); +static job_t job_mig_intran2(jobmgr_t jm, mach_port_t p); +static mach_port_t jobmgr_get_reqport(jobmgr_t jm); +static void job_export_all2(jobmgr_t jm, launch_data_t where); +static pid_t jobmgr_fork(jobmgr_t jm); +static void jobmgr_setup_env_from_other_jobs(jobmgr_t jm); +static struct machservice *jobmgr_lookup_service(jobmgr_t jm, const char *name, bool check_parent); +static void jobmgr_logv(jobmgr_t jm, int pri, int err, const char *msg, va_list ap); +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); + struct job_s { kq_callback kqjob_callback; SLIST_ENTRY(job_s) sle; @@ -204,13 +233,11 @@ SLIST_HEAD(, limititem) limits; SLIST_HEAD(, machservice) machservices; SLIST_HEAD(, semaphoreitem) semaphores; - SLIST_HEAD(, job_s) jobs; struct rusage ru; - job_t parent; - mach_port_t bs_port; - mach_port_t req_port; + mach_port_t j_port; mach_port_t wait_reply_port; uid_t mach_uid; + jobmgr_t mgr; char **argv; char *prog; char *rootdir; @@ -234,8 +261,8 @@ importing_global_env:1, importing_hard_limits:1, setmask:1, legacy_mach_job:1, runatload:1, anonymous:1; mode_t mask; - unsigned int globargv:1, wait4debugger:1, transfer_bstrap:1, unload_at_exit:1, force_ppc:1, - stall_before_exec:1, only_once:1, currently_ignored:1, forced_peers_to_demand_mode:1; + unsigned int globargv:1, wait4debugger:1, unload_at_exit:1, force_ppc:1, stall_before_exec:1, + only_once:1, currently_ignored:1, forced_peers_to_demand_mode:1; char label[0]; }; @@ -249,7 +276,6 @@ static void job_import_integer(job_t j, const char *key, long long value); static void job_import_dictionary(job_t j, const char *key, launch_data_t value); static void job_import_array(job_t j, const char *key, launch_data_t value); -static void job_dispatch_all(job_t j); static bool job_set_global_on_demand(job_t j, bool val); static void job_watch(job_t j); static void job_ignore(job_t j); @@ -263,26 +289,13 @@ static void job_postfork_become_user(job_t j); static void job_force_sampletool(job_t j); static void job_callback(void *obj, struct kevent *kev); -static pid_t job_fork(job_t j); -static size_t job_prep_log_preface(job_t j, char *buf); -static void job_setup_env_from_other_jobs(job_t j); -static void job_export_all2(job_t j, launch_data_t where); static launch_data_t job_export2(job_t j, bool subjobs); -static job_t job_find_by_pid(job_t j, pid_t p, bool recurse); 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, bool fppc); -static job_t job_new_via_mach_init(job_t jbs, const char *cmd, uid_t uid, bool ond); -static job_t job_new_bootstrap(job_t p, mach_port_t requestorport, mach_port_t checkin_port); -static bool job_new_anonymous(job_t p); -static job_t job_find_anonymous(job_t p); +static job_t job_new_via_mach_init(job_t j, const char *cmd, uid_t uid, bool ond); static const char *job_prog(job_t j); static pid_t job_get_pid(job_t j); -static mach_port_t job_get_bsport(job_t j); -static mach_port_t job_get_reqport(job_t j); -static job_t job_get_bs(job_t j); -static job_t job_parent(job_t j); +static jobmgr_t job_get_bs(job_t j); static void job_uncork_fork(job_t j); -static struct machservice *job_lookup_service(job_t jbs, const char *name, bool check_parent); -static void job_foreach_service(job_t jbs, void (*bs_iter)(struct machservice *, void *), void *context, bool only_anonymous); static void job_logv(job_t j, int pri, int err, const char *msg, va_list ap); static void job_log(job_t j, int pri, const char *msg, ...) __attribute__((format(printf, 3, 4))); static void job_log_error(job_t j, int pri, const char *msg, ...) __attribute__((format(printf, 3, 4))); @@ -320,8 +333,8 @@ 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; -job_t root_job; -job_t gc_this_job; +jobmgr_t root_jobmgr; +jobmgr_t gc_this_jobmgr; size_t total_children; void @@ -481,6 +494,8 @@ launch_data_dict_insert(r, tmp, LAUNCH_JOBKEY_MACHSERVICES); } +#if 0 + /* jobs don't have subjobs anymore... */ if (subjobs && !SLIST_EMPTY(&j->jobs) && (tmp = launch_data_alloc(LAUNCH_DATA_ARRAY))) { job_t ji; size_t i = 0; @@ -493,35 +508,71 @@ launch_data_dict_insert(r, tmp, LAUNCH_JOBKEY_SUBJOBS); } +#endif return r; } void -job_remove_all_inactive(job_t j) +jobmgr_remove_all_inactive(jobmgr_t jm) { + jobmgr_t jmi, jmn; job_t ji, jn; - SLIST_FOREACH_SAFE(ji, &j->jobs, sle, jn) { - job_remove_all_inactive(ji); + SLIST_FOREACH_SAFE(jmi, &jm->submgrs, sle, jmn) { + jobmgr_remove_all_inactive(jmi); } - if (!job_active(j)) { - job_remove(j); - } else { - if (debug_shutdown_hangs) { - job_assumes(j, kevent_mod((uintptr_t)j, EVFILT_TIMER, EV_ADD|EV_ONESHOT, NOTE_SECONDS, 8, j) != -1); + SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { + if (!job_active(ji)) { + job_remove(ji); + } else { + if (debug_shutdown_hangs) { + job_assumes(ji, kevent_mod((uintptr_t)ji, EVFILT_TIMER, EV_ADD|EV_ONESHOT, NOTE_SECONDS, 8, ji) != -1); + } + if (getpid() != 1) { + job_stop(ji); + } } - if (getpid() != 1) { - job_stop(j); + } +} + +void +jobmgr_remove(jobmgr_t jm) +{ + jobmgr_t jmi; + job_t ji; + + while ((jmi = SLIST_FIRST(&jm->submgrs))) { + jobmgr_remove(jmi); + } + + while ((ji = SLIST_FIRST(&jm->jobs))) { + job_remove(ji); + } + + if (jm->parentmgr) { + SLIST_REMOVE(&jm->parentmgr->submgrs, jm, jobmgr_s, sle); + } + + if (jm->req_port) { + jobmgr_assumes(jm, launchd_mport_deallocate(jm->req_port) == KERN_SUCCESS); + } + + if (jm->jm_port) { + if (jm->transfer_bstrap) { + jobmgr_assumes(jm, launchd_mport_deallocate(jm->jm_port) == KERN_SUCCESS); + } else { + jobmgr_assumes(jm, launchd_mport_close_recv(jm->jm_port) == KERN_SUCCESS); } } + + free(jm); } void job_remove(job_t j) { - job_t ji; struct calendarinterval *ci; struct socketgroup *sg; struct watchpath *wp; @@ -542,34 +593,24 @@ } } - if (j->parent) { - SLIST_REMOVE(&j->parent->jobs, j, job_s, sle); + if (job_assumes(j, j->mgr)) { + SLIST_REMOVE(&j->mgr->jobs, j, job_s, sle); } if (j->execfd) { job_assumes(j, close(j->execfd) == 0); } - if (j->bs_port) { - if (j->transfer_bstrap) { - job_assumes(j, launchd_mport_deallocate(j->bs_port) == KERN_SUCCESS); - } else { - job_assumes(j, launchd_mport_close_recv(j->bs_port) == KERN_SUCCESS); - } + if (j->j_port) { + job_assumes(j, launchd_mport_deallocate(j->j_port) == KERN_SUCCESS); + job_assumes(j, launchd_mport_close_recv(j->j_port) == KERN_SUCCESS); } - if (j->req_port) { - job_assumes(j, launchd_mport_deallocate(j->req_port) == KERN_SUCCESS); - } - #if 0 if (j->wait_reply_port) { } #endif - while ((ji = SLIST_FIRST(&j->jobs))) { - job_remove(ji); - } while ((sg = SLIST_FIRST(&j->sockets))) { socketgroup_delete(j, sg); } @@ -675,7 +716,7 @@ } if (global_on_demand_cnt == 0) { - job_dispatch_all(root_job); + jobmgr_dispatch_all(root_jobmgr); } return true; @@ -686,7 +727,7 @@ { mach_msg_size_t mxmsgsz; - if (!job_assumes(j, launchd_mport_create_recv(&j->bs_port) == KERN_SUCCESS)) { + if (!job_assumes(j, launchd_mport_create_recv(&j->j_port) == KERN_SUCCESS)) { goto out_bad; } @@ -696,62 +737,62 @@ mxmsgsz = job_mig_protocol_vproc_subsystem.maxsize; } - if (!job_assumes(j, runtime_add_mport(j->bs_port, protocol_vproc_server, mxmsgsz) == KERN_SUCCESS)) { + if (!job_assumes(j, runtime_add_mport(j->j_port, protocol_vproc_server, mxmsgsz) == KERN_SUCCESS)) { goto out_bad2; } return true; out_bad2: - job_assumes(j, launchd_mport_close_recv(j->bs_port) == KERN_SUCCESS); + job_assumes(j, launchd_mport_close_recv(j->j_port) == KERN_SUCCESS); out_bad: return false; } job_t -job_new_via_mach_init(job_t jbs, const char *cmd, uid_t uid, bool ond) +job_new_via_mach_init(job_t j, const char *cmd, uid_t uid, bool ond) { const char **argv = (const char **)mach_cmd2argv(cmd); - job_t j = NULL; + job_t jr = NULL; char buf[1000]; - if (!job_assumes(jbs, argv != NULL)) { + if (!job_assumes(j, argv != NULL)) { goto out_bad; } /* preflight the string so we know how big it is */ snprintf(buf, sizeof(buf), "%s.%s", sizeof(void *) == 8 ? "0xdeadbeeffeedface" : "0xbabecafe", basename((char *)argv[0])); - j = job_new(jbs, buf, NULL, argv, NULL, MACH_PORT_NULL); + jr = job_new(j->mgr, buf, NULL, argv, NULL); - snprintf(j->label, strlen(j->label) + 1, "%p.%s", j, basename(j->argv[0])); - free(argv); - if (!job_assumes(jbs, j != NULL)) { + if (!job_assumes(j, jr != NULL)) { goto out_bad; } - j->mach_uid = uid; - j->ondemand = ond; - j->legacy_mach_job = true; - j->priv_port_has_senders = true; /* the IPC that called us will make-send on this port */ + snprintf(jr->label, strlen(jr->label) + 1, "%p.%s", jr, basename(jr->argv[0])); - if (!job_setup_machport(j)) { + jr->mach_uid = uid; + jr->ondemand = ond; + jr->legacy_mach_job = true; + jr->priv_port_has_senders = true; /* the IPC that called us will make-send on this port */ + + if (!job_setup_machport(jr)) { goto out_bad; } - if (!job_assumes(j, launchd_mport_notify_req(j->bs_port, MACH_NOTIFY_NO_SENDERS) == KERN_SUCCESS)) { - job_assumes(j, launchd_mport_close_recv(j->bs_port) == KERN_SUCCESS); + if (!job_assumes(jr, launchd_mport_notify_req(jr->j_port, MACH_NOTIFY_NO_SENDERS) == KERN_SUCCESS)) { + job_assumes(jr, launchd_mport_close_recv(jr->j_port) == KERN_SUCCESS); goto out_bad; } - job_log(j, LOG_INFO, "Legacy%s server created in bootstrap: %x", ond ? " on-demand" : "", jbs->bs_port); + job_log(jr, LOG_INFO, "Legacy%s server created", ond ? " on-demand" : ""); - return j; + return jr; out_bad: - if (j) { - job_remove(j); + if (jr) { + job_remove(jr); } return NULL; } @@ -774,12 +815,12 @@ { job_t jr; - if ((jr = job_find(j, label)) != NULL) { + if ((jr = jobmgr_find(j->mgr, label)) != NULL) { errno = EEXIST; return NULL; } - jr = job_new(j, label, path, argv, NULL, MACH_PORT_NULL); + jr = job_new(j->mgr, label, path, argv, NULL); if (!jr) { return NULL; @@ -822,56 +863,42 @@ } job_t -job_find_anonymous(job_t p) +jobmgr_new_anonymous(jobmgr_t jm) { - job_t ji = NULL; - - SLIST_FOREACH(ji, &p->jobs, sle) { - if (ji->anonymous) { - break; - } - } - - return ji; -} - -bool -job_new_anonymous(job_t p) -{ char newlabel[1000], *procname = "unknown"; job_t jr; - snprintf(newlabel, sizeof(newlabel), "%u.anonymous", MACH_PORT_INDEX(p->bs_port)); + snprintf(newlabel, sizeof(newlabel), "%u.anonymous", MACH_PORT_INDEX(jm->jm_port)); - if ((jr = job_new(p, newlabel, procname, NULL, NULL, MACH_PORT_NULL))) { + if ((jr = job_new(jm, newlabel, procname, NULL, NULL))) { jr->anonymous = true; } - return jr ? true : false; + return jr; } job_t -job_new(job_t p, const char *label, const char *prog, const char *const *argv, const char *stdinpath, mach_port_t reqport) +job_new(jobmgr_t jm, const char *label, const char *prog, const char *const *argv, const char *stdinpath) { const char *const *argv_tmp = argv; char *co; int i, cc = 0; job_t j; - if (reqport == MACH_PORT_NULL && prog == NULL && argv == NULL) { + if (prog == NULL && argv == NULL) { errno = EINVAL; return NULL; } j = calloc(1, sizeof(struct job_s) + strlen(label) + 1); - if (!job_assumes(p, j != NULL)) { + if (!jobmgr_assumes(jm, j != NULL)) { return NULL; } strcpy(j->label, label); j->kqjob_callback = job_callback; - j->parent = p ? job_get_bs(p) : NULL; + j->mgr = jm; j->min_run_time = LAUNCHD_MIN_JOB_RUN_TIME; j->timeout = LAUNCHD_ADVISABLE_IDLE_TIMEOUT; j->currently_ignored = true; @@ -879,13 +906,6 @@ j->checkedin = true; j->firstborn = (strcmp(label, FIRSTBORN_LABEL) == 0); - if (reqport != MACH_PORT_NULL) { - j->req_port = reqport; - if (!job_assumes(j, launchd_mport_notify_req(reqport, MACH_NOTIFY_DEAD_NAME) == KERN_SUCCESS)) { - goto out_bad; - } - } - if (prog) { j->prog = strdup(prog); if (!job_assumes(j, j->prog != NULL)) { @@ -923,11 +943,10 @@ j->argv[i] = NULL; } - if (j->parent) { - SLIST_INSERT_HEAD(&j->parent->jobs, j, sle); - job_log(j->parent, LOG_DEBUG, "Conceived"); - } + SLIST_INSERT_HEAD(&jm->jobs, j, sle); + job_log(j, LOG_DEBUG, "Conceived"); + return j; out_bad: @@ -1373,7 +1392,7 @@ if (label == NULL) { errno = EINVAL; return NULL; - } else if ((j = job_find(root_job, label)) != NULL) { + } else if ((j = jobmgr_find(root_jobmgr, label)) != NULL) { errno = EEXIST; return NULL; } else if (label[0] == '\0' || (strncasecmp(label, "", strlen("com.apple.launchd")) == 0) || @@ -1394,7 +1413,7 @@ argv[i] = NULL; } - if ((j = job_new(root_job, label, prog, argv, NULL, MACH_PORT_NULL))) { + if ((j = job_new(root_jobmgr, label, prog, argv, NULL))) { launch_data_dict_iterate(pload, job_import_keys, j); } @@ -1402,21 +1421,20 @@ } job_t -job_find(job_t j, const char *label) +jobmgr_find(jobmgr_t jm, const char *label) { - job_t jr, ji; + jobmgr_t jmi; + job_t ji; - if (label[0] == '\0') { - return root_job; + SLIST_FOREACH(jmi, &jm->submgrs, sle) { + if ((ji = jobmgr_find(jmi, label))) { + return ji; + } } - if (strcmp(j->label, label) == 0) { - return j; - } - - SLIST_FOREACH(ji, &j->jobs, sle) { - if ((jr = job_find(ji, label))) { - return jr; + SLIST_FOREACH(ji, &jm->jobs, sle) { + if (strcmp(ji->label, label) == 0) { + return ji; } } @@ -1425,72 +1443,77 @@ } job_t -job_find_by_pid(job_t j, pid_t p, bool recurse) +job_mig_intran2(jobmgr_t jm, mach_port_t p) { - job_t jr, ji; + job_t ji; + jobmgr_t jmi; - if (j->p == p) { - return j; - } + if (jm->jm_port == p) { + struct ldcred ldc; - SLIST_FOREACH(ji, &j->jobs, sle) { - if (ji->p == p) { - return ji; - } else if (recurse && (jr = job_find_by_pid(ji, p, recurse))) { - return jr; + runtime_get_caller_creds(&ldc); + + SLIST_FOREACH(ji, &jm->jobs, sle) { + if (ji->p == ldc.pid) { + /* This is just a MRU perfomance hack */ + SLIST_REMOVE(&jm->jobs, ji, job_s, sle); + SLIST_INSERT_HEAD(&jm->jobs, ji, sle); + return ji; + } } + + return jm->anonj; } - errno = ESRCH; - return NULL; -} + SLIST_FOREACH(jmi, &jm->submgrs, sle) { + job_t jr; -static job_t -job_find_by_port2(job_t j, mach_port_t p) -{ - struct machservice *ms; - job_t jr, ji; - - if (j->bs_port == p) { - return j; - } - - SLIST_FOREACH(ms, &j->machservices, sle) { - if (ms->port == p) { - return j; + if ((jr = job_mig_intran2(jmi, p))) { + return jr; } } - SLIST_FOREACH(ji, &j->jobs, sle) { - if ((jr = job_find_by_port2(ji, p))) { - return jr; + SLIST_FOREACH(ji, &jm->jobs, sle) { + if (ji->j_port == p) { + return ji; } } - errno = ESRCH; return NULL; } job_t job_mig_intran(mach_port_t p) { - struct ldcred ldc; - job_t jp, jr = NULL; + job_t jr = job_mig_intran2(root_jobmgr, p); - runtime_get_caller_creds(&ldc); + launchd_assumes(jr != NULL); - if (launchd_assumes((jp = job_find_by_port2(root_job, p)) != NULL)) { - if (jp->req_port) { - if (!(jr = job_find_by_pid(jp, ldc.pid, false))) { - jr = job_find_anonymous(jp); + return jr; +} + +job_t +jobmgr_find_by_service_port(jobmgr_t jm, mach_port_t p) +{ + struct machservice *ms; + jobmgr_t jmi; + job_t ji, jr; + + SLIST_FOREACH(jmi, &jm->submgrs, sle) { + if ((jr = jobmgr_find_by_service_port(jmi, p))) { + return jr; + } + } + + SLIST_FOREACH(ji, &jm->jobs, sle) { + SLIST_FOREACH(ms, &ji->machservices, sle) { + if (ms->port == p) { + return ji; } - } else { - jr = jp; } - job_assumes(jp, jr != NULL); } - return jr; + return NULL; } void @@ -1499,17 +1522,22 @@ } void -job_export_all2(job_t j, launch_data_t where) +job_export_all2(jobmgr_t jm, launch_data_t where) { - launch_data_t tmp; + jobmgr_t jmi; job_t ji; - if (job_assumes(j, (tmp = job_export2(j, false)) != NULL)) { - launch_data_dict_insert(where, tmp, j->label); + SLIST_FOREACH(jmi, &jm->submgrs, sle) { + job_export_all2(jmi, where); } - SLIST_FOREACH(ji, &j->jobs, sle) - job_export_all2(ji, where); + SLIST_FOREACH(ji, &jm->jobs, sle) { + launch_data_t tmp; + + if (jobmgr_assumes(jm, (tmp = job_export2(ji, false)) != NULL)) { + launch_data_dict_insert(where, tmp, ji->label); + } + } } launch_data_t @@ -1517,7 +1545,9 @@ { launch_data_t resp = launch_data_alloc(LAUNCH_DATA_DICTIONARY); - job_export_all2(root_job, resp); + if (launchd_assumes(resp != NULL)) { + job_export_all2(root_jobmgr, resp); + } return resp; } @@ -1581,15 +1611,18 @@ } void -job_dispatch_all(job_t j) +jobmgr_dispatch_all(jobmgr_t jm) { + jobmgr_t jmi; job_t ji; - SLIST_FOREACH(ji, &j->jobs, sle) { - job_dispatch_all(ji); + SLIST_FOREACH(jmi, &jm->submgrs, sle) { + jobmgr_dispatch_all(jmi); } - job_dispatch(j, false); + SLIST_FOREACH(ji, &jm->jobs, sle) { + job_dispatch(ji, false); + } } void @@ -1688,14 +1721,10 @@ bool sipc = false; time_t td; - if (!job_assumes(j, j->req_port == MACH_PORT_NULL)) { + if (!job_assumes(j, j->mgr != NULL)) { return; } - if (!job_assumes(j, j->parent != NULL)) { - return; - } - if (job_active(j)) { job_log(j, LOG_DEBUG, "Already started"); return; @@ -1732,7 +1761,7 @@ time(&j->start_time); - switch (c = job_fork(j->parent)) { + switch (c = jobmgr_fork(j->mgr)) { case -1: job_log_error(j, LOG_ERR, "fork() failed, will try again in one second"); job_assumes(j, close(execspair[0]) == 0); @@ -1858,16 +1887,20 @@ exit(EXIT_FAILURE); } -void job_setup_env_from_other_jobs(job_t j) +void jobmgr_setup_env_from_other_jobs(jobmgr_t jm) { struct envitem *ei; job_t ji; - SLIST_FOREACH(ji, &j->jobs, sle) - job_setup_env_from_other_jobs(ji); + if (jm->parentmgr) { + jobmgr_setup_env_from_other_jobs(jm->parentmgr); + } - SLIST_FOREACH(ei, &j->global_env, sle) - setenv(ei->key, ei->value, 1); + SLIST_FOREACH(ji, &jm->jobs, sle) { + SLIST_FOREACH(ei, &ji->global_env, sle) { + setenv(ei->key, ei->value, 1); + } + } } void @@ -2019,7 +2052,7 @@ } } - job_setup_env_from_other_jobs(root_job); + jobmgr_setup_env_from_other_jobs(j->mgr); SLIST_FOREACH(ei, &j->env, sle) setenv(ei->key, ei->value, 1); @@ -2073,55 +2106,55 @@ } } -size_t -job_prep_log_preface(job_t j, char *buf) +static void +extract_rcsid_substr(const char *i, char *o, size_t osz) { - size_t lsz = strlen(j->label); - char newlabel[lsz * 2 + 1]; - size_t i, o, r = 0; + char *rcs_rev_tmp = strchr(i, ' '); - for (i = 0, o = 0; i < lsz; i++, o++) { - if (j->label[i] == '%') { - newlabel[o] = '%'; - o++; - newlabel[o] = '%'; - } else { - newlabel[o] = j->label[i]; + if (!rcs_rev_tmp) { + strlcpy(o, i, osz); + } else { + strlcpy(o, rcs_rev_tmp + 1, osz); + rcs_rev_tmp = strchr(o, ' '); + if (rcs_rev_tmp) { + *rcs_rev_tmp = '\0'; } } - newlabel[o] = '\0'; +} - if (j->parent) { - r = job_prep_log_preface(j->parent, buf); +void +jobmgr_log_bug(jobmgr_t jm, const char *rcs_rev, const char *path, unsigned int line, const char *test) +{ + int saved_errno = errno; + const char *file = strrchr(path, '/'); + char buf[100]; + + extract_rcsid_substr(rcs_rev, buf, sizeof(buf)); + + if (!file) { + file = path; + } else { + file += 1; } - return r + sprintf(buf + r, "%s%s", j->parent ? "/" : "", newlabel); + jobmgr_log(jm, LOG_NOTICE, "Bug: %s:%u (%s):%u: %s", file, line, buf, saved_errno, test); } void job_log_bug(job_t j, const char *rcs_rev, const char *path, unsigned int line, const char *test) { int saved_errno = errno; + const char *file = strrchr(path, '/'); char buf[100]; - const char *file = strrchr(path, '/'); - char *rcs_rev_tmp = strchr(rcs_rev, ' '); + extract_rcsid_substr(rcs_rev, buf, sizeof(buf)); + if (!file) { file = path; } else { file += 1; } - if (!rcs_rev_tmp) { - strlcpy(buf, rcs_rev, sizeof(buf)); - } else { - strlcpy(buf, rcs_rev_tmp + 1, sizeof(buf)); - rcs_rev_tmp = strchr(buf, ' '); - if (rcs_rev_tmp) { - *rcs_rev_tmp = '\0'; - } - } - job_log(j, LOG_NOTICE, "Bug: %s:%u (%s):%u: %s", file, line, buf, saved_errno, test); } @@ -2130,7 +2163,6 @@ { char newmsg[10000]; int oldmask = 0; - size_t o; /* * Hack: If bootstrap_port is set, we must be on the child side of a @@ -2141,12 +2173,10 @@ return _vproc_logv(pri, err, msg, ap); } - o = job_prep_log_preface(j, newmsg); - if (err) { - snprintf(newmsg + o, sizeof(newmsg) - o, ": %s: %s", msg, strerror(err)); + snprintf(newmsg, sizeof(newmsg), "%s: %s: %s", j->label, msg, strerror(err)); } else { - snprintf(newmsg + o, sizeof(newmsg) - o, ": %s", msg); + snprintf(newmsg, sizeof(newmsg), "%s: %s", j->label, msg); } if (j->debug) { @@ -2180,6 +2210,36 @@ va_end(ap); } +#if 0 +void +jobmgr_log_error(jobmgr_t jm, int pri, const char *msg, ...) +{ + va_list ap; + + va_start(ap, msg); + jobmgr_logv(jm, pri, errno, msg, ap); + va_end(ap); +} +#endif + +void +jobmgr_log(jobmgr_t jm, int pri, const char *msg, ...) +{ + va_list ap; + + va_start(ap, msg); + jobmgr_logv(jm, pri, 0, msg, ap); + va_end(ap); +} + +void +jobmgr_logv(jobmgr_t jm, int pri, int err, const char *msg, va_list ap) +{ + if (launchd_assumes(jm->anonj)) { + job_logv(jm->anonj, pri, err, msg, ap); + } +} + bool watchpath_new(job_t j, const char *name, bool qdir) { @@ -2657,7 +2717,7 @@ /* Maybe another job has the inverse path based semaphore as this job */ if (dispatch_others) { - job_dispatch_all_other_semaphores(root_job, j); + jobmgr_dispatch_all_other_semaphores(root_jobmgr, j); } return false; @@ -2684,10 +2744,6 @@ return true; } - if (j->req_port) { - return true; - } - if (j->p) { return true; } @@ -2708,25 +2764,25 @@ pid_t launchd_fork(void) { - return job_fork(root_job); + return jobmgr_fork(root_jobmgr); } pid_t -job_fork(job_t j) +jobmgr_fork(jobmgr_t jm) { - mach_port_t p = j->bs_port; + mach_port_t p = jm->jm_port; pid_t r = -1; sigprocmask(SIG_BLOCK, &blocked_signals, NULL); - job_assumes(j, launchd_mport_make_send(p) == KERN_SUCCESS); - job_assumes(j, launchd_set_bport(p) == KERN_SUCCESS); - job_assumes(j, launchd_mport_deallocate(p) == KERN_SUCCESS); + jobmgr_assumes(jm, launchd_mport_make_send(p) == KERN_SUCCESS); + jobmgr_assumes(jm, launchd_set_bport(p) == KERN_SUCCESS); + jobmgr_assumes(jm, launchd_mport_deallocate(p) == KERN_SUCCESS); r = fork(); if (r != 0) { - job_assumes(j, launchd_set_bport(MACH_PORT_NULL) == KERN_SUCCESS); + jobmgr_assumes(jm, launchd_set_bport(MACH_PORT_NULL) == KERN_SUCCESS); } else if (r == 0) { size_t i; @@ -2881,7 +2937,7 @@ struct machservice *ms; mach_port_t p = MACH_PORT_NULL; - if ((ms = job_lookup_service(j->parent, key, false))) { + if ((ms = jobmgr_lookup_service(j->mgr, key, false))) { job_log(j, LOG_WARNING, "Conflict with job: %s over Mach service: %s", ms->job->label, key); return; } @@ -2898,10 +2954,10 @@ } } -job_t -job_parent(job_t j) +jobmgr_t +jobmgr_parent(jobmgr_t jm) { - return j->parent; + return jm->parentmgr; } void @@ -2920,60 +2976,42 @@ } } -void -job_foreach_service(job_t j, void (*bs_iter)(struct machservice *, void *), void *context, bool only_anonymous) +jobmgr_t +jobmgr_new(jobmgr_t jm, mach_port_t requestorport, mach_port_t checkin_port) { - struct machservice *ms; - job_t ji; - - j = job_get_bs(j); - - SLIST_FOREACH(ji, &j->jobs, sle) { - if (ji->req_port) { - continue; - } else if (only_anonymous && !ji->anonymous) { - continue; - } - - SLIST_FOREACH(ms, &ji->machservices, sle) { - bs_iter(ms, context); - } - } - - if (!job_assumes(j, SLIST_EMPTY(&j->machservices))) { - SLIST_FOREACH(ms, &j->machservices, sle) { - bs_iter(ms, context); - } - } -} - -job_t -job_new_bootstrap(job_t p, mach_port_t requestorport, mach_port_t checkin_port) -{ - char bslabel[1024] = "100000"; mach_msg_size_t mxmsgsz; - job_t j; + jobmgr_t jmr; if (requestorport == MACH_PORT_NULL) { - if (p) { - job_log(p, LOG_ERR, "Mach sub-bootstrap create request requires a requester port"); + if (jm) { + jobmgr_log(jm, LOG_ERR, "Mach sub-bootstrap create request requires a requester port"); } return NULL; } - j = job_new(p, bslabel, NULL, NULL, NULL, requestorport); + jmr = calloc(1, sizeof(struct jobmgr_s) + strlen("100000") + 1); - if (j == NULL) { + if (jmr == NULL) { return NULL; } + jmr->req_port = requestorport; + + if ((jmr->parentmgr = jm)) { + SLIST_INSERT_HEAD(&jm->submgrs, jmr, sle); + } + + if (!jobmgr_assumes(jmr, launchd_mport_notify_req(jmr->req_port, MACH_NOTIFY_DEAD_NAME) == KERN_SUCCESS)) { + goto out_bad; + } + if (checkin_port != MACH_PORT_NULL) { - j->bs_port = checkin_port; - } else if (!job_assumes(j, launchd_mport_create_recv(&j->bs_port) == KERN_SUCCESS)) { + jmr->jm_port = checkin_port; + } else if (!jobmgr_assumes(jmr, launchd_mport_create_recv(&jmr->jm_port) == KERN_SUCCESS)) { goto out_bad; } - snprintf(j->label, strlen(j->label) + 1, "%d", MACH_PORT_INDEX(j->bs_port)); + snprintf(jmr->name, strlen(jmr->name) + 1, "%u", MACH_PORT_INDEX(jmr->jm_port)); /* Sigh... at the moment, MIG has maxsize == sizeof(reply union) */ mxmsgsz = sizeof(union __RequestUnion__job_mig_protocol_vproc_subsystem); @@ -2981,29 +3019,32 @@ mxmsgsz = job_mig_protocol_vproc_subsystem.maxsize; } - if (!job_assumes(j, runtime_add_mport(j->bs_port, protocol_vproc_server, mxmsgsz) == KERN_SUCCESS)) { + if (!jobmgr_assumes(jmr, runtime_add_mport(jmr->jm_port, protocol_vproc_server, mxmsgsz) == KERN_SUCCESS)) { goto out_bad; } - if (p) { - job_log(p, LOG_DEBUG, "Mach sub-bootstrap created: %s", j->label); + if (jm) { + jobmgr_log(jm, LOG_DEBUG, "Mach sub-bootstrap created: %s", jmr->name); } - job_assumes(j, job_new_anonymous(j)); + jmr->anonj = jobmgr_new_anonymous(jmr); - return j; + jobmgr_assumes(jmr, jmr->anonj != NULL); + return jmr; + out_bad: - if (j) { - job_remove(j); + if (jmr) { + jobmgr_remove(jmr); } return NULL; } void -job_delete_anything_with_port(job_t j, mach_port_t port) +jobmgr_delete_anything_with_port(jobmgr_t jm, mach_port_t port) { struct machservice *ms, *next_ms; + jobmgr_t jmi, jmn; job_t ji, jn; /* Mach ports, unlike Unix descriptors, are reference counted. In other @@ -3016,56 +3057,42 @@ * to use. */ - SLIST_FOREACH_SAFE(ji, &j->jobs, sle, jn) { - job_delete_anything_with_port(ji, port); + if (jm->req_port == port) { + if (jm == root_jobmgr) { + launchd_shutdown(); + } else { + return jobmgr_remove(jm); + } } - SLIST_FOREACH_SAFE(ms, &j->machservices, sle, next_ms) { - if (ms->port == port) { - machservice_delete(ms); - } + SLIST_FOREACH_SAFE(jmi, &jm->submgrs, sle, jmn) { + jobmgr_delete_anything_with_port(jmi, port); } - if (j->req_port == port) { - if (j == root_job) { - launchd_shutdown(); - } else { - return job_remove(j); + SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { + SLIST_FOREACH_SAFE(ms, &ji->machservices, sle, next_ms) { + if (ms->port == port) { + machservice_delete(ms); + } } } } struct machservice * -job_lookup_service(job_t j, const char *name, bool check_parent) +jobmgr_lookup_service(jobmgr_t jm, const char *name, bool check_parent) { struct machservice *ms; job_t ji; - j = job_get_bs(j); - - SLIST_FOREACH(ji, &j->jobs, sle) { - if (ji->req_port) { - continue; - } - + SLIST_FOREACH(ji, &jm->jobs, sle) { SLIST_FOREACH(ms, &ji->machservices, sle) { if (strcmp(name, ms->name) == 0) { - if (ji->parent) { - SLIST_REMOVE(&ji->parent->jobs, ji, job_s, sle); - SLIST_INSERT_HEAD(&ji->parent->jobs, ji, sle); - } return ms; } } } - SLIST_FOREACH(ms, &j->machservices, sle) { - if (strcmp(name, ms->name) == 0) { - return ms; - } - } - - if (j->parent == NULL) { + if (jm->parentmgr == NULL) { return NULL; } @@ -3073,7 +3100,7 @@ return NULL; } - return job_lookup_service(j->parent, name, true); + return jobmgr_lookup_service(jm->parentmgr, name, true); } mach_port_t @@ -3202,38 +3229,37 @@ } bool -job_ack_port_destruction(job_t j, mach_port_t p) +jobmgr_ack_port_destruction(jobmgr_t jm, mach_port_t p) { + struct machservice *ms = NULL; + jobmgr_t jmi; job_t ji; - struct machservice *ms; - SLIST_FOREACH(ji, &j->jobs, sle) { - if (job_ack_port_destruction(ji, p)) { + SLIST_FOREACH(jmi, &jm->submgrs, sle) { + if (jobmgr_ack_port_destruction(jmi, p)) { return true; } } - SLIST_FOREACH(ms, &j->machservices, sle) { - if (ms->port == p) { - break; - } - } + SLIST_FOREACH(ji, &jm->jobs, sle) { + SLIST_FOREACH(ms, &ji->machservices, sle) { + if (ms->port != p) { + continue; + } - if (ms == NULL) { - return false; - } + ms->isActive = false; - ms->isActive = false; + if (ms->reset) { + machservice_resetport(ji, ms); + } - if (ms->reset) { - machservice_resetport(j, ms); + job_log(ji, LOG_DEBUG, "Receive right returned to us: %s", ms->name); + job_dispatch(ji, false); + return true; + } } - job_log(j, LOG_DEBUG, "Receive right returned to us: %s", ms->name); - - job_dispatch(j, false); - - return true; + return false; } void @@ -3241,8 +3267,8 @@ { j->priv_port_has_senders = false; - job_assumes(j, launchd_mport_close_recv(j->bs_port) == KERN_SUCCESS); - j->bs_port = 0; + job_assumes(j, launchd_mport_close_recv(j->j_port) == KERN_SUCCESS); + j->j_port = 0; job_log(j, LOG_DEBUG, "No more senders on privileged Mach bootstrap port"); @@ -3250,31 +3276,21 @@ } mach_port_t -job_get_reqport(job_t j) +jobmgr_get_reqport(jobmgr_t jm) { - j->transfer_bstrap = true; - gc_this_job = j; + jm->transfer_bstrap = true; + gc_this_jobmgr = jm; - return j->req_port; + return jm->req_port; } -mach_port_t -job_get_bsport(job_t j) -{ - return j->bs_port; -} - -job_t +jobmgr_t job_get_bs(job_t j) { - if (j->req_port) { - return j; + if (job_assumes(j, j->mgr != NULL)) { + return j->mgr; } - if (job_assumes(j, j->parent != NULL)) { - return j->parent; - } - return NULL; } @@ -3369,20 +3385,20 @@ } void -job_dispatch_all_other_semaphores(job_t j, job_t nj) +jobmgr_dispatch_all_other_semaphores(jobmgr_t jm, job_t nj) { + jobmgr_t jmi; job_t ji, jn; - if (j == nj) { - return; - } - SLIST_FOREACH_SAFE(ji, &j->jobs, sle, jn) { - job_dispatch_all_other_semaphores(ji, nj); + SLIST_FOREACH(jmi, &jm->submgrs, sle) { + jobmgr_dispatch_all_other_semaphores(jmi, nj); } - if (!SLIST_EMPTY(&j->semaphores)) { - job_dispatch(j, false); + SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { + if (ji != nj && !SLIST_EMPTY(&ji->semaphores)) { + job_dispatch(ji, false); + } } } @@ -3564,6 +3580,10 @@ struct ldcred ldc; job_t js; + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } + runtime_get_caller_creds(&ldc); job_log(j, LOG_DEBUG, "Server create attempt: %s", server_cmd); @@ -3593,7 +3613,7 @@ return BOOTSTRAP_NO_MEMORY; } - *server_portp = job_get_bsport(js); + *server_portp = js->j_port; return BOOTSTRAP_SUCCESS; } @@ -3602,6 +3622,10 @@ { kern_return_t kr = 0; + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } + switch (key) { case LAST_EXIT_STATUS: *val = j->last_exit_status; @@ -3619,6 +3643,10 @@ { kern_return_t kr = 0; + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } + switch (key) { case GLOBAL_ON_DEMAND: kr = job_set_global_on_demand(j, (bool)val) ? 0 : 1; @@ -3634,6 +3662,10 @@ kern_return_t job_mig_getsocket(job_t j, name_t spr) { + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } + if (!sockpath) { return BOOTSTRAP_NO_MEMORY; } else if (getpid() == 1) { @@ -3648,6 +3680,10 @@ kern_return_t job_mig_log(job_t j, int pri, int err, logmsg_t msg) { + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } + if ((errno = err)) { job_log_error(j, pri, "%s", msg); } else { @@ -3661,11 +3697,11 @@ job_mig_lookup_per_user_context(job_t j, uid_t which_user, mach_port_t *up_cont) { struct ldcred ldc; - job_t ji, jbs = root_job; + job_t ji; -#if 0 - jbs = job_get_bs(j); -#endif + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } runtime_get_caller_creds(&ldc); @@ -3679,7 +3715,7 @@ *up_cont = MACH_PORT_NULL; - SLIST_FOREACH(ji, &jbs->jobs, sle) { + SLIST_FOREACH(ji, &root_jobmgr->jobs, sle) { if (ji->mach_uid != which_user) { continue; } @@ -3698,7 +3734,7 @@ sprintf(lbuf, "com.apple.launchd.peruser.%u", which_user); - ji = job_new(jbs, lbuf, "/sbin/launchd", NULL, NULL, 0); + ji = job_new(root_jobmgr, lbuf, "/sbin/launchd", NULL, NULL); if (ji == NULL) { return BOOTSTRAP_NO_MEMORY; @@ -3729,9 +3765,13 @@ struct machservice *ms; struct ldcred ldc; + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } + runtime_get_caller_creds(&ldc); - ms = job_lookup_service(j, servicename, true); + ms = jobmgr_lookup_service(j->mgr, servicename, true); if (ms == NULL) { job_log(j, LOG_DEBUG, "Check-in of Mach service failed. Unknown: %s", servicename); @@ -3764,6 +3804,10 @@ struct machservice *ms; struct ldcred ldc; + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } + runtime_get_caller_creds(&ldc); #if 0 @@ -3777,7 +3821,7 @@ * 92) is a rogue application (not our UID, not root and not a child of * us). We'll have to reconcile this design friction at a later date. */ - if (j->anonymous && job_get_bs(j)->parent == NULL && ldc.uid != 0 && ldc.uid != getuid() && ldc.uid != 92) { + if (j->anonymous && job_get_bs(j)->parentmgr == NULL && ldc.uid != 0 && ldc.uid != getuid() && ldc.uid != 92) { if (getpid() == 1) { return VPROC_ERR_TRY_PER_USER; } else { @@ -3785,7 +3829,7 @@ } } - ms = job_lookup_service(j, servicename, false); + ms = jobmgr_lookup_service(j->mgr, servicename, false); if (ms) { if (machservice_job(ms) != j) { @@ -3816,13 +3860,17 @@ struct machservice *ms; struct ldcred ldc; + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } + runtime_get_caller_creds(&ldc); - if (getpid() == 1 && j->anonymous && job_get_bs(j)->parent == NULL && ldc.uid != 0 && ldc.euid != 0) { + if (getpid() == 1 && j->anonymous && job_get_bs(j)->parentmgr == NULL && ldc.uid != 0 && ldc.euid != 0) { return VPROC_ERR_TRY_PER_USER; } - ms = job_lookup_service(j, servicename, true); + ms = jobmgr_lookup_service(j->mgr, servicename, true); if (ms && machservice_hidden(ms) && !job_active(machservice_job(ms))) { ms = NULL; @@ -3849,16 +3897,19 @@ kern_return_t job_mig_parent(job_t j, mach_port_t *parentport, mach_msg_type_name_t *pptype) { + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } + job_log(j, LOG_DEBUG, "Requested parent bootstrap port"); + jobmgr_t jm = j->mgr; - j = job_get_bs(j); - *pptype = MACH_MSG_TYPE_MAKE_SEND; - if (job_parent(j)) { - *parentport = job_get_bsport(job_parent(j)); + if (jobmgr_parent(jm)) { + *parentport = jobmgr_parent(jm)->jm_port; } else if (MACH_PORT_NULL == inherited_bootstrap_port) { - *parentport = job_get_bsport(j); + *parentport = jm->jm_port; } else { *pptype = MACH_MSG_TYPE_COPY_SEND; *parentport = inherited_bootstrap_port; @@ -3866,76 +3917,61 @@ return BOOTSTRAP_SUCCESS; } -static void -job_mig_info_countservices(struct machservice *ms, void *context) -{ - unsigned int *cnt = context; - - (*cnt)++; -} - -struct x_bootstrap_info_copyservices_cb { - name_array_t service_names; - bootstrap_status_array_t service_actives; - mach_port_array_t ports; - unsigned int i; -}; - -static void -job_mig_info_copyservices(struct machservice *ms, void *context) -{ - struct x_bootstrap_info_copyservices_cb *info_resp = context; - - strlcpy(info_resp->service_names[info_resp->i], machservice_name(ms), sizeof(info_resp->service_names[0])); - - launchd_assumes(info_resp->service_actives || info_resp->ports); - - if (info_resp->service_actives) { - info_resp->service_actives[info_resp->i] = machservice_status(ms); - } else { - info_resp->ports[info_resp->i] = machservice_port(ms); - } - info_resp->i++; -} - kern_return_t job_mig_info(job_t j, name_array_t *servicenamesp, unsigned int *servicenames_cnt, bootstrap_status_array_t *serviceactivesp, unsigned int *serviceactives_cnt) { - struct x_bootstrap_info_copyservices_cb info_resp = { NULL, NULL, NULL, 0 }; - unsigned int cnt = 0; + name_array_t service_names = NULL; + bootstrap_status_array_t service_actives = NULL; + unsigned int cnt = 0, cnt2 = 0; + struct machservice *ms; + jobmgr_t jm; job_t ji; - for (ji = j; ji; ji = job_parent(ji)) - job_foreach_service(ji, job_mig_info_countservices, &cnt, false); + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } - mig_allocate((vm_address_t *)&info_resp.service_names, cnt * sizeof(info_resp.service_names[0])); - if (!launchd_assumes(info_resp.service_names != NULL)) { + jm = j->mgr; + + SLIST_FOREACH(ji, &jm->jobs, sle) { + SLIST_FOREACH(ms, &ji->machservices, sle) { + cnt++; + } + } + + mig_allocate((vm_address_t *)&service_names, cnt * sizeof(service_names[0])); + if (!launchd_assumes(service_names != NULL)) { goto out_bad; } - mig_allocate((vm_address_t *)&info_resp.service_actives, cnt * sizeof(info_resp.service_actives[0])); - if (!launchd_assumes(info_resp.service_actives != NULL)) { + mig_allocate((vm_address_t *)&service_actives, cnt * sizeof(service_actives[0])); + if (!launchd_assumes(service_actives != NULL)) { goto out_bad; } - for (ji = j; ji; ji = job_parent(ji)) - job_foreach_service(ji, job_mig_info_copyservices, &info_resp, false); + SLIST_FOREACH(ji, &jm->jobs, sle) { + SLIST_FOREACH(ms, &ji->machservices, sle) { + strlcpy(service_names[cnt2], machservice_name(ms), sizeof(service_names[0])); + service_actives[cnt2] = machservice_status(ms); + cnt2++; + } + } - launchd_assumes(info_resp.i == cnt); + launchd_assumes(cnt == cnt2); - *servicenamesp = info_resp.service_names; - *serviceactivesp = info_resp.service_actives; + *servicenamesp = service_names; + *serviceactivesp = service_actives; *servicenames_cnt = *serviceactives_cnt = cnt; return BOOTSTRAP_SUCCESS; out_bad: - if (info_resp.service_names) { - mig_deallocate((vm_address_t)info_resp.service_names, cnt * sizeof(info_resp.service_names[0])); + if (service_names) { + mig_deallocate((vm_address_t)service_names, cnt * sizeof(service_names[0])); } - if (info_resp.service_actives) { - mig_deallocate((vm_address_t)info_resp.service_actives, cnt * sizeof(info_resp.service_actives[0])); + if (service_actives) { + mig_deallocate((vm_address_t)service_actives, cnt * sizeof(service_actives[0])); } return BOOTSTRAP_NO_MEMORY; @@ -3944,47 +3980,61 @@ kern_return_t job_mig_transfer_subset(job_t j, mach_port_t *reqport, mach_port_t *rcvright, name_array_t *servicenamesp, unsigned int *servicenames_cnt, - mach_port_array_t *ports, unsigned int *ports_cnt) + mach_port_array_t *portsp, unsigned int *ports_cnt) { - struct x_bootstrap_info_copyservices_cb info_resp = { NULL, NULL, NULL, 0 }; - unsigned int cnt = 0; + name_array_t service_names = NULL; + mach_port_array_t ports = NULL; + unsigned int cnt = 0, cnt2 = 0; + struct machservice *ms; + jobmgr_t jm; - if (j->anonymous) { - j = j->parent; + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; } + jm = j->mgr; + if (getpid() != 1) { job_log(j, LOG_ERR, "Only the system launchd will transfer Mach sub-bootstraps."); return BOOTSTRAP_NOT_PRIVILEGED; - } else if (!job_parent(j)) { + } else if (jobmgr_parent(jm) == NULL) { job_log(j, LOG_ERR, "Root Mach bootstrap cannot be transferred."); return BOOTSTRAP_NOT_PRIVILEGED; + } else if (!j->anonymous) { + job_log(j, LOG_ERR, "Only the anonymous job can transfer Mach sub-bootstraps."); + return BOOTSTRAP_NOT_PRIVILEGED; } job_log(j, LOG_DEBUG, "Transferring sub-bootstrap to the per session launchd."); - job_foreach_service(j, job_mig_info_countservices, &cnt, true); + SLIST_FOREACH(ms, &j->machservices, sle) { + cnt++; + } - mig_allocate((vm_address_t *)&info_resp.service_names, cnt * sizeof(info_resp.service_names[0])); - if (!launchd_assumes(info_resp.service_names != NULL)) { + mig_allocate((vm_address_t *)&service_names, cnt * sizeof(service_names[0])); + if (!launchd_assumes(service_names != NULL)) { goto out_bad; } - mig_allocate((vm_address_t *)&info_resp.ports, cnt * sizeof(info_resp.ports[0])); - if (!launchd_assumes(info_resp.ports != NULL)) { + mig_allocate((vm_address_t *)&ports, cnt * sizeof(ports[0])); + if (!launchd_assumes(ports != NULL)) { goto out_bad; } - job_foreach_service(j, job_mig_info_copyservices, &info_resp, true); + SLIST_FOREACH(ms, &j->machservices, sle) { + strlcpy(service_names[cnt2], machservice_name(ms), sizeof(service_names[0])); + ports[cnt2] = machservice_port(ms); + cnt2++; + } - launchd_assumes(info_resp.i == cnt); + launchd_assumes(cnt == cnt2); - *servicenamesp = info_resp.service_names; - *ports = info_resp.ports; + *servicenamesp = service_names; + *portsp = ports; *servicenames_cnt = *ports_cnt = cnt; - *reqport = job_get_reqport(j); - *rcvright = job_get_bsport(j); + *reqport = jobmgr_get_reqport(jm); + *rcvright = jm->jm_port; launchd_assumes(runtime_remove_mport(*rcvright) == KERN_SUCCESS); @@ -3993,11 +4043,11 @@ return BOOTSTRAP_SUCCESS; out_bad: - if (info_resp.service_names) { - mig_deallocate((vm_address_t)info_resp.service_names, cnt * sizeof(info_resp.service_names[0])); + if (service_names) { + mig_deallocate((vm_address_t)service_names, cnt * sizeof(service_names[0])); } - if (info_resp.ports) { - mig_deallocate((vm_address_t)info_resp.ports, cnt * sizeof(info_resp.ports[0])); + if (ports) { + mig_deallocate((vm_address_t)ports, cnt * sizeof(ports[0])); } return BOOTSTRAP_NO_MEMORY; @@ -4007,9 +4057,15 @@ job_mig_subset(job_t j, mach_port_t requestorport, mach_port_t *subsetportp) { int bsdepth = 0; - job_t js = j; + jobmgr_t jmr; - while ((js = job_parent(js)) != NULL) { + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } + + jmr = j->mgr; + + while ((jmr = jobmgr_parent(jmr)) != NULL) { bsdepth++; } @@ -4019,14 +4075,14 @@ return BOOTSTRAP_NO_MEMORY; } - if ((js = job_new_bootstrap(j, requestorport, MACH_PORT_NULL)) == NULL) { + if ((jmr = jobmgr_new(j->mgr, requestorport, MACH_PORT_NULL)) == NULL) { if (requestorport == MACH_PORT_NULL) { return BOOTSTRAP_NOT_PRIVILEGED; } return BOOTSTRAP_NO_MEMORY; } - *subsetportp = job_get_bsport(js); + *subsetportp = jmr->jm_port; return BOOTSTRAP_SUCCESS; } @@ -4035,6 +4091,10 @@ { struct machservice *ms; + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } + if (job_prog(j)[0] == '\0') { job_log(j, LOG_ERR, "Mach service creation requires a target server: %s", servicename); return BOOTSTRAP_NOT_PRIVILEGED; @@ -4045,7 +4105,7 @@ return BOOTSTRAP_NOT_PRIVILEGED; } - ms = job_lookup_service(j, servicename, false); + ms = jobmgr_lookup_service(j->mgr, servicename, false); if (ms) { job_log(j, LOG_DEBUG, "Mach service creation attempt for failed. Already exists: %s", servicename); return BOOTSTRAP_NAME_IN_USE; @@ -4070,6 +4130,9 @@ kern_return_t job_mig_wait(job_t j, mach_port_t srp, integer_t *waitstatus) { + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } #if 0 struct ldcred ldc; runtime_get_caller_creds(&ldc); @@ -4080,8 +4143,8 @@ kern_return_t job_mig_uncork_fork(job_t j) { - if (!j) { - return BOOTSTRAP_NOT_PRIVILEGED; + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; } job_uncork_fork(j); @@ -4103,6 +4166,10 @@ const char *workingdir = NULL; size_t argv_i = 0, env_i = 0; + if (!launchd_assumes(j != NULL)) { + return BOOTSTRAP_NO_MEMORY; + } + #if 0 if (ldc.asid != inherited_asid) { job_log(j, LOG_ERR, "Security: PID %d (ASID %d) was denied a request to spawn a process in this session (ASID %d)", @@ -4141,7 +4208,7 @@ } } - jr = job_new_spawn(job_get_bs(j), label, path, workingdir, argv, env, flags & SPAWN_HAS_UMASK ? &mig_umask : NULL, + jr = job_new_spawn(j, label, path, workingdir, argv, env, flags & SPAWN_HAS_UMASK ? &mig_umask : NULL, flags & SPAWN_WANTS_WAIT4DEBUGGER, flags & SPAWN_WANTS_FORCE_PPC); if (jr == NULL) switch (errno) { @@ -4161,7 +4228,7 @@ flags & SPAWN_WANTS_WAIT4DEBUGGER ? " stopped": ""); *child_pid = job_get_pid(jr); - *obsvr_port = job_get_bsport(jr); + *obsvr_port = jr->j_port; return BOOTSTRAP_SUCCESS; } @@ -4208,15 +4275,22 @@ { mach_msg_type_number_t l2l_i; auditinfo_t inherited_audit; - job_t anon_job; + job_t ji, anon_job = NULL; getaudit(&inherited_audit); inherited_asid = inherited_audit.ai_asid; - launchd_assert((root_job = job_new_bootstrap(NULL, req_port ? req_port : mach_task_self(), checkin_port)) != NULL); + launchd_assert((root_jobmgr = jobmgr_new(NULL, req_port ? req_port : mach_task_self(), checkin_port)) != NULL); - launchd_assert((anon_job = job_find_anonymous(root_job)) != NULL); + SLIST_FOREACH(ji, &root_jobmgr->jobs, sle) { + if (ji->anonymous) { + anon_job = ji; + break; + } + } + launchd_assert(anon_job != NULL); + launchd_assert(launchd_get_bport(&inherited_bootstrap_port) == KERN_SUCCESS); if (getpid() != 1) { Modified: trunk/launchd/src/launchd_core_logic.h =================================================================== --- trunk/launchd/src/launchd_core_logic.h 2006-11-13 17:54:12 UTC (rev 22942) +++ trunk/launchd/src/launchd_core_logic.h 2006-11-13 20:53:23 UTC (rev 22943) @@ -24,28 +24,33 @@ #include "liblaunch_public.h" typedef struct job_s *job_t; +typedef struct jobmgr_s *jobmgr_t; -extern job_t root_job; -extern job_t gc_this_job; +extern jobmgr_t root_jobmgr; +extern jobmgr_t gc_this_jobmgr; extern size_t total_children; -job_t job_new(job_t p, const char *label, const char *prog, const char *const *argv, const char *stdinpath, mach_port_t); +void jobmgr_remove_all_inactive(jobmgr_t jm); +void jobmgr_dispatch_all_other_semaphores(jobmgr_t jm, job_t nj); +job_t jobmgr_find(jobmgr_t jm, const char *label); +void jobmgr_delete_anything_with_port(jobmgr_t jm, mach_port_t port); +bool jobmgr_ack_port_destruction(jobmgr_t jm, mach_port_t p); +void jobmgr_remove(jobmgr_t jm); +job_t jobmgr_find_by_service_port(jobmgr_t jm, mach_port_t p); + +launch_data_t job_export_all(void); + +job_t job_new(jobmgr_t jm, const char *label, const char *prog, const char *const *argv, const char *stdinpath); void job_dispatch(job_t j, bool kickstart); bool job_active(job_t j); -void job_remove_all_inactive(job_t j); -void job_dispatch_all_other_semaphores(job_t j, job_t nj); launch_data_t job_export(job_t j); -launch_data_t job_export_all(void); void job_stop(job_t j); void job_checkin(job_t j); void job_remove(job_t j); -job_t job_find(job_t j, const char *label); job_t job_import(launch_data_t pload); launch_data_t job_import_bulk(launch_data_t pload); job_t job_mig_intran(mach_port_t mp); void job_mig_destructor(job_t j); -bool job_ack_port_destruction(job_t j, mach_port_t p); void job_ack_no_senders(job_t j); -void job_delete_anything_with_port(job_t jbs, mach_port_t port); #endif Modified: trunk/launchd/src/launchd_runtime.c =================================================================== --- trunk/launchd/src/launchd_runtime.c 2006-11-13 17:54:12 UTC (rev 22942) +++ trunk/launchd/src/launchd_runtime.c 2006-11-13 20:53:23 UTC (rev 22943) @@ -160,7 +160,7 @@ continue; } if (status.mps_msgcount) { - EV_SET(&kev, members[i], EVFILT_MACHPORT, 0, 0, 0, job_mig_intran(members[i])); + EV_SET(&kev, members[i], EVFILT_MACHPORT, 0, 0, 0, jobmgr_find_by_service_port(root_jobmgr, members[i])); (*((kq_callback *)kev.udata))(kev.udata, &kev); /* the callback may have tainted our ability to continue this for loop */ break; @@ -407,7 +407,7 @@ { /* This message is sent to us when a receive right is returned to us. */ - if (!job_ack_port_destruction(root_job, rights)) { + if (!jobmgr_ack_port_destruction(root_jobmgr, rights)) { launchd_assumes(launchd_mport_close_recv(rights) == KERN_SUCCESS); } @@ -466,7 +466,7 @@ inherited_bootstrap_port = MACH_PORT_NULL; } - job_delete_anything_with_port(root_job, name); + jobmgr_delete_anything_with_port(root_jobmgr, name); /* A dead-name notification about a port appears to increment the * rights on said port. Let's deallocate it so that we don't leak @@ -568,9 +568,9 @@ bufReply = bufTemp; /* XXX - So very gross */ - if (gc_this_job) { - job_remove(gc_this_job); - gc_this_job = NULL; + if (gc_this_jobmgr) { + jobmgr_remove(gc_this_jobmgr); + gc_this_jobmgr = NULL; } if (!(tmp_options & MACH_RCV_MSG)) { Modified: trunk/launchd/src/launchd_unix_ipc.c =================================================================== --- trunk/launchd/src/launchd_unix_ipc.c 2006-11-13 17:54:12 UTC (rev 22942) +++ trunk/launchd/src/launchd_unix_ipc.c 2006-11-13 20:53:23 UTC (rev 22943) @@ -398,19 +398,19 @@ launch_data_set_bool(resp, batch_disabler_count == 0); } } else if (!strcmp(cmd, LAUNCH_KEY_STARTJOB)) { - if ((j = job_find(root_job, launch_data_get_string(data))) != NULL) { + if ((j = jobmgr_find(root_jobmgr, launch_data_get_string(data))) != NULL) { job_dispatch(j, true); errno = 0; } resp = launch_data_new_errno(errno); } else if (!strcmp(cmd, LAUNCH_KEY_STOPJOB)) { - if ((j = job_find(root_job, launch_data_get_string(data))) != NULL) { + if ((j = jobmgr_find(root_jobmgr, launch_data_get_string(data))) != NULL) { job_stop(j); errno = 0; } resp = launch_data_new_errno(errno); } else if (!strcmp(cmd, LAUNCH_KEY_REMOVEJOB)) { - if ((j = job_find(root_job, launch_data_get_string(data))) != NULL) { + if ((j = jobmgr_find(root_jobmgr, launch_data_get_string(data))) != NULL) { job_remove(j); errno = 0; } @@ -433,14 +433,14 @@ } else if (!strcmp(cmd, LAUNCH_KEY_SETRESOURCELIMITS)) { resp = adjust_rlimits(data); } else if (!strcmp(cmd, LAUNCH_KEY_GETJOB)) { - if ((j = job_find(root_job, launch_data_get_string(data))) == NULL) { + if ((j = jobmgr_find(root_jobmgr, launch_data_get_string(data))) == NULL) { resp = launch_data_new_errno(errno); } else { resp = job_export(j); ipc_revoke_fds(resp); } } else if (!strcmp(cmd, LAUNCH_KEY_GETJOBWITHHANDLES)) { - if ((j = job_find(root_job, launch_data_get_string(data))) == NULL) { + if ((j = jobmgr_find(root_jobmgr, launch_data_get_string(data))) == NULL) { resp = launch_data_new_errno(errno); } else { resp = job_export(j); Modified: trunk/launchd/src/liblaunch_public.h =================================================================== --- trunk/launchd/src/liblaunch_public.h 2006-11-13 17:54:12 UTC (rev 22942) +++ trunk/launchd/src/liblaunch_public.h 2006-11-13 20:53:23 UTC (rev 22943) @@ -93,7 +93,6 @@ #define LAUNCH_JOBKEY_BONJOURFDS "BonjourFDs" #define LAUNCH_JOBKEY_LASTEXITSTATUS "LastExitStatus" #define LAUNCH_JOBKEY_PID "PID" -#define LAUNCH_JOBKEY_SUBJOBS "SubJobs" #define LAUNCH_JOBKEY_THROTTLEINTERVAL "ThrottleInterval" #define LAUNCH_JOBKEY_LAUNCHONLYONCE "LaunchOnlyOnce" -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061113/e738f434/attachment.html From source_changes at macosforge.org Tue Nov 14 14:49:00 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22944] trunk/launchd/src Message-ID: <20061114224900.3DF362F0FB6@cvs.opensource.apple.com> Revision: 22944 http://trac.macosforge.org/projects/launchd/changeset/22944 Author: zarzycki@apple.com Date: 2006-11-14 14:48:59 -0800 (Tue, 14 Nov 2006) Log Message: ----------- rejigger GUI application into the GUI session, regardless of which session they really are spawned in Modified Paths: -------------- trunk/launchd/src/launchctl.c trunk/launchd/src/launchd.c trunk/launchd/src/launchd.h trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/liblaunch.c trunk/launchd/src/libvproc.c trunk/launchd/src/libvproc_internal.h trunk/launchd/src/protocol_job.defs trunk/launchd/src/protocol_job_reply.defs Modified: trunk/launchd/src/launchctl.c =================================================================== --- trunk/launchd/src/launchctl.c 2006-11-13 20:53:23 UTC (rev 22943) +++ trunk/launchd/src/launchctl.c 2006-11-14 22:48:59 UTC (rev 22944) @@ -63,6 +63,7 @@ #include #include "libbootstrap_public.h" +#include "libvproc_public.h" #include "libvproc_internal.h" #include "liblaunch_public.h" #include "liblaunch_private.h" @@ -534,6 +535,13 @@ goto out_bad; } + if (lus->session_type && !(tmpa = launch_data_dict_lookup(thejob, LAUNCH_JOBKEY_LIMITLOADTOSESSIONTYPE))) { + fprintf(stderr, "%s: Missing key \"%s\", defaulting value to \"Aqua\"\n", getprogname(), + LAUNCH_JOBKEY_LIMITLOADTOSESSIONTYPE); + tmpa = launch_data_new_string("Aqua"); + launch_data_dict_insert(thejob, tmpa, LAUNCH_JOBKEY_LIMITLOADTOSESSIONTYPE); + } + if ((tmpa = launch_data_dict_lookup(thejob, LAUNCH_JOBKEY_LIMITLOADTOSESSIONTYPE))) { const char *allowed_session; bool skipjob = true; Modified: trunk/launchd/src/launchd.c =================================================================== --- trunk/launchd/src/launchd.c 2006-11-13 20:53:23 UTC (rev 22943) +++ trunk/launchd/src/launchd.c 2006-11-14 22:48:59 UTC (rev 22944) @@ -65,6 +65,7 @@ #include #include "libbootstrap_public.h" +#include "libvproc_public.h" #include "libvproc_internal.h" #include "liblaunch_public.h" #include "liblaunch_private.h" @@ -122,9 +123,6 @@ }; struct sigaction fsa; bool sflag = false, dflag = false, Dflag = false; - mach_msg_type_number_t l2l_name_cnt = 0, l2l_port_cnt = 0; - name_array_t l2l_names = NULL; - mach_port_array_t l2l_ports = NULL; char ldconf[PATH_MAX] = PID1LAUNCHD_CONF; const char *h = getenv("HOME"); const char *session_type = NULL; @@ -133,7 +131,6 @@ struct stat sb; size_t i, checkin_fdcnt = 0; int *checkin_fds = NULL; - mach_port_t req_mport = MACH_PORT_NULL; mach_port_t checkin_mport = MACH_PORT_NULL; int ch, ker, logopts; @@ -247,30 +244,8 @@ /* sigh... ignoring SIGCHLD has side effects: we can't call wait*() */ launchd_assert(kevent_mod(SIGCHLD, EVFILT_SIGNAL, EV_ADD, 0, 0, &kqsignal_callback) != -1); - if (session_type && strcmp(session_type, "Aqua") == 0) { - mach_port_t newparent; + mach_init_init(checkin_mport); - launchd_assert(bootstrap_parent(bootstrap_port, &newparent) == BOOTSTRAP_SUCCESS); - - launchd_assert(_launchd_to_launchd(bootstrap_port, &req_mport, &checkin_mport, - &l2l_names, &l2l_name_cnt, &l2l_ports, &l2l_port_cnt) == BOOTSTRAP_SUCCESS); - - launchd_assert(l2l_name_cnt == l2l_port_cnt); - - task_set_bootstrap_port(mach_task_self(), newparent); - launchd_assumes(mach_port_deallocate(mach_task_self(), bootstrap_port) == KERN_SUCCESS); - bootstrap_port = newparent; - } - - mach_init_init(req_mport, checkin_mport, l2l_names, l2l_ports, l2l_name_cnt); - - if (l2l_names) { - mig_deallocate((vm_address_t)l2l_names, l2l_name_cnt * sizeof(l2l_names[0])); - } - if (l2l_ports) { - mig_deallocate((vm_address_t)l2l_ports, l2l_port_cnt * sizeof(l2l_ports[0])); - } - if (h) { snprintf(ldconf, sizeof(ldconf), "%s/%s", h, LAUNCHD_CONF); } Modified: trunk/launchd/src/launchd.h =================================================================== --- trunk/launchd/src/launchd.h 2006-11-13 20:53:23 UTC (rev 22943) +++ trunk/launchd/src/launchd.h 2006-11-14 22:48:59 UTC (rev 22944) @@ -59,7 +59,7 @@ void catatonia(void); void mach_start_shutdown(void); -void mach_init_init(mach_port_t, mach_port_t, name_array_t, mach_port_array_t, mach_msg_type_number_t); +void mach_init_init(mach_port_t); int _fd(int fd); Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2006-11-13 20:53:23 UTC (rev 22943) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-14 22:48:59 UTC (rev 22944) @@ -74,6 +74,7 @@ #include "liblaunch_public.h" #include "liblaunch_private.h" #include "libbootstrap_public.h" +#include "libvproc_public.h" #include "libvproc_internal.h" #include "launchd.h" @@ -288,6 +289,7 @@ static bool job_setup_machport(job_t j); 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_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, bool fppc); @@ -815,7 +817,7 @@ { job_t jr; - if ((jr = jobmgr_find(j->mgr, label)) != NULL) { + if ((jr = jobmgr_find(root_jobmgr, label)) != NULL) { errno = EEXIST; return NULL; } @@ -826,6 +828,8 @@ return NULL; } + job_reparent_to_aqua_hack(jr); + if (getpid() == 1) { struct ldcred ldc; @@ -1097,6 +1101,9 @@ } else if (strcasecmp(key, LAUNCH_JOBKEY_LIMITLOADFROMHOSTS) == 0) { return; } else if (strcasecmp(key, LAUNCH_JOBKEY_LIMITLOADTOSESSIONTYPE) == 0) { + if (strcmp(value, "Aqua") == 0) { + job_reparent_to_aqua_hack(j); + } return; } break; @@ -3705,8 +3712,8 @@ runtime_get_caller_creds(&ldc); - if (ldc.uid != 0) { - which_user = ldc.uid; + if (ldc.euid || ldc.uid) { + which_user = ldc.euid ? ldc.euid : ldc.uid; } if (which_user == 0) { @@ -3940,6 +3947,10 @@ } } + if (cnt == 0) { + goto out; + } + mig_allocate((vm_address_t *)&service_names, cnt * sizeof(service_names[0])); if (!launchd_assumes(service_names != NULL)) { goto out_bad; @@ -3960,6 +3971,7 @@ launchd_assumes(cnt == cnt2); +out: *servicenamesp = service_names; *serviceactivesp = service_actives; *servicenames_cnt = *serviceactives_cnt = cnt; @@ -3977,8 +3989,76 @@ return BOOTSTRAP_NO_MEMORY; } + +void +job_reparent_to_aqua_hack(job_t j) +{ + jobmgr_t jmi = NULL; + + SLIST_FOREACH(jmi, &root_jobmgr->submgrs, sle) { + if (strcmp(jmi->name, "Aqua") == 0) { + break; + } + } + + if (job_assumes(j, jmi != NULL)) { + SLIST_REMOVE(&j->mgr->jobs, j, job_s, sle); + SLIST_INSERT_HEAD(&jmi->jobs, j, sle); + j->mgr = jmi; + } +} + kern_return_t -job_mig_transfer_subset(job_t j, mach_port_t *reqport, mach_port_t *rcvright, +job_mig_move_subset_to_user(job_t j, mach_port_t target_subset) +{ + mach_msg_type_number_t l2l_i, l2l_name_cnt = 0, l2l_port_cnt = 0; + name_array_t l2l_names = NULL; + mach_port_array_t l2l_ports = NULL; + mach_port_t reqport, rcvright; + kern_return_t kr; + jobmgr_t jmr; + + kr = _vproc_grab_subset(target_subset, &reqport, + &rcvright, &l2l_names, &l2l_name_cnt, &l2l_ports, &l2l_port_cnt); + + if (job_assumes(j, kr == 0)) { + job_assumes(j, launchd_mport_deallocate(target_subset) == KERN_SUCCESS); + } else { + goto out; + } + + launchd_assert(l2l_name_cnt == l2l_port_cnt); + + if ((jmr = jobmgr_new(j->mgr, reqport, rcvright)) == NULL) { + kr = BOOTSTRAP_NO_MEMORY; + goto out; + } + + strcpy(jmr->name, "Aqua"); + + for (l2l_i = 0; l2l_i < l2l_name_cnt; l2l_i++) { + struct machservice *ms; + + if ((ms = machservice_new(jmr->anonj, l2l_names[l2l_i], &l2l_ports[l2l_i]))) { + machservice_watch(ms); + } + } + + kr = 0; + +out: + if (l2l_names) { + mig_deallocate((vm_address_t)l2l_names, l2l_name_cnt * sizeof(l2l_names[0])); + } + if (l2l_ports) { + mig_deallocate((vm_address_t)l2l_ports, l2l_port_cnt * sizeof(l2l_ports[0])); + } + + return kr; +} + +kern_return_t +job_mig_take_subset(job_t j, mach_port_t *reqport, mach_port_t *rcvright, name_array_t *servicenamesp, unsigned int *servicenames_cnt, mach_port_array_t *portsp, unsigned int *ports_cnt) { @@ -4165,18 +4245,18 @@ const char *path = NULL; const char *workingdir = NULL; size_t argv_i = 0, env_i = 0; + struct ldcred ldc; + runtime_get_caller_creds(&ldc); + if (!launchd_assumes(j != NULL)) { return BOOTSTRAP_NO_MEMORY; } -#if 0 - if (ldc.asid != inherited_asid) { - job_log(j, LOG_ERR, "Security: PID %d (ASID %d) was denied a request to spawn a process in this session (ASID %d)", - ldc.pid, ldc.asid, inherited_asid); - return BOOTSTRAP_NOT_PRIVILEGED; + if (getpid() == 1 && ldc.euid && ldc.uid) { + job_log(j, LOG_DEBUG, "Punting spawn to per-user-context"); + return VPROC_ERR_TRY_PER_USER; } -#endif argv = alloca((argc + 1) * sizeof(char *)); memset(argv, 0, (argc + 1) * sizeof(char *)); @@ -4270,17 +4350,15 @@ } void -mach_init_init(mach_port_t req_port, mach_port_t checkin_port, - name_array_t l2l_names, mach_port_array_t l2l_ports, mach_msg_type_number_t l2l_cnt) +mach_init_init(mach_port_t checkin_port) { - mach_msg_type_number_t l2l_i; auditinfo_t inherited_audit; job_t ji, anon_job = NULL; getaudit(&inherited_audit); inherited_asid = inherited_audit.ai_asid; - launchd_assert((root_jobmgr = jobmgr_new(NULL, req_port ? req_port : mach_task_self(), checkin_port)) != NULL); + launchd_assert((root_jobmgr = jobmgr_new(NULL, mach_task_self(), checkin_port)) != NULL); SLIST_FOREACH(ji, &root_jobmgr->jobs, sle) { if (ji->anonymous) { @@ -4302,16 +4380,4 @@ /* cut off the Libc cache, we don't want to deadlock against ourself */ bootstrap_port = MACH_PORT_NULL; - - if (l2l_names == NULL) { - return; - } - - for (l2l_i = 0; l2l_i < l2l_cnt; l2l_i++) { - struct machservice *ms; - - if ((ms = machservice_new(anon_job, l2l_names[l2l_i], &l2l_ports[l2l_i]))) { - machservice_watch(ms); - } - } } Modified: trunk/launchd/src/liblaunch.c =================================================================== --- trunk/launchd/src/liblaunch.c 2006-11-13 20:53:23 UTC (rev 22943) +++ trunk/launchd/src/liblaunch.c 2006-11-14 22:48:59 UTC (rev 22944) @@ -39,6 +39,7 @@ #include #include "libbootstrap_public.h" +#include "libvproc_public.h" #include "libvproc_internal.h" /* __OSBogusByteSwap__() must not really exist in the symbol namespace @@ -1188,31 +1189,25 @@ pid_t create_and_switch_to_per_session_launchd(const char *login, int flags, ...) { - static char *const ldargv[] = { "/sbin/launchd", "-S", "Aqua", NULL }; char *largv[] = { "/bin/launchctl", "load", "-S", "Aqua", "-D", "all", "/etc/mach_init_per_user.d", NULL }; mach_port_t bezel_ui_server; struct passwd *pwe; struct stat sb; int wstatus; - name_t sp; - pid_t p, ldp; + pid_t p; uid_t u; gid_t g; + if (_vproc_move_subset_to_user()) { + return -1; + } + if ((pwe = getpwnam(login)) == NULL) return -1; u = pwe->pw_uid; g = pwe->pw_gid; - if ((ldp = fexecv_as_user(login, u, g, ldargv)) == -1) { - return -1; - } - - while (_vprocmgr_getsocket(sp) != BOOTSTRAP_SUCCESS) { - usleep(20000); - } - if (flags & LOAD_ONLY_SAFEMODE_LAUNCHAGENTS) { largv[5] = "system"; } @@ -1245,5 +1240,5 @@ } } - return ldp; + return 1; } Modified: trunk/launchd/src/libvproc.c =================================================================== --- trunk/launchd/src/libvproc.c 2006-11-13 20:53:23 UTC (rev 22943) +++ trunk/launchd/src/libvproc.c 2006-11-14 22:48:59 UTC (rev 22944) @@ -36,13 +36,28 @@ #include "protocol_vproc.h" kern_return_t -_launchd_to_launchd(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright, +_vproc_grab_subset(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright, name_array_t *service_names, mach_msg_type_number_t *service_namesCnt, mach_port_array_t *ports, mach_msg_type_number_t *portCnt) { - return vproc_mig_transfer_subset(bp, reqport, rcvright, service_names, service_namesCnt, ports, portCnt); + return vproc_mig_take_subset(bp, reqport, rcvright, service_names, service_namesCnt, ports, portCnt); } +vproc_err_t +_vproc_move_subset_to_user(void) +{ + kern_return_t kr = 1; + mach_port_t puc; + + if (vproc_mig_lookup_per_user_context(bootstrap_port, 0, &puc) == 0) { + kr = vproc_mig_move_subset_to_user(puc, bootstrap_port); + mach_port_deallocate(mach_task_self(), puc); + } + + return kr == 0 ? NULL : (vproc_err_t)_vproc_move_subset_to_user; +} + + pid_t _spawn_via_launchd(const char *label, const char *const *argv, const struct spawn_via_launchd_attr *spawn_attrs, int struct_version) { @@ -112,6 +127,15 @@ kr = vproc_mig_spawn(bootstrap_port, buf, buf_len, argc, envc, flags, u_mask, &p, &obsvr_port); + if (kr == VPROC_ERR_TRY_PER_USER) { + mach_port_t puc; + + if (vproc_mig_lookup_per_user_context(bootstrap_port, 0, &puc) == 0) { + kr = vproc_mig_spawn(puc, buf, buf_len, argc, envc, flags, u_mask, &p, &obsvr_port); + mach_port_deallocate(mach_task_self(), puc); + } + } + free(buf); if (kr == BOOTSTRAP_SUCCESS) { Modified: trunk/launchd/src/libvproc_internal.h =================================================================== --- trunk/launchd/src/libvproc_internal.h 2006-11-13 20:53:23 UTC (rev 22943) +++ trunk/launchd/src/libvproc_internal.h 2006-11-14 22:48:59 UTC (rev 22944) @@ -48,12 +48,14 @@ #define SPAWN_WANTS_FORCE_PPC 0x0010 kern_return_t -_launchd_to_launchd(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright, +_vproc_grab_subset(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright, name_array_t *service_names, mach_msg_type_number_t *service_namesCnt, mach_port_array_t *ports, mach_msg_type_number_t *portCnt); kern_return_t _vprocmgr_getsocket(name_t); +vproc_err_t _vproc_move_subset_to_user(void); + void _vproc_logv(int pri, int err, const char *msg, va_list ap); kern_return_t Modified: trunk/launchd/src/protocol_job.defs =================================================================== --- trunk/launchd/src/protocol_job.defs 2006-11-13 20:53:23 UTC (rev 22943) +++ trunk/launchd/src/protocol_job.defs 2006-11-14 22:48:59 UTC (rev 22944) @@ -81,7 +81,7 @@ __service_name : name_t; out __service_port : mach_port_t); -routine transfer_subset( +routine take_subset( __bs_port : job_t; out __bs_reqport : mach_port_t; out __bs_rcvright : mach_port_move_receive_t; @@ -130,3 +130,7 @@ __bs_port : job_t; __wu : uid_t; out __u_cont : mach_port_t); + +routine move_subset_to_user( + __bs_port : job_t; + __target_port : mach_port_t); Modified: trunk/launchd/src/protocol_job_reply.defs =================================================================== --- trunk/launchd/src/protocol_job_reply.defs 2006-11-13 20:53:23 UTC (rev 22943) +++ trunk/launchd/src/protocol_job_reply.defs 2006-11-14 22:48:59 UTC (rev 22944) @@ -24,6 +24,7 @@ #include #include "launchd_mig_types.defs" import "libbootstrap_public.h"; +import "libvproc_public.h"; import "libvproc_internal.h"; skip; /* create_server */ -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061114/ae1cdb05/attachment.html From source_changes at macosforge.org Wed Nov 15 10:52:36 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22945] trunk/launchd/src/launchd_core_logic.c Message-ID: <20061115185236.0A8CD2F70E0@cvs.opensource.apple.com> Revision: 22945 http://trac.macosforge.org/projects/launchd/changeset/22945 Author: zarzycki@apple.com Date: 2006-11-15 10:52:35 -0800 (Wed, 15 Nov 2006) Log Message: ----------- coreservicesd does not quit on SIGTERM 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-14 22:48:59 UTC (rev 22944) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-15 18:52:35 UTC (rev 22945) @@ -532,9 +532,7 @@ if (debug_shutdown_hangs) { job_assumes(ji, kevent_mod((uintptr_t)ji, EVFILT_TIMER, EV_ADD|EV_ONESHOT, NOTE_SECONDS, 8, ji) != -1); } - if (getpid() != 1) { - job_stop(ji); - } + job_stop(ji); } } } -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061115/f523286d/attachment.html From source_changes at macosforge.org Wed Nov 15 11:02:55 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22946] trunk/launchd/src/launchd_core_logic.c Message-ID: <20061115190255.22C6C2F7187@cvs.opensource.apple.com> Revision: 22946 http://trac.macosforge.org/projects/launchd/changeset/22946 Author: zarzycki@apple.com Date: 2006-11-15 11:02:54 -0800 (Wed, 15 Nov 2006) Log Message: ----------- Missing { } 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-15 18:52:35 UTC (rev 22945) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-15 19:02:54 UTC (rev 22946) @@ -2059,8 +2059,9 @@ jobmgr_setup_env_from_other_jobs(j->mgr); - SLIST_FOREACH(ei, &j->env, sle) + SLIST_FOREACH(ei, &j->env, sle) { setenv(ei->key, ei->value, 1); + } setsid(); } -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061115/29cc9410/attachment.html From source_changes at macosforge.org Wed Nov 15 12:15:19 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:35 2007 Subject: [launchd-changes] [22947] trunk/launchd/src/launchd_core_logic.c Message-ID: <20061115201519.633172F7460@cvs.opensource.apple.com> Revision: 22947 http://trac.macosforge.org/projects/launchd/changeset/22947 Author: zarzycki@apple.com Date: 2006-11-15 12:15:19 -0800 (Wed, 15 Nov 2006) Log Message: ----------- Fix some code duplication. 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-15 19:02:54 UTC (rev 22946) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-15 20:15:19 UTC (rev 22947) @@ -254,6 +254,7 @@ int execfd; int nice; int timeout; + int stdout_err_fd; time_t start_time; time_t min_run_time; unsigned int start_interval; @@ -287,6 +288,7 @@ static void job_start_child(job_t j, int execfd) __attribute__((noreturn)); static void job_setup_attributes(job_t j); static bool job_setup_machport(job_t j); +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); @@ -2029,33 +2031,9 @@ umask(j->mask); } - if (j->stdinpath) { - int sifd = open(j->stdinpath, O_RDONLY|O_NOCTTY); - if (sifd == -1) { - job_log_error(j, LOG_WARNING, "open(\"%s\", ...)", j->stdinpath); - } else { - job_assumes(j, dup2(sifd, STDIN_FILENO) != -1); - job_assumes(j, close(sifd) == 0); - } - } - if (j->stdoutpath) { - int sofd = open(j->stdoutpath, O_WRONLY|O_APPEND|O_CREAT|O_NOCTTY, DEFFILEMODE); - if (sofd == -1) { - job_log_error(j, LOG_WARNING, "open(\"%s\", ...)", j->stdoutpath); - } else { - job_assumes(j, dup2(sofd, STDOUT_FILENO) != -1); - job_assumes(j, close(sofd) == 0); - } - } - if (j->stderrpath) { - int sefd = open(j->stderrpath, O_WRONLY|O_APPEND|O_CREAT|O_NOCTTY, DEFFILEMODE); - if (sefd == -1) { - job_log_error(j, LOG_WARNING, "open(\"%s\", ...)", j->stderrpath); - } else { - job_assumes(j, dup2(sefd, STDERR_FILENO) != -1); - job_assumes(j, close(sefd) == 0); - } - } + 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); jobmgr_setup_env_from_other_jobs(j->mgr); @@ -2066,6 +2044,55 @@ setsid(); } +void +job_setup_fd(job_t j, int target_fd, const char *path, int flags) +{ + char newpath[PATH_MAX]; + int fd; + + if (!path) { +#if 0 + switch (target_fd) { + case STDOUT_FILENO: + case STDERR_FILENO: + flags |= O_TRUNC; + break; + default: + return; + } + + if (getuid() == 0) { + snprintf(newpath, sizeof(newpath), "/var/log/launchd"); + } else { + struct passwd *pwe; + + if (!job_assumes(j, (pwe = getpwuid(getuid())) != NULL)) { + return; + } + + snprintf(newpath, sizeof(newpath), "%s/Library/Logs/launchd", pwe->pw_dir); + } + + mkdir(newpath, ACCESSPERMS); + + strcat(newpath, "/"); + strcat(newpath, j->label); + + path = newpath; +#else + return; +#endif + } + + if ((fd = open(path, flags|O_NOCTTY, DEFFILEMODE)) == -1) { + job_log_error(j, LOG_WARNING, "open(\"%s\", ...)", path); + return; + } + + job_assumes(j, dup2(fd, target_fd) != -1); + job_assumes(j, close(fd) == 0); +} + int dir_has_files(job_t j, const char *path) { -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061115/1bfaf66c/attachment.html From source_changes at macosforge.org Wed Nov 15 15:45:42 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:36 2007 Subject: [launchd-changes] [22948] trunk/launchd/src/launchd_core_logic.c Message-ID: <20061115234542.8FBFD2F814D@cvs.opensource.apple.com> Revision: 22948 http://trac.macosforge.org/projects/launchd/changeset/22948 Author: zarzycki@apple.com Date: 2006-11-15 15:45:41 -0800 (Wed, 15 Nov 2006) Log Message: ----------- Quite a warning. Yay for -Werror. 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-15 20:15:19 UTC (rev 22947) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-15 23:45:41 UTC (rev 22948) @@ -2047,7 +2047,9 @@ void job_setup_fd(job_t j, int target_fd, const char *path, int flags) { +#if 0 char newpath[PATH_MAX]; +#endif int fd; if (!path) { -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061115/eab2a1a8/attachment.html From source_changes at macosforge.org Wed Nov 15 15:48:20 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:36 2007 Subject: [launchd-changes] [22949] tags/launchd-174/ Message-ID: <20061115234820.16B772F815E@cvs.opensource.apple.com> Revision: 22949 http://trac.macosforge.org/projects/launchd/changeset/22949 Author: zarzycki@apple.com Date: 2006-11-15 15:48:19 -0800 (Wed, 15 Nov 2006) Log Message: ----------- "Tagging launchd-174 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-174/ Copied: tags/launchd-174 (from rev 22948, trunk) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061115/0ffcd05c/attachment.html From source_changes at macosforge.org Thu Nov 16 10:25:06 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:36 2007 Subject: [launchd-changes] [22950] trunk/launchd/src/launchctl.c Message-ID: <20061116182506.B61D12FCCC9@cvs.opensource.apple.com> Revision: 22950 http://trac.macosforge.org/projects/launchd/changeset/22950 Author: zarzycki@apple.com Date: 2006-11-16 10:25:06 -0800 (Thu, 16 Nov 2006) Log Message: ----------- launchd should exec /etc/rc.server during boot Modified Paths: -------------- trunk/launchd/src/launchctl.c Modified: trunk/launchd/src/launchctl.c =================================================================== --- trunk/launchd/src/launchctl.c 2006-11-15 23:48:19 UTC (rev 22949) +++ trunk/launchd/src/launchctl.c 2006-11-16 18:25:06 UTC (rev 22950) @@ -1196,7 +1196,11 @@ loopback_setup_ipv4(); loopback_setup_ipv6(); - apply_sysctls_from_file("/etc/sysctl-macosxserver.conf"); + if (path_check("/etc/rc.server")) { + const char *rcserver_tool[] = { _PATH_BSHELL, "/etc/rc.server", NULL }; + assumes(fwexec(rcserver_tool, true) != -1); + } + apply_sysctls_from_file("/etc/sysctl.conf"); if (path_check("/etc/rc.cdrom")) { -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061116/76ed9484/attachment.html From source_changes at macosforge.org Thu Nov 16 10:25:48 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:36 2007 Subject: [launchd-changes] [22951] trunk/launchd/src/libvproc.c Message-ID: <20061116182548.DC96A2FCCD5@cvs.opensource.apple.com> Revision: 22951 http://trac.macosforge.org/projects/launchd/changeset/22951 Author: zarzycki@apple.com Date: 2006-11-16 10:25:48 -0800 (Thu, 16 Nov 2006) Log Message: ----------- Let's be a little more paranoid about errno. Modified Paths: -------------- trunk/launchd/src/libvproc.c Modified: trunk/launchd/src/libvproc.c =================================================================== --- trunk/launchd/src/libvproc.c 2006-11-16 18:25:06 UTC (rev 22950) +++ trunk/launchd/src/libvproc.c 2006-11-16 18:25:48 UTC (rev 22951) @@ -235,9 +235,10 @@ void _vproc_log_error(int pri, const char *msg, ...) { + int saved_errno = errno; va_list ap; va_start(ap, msg); - _vproc_logv(pri, errno, msg, ap); + _vproc_logv(pri, saved_errno, msg, ap); va_end(ap); } -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061116/18198752/attachment.html From source_changes at macosforge.org Thu Nov 16 10:42:12 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:36 2007 Subject: [launchd-changes] [22952] tags/launchd-175/ Message-ID: <20061116184212.233E72FCD15@cvs.opensource.apple.com> Revision: 22952 http://trac.macosforge.org/projects/launchd/changeset/22952 Author: zarzycki@apple.com Date: 2006-11-16 10:42:11 -0800 (Thu, 16 Nov 2006) Log Message: ----------- "Tagging launchd-175 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-175/ Copied: tags/launchd-175 (from rev 22951, trunk) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061116/5322590b/attachment.html From source_changes at macosforge.org Thu Nov 16 11:17:39 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:36 2007 Subject: [launchd-changes] [22953] trunk/launchd/src/init.c Message-ID: <20061116191739.EFE8E2FCE6A@cvs.opensource.apple.com> Revision: 22953 http://trac.macosforge.org/projects/launchd/changeset/22953 Author: zarzycki@apple.com Date: 2006-11-16 11:17:39 -0800 (Thu, 16 Nov 2006) Log Message: ----------- Dead code deletion. Modified Paths: -------------- trunk/launchd/src/init.c Modified: trunk/launchd/src/init.c =================================================================== --- trunk/launchd/src/init.c 2006-11-16 18:42:11 UTC (rev 22952) +++ trunk/launchd/src/init.c 2006-11-16 19:17:39 UTC (rev 22953) @@ -110,8 +110,6 @@ static void single_user(void); static void runcom(void); -static bool runcom_safe = false; -static bool runcom_netboot = false; static bool single_user_mode = false; static bool run_runcom = true; static pid_t single_user_pid = 0; @@ -176,25 +174,10 @@ void init_boot(bool sflag) { - int nbmib[2] = { CTL_KERN, KERN_NETBOOT }; - int sbmib[2] = { CTL_KERN, KERN_SAFEBOOT }; - uint32_t v = 0; - size_t vsz = sizeof(v); - if (sflag) { single_user_mode = true; run_runcom = false; } - - if (launchd_assumes(sysctl(nbmib, 2, &v, &vsz, NULL, 0) != -1)) { - if (v != 0) - runcom_netboot = true; - } - if (launchd_assumes(sysctl(sbmib, 2, &v, &vsz, NULL, 0) != -1)) { - if (v != 0) - runcom_safe = true; - } - } void @@ -308,10 +291,6 @@ setctty(_PATH_CONSOLE, O_POPUP); setenv("TERM", "vt100", 1); - setenv("SafeBoot", runcom_safe ? "-x" : "", 1); - setenv("VerboseFlag", "-v", 1); /* single user mode implies verbose mode */ - setenv("FsckSlash", runcom_fsck ? "-F" : "", 1); - setenv("NetBoot", runcom_netboot ? "-N" : "", 1); if (runcom_fsck) { fprintf(stdout, "Singleuser boot -- fsck not done\n"); @@ -365,7 +344,6 @@ static void runcom(void) { - bool runcom_fsck = should_fsck(); char *argv[] = { "/bin/launchctl", "bootstrap", NULL }; struct termios term; int vdisable; @@ -406,10 +384,6 @@ syslog(LOG_WARNING, "tcsetattr(\"%s\") %m", _PATH_CONSOLE); } - setenv("SafeBoot", runcom_safe ? "-x" : "", 1); - setenv("FsckSlash", runcom_fsck ? "-F" : "", 1); - setenv("NetBoot", runcom_netboot ? "-N" : "", 1); - execv(argv[0], argv); stall("can't exec %s for %s: %m", _PATH_BSHELL, _PATH_RUNCOM); exit(EXIT_FAILURE); -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061116/77197ac6/attachment.html From source_changes at macosforge.org Thu Nov 16 13:33:30 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:36 2007 Subject: [launchd-changes] [22954] trunk/launchd/src Message-ID: <20061116213330.A2E832FDAD3@cvs.opensource.apple.com> Revision: 22954 http://trac.macosforge.org/projects/launchd/changeset/22954 Author: zarzycki@apple.com Date: 2006-11-16 13:33:30 -0800 (Thu, 16 Nov 2006) Log Message: ----------- Defer socket creation until requested. Modified Paths: -------------- trunk/launchd/src/launchd.c trunk/launchd/src/launchd_core_logic.c Modified: trunk/launchd/src/launchd.c =================================================================== --- trunk/launchd/src/launchd.c 2006-11-16 19:17:39 UTC (rev 22953) +++ trunk/launchd/src/launchd.c 2006-11-16 21:33:30 UTC (rev 22954) @@ -485,8 +485,6 @@ pending_stderr = NULL; } } - - ipc_server_init(NULL, 0); } void Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2006-11-16 19:17:39 UTC (rev 22953) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-16 21:33:30 UTC (rev 22954) @@ -3701,10 +3701,10 @@ return BOOTSTRAP_NO_MEMORY; } + ipc_server_init(NULL, 0); + if (!sockpath) { return BOOTSTRAP_NO_MEMORY; - } else if (getpid() == 1) { - return BOOTSTRAP_NOT_PRIVILEGED; } strncpy(spr, sockpath, sizeof(name_t)); -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061116/decf71b6/attachment.html From source_changes at macosforge.org Thu Nov 16 14:14:13 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:36 2007 Subject: [launchd-changes] [22955] trunk/launchd/src/launchd_core_logic.c Message-ID: <20061116221413.036062FE022@cvs.opensource.apple.com> Revision: 22955 http://trac.macosforge.org/projects/launchd/changeset/22955 Author: zarzycki@apple.com Date: 2006-11-16 14:14:13 -0800 (Thu, 16 Nov 2006) Log Message: ----------- No need to deallocate the send right. We always "make-send" in flight via MIG. 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-16 21:33:30 UTC (rev 22954) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-16 22:14:13 UTC (rev 22955) @@ -604,7 +604,6 @@ } if (j->j_port) { - job_assumes(j, launchd_mport_deallocate(j->j_port) == KERN_SUCCESS); job_assumes(j, launchd_mport_close_recv(j->j_port) == KERN_SUCCESS); } -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061116/fe36398e/attachment.html From source_changes at macosforge.org Thu Nov 16 14:49:30 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:36 2007 Subject: [launchd-changes] [22956] trunk/launchd/src Message-ID: <20061116224930.740562FE57D@cvs.opensource.apple.com> Revision: 22956 http://trac.macosforge.org/projects/launchd/changeset/22956 Author: zarzycki@apple.com Date: 2006-11-16 14:49:29 -0800 (Thu, 16 Nov 2006) Log Message: ----------- More dead code deletion and a few slight refinement to bootstrap logic. Modified Paths: -------------- trunk/launchd/src/launchd.c trunk/launchd/src/launchd.h trunk/launchd/src/launchd_core_logic.c Modified: trunk/launchd/src/launchd.c =================================================================== --- trunk/launchd/src/launchd.c 2006-11-16 22:14:13 UTC (rev 22955) +++ trunk/launchd/src/launchd.c 2006-11-16 22:49:29 UTC (rev 22956) @@ -76,7 +76,6 @@ #define PID1LAUNCHD_CONF "/etc/launchd.conf" #define LAUNCHD_CONF ".launchd.conf" -#define LAUNCHCTL_PATH "/bin/launchctl" #define SECURITY_LIB "/System/Library/Frameworks/Security.framework/Versions/A/Security" extern char **environ; @@ -106,6 +105,7 @@ static job_t rlcj = NULL; static jmp_buf doom_doom_doom; static void *crash_addr; +static const char *launchctl_bootstrap_tool[] = { "/bin/launchctl", "bootstrap", NULL }; sigset_t blocked_signals = 0; bool shutdown_in_progress = false; @@ -250,7 +250,7 @@ snprintf(ldconf, sizeof(ldconf), "%s/%s", h, LAUNCHD_CONF); } - rlcj = job_new(root_jobmgr, READCONF_LABEL, LAUNCHCTL_PATH, NULL, ldconf); + rlcj = job_new(root_jobmgr, READCONF_LABEL, NULL, launchctl_bootstrap_tool, ldconf); launchd_assert(rlcj != NULL); if (argv[0]) { @@ -656,31 +656,6 @@ syslog(LOG_NOTICE, "Bug: %s:%u (%s):%u: %s", file, line, buf, saved_errno, test); } -bool -progeny_check(pid_t p) -{ - pid_t selfpid = getpid(); - - while (p != selfpid && p != 1) { - int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, p }; - size_t miblen = sizeof(mib) / sizeof(mib[0]); - struct kinfo_proc kp; - size_t kplen = sizeof(kp); - - if (launchd_assumes(sysctl(mib, miblen, &kp, &kplen, NULL, 0) != -1) && launchd_assumes(kplen == sizeof(kp))) { - p = kp.kp_eproc.e_ppid; - } else { - return false; - } - } - - if (p == selfpid) { - return true; - } - - return false; -} - void launchd_post_kevent(void) { Modified: trunk/launchd/src/launchd.h =================================================================== --- trunk/launchd/src/launchd.h 2006-11-16 22:14:13 UTC (rev 22955) +++ trunk/launchd/src/launchd.h 2006-11-16 22:49:29 UTC (rev 22956) @@ -63,6 +63,4 @@ int _fd(int fd); -bool progeny_check(pid_t p); - #endif Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2006-11-16 22:14:13 UTC (rev 22955) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-16 22:49:29 UTC (rev 22956) @@ -87,12 +87,8 @@ #define LAUNCHD_MIN_JOB_RUN_TIME 10 #define LAUNCHD_ADVISABLE_IDLE_TIMEOUT 30 -static au_asid_t inherited_asid; mach_port_t inherited_bootstrap_port; -static bool trusted_client_check(job_t j, struct ldcred *ldc); - - struct machservice { SLIST_ENTRY(machservice) sle; job_t job; @@ -3624,21 +3620,19 @@ #define LET_MERE_MORTALS_ADD_SERVERS_TO_PID1 /* XXX - This code should go away once the per session launchd is integrated with the rest of the system */ - #ifdef LET_MERE_MORTALS_ADD_SERVERS_TO_PID1 +#ifdef LET_MERE_MORTALS_ADD_SERVERS_TO_PID1 if (getpid() == 1) { - if (ldc.euid != 0 && ldc.euid != server_uid) { + if (ldc.euid && server_uid && (ldc.euid != server_uid)) { job_log(j, LOG_WARNING, "Server create: \"%s\": Will run as UID %d, not UID %d as they told us to", server_cmd, ldc.euid, server_uid); server_uid = ldc.euid; } } else #endif - if (!trusted_client_check(j, &ldc)) { - return BOOTSTRAP_NOT_PRIVILEGED; - } else if (server_uid != getuid()) { + if ((getuid() != 0) && server_uid) { job_log(j, LOG_WARNING, "Server create: \"%s\": As UID %d, we will not be able to switch to UID %d", server_cmd, getuid(), server_uid); - server_uid = getuid(); + server_uid = 0; /* zero means "do nothing" */ } js = job_new_via_mach_init(j, server_cmd, server_uid, on_demand); @@ -4340,51 +4334,11 @@ return BOOTSTRAP_SUCCESS; } -bool -trusted_client_check(job_t j, struct ldcred *ldc) -{ - static pid_t last_warned_pid = 0; - - /* - * In the long run, we wish to enforce the progeny rule, but for now, - * we'll let root and the user be forgiven. Once we get CoreProcesses - * to switch to using launchd rather than the WindowServer for indirect - * process invocation, we can then seriously look at cranking up the - * warning level here. - */ - - if (inherited_asid == ldc->asid) { - return true; - } - if (progeny_check(ldc->pid)) { - return true; - } - if (ldc->euid == geteuid()) { - return true; - } - if (ldc->euid == 0 && ldc->uid == 0) { - return true; - } - if (last_warned_pid == ldc->pid) { - return false; - } - - job_log(j, LOG_NOTICE, "Security: PID %d (ASID %d) was leaked into this session (ASID %d). This will be denied in the future.", ldc->pid, ldc->asid, inherited_asid); - - last_warned_pid = ldc->pid; - - return false; -} - void mach_init_init(mach_port_t checkin_port) { - auditinfo_t inherited_audit; job_t ji, anon_job = NULL; - getaudit(&inherited_audit); - inherited_asid = inherited_audit.ai_asid; - launchd_assert((root_jobmgr = jobmgr_new(NULL, mach_task_self(), checkin_port)) != NULL); SLIST_FOREACH(ji, &root_jobmgr->jobs, sle) { -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061116/e4b0f86f/attachment.html From source_changes at macosforge.org Fri Nov 17 15:08:15 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:36 2007 Subject: [launchd-changes] [22957] trunk/launchd/src Message-ID: <20061117230815.D9F053046A8@cvs.opensource.apple.com> Revision: 22957 http://trac.macosforge.org/projects/launchd/changeset/22957 Author: zarzycki@apple.com Date: 2006-11-17 15:08:14 -0800 (Fri, 17 Nov 2006) Log Message: ----------- BootRoot: launchd needs to call kextd early if is_bootrooted() Modified Paths: -------------- trunk/launchd/src/launchctl.c trunk/launchd/src/launchd_core_logic.c Modified: trunk/launchd/src/launchctl.c =================================================================== --- trunk/launchd/src/launchctl.c 2006-11-16 22:49:29 UTC (rev 22956) +++ trunk/launchd/src/launchctl.c 2006-11-17 23:08:14 UTC (rev 22957) @@ -64,6 +64,7 @@ #include "libbootstrap_public.h" #include "libvproc_public.h" +#include "libvproc_private.h" #include "libvproc_internal.h" #include "liblaunch_public.h" #include "liblaunch_private.h" @@ -1218,8 +1219,6 @@ do_potential_fsck(); } - do_bootroot_magic(); - if (path_check("/var/account/acct")) { assumes(acct("/var/account/acct") != -1); } @@ -1256,6 +1255,8 @@ preheat_page_cache_hack(); + _vproc_set_global_on_demand(true); + char *load_launchd_items[] = { "load", "-D", "all", "/etc/mach_init.d", NULL }; if (is_safeboot()) load_launchd_items[2] = "system"; @@ -1264,6 +1265,10 @@ const char *bcc_tag_tool[] = { "BootCacheControl", "tag", NULL }; assumes(fwexec(bcc_tag_tool, true) != -1); + do_bootroot_magic(); + + _vproc_set_global_on_demand(false); + const char *SystemStarter_tool[] = { "SystemStarter", NULL }; assumes(fwexec(SystemStarter_tool, false) != -1); Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2006-11-16 22:49:29 UTC (rev 22956) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-17 23:08:14 UTC (rev 22957) @@ -376,7 +376,7 @@ struct machservice *ms; struct watchpath *wp; - if (!job_assumes(j, j->currently_ignored)) { + if (!j->currently_ignored) { return; } @@ -1642,7 +1642,7 @@ return; } else if (job_useless(j)) { job_remove(j); - } else if (global_on_demand_cnt == 0 && (kickstart || job_keepalive(j))) { + } else if (kickstart || job_keepalive(j)) { job_start(j); } else { job_watch(j); @@ -2688,6 +2688,10 @@ bool good_exit = (WIFEXITED(j->last_exit_status) && WEXITSTATUS(j->last_exit_status) == 0); bool dispatch_others = false; + if (global_on_demand_cnt > 0) { + return false; + } + if (j->runatload && j->start_time == 0) { job_log(j, LOG_DEBUG, "KeepAlive check: job needs to run at least once."); return true; -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061117/9485f152/attachment.html From source_changes at macosforge.org Fri Nov 17 15:08:32 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:36 2007 Subject: [launchd-changes] [22958] tags/launchd-176/ Message-ID: <20061117230832.3A6143046B2@cvs.opensource.apple.com> Revision: 22958 http://trac.macosforge.org/projects/launchd/changeset/22958 Author: zarzycki@apple.com Date: 2006-11-17 15:08:31 -0800 (Fri, 17 Nov 2006) Log Message: ----------- "Tagging launchd-176 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-176/ Copied: tags/launchd-176 (from rev 22957, trunk) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061117/5976075a/attachment.html From source_changes at macosforge.org Tue Nov 28 16:04:29 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:36 2007 Subject: [launchd-changes] [22959] trunk/launchd/src/launchd_core_logic.c Message-ID: <20061129000429.063653724A7@cvs.opensource.apple.com> Revision: 22959 http://trac.macosforge.org/projects/launchd/changeset/22959 Author: zarzycki@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 From source_changes at macosforge.org Wed Nov 29 09:40:04 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:36 2007 Subject: [launchd-changes] [22960] trunk/launchd/src Message-ID: <20061129174004.CF54937BCBB@cvs.opensource.apple.com> Revision: 22960 http://trac.macosforge.org/projects/launchd/changeset/22960 Author: zarzycki@apple.com Date: 2006-11-29 09:40:04 -0800 (Wed, 29 Nov 2006) Log Message: ----------- One less global. Modified Paths: -------------- trunk/launchd/src/launchd.c trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/launchd_core_logic.h trunk/launchd/src/launchd_runtime.c Modified: trunk/launchd/src/launchd.c =================================================================== --- trunk/launchd/src/launchd.c 2006-11-29 00:04:29 UTC (rev 22959) +++ trunk/launchd/src/launchd.c 2006-11-29 17:40:04 UTC (rev 22960) @@ -659,7 +659,7 @@ void launchd_post_kevent(void) { - if (shutdown_in_progress && total_children == 0) { + if (shutdown_in_progress && jobmgr_is_idle(root_jobmgr)) { shutdown_in_progress = false; if (getpid() != 1) { Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2006-11-29 00:04:29 UTC (rev 22959) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-29 17:40:04 UTC (rev 22960) @@ -339,7 +339,6 @@ static char **mach_cmd2argv(const char *string); jobmgr_t root_jobmgr; jobmgr_t gc_this_jobmgr; -size_t total_children; void simple_zombie_reaper(void *obj __attribute__((unused)), struct kevent *kev) @@ -598,7 +597,6 @@ job_reap(j); } else { /* we've attached the simple zombie reaper, we're going to delete the job before it is dead */ - total_children--; job_stop(j); } } @@ -1619,7 +1617,6 @@ } } - total_children--; j->last_exit_status = status; j->p = 0; } @@ -1807,7 +1804,6 @@ break; default: j->p = c; - total_children++; job_assumes(j, close(execspair[1]) == 0); j->execfd = _fd(execspair[0]); if (sipc) { @@ -3000,6 +2996,20 @@ } } +bool +jobmgr_is_idle(jobmgr_t jm) +{ + job_t ji; + + SLIST_FOREACH(ji, &jm->jobs, sle) { + if (ji->p) { + return false; + } + } + + return true; +} + char * jobmgr_get_stdout(jobmgr_t jm) { Modified: trunk/launchd/src/launchd_core_logic.h =================================================================== --- trunk/launchd/src/launchd_core_logic.h 2006-11-29 00:04:29 UTC (rev 22959) +++ trunk/launchd/src/launchd_core_logic.h 2006-11-29 17:40:04 UTC (rev 22960) @@ -28,8 +28,8 @@ extern jobmgr_t root_jobmgr; extern jobmgr_t gc_this_jobmgr; -extern size_t total_children; +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); job_t jobmgr_find(jobmgr_t jm, const char *label); Modified: trunk/launchd/src/launchd_runtime.c =================================================================== --- trunk/launchd/src/launchd_runtime.c 2006-11-29 00:04:29 UTC (rev 22959) +++ trunk/launchd/src/launchd_runtime.c 2006-11-29 17:40:04 UTC (rev 22960) @@ -74,6 +74,7 @@ static void async_callback(void); static kq_callback kqasync_callback = (kq_callback)async_callback; +static void record_caller_creds(mach_msg_header_t *mh); static void launchd_runtime2(mach_msg_size_t msg_size, mig_reply_error_t *bufRequest, mig_reply_error_t *bufReply); static mach_msg_size_t max_msg_size; static mig_callback *mig_cb_table; @@ -477,7 +478,7 @@ return KERN_SUCCESS; } -static void +void record_caller_creds(mach_msg_header_t *mh) { mach_msg_max_trailer_t *tp; -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061129/3df93340/attachment.html From source_changes at macosforge.org Wed Nov 29 14:10:25 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:36 2007 Subject: [launchd-changes] [22961] trunk/launchd/src/launchd_core_logic.c Message-ID: <20061129221025.AC44C37E175@cvs.opensource.apple.com> Revision: 22961 http://trac.macosforge.org/projects/launchd/changeset/22961 Author: zarzycki@apple.com Date: 2006-11-29 14:10:25 -0800 (Wed, 29 Nov 2006) Log Message: ----------- 9A315: Logging In After Logging Out Fails 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-29 17:40:04 UTC (rev 22960) +++ trunk/launchd/src/launchd_core_logic.c 2006-11-29 22:10:25 UTC (rev 22961) @@ -592,6 +592,10 @@ job_log(j, LOG_DEBUG, "Removed"); + if (j->forced_peers_to_demand_mode) { + job_set_global_on_demand(j, false); + } + if (j->p && !j->anonymous) { if (kevent_mod(j->p, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, &kqsimple_zombie_reaper) == -1) { job_reap(j); -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061129/df11dda5/attachment.html From source_changes at macosforge.org Wed Nov 29 14:10:38 2006 From: source_changes at macosforge.org (source_changes@macosforge.org) Date: Tue Oct 9 16:25:36 2007 Subject: [launchd-changes] [22962] tags/launchd-177/ Message-ID: <20061129221038.3AD9837E17F@cvs.opensource.apple.com> Revision: 22962 http://trac.macosforge.org/projects/launchd/changeset/22962 Author: zarzycki@apple.com Date: 2006-11-29 14:10:38 -0800 (Wed, 29 Nov 2006) Log Message: ----------- "Tagging launchd-177 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-177/ Copied: tags/launchd-177 (from rev 22961, trunk) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061129/f46cecac/attachment.html