Revision: 23481 http://trac.macosforge.org/projects/launchd/changeset/23481 Author: zarzycki@apple.com Date: 2008-01-11 09:12:59 -0800 (Fri, 11 Jan 2008) Log Message: ----------- Most of the time, when launchd calls getpid(), it simply wants to know whether it should do "PID 1 magic." This simplifies the code a bit. Modified Paths: -------------- trunk/launchd/src/launchd.c trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/launchd_runtime.c trunk/launchd/src/launchd_runtime.h trunk/launchd/src/launchd_unix_ipc.c Modified: trunk/launchd/src/launchd.c =================================================================== --- trunk/launchd/src/launchd.c 2008-01-11 15:17:14 UTC (rev 23480) +++ trunk/launchd/src/launchd.c 2008-01-11 17:12:59 UTC (rev 23481) @@ -134,7 +134,7 @@ setenv("PATH", _PATH_STDPATH, 1); } - if (getpid() == 1) { + if (pid1_magic) { pid1_magic_init(); } else { ipc_server_init(); @@ -142,7 +142,7 @@ monitor_networking_state(); - if (getpid() == 1) { + if (pid1_magic) { handle_pid1_crashes_separately(); } @@ -253,7 +253,7 @@ shutdown_in_progress = true; - if (getpid() == 1) { + if (pid1_magic) { /* * When this changes to a more sustainable API, update this: * http://howto.apple.com/db.cgi?Debugging_Apps_Non-Responsive_At_Shutdown Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2008-01-11 15:17:14 UTC (rev 23480) +++ trunk/launchd/src/launchd_core_logic.c 2008-01-11 17:12:59 UTC (rev 23481) @@ -714,7 +714,7 @@ } } - if (do_apple_internal_logging() && jm->parentmgr == NULL && getpid() == 1) { + if (do_apple_internal_logging() && jm->parentmgr == NULL && pid1_magic) { runtime_set_timeout(still_alive_with_check, 5); } @@ -756,7 +756,7 @@ if (jm->parentmgr) { runtime_del_ref(); SLIST_REMOVE(&jm->parentmgr->submgrs, jm, jobmgr_s, sle); - } else if (getpid() == 1) { + } else if (pid1_magic) { jobmgr_log(jm, LOG_DEBUG, "About to call: sync()"); sync(); /* We're are going to rely on log timestamps to benchmark this call */ jobmgr_log(jm, LOG_DEBUG, "Unmounting all filesystems except / and /dev"); @@ -1120,7 +1120,7 @@ /* the kernel */ break; case 1: - if (getpid() != 1) { + if (!pid1_magic) { /* we cannot possibly find a parent job_t that is useful in this function */ break; } @@ -2524,7 +2524,7 @@ runtime_closelog(); /* HACK -- force 'start' time to be set */ - if (getpid() == 1) { + if (pid1_magic) { int64_t now = runtime_get_wall_time(); jobmgr_log(jm, LOG_NOTICE, "Anticipatory shutdown began at: %lld.%06llu", now / USEC_PER_SEC, now % USEC_PER_SEC); @@ -4204,7 +4204,7 @@ if (likely(target_task)) { job_assumes(j, task_set_exception_ports(target_task, EXC_MASK_CRASH, exc_port, EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES, f) == KERN_SUCCESS); - } else if (getpid() == 1 && the_exception_server) { + } else if (pid1_magic && the_exception_server) { mach_port_t mhp = mach_host_self(); job_assumes(j, host_set_exception_ports(mhp, EXC_MASK_CRASH, the_exception_server, EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES, f) == KERN_SUCCESS); @@ -4254,7 +4254,7 @@ SLIST_INSERT_HEAD(&special_ports, ms, special_port_sle); break; } - } else if (strcasecmp(key, LAUNCH_JOBKEY_MACH_HOSTSPECIALPORT) == 0 && getpid() == 1) { + } else if (strcasecmp(key, LAUNCH_JOBKEY_MACH_HOSTSPECIALPORT) == 0 && pid1_magic) { if (which_port > HOST_MAX_SPECIAL_KERNEL_PORT) { job_assumes(ms->job, (errno = host_set_special_port(mhp, which_port, ms->port)) == KERN_SUCCESS); } else { @@ -4387,7 +4387,7 @@ size_t i, kp_cnt = 0, kp_skipped = 0, len = 10*1024*1024; struct kinfo_proc *kp; - if (likely(jm->parentmgr || getpid() != 1)) { + if (likely(jm->parentmgr || !pid1_magic)) { return; } @@ -4483,7 +4483,7 @@ if (transfer_port != MACH_PORT_NULL) { jobmgr_assumes(jmr, jm != NULL); jmr->jm_port = transfer_port; - } else if (!jm && getpid() != 1) { + } else if (!jm && !pid1_magic) { char *trusted_fd = getenv(LAUNCHD_TRUSTED_FD_ENV); name_t service_buf; @@ -5276,7 +5276,7 @@ #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 - if (getpid() == 1) { + if (pid1_magic) { if (unlikely(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); @@ -5662,7 +5662,7 @@ return BOOTSTRAP_NO_MEMORY; } - if (unlikely(getpid() != 1)) { + if (unlikely(!pid1_magic)) { return BOOTSTRAP_NOT_PRIVILEGED; } @@ -5731,7 +5731,7 @@ void ensure_root_bkgd_setup(void) { - if (likely(background_jobmgr) || getpid() != 1) { + if (likely(background_jobmgr) || !pid1_magic) { return; } @@ -5757,7 +5757,7 @@ runtime_get_caller_creds(&ldc); - if (unlikely(getpid() != 1)) { + if (unlikely(!pid1_magic)) { job_log(j, LOG_ERR, "Only PID 1 supports per user launchd lookups."); return BOOTSTRAP_NOT_PRIVILEGED; } @@ -5896,7 +5896,7 @@ * us). We'll have to reconcile this design friction at a later date. */ if (unlikely(j->anonymous && job_get_bs(j)->parentmgr == NULL && ldc.uid != 0 && ldc.uid != getuid() && ldc.uid != 92)) { - if (getpid() == 1) { + if (pid1_magic) { return VPROC_ERR_TRY_PER_USER; } else { return BOOTSTRAP_NOT_PRIVILEGED; @@ -5941,7 +5941,7 @@ runtime_get_caller_creds(&ldc); - if (unlikely(getpid() == 1 && j->anonymous && job_get_bs(j)->parentmgr == NULL && ldc.uid != 0 && ldc.euid != 0)) { + if (unlikely(pid1_magic && j->anonymous && job_get_bs(j)->parentmgr == NULL && ldc.uid != 0 && ldc.euid != 0)) { return VPROC_ERR_TRY_PER_USER; } @@ -5981,7 +5981,7 @@ job_assumes(j, vproc_mig_look_up2_forward(inherited_bootstrap_port, srp, servicename, 0, 0) == 0); /* The previous routine moved the reply port, we're forced to return MIG_NO_REPLY now */ return MIG_NO_REPLY; - } else if (getpid() == 1 && j->anonymous && ldc.euid >= 500 && strcasecmp(job_get_bs(j)->name, VPROCMGR_SESSION_LOGINWINDOW) == 0) { + } else if (pid1_magic && j->anonymous && ldc.euid >= 500 && strcasecmp(job_get_bs(j)->name, VPROCMGR_SESSION_LOGINWINDOW) == 0) { /* * 5240036 Should start background session when a lookup of CCacheServer occurs * @@ -6113,7 +6113,7 @@ continue; } else if (strcasecmp(jmi->name, where) == 0) { goto jm_found; - } else if (strcasecmp(jmi->name, VPROCMGR_SESSION_BACKGROUND) == 0 && getpid() == 1) { + } else if (strcasecmp(jmi->name, VPROCMGR_SESSION_BACKGROUND) == 0 && pid1_magic) { SLIST_FOREACH(jmi2, &jmi->submgrs, sle) { if (strcasecmp(jmi2->name, where) == 0) { jmi = jmi2; @@ -6162,7 +6162,7 @@ job_t j2; if (j->mgr->session_initialized) { - if (ldc.uid == 0 && getpid() == 1) { + if (ldc.uid == 0 && pid1_magic) { if (strcmp(j->mgr->name, VPROCMGR_SESSION_LOGINWINDOW) == 0) { job_t ji, jn; @@ -6200,7 +6200,7 @@ kr = BOOTSTRAP_NOT_PRIVILEGED; goto out; } - } else if (ldc.uid == 0 && getpid() == 1 && strcmp(session_type, VPROCMGR_SESSION_STANDARDIO) == 0) { + } else if (ldc.uid == 0 && pid1_magic && strcmp(session_type, VPROCMGR_SESSION_STANDARDIO) == 0) { ensure_root_bkgd_setup(); SLIST_REMOVE(&j->mgr->parentmgr->submgrs, j->mgr, jobmgr_s, sle); @@ -6334,7 +6334,7 @@ jm = j->mgr; - if (unlikely(getpid() != 1)) { + if (unlikely(!pid1_magic)) { job_log(j, LOG_ERR, "Only the system launchd will transfer Mach sub-bootstraps."); return BOOTSTRAP_NOT_PRIVILEGED; } @@ -6606,7 +6606,7 @@ return BOOTSTRAP_NO_MEMORY; } - if (unlikely(getpid() == 1 && ldc.euid && ldc.uid)) { + if (unlikely(pid1_magic && ldc.euid && ldc.uid)) { job_log(j, LOG_DEBUG, "Punting spawn to per-user-context"); return VPROC_ERR_TRY_PER_USER; } @@ -6632,7 +6632,7 @@ job_reparent_hack(jr, NULL); - if (getpid() == 1) { + if (pid1_magic) { jr->mach_uid = ldc.uid; } @@ -6670,7 +6670,7 @@ INTERNAL_ABI void jobmgr_init(bool sflag) { - const char *root_session_type = getpid() == 1 ? VPROCMGR_SESSION_SYSTEM : VPROCMGR_SESSION_BACKGROUND; + const char *root_session_type = pid1_magic ? VPROCMGR_SESSION_SYSTEM : VPROCMGR_SESSION_BACKGROUND; launchd_assert((root_jobmgr = jobmgr_new(NULL, MACH_PORT_NULL, MACH_PORT_NULL, sflag, root_session_type)) != NULL); } Modified: trunk/launchd/src/launchd_runtime.c =================================================================== --- trunk/launchd/src/launchd_runtime.c 2008-01-11 15:17:14 UTC (rev 23480) +++ trunk/launchd/src/launchd_runtime.c 2008-01-11 17:12:59 UTC (rev 23481) @@ -120,8 +120,8 @@ }; static sigset_t sigign_set; static FILE *ourlogfile; +bool pid1_magic; - INTERNAL_ABI mach_port_t runtime_get_kernel_port(void) { @@ -1158,7 +1158,7 @@ { struct runtime_syslog_attr attr = { "com.apple.launchd", "com.apple.launchd", - getpid() == 1 ? "System" : "Background", + pid1_magic ? "System" : "Background", pri, getuid(), getpid(), getpid() }; va_list ap; @@ -1326,7 +1326,7 @@ if (logmsg_queue_cnt == 0) { launchd_assumes(STAILQ_EMPTY(&logmsg_queue)); return; - } else if (getpid() != 1) { + } else if (!pid1_magic) { if (runtime_log_pack(&outval, &outvalCnt) == 0) { launchd_assumes(_vprocmgr_log_forward(inherited_bootstrap_port, (void *)outval, outvalCnt) == NULL); mig_deallocate(outval, outvalCnt); @@ -1605,4 +1605,8 @@ launchd_assert(mach_timebase_info(&tbi) == 0); tbi_float_val = tbi.numer; tbi_float_val /= tbi.denom; + + if (getpid() == 1) { + pid1_magic = true; + } } Modified: trunk/launchd/src/launchd_runtime.h =================================================================== --- trunk/launchd/src/launchd_runtime.h 2008-01-11 15:17:14 UTC (rev 23480) +++ trunk/launchd/src/launchd_runtime.h 2008-01-11 17:12:59 UTC (rev 23481) @@ -103,6 +103,8 @@ typedef boolean_t (*mig_callback)(mach_msg_header_t *, mach_msg_header_t *); typedef INTERNAL_ABI void (*timeout_callback)(void); +extern bool pid1_magic; + INTERNAL_ABI mach_port_t runtime_get_kernel_port(void); INTERNAL_ABI void runtime_add_ref(void); Modified: trunk/launchd/src/launchd_unix_ipc.c =================================================================== --- trunk/launchd/src/launchd_unix_ipc.c 2008-01-11 15:17:14 UTC (rev 23480) +++ trunk/launchd/src/launchd_unix_ipc.c 2008-01-11 17:12:59 UTC (rev 23481) @@ -102,7 +102,7 @@ memset(&sun, 0, sizeof(sun)); sun.sun_family = AF_UNIX; - if (getpid() == 1) { + if (pid1_magic) { strcpy(ourdir, LAUNCHD_SOCK_PREFIX); strncpy(sun.sun_path, LAUNCHD_SOCK_PREFIX "/sock", sizeof(sun.sun_path)); @@ -458,7 +458,7 @@ continue; } - if (/* XXX readcfg_pid && */ getpid() == 1 && (i == RLIMIT_NOFILE || i == RLIMIT_NPROC)) { + if (/* XXX readcfg_pid && */ pid1_magic && (i == RLIMIT_NOFILE || i == RLIMIT_NPROC)) { int gmib[] = { CTL_KERN, KERN_MAXPROC }; int pmib[] = { CTL_KERN, KERN_MAXPROCPERUID }; const char *gstr = "kern.maxproc";