From source_changes at macosforge.org Thu Nov 6 15:52:32 2008 From: source_changes at macosforge.org (source_changes at macosforge.org) Date: Thu, 6 Nov 2008 15:52:32 -0800 (PST) Subject: [launchd-changes] [23750] trunk Message-ID: <20081106235232.85A536348B1@beta.macosforge.org> Revision: 23750 http://trac.macosforge.org/projects/launchd/changeset/23750 Author: dsorresso at apple.com Date: 2008-11-06 15:52:32 -0800 (Thu, 06 Nov 2008) Log Message: ----------- Launchd does not bounds check StartCalendarInterval parameters ("input validation") Background agents in home directory launchd should query Seatbelt at Mach service lookup time (patch attached) BTMM: kdcmond doesn't launch on demand when AFP is enabled launchd is deaf to MIG requests while running 'sample' 1/3rd fewer threads build failures when including vproc_priv.h before vproc.h launchctl never exits after unloading the slapd plist causing server hang 10A208: launchctl limit core unlimited complains about maxfiles!? 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/vproc_priv.h Removed Paths: ------------- trunk/Makefile Deleted: trunk/Makefile =================================================================== --- trunk/Makefile 2008-10-30 01:28:28 UTC (rev 23749) +++ trunk/Makefile 2008-11-06 23:52:32 UTC (rev 23750) @@ -1,36 +0,0 @@ -ifndef SDKROOT -export SDKROOT = / -endif - -Project = launchd -Extra_Configure_Flags = --sbindir=/sbin --bindir=/bin --sysconfdir=/private/etc -GnuAfterInstall = launchd_after_install -include $(MAKEFILEPATH)/CoreOS/ReleaseControl/GNUSource.make -Install_Flags = DESTDIR=$(DSTROOT) - -ifeq ($(shell tconf --test TARGET_OS_EMBEDDED),YES) -Extra_Configure_Flags += --host=none-apple-darwin -endif - -launchd_after_install:: -ifeq ($(RC_ProjectName),launchd_libs) - -find -d $(DSTROOT) -type f | grep -v /usr/local/lib/system | xargs rm - -find -d $(DSTROOT) -type l | grep -v /usr/local/lib/system | xargs rm - -find -d $(DSTROOT) -type d | grep -v /usr/local/lib/system | xargs rmdir -else -ifeq ($(shell tconf --test TARGET_OS_EMBEDDED),NO) - mkdir -p $(DSTROOT)/Library/StartupItems - chmod 755 $(DSTROOT)/Library/StartupItems - mkdir -p $(DSTROOT)/System/Library/StartupItems - chmod 755 $(DSTROOT)/System/Library/StartupItems -endif - rm -rf $(DSTROOT)/usr/local/lib/system - cp $(OBJROOT)/src/launchd $(SYMROOT) - cp $(OBJROOT)/src/launchctl $(SYMROOT) - cp $(OBJROOT)/src/launchproxy $(SYMROOT) - -dsymutil $(SYMROOT)/launchd - -dsymutil $(SYMROOT)/launchctl - -dsymutil $(SYMROOT)/launchproxy -endif - -launchd_libs:: install Modified: trunk/launchd/src/launchctl.c =================================================================== --- trunk/launchd/src/launchctl.c 2008-10-30 01:28:28 UTC (rev 23749) +++ trunk/launchd/src/launchctl.c 2008-11-06 23:52:32 UTC (rev 23750) @@ -1633,9 +1633,12 @@ if (strcasecmp(session_type, "System") == 0) { system_specific_bootstrap(sflag); } else { - char *load_launchd_items[] = { "load", "-S", session_type, "-D", "all", NULL, NULL, NULL, NULL }; + char *load_launchd_items[] = { "load", "-S", session_type, "-D", "all", NULL, NULL, NULL, NULL, NULL, NULL }; int the_argc = 5; + char *load_launchd_items_user[] = { "load", "-S", session_type, "-D", "user", NULL }; + int the_argc_user = 0; + if (is_safeboot()) { load_launchd_items[4] = "system"; } @@ -1650,6 +1653,17 @@ if (strcasecmp(session_type, VPROCMGR_SESSION_LOGINWINDOW) == 0) { load_launchd_items[the_argc] = "/etc/mach_init_per_login_session.d"; the_argc += 1; + } else { + /* If we're a per-user launchd initializing our Background session, + * don't forget about the user's launchd jobs that may be specified as + * LimitLoadToSessionType = Background. We also + * must keep in mind that we need to load the user jobs last, since the + * jobs in the local sessions may be responsible for mounting the home + * directory. + */ + if( getppid() != 1 ) { + the_argc_user = 5; + } } } else if (strcasecmp(session_type, VPROCMGR_SESSION_AQUA) == 0) { load_launchd_items[5] = "/etc/mach_init_per_user.d"; @@ -1663,7 +1677,21 @@ #endif } - return load_and_unload_cmd(the_argc, load_launchd_items); + int retval = load_and_unload_cmd(the_argc, load_launchd_items); + if( retval == 0 && the_argc_user != 0 ) { + optind = 1; + /* Load user jobs. But first, we tell launchd to resume listening to + * other clients, since this operation could potentially block if the user's + * home directory is on a network volume or something. + */ + int64_t junk = 0; + vproc_err_t err = vproc_swap_integer(NULL, VPROC_GSK_WEIRD_BOOTSTRAP, &junk, NULL); + if( !err ) { + retval = load_and_unload_cmd(the_argc_user, load_launchd_items_user); + } + } + + return retval; } return 0; @@ -2353,19 +2381,21 @@ lmts[which].rlim_max = hlim; bool maxfiles_exceeded = false; - if( argc > 2 ) { - maxfiles_exceeded = ( strncmp(argv[2], "unlimited", sizeof("unlimited")) == 0 ); + if( strncmp(argv[1], "maxfiles", sizeof("maxfiles")) == 0 ) { + if( argc > 2 ) { + maxfiles_exceeded = ( strncmp(argv[2], "unlimited", sizeof("unlimited")) == 0 ); + } + + if( argc > 3 ) { + maxfiles_exceeded = ( maxfiles_exceeded || strncmp(argv[3], "unlimited", sizeof("unlimited")) == 0 ); + } + + if( maxfiles_exceeded ) { + fprintf(stderr, "Neither the hard nor soft limit for \"maxfiles\" can be unlimited. Please use a numeric parameter for both.\n"); + return 1; + } } - if( argc > 3 ) { - maxfiles_exceeded = ( maxfiles_exceeded || strncmp(argv[3], "unlimited", sizeof("unlimited")) == 0 ); - } - - if( maxfiles_exceeded ) { - fprintf(stderr, "Neither the hard nor soft limit for \"maxfiles\" can be unlimited. Please use a numeric parameter for both.\n"); - return 1; - } - msg = launch_data_alloc(LAUNCH_DATA_DICTIONARY); tmp = launch_data_new_opaque(lmts, lsz); launch_data_dict_insert(msg, tmp, LAUNCH_KEY_SETRESOURCELIMITS); Modified: trunk/launchd/src/launchd.c =================================================================== --- trunk/launchd/src/launchd.c 2008-10-30 01:28:28 UTC (rev 23749) +++ trunk/launchd/src/launchd.c 2008-11-06 23:52:32 UTC (rev 23750) @@ -156,12 +156,12 @@ } else { if( !launchd_assumes((g_console = fopen(_PATH_CONSOLE, "w")) != NULL) ) { g_console = stdout; - } else { - _fd(fileno(g_console)); } _fd(fileno(g_console)); } + } else { + g_console = stdout; } if (NULL == getenv("PATH")) { @@ -330,8 +330,8 @@ now = runtime_get_wall_time(); - char *term_who = pid1_magic ? "System shutdown" : "Per-user launchd termination"; - runtime_syslog(LOG_NOTICE, "%s began at: %lld.%06llu", term_who, now / USEC_PER_SEC, now % USEC_PER_SEC); + char *term_who = pid1_magic ? "System shutdown" : "Per-user launchd termination for "; + runtime_syslog(LOG_NOTICE, "%s%s began at: %lld.%06llu", term_who, pid1_magic ? "" : g_username, now / USEC_PER_SEC, now % USEC_PER_SEC); launchd_assert(jobmgr_shutdown(root_jobmgr) != NULL); } Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2008-10-30 01:28:28 UTC (rev 23749) +++ trunk/launchd/src/launchd_core_logic.c 2008-11-06 23:52:32 UTC (rev 23750) @@ -75,6 +75,7 @@ #include #include #if HAVE_SANDBOX +#define __APPLE_API_PRIVATE #include #endif #if HAVE_QUARANTINE @@ -333,6 +334,7 @@ static void jobmgr_dequeue_next_sample(jobmgr_t jm); static job_t jobmgr_init_session(jobmgr_t jm, const char *session_type, bool sflag); static job_t jobmgr_find_by_pid(jobmgr_t jm, pid_t p, bool create_anon); +static jobmgr_t jobmgr_find_by_name(jobmgr_t jm, const char *where); static job_t job_mig_intran2(jobmgr_t jm, mach_port_t mport, pid_t upid); static void job_export_all2(jobmgr_t jm, launch_data_t where); INTERNAL_ABI static void jobmgr_callback(void *obj, struct kevent *kev); @@ -353,6 +355,7 @@ LIST_ENTRY(job_s) label_hash_sle; LIST_ENTRY(job_s) global_env_sle; LIST_ENTRY(job_s) pending_samples_sle; + SLIST_ENTRY(job_s) curious_jobs_sle; SLIST_HEAD(, socketgroup) sockets; SLIST_HEAD(, calendarinterval) cal_intervals; SLIST_HEAD(, envitem) global_env; @@ -454,7 +457,9 @@ kill_via_shmem :1, /* man launchd.plist --> EnableTransactions */ sent_kill_via_shmem :1, /* We need to 'kill_via_shmem' once-and-only-once */ pending_sample :1, /* This job needs to be sampled for some reason. */ - kill_after_sample :1; /* The job is to be killed after sampling. */ + kill_after_sample :1, /* The job is to be killed after sampling. */ + reap_after_sample :1, /* The job exited before sample did, so we should reap it after sample is done. */ + nosy :1; /* The job has an OtherJobEnabled KeepAlive criterion. */ mode_t mask; pid_t sample_pid; const char label[0]; @@ -465,8 +470,8 @@ static LIST_HEAD(, job_s) label_hash[LABEL_HASH_SIZE]; static size_t hash_label(const char *label) __attribute__((pure)); static size_t hash_ms(const char *msstr) __attribute__((pure)); +static SLIST_HEAD(, job_s) s_curious_jobs; - #define job_assumes(j, e) \ (unlikely(!(e)) ? job_log_bug(j, __LINE__), false : true) @@ -481,9 +486,11 @@ static const char *job_active(job_t j); static void job_watch(job_t j); static void job_ignore(job_t j); +static void job_reap_sample(job_t j); static void job_reap(job_t j); static bool job_useless(job_t j); static bool job_keepalive(job_t j); +static void job_dispatch_curious_jobs(job_t j); static void job_start(job_t j); static void job_start_child(job_t j) __attribute__((noreturn)); static void job_setup_attributes(job_t j); @@ -499,9 +506,8 @@ static void job_force_sampletool(job_t j); #endif static void job_setup_exception_port(job_t j, task_t target_task); -static void job_reparent_hack(job_t j, const char *where); INTERNAL_ABI static void job_callback(void *obj, struct kevent *kev); -static void job_callback_proc(job_t j, int fflags); +static void job_callback_proc(job_t j, struct kevent *kev); static void job_callback_timer(job_t j, void *ident); static void job_callback_read(job_t j, int ident); static void job_log_stray_pg(job_t j); @@ -564,7 +570,6 @@ mach_port_t inherited_bootstrap_port; jobmgr_t root_jobmgr; - void job_ignore(job_t j) { @@ -1037,6 +1042,8 @@ return; } } + + job_dispatch_curious_jobs(j); ipc_close_all_with_job(j); @@ -1536,6 +1543,7 @@ return NULL; } + job_dispatch_curious_jobs(j); return job_dispatch(j, false); } @@ -1546,7 +1554,7 @@ job_t *ja; size_t i, c = launch_data_array_get_count(pload); - ja = alloca(c * sizeof(job_t )); + ja = alloca(c * sizeof(job_t)); for (i = 0; i < c; i++) { if (likely(ja[i] = jobmgr_import2(root_jobmgr, launch_data_array_get_index(pload, i)))) { @@ -1557,6 +1565,7 @@ for (i = 0; i < c; i++) { if (likely(ja[i])) { + job_dispatch_curious_jobs(ja[i]); job_dispatch(ja[i], false); } } @@ -1718,7 +1727,6 @@ } else if (strcasecmp(key, LAUNCH_JOBKEY_LIMITLOADFROMHOSTS) == 0) { return; } else if (strcasecmp(key, LAUNCH_JOBKEY_LIMITLOADTOSESSIONTYPE) == 0) { - job_reparent_hack(j, value); return; } break; @@ -2181,6 +2189,14 @@ argv[i] = NULL; } + /* Hack to make sure the proper job manager is set the whole way through. */ + launch_data_t session = launch_data_dict_lookup(pload, LAUNCH_JOBKEY_LIMITLOADTOSESSIONTYPE); + if( session ) { + jm = jobmgr_find_by_name(jm, launch_data_get_string(session)) ?: jm; + } + + jobmgr_log(jm, LOG_DEBUG, "Importing %s.", label); + if (unlikely((j = job_find(label)) != NULL)) { errno = EEXIST; return NULL; @@ -2434,14 +2450,8 @@ } if (unlikely(j->weird_bootstrap)) { - mach_msg_size_t mxmsgsz = (typeof(mxmsgsz)) sizeof(union __RequestUnion__job_mig_protocol_vproc_subsystem); - - if (job_mig_protocol_vproc_subsystem.maxsize > mxmsgsz) { - mxmsgsz = job_mig_protocol_vproc_subsystem.maxsize; - } - - job_assumes(j, runtime_add_mport(j->mgr->jm_port, protocol_vproc_server, mxmsgsz) == KERN_SUCCESS); - j->weird_bootstrap = false; + int64_t junk = 0; + job_mig_swap_integer(j, VPROC_GSK_WEIRD_BOOTSTRAP, 0, 0, &junk); } if (j->log_redirect_fd && !j->legacy_LS_job) { @@ -2522,7 +2532,7 @@ td_sec = td / NSEC_PER_SEC; td_usec = (td % NSEC_PER_SEC) / NSEC_PER_USEC; - job_log(j, LOG_INFO, "Exited %llu.%06llu seconds after the first signal was sent", td_sec, td_usec); + job_log(j, LOG_NOTICE, "Exited %llu.%06llu seconds after the first signal was sent", td_sec, td_usec); } timeradd(&ru.ru_utime, &j->ru.ru_utime, &j->ru.ru_utime); @@ -2632,12 +2642,22 @@ snprintf(pidstr, sizeof(pidstr), "%u", j->p); snprintf(j->mgr->sample_log_file, sizeof(j->mgr->sample_log_file), SHUTDOWN_LOG_DIR "/%s-%u.sample.txt", j->label, j->p); job_log(j, LOG_DEBUG | LOG_CONSOLE, "Going to write sample to %s.", j->mgr->sample_log_file); - + exception_mask_t exceptions = EXC_MASK_BAD_ACCESS | + EXC_MASK_BAD_INSTRUCTION | + EXC_MASK_ARITHMETIC | + EXC_MASK_CRASH ; + if (job_assumes(j, unlink(jm->sample_log_file) != -1 || errno == ENOENT)) { pid_t sp = 0; char *sample_args[] = { "/usr/bin/sample", pidstr, "1", "-unsupportedShowArch", "-mayDie", "-file", j->mgr->sample_log_file, NULL }; - if (!job_assumes(j, (errno = posix_spawnp(&sp, sample_args[0], NULL, NULL, sample_args, environ)) == 0)) { + #if NEEDS_MULTI_THREADED_EXEC + posix_spawnattr_t psattr; + posix_spawnattr_init(psattr); + posix_spawnattr_setexceptionports_np(&psattr, exceptions, MACH_PORT_NULL, EXCEPTION_DEFAULT, 0); + + if (!job_assumes(j, (errno = posix_spawnp(&sp, sample_args[0], NULL, &psattr, sample_args, environ)) == 0)) { job_log(j, LOG_ERR | LOG_CONSOLE, "Sampling failed for job! Kill it! Kill it with fire!"); + LIST_REMOVE(j, pending_samples_sle); job_kill(j); jobmgr_dequeue_next_sample(jm); } else { @@ -2647,9 +2667,57 @@ /* Let us know when sample is done. ONESHOT is implicit if we're just interested in NOTE_EXIT. */ job_assumes(j, kevent_mod(sp, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, j) != -1); } + + posix_spawnattr_destroy(&psattr); + #else + switch( (sp = vfork()) ) { + case 0 : + /* Neuter the exception port so that crashes don't hang sample, making it unreapable. */ + task_set_exception_ports(mach_task_self(), exceptions, MACH_PORT_NULL, EXCEPTION_DEFAULT, 0); + execve(sample_args[0], sample_args, environ); + job_log(j, LOG_NOTICE | LOG_CONSOLE, "Could not exec(2): %d", errno); + _exit(EXIT_FAILURE); + case -1 : + job_log(j, LOG_NOTICE | LOG_CONSOLE, "vfork(2) failed: %d", errno); + break; + default : + break; + } + + if( sp != -1 ) { + j->sample_pid = sp; + j->pending_sample = false; + + /* Let us know when sample is done. ONESHOT is implicit if we're just interested in NOTE_EXIT. */ + job_assumes(j, kevent_mod(sp, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, j) != -1); + } else { + job_log(j, LOG_ERR | LOG_CONSOLE, "Sampling failed for job! Kill it! Kill it with fire!"); + LIST_REMOVE(j, pending_samples_sle); + job_kill(j); + jobmgr_dequeue_next_sample(jm); + } + #endif } } +void +job_dispatch_curious_jobs(job_t j) +{ + job_t ji = NULL; + SLIST_FOREACH( ji, &s_curious_jobs, curious_jobs_sle ) { + struct semaphoreitem *si = NULL; + SLIST_FOREACH( si, &ji->semaphores, sle ) { + if( si->why == OTHER_JOB_ENABLED || si->why == OTHER_JOB_DISABLED ) { + if( strncmp(si->what, j->label, strlen(j->label)) == 0 ) { + job_log(ji, LOG_NOTICE | LOG_CONSOLE, "Dispatching out of interest in \"%s\".", j->label); + job_assumes(ji, job_dispatch(ji, false) != NULL); + break; + } + } + } + } +} + INTERNAL_ABI job_t job_dispatch(job_t j, bool kickstart) { @@ -2800,21 +2868,17 @@ free(kp); } -static void +void job_reap_sample(job_t j) { char *contents = NULL; int wstatus = 0; int logfile_fd = -1; - LIST_REMOVE(j, pending_samples_sle); - if (!job_assumes(j, waitpid(j->sample_pid, &wstatus, 0) != -1)) { goto out; } - j->sampled = true; - /* * This won't work if the VFS or filesystems are sick: * sync(); @@ -2874,23 +2938,41 @@ } j->sample_pid = 0; + j->sampled = true; + LIST_REMOVE(j, pending_samples_sle); + + if( j->reap_after_sample ) { + job_log(j, LOG_NOTICE | LOG_CONSOLE, "Sampling complete. Reaping."); + struct kevent kev; + EV_SET(&kev, 1, 0, 0, NOTE_EXIT, 0, 0); + + /* Fake a kevent to keep our logic consistent. */ + job_callback_proc(j, &kev); + } + job_log(j, LOG_DEBUG | LOG_CONSOLE, "Finished sampling."); jobmgr_dequeue_next_sample(j->mgr); } void -job_callback_proc(job_t j, int fflags) +job_callback_proc(job_t j, struct kevent *kev) { bool program_changed = false; + int fflags = kev->fflags; - if( j->sample_pid ) { + if( j->sample_pid == (pid_t)kev->ident ) { job_assumes(j, (fflags & NOTE_EXIT) != 0); job_log(j, LOG_NOTICE | LOG_CONSOLE, "Sampling for job done. Reaping sample..."); job_reap_sample(j); return; + } else if( j->sample_pid && !j->reap_after_sample ) { + /* The job exited before our sample completed. */ + job_log(j, LOG_NOTICE | LOG_CONSOLE, "Job exited. Will reap after sample is complete."); + j->reap_after_sample = true; + return; } if (fflags & NOTE_EXEC) { @@ -2971,7 +3053,7 @@ td -= j->exit_timeout; job_log(j, LOG_WARNING | LOG_CONSOLE, "Did not die after sending SIGKILL %llu seconds ago...", td); - } else if (!j->sampled && (!j->exit_timeout || (LAUNCHD_SAMPLE_TIMEOUT < j->exit_timeout))) { + } else if ((!j->sampled && !j->sample_pid) && (!j->exit_timeout || (LAUNCHD_SAMPLE_TIMEOUT < j->exit_timeout))) { /* This should work even if the job changes its exit_timeout midstream */ job_log(j, LOG_NOTICE | LOG_CONSOLE, "Sampling timeout elapsed (%u seconds). Scheduling a sample...", LAUNCHD_SAMPLE_TIMEOUT); if (j->exit_timeout) { @@ -3101,7 +3183,7 @@ switch (kev->filter) { case EVFILT_PROC: - return job_callback_proc(j, kev->fflags); + return job_callback_proc(j, kev); case EVFILT_TIMER: return job_callback_timer(j, (void *) kev->ident); case EVFILT_VNODE: @@ -4232,16 +4314,41 @@ if (val < 0) { job_log(j, LOG_WARNING, "The interval for key \"%s\" is less than zero.", key); } else if (strcasecmp(key, LAUNCH_JOBKEY_CAL_MINUTE) == 0) { - tmptm->tm_min = (typeof(tmptm->tm_min)) val; + if( val > 59 ) { + job_log(j, LOG_WARNING, "The interval for key \"%s\" is not between 0 and 59 (inclusive).", key); + tmptm->tm_sec = -1; + } else { + tmptm->tm_min = (typeof(tmptm->tm_min)) val; + } } else if (strcasecmp(key, LAUNCH_JOBKEY_CAL_HOUR) == 0) { - tmptm->tm_hour = (typeof(tmptm->tm_hour)) val; + if( val > 23 ) { + job_log(j, LOG_WARNING, "The interval for key \"%s\" is not between 0 and 23 (inclusive).", key); + tmptm->tm_sec = -1; + } else { + tmptm->tm_hour = (typeof(tmptm->tm_hour)) val; + } } else if (strcasecmp(key, LAUNCH_JOBKEY_CAL_DAY) == 0) { - tmptm->tm_mday = (typeof(tmptm->tm_mday)) val; + if( val < 1 || val > 31 ) { + job_log(j, LOG_WARNING, "The interval for key \"%s\" is not between 1 and 31 (inclusive).", key); + tmptm->tm_sec = -1; + } else { + tmptm->tm_mday = (typeof(tmptm->tm_mday)) val; + } } else if (strcasecmp(key, LAUNCH_JOBKEY_CAL_WEEKDAY) == 0) { - tmptm->tm_wday = (typeof(tmptm->tm_wday)) val; + if( val > 7 ) { + job_log(j, LOG_WARNING, "The interval for key \"%s\" is not between 0 and 7 (inclusive).", key); + tmptm->tm_sec = -1; + } else { + tmptm->tm_wday = (typeof(tmptm->tm_wday)) val; + } } else if (strcasecmp(key, LAUNCH_JOBKEY_CAL_MONTH) == 0) { - tmptm->tm_mon = (typeof(tmptm->tm_mon)) val; - tmptm->tm_mon -= 1; /* 4798263 cron compatibility */ + if( val > 12 ) { + job_log(j, LOG_WARNING, "The interval for key \"%s\" is not between 0 and 12 (inclusive).", key); + tmptm->tm_sec = -1; + } else { + tmptm->tm_mon = (typeof(tmptm->tm_mon)) val; + tmptm->tm_mon -= 1; /* 4798263 cron compatibility */ + } } } @@ -5738,6 +5845,12 @@ } SLIST_INSERT_HEAD(&j->semaphores, si, sle); + + if( (why == OTHER_JOB_ENABLED || why == OTHER_JOB_DISABLED) && !j->nosy ) { + job_log(j, LOG_DEBUG, "Job is interested in \"%s\".", what); + SLIST_INSERT_HEAD(&s_curious_jobs, j, curious_jobs_sle); + j->nosy = true; + } semaphoreitem_runtime_mod_ref(si, true); @@ -5782,6 +5895,14 @@ job_assumes(j, runtime_close(si->fd) != -1); } + job_log(j, LOG_DEBUG, "Removing semaphore item... (what = %s, why = %u)", si->what, si->why); + + /* We'll need to rethink this if it ever becomes possible to dynamically add or remove semaphores. */ + if( (si->why == OTHER_JOB_ENABLED || si->why == OTHER_JOB_DISABLED) && j->nosy ) { + j->nosy = false; + SLIST_REMOVE(&s_curious_jobs, j, job_s, curious_jobs_sle); + } + free(si); } @@ -6088,6 +6209,18 @@ return BOOTSTRAP_NOT_PRIVILEGED; } +#if HAVE_SANDBOX + const char **argv = (const char **)mach_cmd2argv(server_cmd); + if (unlikely(argv == NULL)) { + return BOOTSTRAP_NO_MEMORY; + } + if (unlikely(sandbox_check(ldc->pid, "job-creation", SANDBOX_FILTER_PATH, argv[0]) > 0)) { + free(argv); + return BOOTSTRAP_NOT_PRIVILEGED; + } + free(argv); +#endif + job_log(j, LOG_DEBUG, "Server create attempt: %s", server_cmd); if (pid1_magic) { @@ -6449,6 +6582,19 @@ j->kill_via_shmem = (bool)inval; job_log(j, LOG_DEBUG, "j->kill_via_shmem = %s", j->kill_via_shmem ? "true" : "false"); } + case VPROC_GSK_WEIRD_BOOTSTRAP: + if( job_assumes(j, j->weird_bootstrap) ) { + job_log(j, LOG_NOTICE, "Unsetting weird bootstrap."); + + mach_msg_size_t mxmsgsz = (typeof(mxmsgsz)) sizeof(union __RequestUnion__job_mig_protocol_vproc_subsystem); + + if (job_mig_protocol_vproc_subsystem.maxsize > mxmsgsz) { + mxmsgsz = job_mig_protocol_vproc_subsystem.maxsize; + } + + job_assumes(j, runtime_add_mport(j->mgr->jm_port, protocol_vproc_server, mxmsgsz) == KERN_SUCCESS); + j->weird_bootstrap = false; + } case 0: break; default: @@ -6819,6 +6965,12 @@ return BOOTSTRAP_NOT_PRIVILEGED; } +#if HAVE_SANDBOX + if (unlikely(sandbox_check(ldc->pid, "mach-lookup", per_pid_lookup ? SANDBOX_FILTER_LOCAL_NAME : SANDBOX_FILTER_GLOBAL_NAME, servicename) > 0)) { + return BOOTSTRAP_NOT_PRIVILEGED; + } +#endif + if (per_pid_lookup) { ms = jobmgr_lookup_service(j->mgr, servicename, false, target_pid); } else { @@ -6961,8 +7113,8 @@ return BOOTSTRAP_NO_MEMORY; } -void -job_reparent_hack(job_t j, const char *where) +jobmgr_t +jobmgr_find_by_name(jobmgr_t jm, const char *where) { jobmgr_t jmi, jmi2; @@ -6970,18 +7122,23 @@ /* NULL is only passed for our custom API for LaunchServices. If that is the case, we do magic. */ if (where == NULL) { - if (strcasecmp(j->mgr->name, VPROCMGR_SESSION_LOGINWINDOW) == 0) { + if (strcasecmp(jm->name, VPROCMGR_SESSION_LOGINWINDOW) == 0) { where = VPROCMGR_SESSION_LOGINWINDOW; } else { where = VPROCMGR_SESSION_AQUA; } } - if (strcasecmp(j->mgr->name, where) == 0) { - return; + if (strcasecmp(jm->name, where) == 0) { + return jm; } + + if( strcasecmp(where, VPROCMGR_SESSION_BACKGROUND) == 0 && !pid1_magic ) { + jmi = root_jobmgr; + goto jm_found; + } - SLIST_FOREACH(jmi, &root_jobmgr->submgrs, sle) { + SLIST_FOREACH(jmi, &root_jobmgr->submgrs, sle) { if (unlikely(jmi->shutting_down)) { continue; } else if (strcasecmp(jmi->name, where) == 0) { @@ -6996,22 +7153,10 @@ } } + launchd_assumes(jmi != NULL); + jm_found: - if (job_assumes(j, jmi != NULL)) { - struct machservice *msi; - - SLIST_FOREACH(msi, &j->machservices, sle) { - LIST_REMOVE(msi, name_hash_sle); - } - - LIST_REMOVE(j, sle); - LIST_INSERT_HEAD(&jmi->jobs, j, sle); - j->mgr = jmi; - - SLIST_FOREACH(msi, &j->machservices, sle) { - LIST_INSERT_HEAD(&j->mgr->ms_hash[hash_ms(msi->name)], msi, name_hash_sle); - } - } + return jmi; } kern_return_t @@ -7526,6 +7671,12 @@ return BOOTSTRAP_NOT_PRIVILEGED; } +#if HAVE_SANDBOX + if (unlikely(sandbox_check(ldc->pid, "job-creation", SANDBOX_FILTER_NONE) > 0)) { + return BOOTSTRAP_NOT_PRIVILEGED; + } +#endif + 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; @@ -7540,8 +7691,14 @@ return 1; } - jr = jobmgr_import2(j->mgr, input_obj); + jobmgr_t target_jm = jobmgr_find_by_name(j->mgr, NULL); + if( !jobmgr_assumes(j->mgr, target_jm != NULL) ) { + jobmgr_log(j->mgr, LOG_NOTICE, "%s() can't find its session!", __func__); + return 1; + } + jr = jobmgr_import2(target_jm ?: j->mgr, input_obj); + if (!job_assumes(j, jr != NULL)) { switch (errno) { case EEXIST: @@ -7551,8 +7708,6 @@ } } - job_reparent_hack(jr, NULL); - if (pid1_magic) { jr->mach_uid = ldc->uid; } @@ -7592,7 +7747,8 @@ jobmgr_init(bool sflag) { const char *root_session_type = pid1_magic ? VPROCMGR_SESSION_SYSTEM : VPROCMGR_SESSION_BACKGROUND; - + SLIST_INIT(&s_curious_jobs); + launchd_assert((root_jobmgr = jobmgr_new(NULL, MACH_PORT_NULL, MACH_PORT_NULL, sflag, root_session_type)) != NULL); } Modified: trunk/launchd/src/launchd_core_logic.h =================================================================== --- trunk/launchd/src/launchd_core_logic.h 2008-10-30 01:28:28 UTC (rev 23749) +++ trunk/launchd/src/launchd_core_logic.h 2008-11-06 23:52:32 UTC (rev 23750) @@ -20,7 +20,7 @@ * @APPLE_APACHE_LICENSE_HEADER_END@ */ -#include +#include "launchd_runtime.h" #include "bootstrap.h" #include "launch.h" @@ -33,6 +33,7 @@ INTERNAL_ABI void jobmgr_init(bool); INTERNAL_ABI jobmgr_t jobmgr_shutdown(jobmgr_t jm); INTERNAL_ABI void jobmgr_dispatch_all_semaphores(jobmgr_t jm); +void jobmgr_dispatch_all_interested(jobmgr_t jm, job_t j); INTERNAL_ABI jobmgr_t jobmgr_delete_anything_with_port(jobmgr_t jm, mach_port_t port); INTERNAL_ABI launch_data_t job_export_all(void); Modified: trunk/launchd/src/vproc_priv.h =================================================================== --- trunk/launchd/src/vproc_priv.h 2008-10-30 01:28:28 UTC (rev 23749) +++ trunk/launchd/src/vproc_priv.h 2008-11-06 23:52:32 UTC (rev 23750) @@ -27,6 +27,7 @@ #include #include #include +#include #ifndef VPROC_HAS_TRANSACTIONS #define VPROC_HAS_TRANSACTIONS @@ -56,7 +57,8 @@ VPROC_GSK_GLOBAL_LOG_MASK, VPROC_GSK_GLOBAL_UMASK, VPROC_GSK_ABANDON_PROCESS_GROUP, - VPROC_GSK_TRANSACTIONS_ENABLED + VPROC_GSK_TRANSACTIONS_ENABLED, + VPROC_GSK_WEIRD_BOOTSTRAP, } vproc_gsk_t; vproc_err_t vproc_swap_integer(vproc_t vp, vproc_gsk_t key, int64_t *inval, int64_t *outval); -------------- next part -------------- An HTML attachment was scrubbed... URL: From source_changes at macosforge.org Thu Nov 6 15:53:11 2008 From: source_changes at macosforge.org (source_changes at macosforge.org) Date: Thu, 6 Nov 2008 15:53:11 -0800 (PST) Subject: [launchd-changes] [23751] tags/launchd-289/ Message-ID: <20081106235311.9F3246348D7@beta.macosforge.org> Revision: 23751 http://trac.macosforge.org/projects/launchd/changeset/23751 Author: dsorresso at apple.com Date: 2008-11-06 15:53:11 -0800 (Thu, 06 Nov 2008) Log Message: ----------- "Tagging launchd-289 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-289/ Property changes on: tags/launchd-289 ___________________________________________________________________ Added: svn:ignore + build Added: svn:mergeinfo + /branches/PR-5092682:23731-23742 /branches/PR-5898404:23681-23700 /branches/PR-5978442:23651-23701 /branches/PR-6132016:23719-23738 -------------- next part -------------- An HTML attachment was scrubbed... URL: From source_changes at macosforge.org Mon Nov 10 13:29:44 2008 From: source_changes at macosforge.org (source_changes at macosforge.org) Date: Mon, 10 Nov 2008 13:29:44 -0800 (PST) Subject: [launchd-changes] [23752] trunk/launchd/src/launchctl.c Message-ID: <20081110212945.1548F677665@beta.macosforge.org> Revision: 23752 http://trac.macosforge.org/projects/launchd/changeset/23752 Author: dsorresso at apple.com Date: 2008-11-10 13:29:44 -0800 (Mon, 10 Nov 2008) Log Message: ----------- can't log into AFP OD account with launchd-289 Deactivated change for Background agents in home directory Modified Paths: -------------- trunk/launchd/src/launchctl.c Modified: trunk/launchd/src/launchctl.c =================================================================== --- trunk/launchd/src/launchctl.c 2008-11-06 23:53:11 UTC (rev 23751) +++ trunk/launchd/src/launchctl.c 2008-11-10 21:29:44 UTC (rev 23752) @@ -1635,9 +1635,11 @@ } else { char *load_launchd_items[] = { "load", "-S", session_type, "-D", "all", NULL, NULL, NULL, NULL, NULL, NULL }; int the_argc = 5; - + + /* char *load_launchd_items_user[] = { "load", "-S", session_type, "-D", "user", NULL }; int the_argc_user = 0; + */ if (is_safeboot()) { load_launchd_items[4] = "system"; @@ -1661,9 +1663,11 @@ * jobs in the local sessions may be responsible for mounting the home * directory. */ + /* if( getppid() != 1 ) { the_argc_user = 5; } + */ } } else if (strcasecmp(session_type, VPROCMGR_SESSION_AQUA) == 0) { load_launchd_items[5] = "/etc/mach_init_per_user.d"; @@ -1678,6 +1682,7 @@ } int retval = load_and_unload_cmd(the_argc, load_launchd_items); + #if 0 /* Maybe someday. */ if( retval == 0 && the_argc_user != 0 ) { optind = 1; /* Load user jobs. But first, we tell launchd to resume listening to @@ -1690,6 +1695,7 @@ retval = load_and_unload_cmd(the_argc_user, load_launchd_items_user); } } + #endif return retval; } -------------- next part -------------- An HTML attachment was scrubbed... URL: From source_changes at macosforge.org Mon Nov 10 13:30:04 2008 From: source_changes at macosforge.org (source_changes at macosforge.org) Date: Mon, 10 Nov 2008 13:30:04 -0800 (PST) Subject: [launchd-changes] [23753] tags/launchd-290/ Message-ID: <20081110213005.00EC367768A@beta.macosforge.org> Revision: 23753 http://trac.macosforge.org/projects/launchd/changeset/23753 Author: dsorresso at apple.com Date: 2008-11-10 13:30:04 -0800 (Mon, 10 Nov 2008) Log Message: ----------- "Tagging launchd-290 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-290/ Property changes on: tags/launchd-290 ___________________________________________________________________ Added: svn:ignore + build Added: svn:mergeinfo + /branches/PR-5092682:23731-23742 /branches/PR-5898404:23681-23700 /branches/PR-5978442:23651-23701 /branches/PR-6132016:23719-23738 -------------- next part -------------- An HTML attachment was scrubbed... URL: From source_changes at macosforge.org Sat Nov 22 14:31:21 2008 From: source_changes at macosforge.org (source_changes at macosforge.org) Date: Sat, 22 Nov 2008 14:31:21 -0800 (PST) Subject: [launchd-changes] [23754] trunk Message-ID: <20081122223122.4DD1B72FC24@beta.macosforge.org> Revision: 23754 http://trac.macosforge.org/projects/launchd/changeset/23754 Author: dsorresso at apple.com Date: 2008-11-22 14:31:20 -0800 (Sat, 22 Nov 2008) Log Message: ----------- launchd restarts user agent on log out/restart/shutdown 1/3rd fewer threads TASK: flatten per-user bootstrap namespaces Remove old bootstrap_set_policy() bits from launchd SnowLeopard: launchd_libs doesn't installhrds correctly calling exit() from a signal handler considered harmful SnowLeopard10A212: Shutdown was in a loop waiting for processes to stop Execution of rc.boot differs in Embedded and SnowLeopard launchd: using socket types requires sys/socket.h There's no _vproc_transaction_count_for_pid(), bootstrap_lookup_children(), etc. Removed INTERNAL_ABI. Overall fixes to internal shutdown path having to do with sampling. Shutdown should hang much less often now. Other assorted fixes. Modified Paths: -------------- trunk/launchd/src/bootstrap.h trunk/launchd/src/bootstrap_priv.h trunk/launchd/src/launch_priv.h 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/launchd_core_logic.h trunk/launchd/src/launchd_internal.defs trunk/launchd/src/launchd_ktrace.c trunk/launchd/src/launchd_ktrace.h trunk/launchd/src/launchd_mig_types.defs trunk/launchd/src/launchd_runtime.c trunk/launchd/src/launchd_runtime.h trunk/launchd/src/launchd_unix_ipc.c trunk/launchd/src/launchd_unix_ipc.h trunk/launchd/src/libbootstrap.c trunk/launchd/src/libvproc.c trunk/launchd/src/protocol_job_reply.defs trunk/launchd/src/protocol_vproc.defs trunk/launchd/src/vproc_priv.h trunk/launchd.xcodeproj/project.pbxproj Removed Paths: ------------- trunk/launchd/src/Makefile.am trunk/launchd/src/Makefile.in Deleted: trunk/launchd/src/Makefile.am =================================================================== --- trunk/launchd/src/Makefile.am 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/Makefile.am 2008-11-22 22:31:20 UTC (rev 23754) @@ -1,120 +0,0 @@ -CWARN = -Wall -Wextra -Waggregate-return -Wfloat-equal -Wshadow -Wpacked -Wmissing-prototypes -Wmissing-declarations -Werror -Wstrict-overflow=4 # -Wstrict-aliasing=2 -Wshorten-64-to-32 # -Wpadded -Wconversion -CTUNE = -fvisibility=hidden -freorder-blocks -fdiagnostics-show-option # -fstrict-aliasing -CMISC = -isysroot $(SDKROOT) -F$(SDKROOT)/System/Library/PrivateFrameworks -Dmig_external=__private_extern__ -D_DARWIN_USE_64_BIT_INODE=1 -AM_CFLAGS = $(CTUNE) $(CMISC) $(CWARN) -AM_LDFLAGS = -Wl,-syslibroot,$(SDKROOT) - -CLEANFILES = protocol_vproc.h protocol_vprocServer.c protocol_vprocUser.c protocol_vprocServer.h \ - launchd_internal.h launchd_internalServer.h launchd_internalServer.c launchd_internalUser.c \ - notifyServer.c notifyServer.h job_replyUser.c job_reply.h __version.c mach_excServer.c mach_excServer.h - -protocol_vproc.h protocol_vprocServer.c protocol_vprocUser.c protocol_vprocServer.h: $(srcdir)/protocol_job.defs - mig $(MIGFLAGS) -sheader protocol_vprocServer.h $(srcdir)/protocol_job.defs - -if LIBS_ONLY - -noinst_LIBRARIES = liblaunch.a liblaunch_profile.a - -liblaunch_a_CFLAGS = -D__DARWIN_NON_CANCELABLE=1 $(AM_CFLAGS) -liblaunch_a_SOURCES = liblaunch.c libvproc.c libbootstrap.c protocol_vprocUser.c launchd_ktrace.c __version.c - -liblaunch_profile_a_CFLAGS = -pg -D__DARWIN_NON_CANCELABLE=1 $(AM_CFLAGS) -liblaunch_profile_a_SOURCES = liblaunch.c libvproc.c libbootstrap.c protocol_vprocUser.c launchd_ktrace.c __version.c - -$(srcdir)/libvproc.c:: protocol_vproc.h - -$(srcdir)/protocol_vprocUser.c:: protocol_vproc.h - -__version.c: - /Developer/Makefiles/bin/version.pl launchd_libs > $@ - - -install-data-hook: - mkdir -p $(DESTDIR)/usr/local/lib/system - cp liblaunch.a $(DESTDIR)/usr/local/lib/system - cp liblaunch.a $(DESTDIR)/usr/local/lib/system/liblaunch_debug.a - cp liblaunch_profile.a $(DESTDIR)/usr/local/lib/system/liblaunch_profile.a - -else - -bin_PROGRAMS = launchctl wait4path -if DO_EMBEDDED_MAGIC -sbin_PROGRAMS = launchd -else -sbin_PROGRAMS = launchd SystemStarter -endif -libexec_PROGRAMS = launchproxy - -sysconf_DATA = hostconfig rc.common rc.netboot - -launchctl_CFLAGS = $(AM_CFLAGS) -isystem $(SDKROOT)/System/Library/Frameworks/System.framework/PrivateHeaders -launchctl_LDFLAGS = $(AM_LDFLAGS) -framework CoreFoundation -framework IOKit $(LIBS_SECURITY) -weak_library /usr/lib/libedit.dylib - -if DO_EMBEDDED_MAGIC -else -SystemStarter_CFLAGS = -mdynamic-no-pic $(AM_CFLAGS) -SystemStarter_LDFLAGS = $(AM_LDFLAGS) -framework CoreFoundation -framework IOKit -framework DiskArbitration -SystemStarter_SOURCES = StartupItems.c IPC.c SystemStarter.c -endif - -launchd_CFLAGS = -mdynamic-no-pic $(AM_CFLAGS) -launchd_LDFLAGS = $(AM_LDFLAGS) -lbsm -launchd_SOURCES = launchd.c launchd_core_logic.c launchd_unix_ipc.c protocol_vprocServer.c notifyServer.c launchd_internalUser.c launchd_internalServer.c job_replyUser.c launchd_runtime.c launchd_runtime_kill.c job_forwardUser.c mach_excServer.c launchd_ktrace.c - -launchd_runtime.c:: notifyServer.h launchd_internal.h mach_excServer.h -launchd_core_logic.c:: protocol_vproc.h job_reply.h protocol_vprocServer.h job_forward.h - -launchproxy_LDFLAGS = $(AM_LDFLAGS) $(LIBS_SECURITY) - -job_forwardUser.c job_forward.h: $(srcdir)/protocol_job_forward.defs - mig $(MIGFLAGS) -sheader /dev/null -server /dev/null $(srcdir)/protocol_job_forward.defs - -notifyServer.c notifyServer.h: /usr/include/mach/notify.defs - mig $(MIGFLAGS) -header /dev/null -user /dev/null -sheader notifyServer.h /usr/include/mach/notify.defs - -mach_excServer.c mach_excServer.h: /usr/include/mach/mach_exc.defs - mig $(MIGFLAGS) -header /dev/null -user /dev/null -sheader mach_excServer.h /usr/include/mach/mach_exc.defs - -job_replyUser.c job_reply.h: $(srcdir)/protocol_job_reply.defs - mig $(MIGFLAGS) -sheader /dev/null -server /dev/null $(srcdir)/protocol_job_reply.defs - -launchd_internal.h launchd_internalServer.c launchd_internalUser.c launchd_internalServer.h: $(srcdir)/launchd_internal.defs - mig $(MIGFLAGS) -sheader launchd_internalServer.h $(srcdir)/launchd_internal.defs - - -man1_MANS = wait4path.1 launchctl.1 - -man5_MANS = launchd.plist.5 launchd.conf.5 - -if DO_EMBEDDED_MAGIC -man8_MANS = launchd.8 launchproxy.8 -else -man8_MANS = StartupItemContext.8 SystemStarter.8 rc.8 launchd.8 launchproxy.8 -endif - -install-data-hook: - mkdir -p $(DESTDIR)/usr/libexec - mkdir -p $(DESTDIR)/usr/include/servers - mkdir -p $(DESTDIR)/usr/local/include - mkdir -p $(DESTDIR)/$(sysconfdir)/mach_init.d - mkdir -p $(DESTDIR)/$(sysconfdir)/mach_init_per_user.d - mkdir -p $(DESTDIR)/$(sysconfdir)/mach_init_per_login_session.d - mkdir -p $(DESTDIR)/Library/LaunchDaemons - mkdir -p $(DESTDIR)/Library/LaunchAgents - mkdir -p $(DESTDIR)/System/Library/LaunchAgents - mkdir -p $(DESTDIR)/System/Library/LaunchDaemons - cp $(srcdir)/liblaunch_public.h $(DESTDIR)/usr/include/launch.h - cp $(srcdir)/libvproc_public.h $(DESTDIR)/usr/include/vproc.h - cp $(srcdir)/libbootstrap_public.h $(DESTDIR)/usr/include/servers/bootstrap.h - cp $(srcdir)/libbootstrap_public.h $(DESTDIR)/usr/include/servers/bootstrap_defs.h - cp $(srcdir)/libbootstrap_private.h $(DESTDIR)/usr/local/include/bootstrap_priv.h - cp $(srcdir)/liblaunch_private.h $(DESTDIR)/usr/local/include/launch_priv.h - cp $(srcdir)/libvproc_private.h $(DESTDIR)/usr/local/include/vproc_priv.h - cp $(srcdir)/reboot2.h $(DESTDIR)/usr/local/include/reboot2.h -if DO_EMBEDDED_MAGIC -else - cp $(srcdir)/StartupItemContext $(DESTDIR)/usr/libexec - cp $(srcdir)/com.apple.SystemStarter.plist $(DESTDIR)/System/Library/LaunchDaemons -endif - -endif Deleted: trunk/launchd/src/Makefile.in =================================================================== --- trunk/launchd/src/Makefile.in 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/Makefile.in 2008-11-22 22:31:20 UTC (rev 23754) @@ -1,1283 +0,0 @@ -# Makefile.in generated by automake 1.10 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - at SET_MAKE@ - - - -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : - at LIBS_ONLY_FALSE@bin_PROGRAMS = launchctl$(EXEEXT) wait4path$(EXEEXT) - at DO_EMBEDDED_MAGIC_FALSE@@LIBS_ONLY_FALSE at sbin_PROGRAMS = \ - at DO_EMBEDDED_MAGIC_FALSE@@LIBS_ONLY_FALSE@ launchd$(EXEEXT) \ - at DO_EMBEDDED_MAGIC_FALSE@@LIBS_ONLY_FALSE@ SystemStarter$(EXEEXT) - at DO_EMBEDDED_MAGIC_TRUE@@LIBS_ONLY_FALSE at sbin_PROGRAMS = \ - at DO_EMBEDDED_MAGIC_TRUE@@LIBS_ONLY_FALSE@ launchd$(EXEEXT) - at LIBS_ONLY_FALSE@libexec_PROGRAMS = launchproxy$(EXEEXT) -subdir = src -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/config.h.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = config.h -CONFIG_CLEAN_FILES = -LIBRARIES = $(noinst_LIBRARIES) -AR = ar -ARFLAGS = cru -liblaunch_a_AR = $(AR) $(ARFLAGS) -liblaunch_a_LIBADD = -am__liblaunch_a_SOURCES_DIST = liblaunch.c libvproc.c libbootstrap.c \ - protocol_vprocUser.c launchd_ktrace.c __version.c - at LIBS_ONLY_TRUE@am_liblaunch_a_OBJECTS = \ - at LIBS_ONLY_TRUE@ liblaunch_a-liblaunch.$(OBJEXT) \ - at LIBS_ONLY_TRUE@ liblaunch_a-libvproc.$(OBJEXT) \ - at LIBS_ONLY_TRUE@ liblaunch_a-libbootstrap.$(OBJEXT) \ - at LIBS_ONLY_TRUE@ liblaunch_a-protocol_vprocUser.$(OBJEXT) \ - at LIBS_ONLY_TRUE@ liblaunch_a-launchd_ktrace.$(OBJEXT) \ - at LIBS_ONLY_TRUE@ liblaunch_a-__version.$(OBJEXT) -liblaunch_a_OBJECTS = $(am_liblaunch_a_OBJECTS) -liblaunch_profile_a_AR = $(AR) $(ARFLAGS) -liblaunch_profile_a_LIBADD = -am__liblaunch_profile_a_SOURCES_DIST = liblaunch.c libvproc.c \ - libbootstrap.c protocol_vprocUser.c launchd_ktrace.c \ - __version.c - at LIBS_ONLY_TRUE@am_liblaunch_profile_a_OBJECTS = \ - at LIBS_ONLY_TRUE@ liblaunch_profile_a-liblaunch.$(OBJEXT) \ - at LIBS_ONLY_TRUE@ liblaunch_profile_a-libvproc.$(OBJEXT) \ - at LIBS_ONLY_TRUE@ liblaunch_profile_a-libbootstrap.$(OBJEXT) \ - at LIBS_ONLY_TRUE@ liblaunch_profile_a-protocol_vprocUser.$(OBJEXT) \ - at LIBS_ONLY_TRUE@ liblaunch_profile_a-launchd_ktrace.$(OBJEXT) \ - at LIBS_ONLY_TRUE@ liblaunch_profile_a-__version.$(OBJEXT) -liblaunch_profile_a_OBJECTS = $(am_liblaunch_profile_a_OBJECTS) -am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" \ - "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man1dir)" \ - "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)" \ - "$(DESTDIR)$(sysconfdir)" -binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) -libexecPROGRAMS_INSTALL = $(INSTALL_PROGRAM) -sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM) -PROGRAMS = $(bin_PROGRAMS) $(libexec_PROGRAMS) $(sbin_PROGRAMS) -am__SystemStarter_SOURCES_DIST = StartupItems.c IPC.c SystemStarter.c - at DO_EMBEDDED_MAGIC_FALSE@@LIBS_ONLY_FALSE at am_SystemStarter_OBJECTS = SystemStarter-StartupItems.$(OBJEXT) \ - at DO_EMBEDDED_MAGIC_FALSE@@LIBS_ONLY_FALSE@ SystemStarter-IPC.$(OBJEXT) \ - at DO_EMBEDDED_MAGIC_FALSE@@LIBS_ONLY_FALSE@ SystemStarter-SystemStarter.$(OBJEXT) -SystemStarter_OBJECTS = $(am_SystemStarter_OBJECTS) -SystemStarter_LDADD = $(LDADD) -SystemStarter_LINK = $(CCLD) $(SystemStarter_CFLAGS) $(CFLAGS) \ - $(SystemStarter_LDFLAGS) $(LDFLAGS) -o $@ -launchctl_SOURCES = launchctl.c -launchctl_OBJECTS = launchctl-launchctl.$(OBJEXT) -launchctl_LDADD = $(LDADD) -launchctl_LINK = $(CCLD) $(launchctl_CFLAGS) $(CFLAGS) \ - $(launchctl_LDFLAGS) $(LDFLAGS) -o $@ -am__launchd_SOURCES_DIST = launchd.c launchd_core_logic.c \ - launchd_unix_ipc.c protocol_vprocServer.c notifyServer.c \ - launchd_internalUser.c launchd_internalServer.c \ - job_replyUser.c launchd_runtime.c launchd_runtime_kill.c \ - job_forwardUser.c mach_excServer.c launchd_ktrace.c - at LIBS_ONLY_FALSE@am_launchd_OBJECTS = launchd-launchd.$(OBJEXT) \ - at LIBS_ONLY_FALSE@ launchd-launchd_core_logic.$(OBJEXT) \ - at LIBS_ONLY_FALSE@ launchd-launchd_unix_ipc.$(OBJEXT) \ - at LIBS_ONLY_FALSE@ launchd-protocol_vprocServer.$(OBJEXT) \ - at LIBS_ONLY_FALSE@ launchd-notifyServer.$(OBJEXT) \ - at LIBS_ONLY_FALSE@ launchd-launchd_internalUser.$(OBJEXT) \ - at LIBS_ONLY_FALSE@ launchd-launchd_internalServer.$(OBJEXT) \ - at LIBS_ONLY_FALSE@ launchd-job_replyUser.$(OBJEXT) \ - at LIBS_ONLY_FALSE@ launchd-launchd_runtime.$(OBJEXT) \ - at LIBS_ONLY_FALSE@ launchd-launchd_runtime_kill.$(OBJEXT) \ - at LIBS_ONLY_FALSE@ launchd-job_forwardUser.$(OBJEXT) \ - at LIBS_ONLY_FALSE@ launchd-mach_excServer.$(OBJEXT) \ - at LIBS_ONLY_FALSE@ launchd-launchd_ktrace.$(OBJEXT) -launchd_OBJECTS = $(am_launchd_OBJECTS) -launchd_LDADD = $(LDADD) -launchd_LINK = $(CCLD) $(launchd_CFLAGS) $(CFLAGS) $(launchd_LDFLAGS) \ - $(LDFLAGS) -o $@ -launchproxy_SOURCES = launchproxy.c -launchproxy_OBJECTS = launchproxy.$(OBJEXT) -launchproxy_LDADD = $(LDADD) -launchproxy_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(launchproxy_LDFLAGS) $(LDFLAGS) -o $@ -wait4path_SOURCES = wait4path.c -wait4path_OBJECTS = wait4path.$(OBJEXT) -wait4path_LDADD = $(LDADD) -DEFAULT_INCLUDES = -I. at am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = $(liblaunch_a_SOURCES) $(liblaunch_profile_a_SOURCES) \ - $(SystemStarter_SOURCES) launchctl.c $(launchd_SOURCES) \ - launchproxy.c wait4path.c -DIST_SOURCES = $(am__liblaunch_a_SOURCES_DIST) \ - $(am__liblaunch_profile_a_SOURCES_DIST) \ - $(am__SystemStarter_SOURCES_DIST) launchctl.c \ - $(am__launchd_SOURCES_DIST) launchproxy.c wait4path.c -man1dir = $(mandir)/man1 -man5dir = $(mandir)/man5 -man8dir = $(mandir)/man8 -NROFF = nroff -MANS = $(man1_MANS) $(man5_MANS) $(man8_MANS) -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; -sysconfDATA_INSTALL = $(INSTALL_DATA) -DATA = $(sysconf_DATA) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -ALLOCA = @ALLOCA@ -AMTAR = @AMTAR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBS_SECURITY = @LIBS_SECURITY@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -WEAKLIBS_SECURITY = @WEAKLIBS_SECURITY@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build_alias = @build_alias@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host_alias = @host_alias@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -CWARN = -Wall -Wextra -Waggregate-return -Wfloat-equal -Wshadow -Wpacked -Wmissing-prototypes -Wmissing-declarations -Werror -Wstrict-overflow=4 # -Wstrict-aliasing=2 -Wshorten-64-to-32 # -Wpadded -Wconversion -CTUNE = -fvisibility=hidden -freorder-blocks -fdiagnostics-show-option # -fstrict-aliasing -CMISC = -isysroot $(SDKROOT) -F$(SDKROOT)/System/Library/PrivateFrameworks -Dmig_external=__private_extern__ -D_DARWIN_USE_64_BIT_INODE=1 -AM_CFLAGS = $(CTUNE) $(CMISC) $(CWARN) -AM_LDFLAGS = -Wl,-syslibroot,$(SDKROOT) -CLEANFILES = protocol_vproc.h protocol_vprocServer.c protocol_vprocUser.c protocol_vprocServer.h \ - launchd_internal.h launchd_internalServer.h launchd_internalServer.c launchd_internalUser.c \ - notifyServer.c notifyServer.h job_replyUser.c job_reply.h __version.c mach_excServer.c mach_excServer.h - - at LIBS_ONLY_TRUE@noinst_LIBRARIES = liblaunch.a liblaunch_profile.a - at LIBS_ONLY_TRUE@liblaunch_a_CFLAGS = -D__DARWIN_NON_CANCELABLE=1 $(AM_CFLAGS) - at LIBS_ONLY_TRUE@liblaunch_a_SOURCES = liblaunch.c libvproc.c libbootstrap.c protocol_vprocUser.c launchd_ktrace.c __version.c - at LIBS_ONLY_TRUE@liblaunch_profile_a_CFLAGS = -pg -D__DARWIN_NON_CANCELABLE=1 $(AM_CFLAGS) - at LIBS_ONLY_TRUE@liblaunch_profile_a_SOURCES = liblaunch.c libvproc.c libbootstrap.c protocol_vprocUser.c launchd_ktrace.c __version.c - at LIBS_ONLY_FALSE@sysconf_DATA = hostconfig rc.common rc.netboot - at LIBS_ONLY_FALSE@launchctl_CFLAGS = $(AM_CFLAGS) -isystem $(SDKROOT)/System/Library/Frameworks/System.framework/PrivateHeaders - at LIBS_ONLY_FALSE@launchctl_LDFLAGS = $(AM_LDFLAGS) -framework CoreFoundation -framework IOKit $(LIBS_SECURITY) -weak_library /usr/lib/libedit.dylib - at DO_EMBEDDED_MAGIC_FALSE@@LIBS_ONLY_FALSE at SystemStarter_CFLAGS = -mdynamic-no-pic $(AM_CFLAGS) - at DO_EMBEDDED_MAGIC_FALSE@@LIBS_ONLY_FALSE at SystemStarter_LDFLAGS = $(AM_LDFLAGS) -framework CoreFoundation -framework IOKit -framework DiskArbitration - at DO_EMBEDDED_MAGIC_FALSE@@LIBS_ONLY_FALSE at SystemStarter_SOURCES = StartupItems.c IPC.c SystemStarter.c - at LIBS_ONLY_FALSE@launchd_CFLAGS = -mdynamic-no-pic $(AM_CFLAGS) - at LIBS_ONLY_FALSE@launchd_LDFLAGS = $(AM_LDFLAGS) -lbsm - at LIBS_ONLY_FALSE@launchd_SOURCES = launchd.c launchd_core_logic.c launchd_unix_ipc.c protocol_vprocServer.c notifyServer.c launchd_internalUser.c launchd_internalServer.c job_replyUser.c launchd_runtime.c launchd_runtime_kill.c job_forwardUser.c mach_excServer.c launchd_ktrace.c - at LIBS_ONLY_FALSE@launchproxy_LDFLAGS = $(AM_LDFLAGS) $(LIBS_SECURITY) - at LIBS_ONLY_FALSE@man1_MANS = wait4path.1 launchctl.1 - at LIBS_ONLY_FALSE@man5_MANS = launchd.plist.5 launchd.conf.5 - at DO_EMBEDDED_MAGIC_FALSE@@LIBS_ONLY_FALSE at man8_MANS = StartupItemContext.8 SystemStarter.8 rc.8 launchd.8 launchproxy.8 - at DO_EMBEDDED_MAGIC_TRUE@@LIBS_ONLY_FALSE at man8_MANS = launchd.8 launchproxy.8 -all: config.h - $(MAKE) $(AM_MAKEFLAGS) all-am - -.SUFFIXES: -.SUFFIXES: .c .o .obj -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -config.h: stamp-h1 - @if test ! -f $@; then \ - rm -f stamp-h1; \ - $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ - else :; fi - -stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status - @rm -f stamp-h1 - cd $(top_builddir) && $(SHELL) ./config.status src/config.h -$(srcdir)/config.h.in: $(am__configure_deps) - cd $(top_srcdir) && $(AUTOHEADER) - rm -f stamp-h1 - touch $@ - -distclean-hdr: - -rm -f config.h stamp-h1 - -clean-noinstLIBRARIES: - -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -liblaunch.a: $(liblaunch_a_OBJECTS) $(liblaunch_a_DEPENDENCIES) - -rm -f liblaunch.a - $(liblaunch_a_AR) liblaunch.a $(liblaunch_a_OBJECTS) $(liblaunch_a_LIBADD) - $(RANLIB) liblaunch.a -liblaunch_profile.a: $(liblaunch_profile_a_OBJECTS) $(liblaunch_profile_a_DEPENDENCIES) - -rm -f liblaunch_profile.a - $(liblaunch_profile_a_AR) liblaunch_profile.a $(liblaunch_profile_a_OBJECTS) $(liblaunch_profile_a_LIBADD) - $(RANLIB) liblaunch_profile.a -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ - else :; fi; \ - done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ - done - -clean-binPROGRAMS: - -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) -install-libexecPROGRAMS: $(libexec_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)" - @list='$(libexec_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(libexecPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(libexecdir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(libexecPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(libexecdir)/$$f" || exit 1; \ - else :; fi; \ - done - -uninstall-libexecPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(libexec_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(libexecdir)/$$f'"; \ - rm -f "$(DESTDIR)$(libexecdir)/$$f"; \ - done - -clean-libexecPROGRAMS: - -test -z "$(libexec_PROGRAMS)" || rm -f $(libexec_PROGRAMS) -install-sbinPROGRAMS: $(sbin_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(sbindir)" || $(MKDIR_P) "$(DESTDIR)$(sbindir)" - @list='$(sbin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(sbindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(sbindir)/$$f" || exit 1; \ - else :; fi; \ - done - -uninstall-sbinPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(sbin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \ - rm -f "$(DESTDIR)$(sbindir)/$$f"; \ - done - -clean-sbinPROGRAMS: - -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) -SystemStarter$(EXEEXT): $(SystemStarter_OBJECTS) $(SystemStarter_DEPENDENCIES) - @rm -f SystemStarter$(EXEEXT) - $(SystemStarter_LINK) $(SystemStarter_OBJECTS) $(SystemStarter_LDADD) $(LIBS) -launchctl$(EXEEXT): $(launchctl_OBJECTS) $(launchctl_DEPENDENCIES) - @rm -f launchctl$(EXEEXT) - $(launchctl_LINK) $(launchctl_OBJECTS) $(launchctl_LDADD) $(LIBS) -launchd$(EXEEXT): $(launchd_OBJECTS) $(launchd_DEPENDENCIES) - @rm -f launchd$(EXEEXT) - $(launchd_LINK) $(launchd_OBJECTS) $(launchd_LDADD) $(LIBS) -launchproxy$(EXEEXT): $(launchproxy_OBJECTS) $(launchproxy_DEPENDENCIES) - @rm -f launchproxy$(EXEEXT) - $(launchproxy_LINK) $(launchproxy_OBJECTS) $(launchproxy_LDADD) $(LIBS) -wait4path$(EXEEXT): $(wait4path_OBJECTS) $(wait4path_DEPENDENCIES) - @rm -f wait4path$(EXEEXT) - $(LINK) $(wait4path_OBJECTS) $(wait4path_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/SystemStarter-IPC.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/SystemStarter-StartupItems.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/SystemStarter-SystemStarter.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/launchctl-launchctl.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/launchd-job_forwardUser.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/launchd-job_replyUser.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/launchd-launchd.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/launchd-launchd_core_logic.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/launchd-launchd_internalServer.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/launchd-launchd_internalUser.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/launchd-launchd_ktrace.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/launchd-launchd_runtime.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/launchd-launchd_runtime_kill.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/launchd-launchd_unix_ipc.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/launchd-mach_excServer.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/launchd-notifyServer.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/launchd-protocol_vprocServer.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/launchproxy.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liblaunch_a-__version.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liblaunch_a-launchd_ktrace.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liblaunch_a-libbootstrap.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liblaunch_a-liblaunch.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liblaunch_a-libvproc.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liblaunch_a-protocol_vprocUser.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liblaunch_profile_a-__version.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liblaunch_profile_a-launchd_ktrace.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liblaunch_profile_a-libbootstrap.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liblaunch_profile_a-liblaunch.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liblaunch_profile_a-libvproc.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/liblaunch_profile_a-protocol_vprocUser.Po at am__quote@ - at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/wait4path.Po at am__quote@ - -.c.o: - at am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(COMPILE) -c $< - -.c.obj: - at am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -liblaunch_a-liblaunch.o: liblaunch.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -MT liblaunch_a-liblaunch.o -MD -MP -MF $(DEPDIR)/liblaunch_a-liblaunch.Tpo -c -o liblaunch_a-liblaunch.o `test -f 'liblaunch.c' || echo '$(srcdir)/'`liblaunch.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_a-liblaunch.Tpo $(DEPDIR)/liblaunch_a-liblaunch.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='liblaunch.c' object='liblaunch_a-liblaunch.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -c -o liblaunch_a-liblaunch.o `test -f 'liblaunch.c' || echo '$(srcdir)/'`liblaunch.c - -liblaunch_a-liblaunch.obj: liblaunch.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -MT liblaunch_a-liblaunch.obj -MD -MP -MF $(DEPDIR)/liblaunch_a-liblaunch.Tpo -c -o liblaunch_a-liblaunch.obj `if test -f 'liblaunch.c'; then $(CYGPATH_W) 'liblaunch.c'; else $(CYGPATH_W) '$(srcdir)/liblaunch.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_a-liblaunch.Tpo $(DEPDIR)/liblaunch_a-liblaunch.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='liblaunch.c' object='liblaunch_a-liblaunch.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -c -o liblaunch_a-liblaunch.obj `if test -f 'liblaunch.c'; then $(CYGPATH_W) 'liblaunch.c'; else $(CYGPATH_W) '$(srcdir)/liblaunch.c'; fi` - -liblaunch_a-libvproc.o: libvproc.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -MT liblaunch_a-libvproc.o -MD -MP -MF $(DEPDIR)/liblaunch_a-libvproc.Tpo -c -o liblaunch_a-libvproc.o `test -f 'libvproc.c' || echo '$(srcdir)/'`libvproc.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_a-libvproc.Tpo $(DEPDIR)/liblaunch_a-libvproc.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libvproc.c' object='liblaunch_a-libvproc.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -c -o liblaunch_a-libvproc.o `test -f 'libvproc.c' || echo '$(srcdir)/'`libvproc.c - -liblaunch_a-libvproc.obj: libvproc.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -MT liblaunch_a-libvproc.obj -MD -MP -MF $(DEPDIR)/liblaunch_a-libvproc.Tpo -c -o liblaunch_a-libvproc.obj `if test -f 'libvproc.c'; then $(CYGPATH_W) 'libvproc.c'; else $(CYGPATH_W) '$(srcdir)/libvproc.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_a-libvproc.Tpo $(DEPDIR)/liblaunch_a-libvproc.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libvproc.c' object='liblaunch_a-libvproc.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -c -o liblaunch_a-libvproc.obj `if test -f 'libvproc.c'; then $(CYGPATH_W) 'libvproc.c'; else $(CYGPATH_W) '$(srcdir)/libvproc.c'; fi` - -liblaunch_a-libbootstrap.o: libbootstrap.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -MT liblaunch_a-libbootstrap.o -MD -MP -MF $(DEPDIR)/liblaunch_a-libbootstrap.Tpo -c -o liblaunch_a-libbootstrap.o `test -f 'libbootstrap.c' || echo '$(srcdir)/'`libbootstrap.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_a-libbootstrap.Tpo $(DEPDIR)/liblaunch_a-libbootstrap.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libbootstrap.c' object='liblaunch_a-libbootstrap.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -c -o liblaunch_a-libbootstrap.o `test -f 'libbootstrap.c' || echo '$(srcdir)/'`libbootstrap.c - -liblaunch_a-libbootstrap.obj: libbootstrap.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -MT liblaunch_a-libbootstrap.obj -MD -MP -MF $(DEPDIR)/liblaunch_a-libbootstrap.Tpo -c -o liblaunch_a-libbootstrap.obj `if test -f 'libbootstrap.c'; then $(CYGPATH_W) 'libbootstrap.c'; else $(CYGPATH_W) '$(srcdir)/libbootstrap.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_a-libbootstrap.Tpo $(DEPDIR)/liblaunch_a-libbootstrap.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libbootstrap.c' object='liblaunch_a-libbootstrap.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -c -o liblaunch_a-libbootstrap.obj `if test -f 'libbootstrap.c'; then $(CYGPATH_W) 'libbootstrap.c'; else $(CYGPATH_W) '$(srcdir)/libbootstrap.c'; fi` - -liblaunch_a-protocol_vprocUser.o: protocol_vprocUser.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -MT liblaunch_a-protocol_vprocUser.o -MD -MP -MF $(DEPDIR)/liblaunch_a-protocol_vprocUser.Tpo -c -o liblaunch_a-protocol_vprocUser.o `test -f 'protocol_vprocUser.c' || echo '$(srcdir)/'`protocol_vprocUser.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_a-protocol_vprocUser.Tpo $(DEPDIR)/liblaunch_a-protocol_vprocUser.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocol_vprocUser.c' object='liblaunch_a-protocol_vprocUser.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -c -o liblaunch_a-protocol_vprocUser.o `test -f 'protocol_vprocUser.c' || echo '$(srcdir)/'`protocol_vprocUser.c - -liblaunch_a-protocol_vprocUser.obj: protocol_vprocUser.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -MT liblaunch_a-protocol_vprocUser.obj -MD -MP -MF $(DEPDIR)/liblaunch_a-protocol_vprocUser.Tpo -c -o liblaunch_a-protocol_vprocUser.obj `if test -f 'protocol_vprocUser.c'; then $(CYGPATH_W) 'protocol_vprocUser.c'; else $(CYGPATH_W) '$(srcdir)/protocol_vprocUser.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_a-protocol_vprocUser.Tpo $(DEPDIR)/liblaunch_a-protocol_vprocUser.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocol_vprocUser.c' object='liblaunch_a-protocol_vprocUser.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -c -o liblaunch_a-protocol_vprocUser.obj `if test -f 'protocol_vprocUser.c'; then $(CYGPATH_W) 'protocol_vprocUser.c'; else $(CYGPATH_W) '$(srcdir)/protocol_vprocUser.c'; fi` - -liblaunch_a-launchd_ktrace.o: launchd_ktrace.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -MT liblaunch_a-launchd_ktrace.o -MD -MP -MF $(DEPDIR)/liblaunch_a-launchd_ktrace.Tpo -c -o liblaunch_a-launchd_ktrace.o `test -f 'launchd_ktrace.c' || echo '$(srcdir)/'`launchd_ktrace.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_a-launchd_ktrace.Tpo $(DEPDIR)/liblaunch_a-launchd_ktrace.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_ktrace.c' object='liblaunch_a-launchd_ktrace.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -c -o liblaunch_a-launchd_ktrace.o `test -f 'launchd_ktrace.c' || echo '$(srcdir)/'`launchd_ktrace.c - -liblaunch_a-launchd_ktrace.obj: launchd_ktrace.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -MT liblaunch_a-launchd_ktrace.obj -MD -MP -MF $(DEPDIR)/liblaunch_a-launchd_ktrace.Tpo -c -o liblaunch_a-launchd_ktrace.obj `if test -f 'launchd_ktrace.c'; then $(CYGPATH_W) 'launchd_ktrace.c'; else $(CYGPATH_W) '$(srcdir)/launchd_ktrace.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_a-launchd_ktrace.Tpo $(DEPDIR)/liblaunch_a-launchd_ktrace.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_ktrace.c' object='liblaunch_a-launchd_ktrace.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -c -o liblaunch_a-launchd_ktrace.obj `if test -f 'launchd_ktrace.c'; then $(CYGPATH_W) 'launchd_ktrace.c'; else $(CYGPATH_W) '$(srcdir)/launchd_ktrace.c'; fi` - -liblaunch_a-__version.o: __version.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -MT liblaunch_a-__version.o -MD -MP -MF $(DEPDIR)/liblaunch_a-__version.Tpo -c -o liblaunch_a-__version.o `test -f '__version.c' || echo '$(srcdir)/'`__version.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_a-__version.Tpo $(DEPDIR)/liblaunch_a-__version.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='__version.c' object='liblaunch_a-__version.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -c -o liblaunch_a-__version.o `test -f '__version.c' || echo '$(srcdir)/'`__version.c - -liblaunch_a-__version.obj: __version.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -MT liblaunch_a-__version.obj -MD -MP -MF $(DEPDIR)/liblaunch_a-__version.Tpo -c -o liblaunch_a-__version.obj `if test -f '__version.c'; then $(CYGPATH_W) '__version.c'; else $(CYGPATH_W) '$(srcdir)/__version.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_a-__version.Tpo $(DEPDIR)/liblaunch_a-__version.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='__version.c' object='liblaunch_a-__version.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_a_CFLAGS) $(CFLAGS) -c -o liblaunch_a-__version.obj `if test -f '__version.c'; then $(CYGPATH_W) '__version.c'; else $(CYGPATH_W) '$(srcdir)/__version.c'; fi` - -liblaunch_profile_a-liblaunch.o: liblaunch.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -MT liblaunch_profile_a-liblaunch.o -MD -MP -MF $(DEPDIR)/liblaunch_profile_a-liblaunch.Tpo -c -o liblaunch_profile_a-liblaunch.o `test -f 'liblaunch.c' || echo '$(srcdir)/'`liblaunch.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_profile_a-liblaunch.Tpo $(DEPDIR)/liblaunch_profile_a-liblaunch.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='liblaunch.c' object='liblaunch_profile_a-liblaunch.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -c -o liblaunch_profile_a-liblaunch.o `test -f 'liblaunch.c' || echo '$(srcdir)/'`liblaunch.c - -liblaunch_profile_a-liblaunch.obj: liblaunch.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -MT liblaunch_profile_a-liblaunch.obj -MD -MP -MF $(DEPDIR)/liblaunch_profile_a-liblaunch.Tpo -c -o liblaunch_profile_a-liblaunch.obj `if test -f 'liblaunch.c'; then $(CYGPATH_W) 'liblaunch.c'; else $(CYGPATH_W) '$(srcdir)/liblaunch.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_profile_a-liblaunch.Tpo $(DEPDIR)/liblaunch_profile_a-liblaunch.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='liblaunch.c' object='liblaunch_profile_a-liblaunch.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -c -o liblaunch_profile_a-liblaunch.obj `if test -f 'liblaunch.c'; then $(CYGPATH_W) 'liblaunch.c'; else $(CYGPATH_W) '$(srcdir)/liblaunch.c'; fi` - -liblaunch_profile_a-libvproc.o: libvproc.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -MT liblaunch_profile_a-libvproc.o -MD -MP -MF $(DEPDIR)/liblaunch_profile_a-libvproc.Tpo -c -o liblaunch_profile_a-libvproc.o `test -f 'libvproc.c' || echo '$(srcdir)/'`libvproc.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_profile_a-libvproc.Tpo $(DEPDIR)/liblaunch_profile_a-libvproc.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libvproc.c' object='liblaunch_profile_a-libvproc.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -c -o liblaunch_profile_a-libvproc.o `test -f 'libvproc.c' || echo '$(srcdir)/'`libvproc.c - -liblaunch_profile_a-libvproc.obj: libvproc.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -MT liblaunch_profile_a-libvproc.obj -MD -MP -MF $(DEPDIR)/liblaunch_profile_a-libvproc.Tpo -c -o liblaunch_profile_a-libvproc.obj `if test -f 'libvproc.c'; then $(CYGPATH_W) 'libvproc.c'; else $(CYGPATH_W) '$(srcdir)/libvproc.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_profile_a-libvproc.Tpo $(DEPDIR)/liblaunch_profile_a-libvproc.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libvproc.c' object='liblaunch_profile_a-libvproc.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -c -o liblaunch_profile_a-libvproc.obj `if test -f 'libvproc.c'; then $(CYGPATH_W) 'libvproc.c'; else $(CYGPATH_W) '$(srcdir)/libvproc.c'; fi` - -liblaunch_profile_a-libbootstrap.o: libbootstrap.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -MT liblaunch_profile_a-libbootstrap.o -MD -MP -MF $(DEPDIR)/liblaunch_profile_a-libbootstrap.Tpo -c -o liblaunch_profile_a-libbootstrap.o `test -f 'libbootstrap.c' || echo '$(srcdir)/'`libbootstrap.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_profile_a-libbootstrap.Tpo $(DEPDIR)/liblaunch_profile_a-libbootstrap.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libbootstrap.c' object='liblaunch_profile_a-libbootstrap.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -c -o liblaunch_profile_a-libbootstrap.o `test -f 'libbootstrap.c' || echo '$(srcdir)/'`libbootstrap.c - -liblaunch_profile_a-libbootstrap.obj: libbootstrap.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -MT liblaunch_profile_a-libbootstrap.obj -MD -MP -MF $(DEPDIR)/liblaunch_profile_a-libbootstrap.Tpo -c -o liblaunch_profile_a-libbootstrap.obj `if test -f 'libbootstrap.c'; then $(CYGPATH_W) 'libbootstrap.c'; else $(CYGPATH_W) '$(srcdir)/libbootstrap.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_profile_a-libbootstrap.Tpo $(DEPDIR)/liblaunch_profile_a-libbootstrap.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libbootstrap.c' object='liblaunch_profile_a-libbootstrap.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -c -o liblaunch_profile_a-libbootstrap.obj `if test -f 'libbootstrap.c'; then $(CYGPATH_W) 'libbootstrap.c'; else $(CYGPATH_W) '$(srcdir)/libbootstrap.c'; fi` - -liblaunch_profile_a-protocol_vprocUser.o: protocol_vprocUser.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -MT liblaunch_profile_a-protocol_vprocUser.o -MD -MP -MF $(DEPDIR)/liblaunch_profile_a-protocol_vprocUser.Tpo -c -o liblaunch_profile_a-protocol_vprocUser.o `test -f 'protocol_vprocUser.c' || echo '$(srcdir)/'`protocol_vprocUser.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_profile_a-protocol_vprocUser.Tpo $(DEPDIR)/liblaunch_profile_a-protocol_vprocUser.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocol_vprocUser.c' object='liblaunch_profile_a-protocol_vprocUser.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -c -o liblaunch_profile_a-protocol_vprocUser.o `test -f 'protocol_vprocUser.c' || echo '$(srcdir)/'`protocol_vprocUser.c - -liblaunch_profile_a-protocol_vprocUser.obj: protocol_vprocUser.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -MT liblaunch_profile_a-protocol_vprocUser.obj -MD -MP -MF $(DEPDIR)/liblaunch_profile_a-protocol_vprocUser.Tpo -c -o liblaunch_profile_a-protocol_vprocUser.obj `if test -f 'protocol_vprocUser.c'; then $(CYGPATH_W) 'protocol_vprocUser.c'; else $(CYGPATH_W) '$(srcdir)/protocol_vprocUser.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_profile_a-protocol_vprocUser.Tpo $(DEPDIR)/liblaunch_profile_a-protocol_vprocUser.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocol_vprocUser.c' object='liblaunch_profile_a-protocol_vprocUser.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -c -o liblaunch_profile_a-protocol_vprocUser.obj `if test -f 'protocol_vprocUser.c'; then $(CYGPATH_W) 'protocol_vprocUser.c'; else $(CYGPATH_W) '$(srcdir)/protocol_vprocUser.c'; fi` - -liblaunch_profile_a-launchd_ktrace.o: launchd_ktrace.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -MT liblaunch_profile_a-launchd_ktrace.o -MD -MP -MF $(DEPDIR)/liblaunch_profile_a-launchd_ktrace.Tpo -c -o liblaunch_profile_a-launchd_ktrace.o `test -f 'launchd_ktrace.c' || echo '$(srcdir)/'`launchd_ktrace.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_profile_a-launchd_ktrace.Tpo $(DEPDIR)/liblaunch_profile_a-launchd_ktrace.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_ktrace.c' object='liblaunch_profile_a-launchd_ktrace.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -c -o liblaunch_profile_a-launchd_ktrace.o `test -f 'launchd_ktrace.c' || echo '$(srcdir)/'`launchd_ktrace.c - -liblaunch_profile_a-launchd_ktrace.obj: launchd_ktrace.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -MT liblaunch_profile_a-launchd_ktrace.obj -MD -MP -MF $(DEPDIR)/liblaunch_profile_a-launchd_ktrace.Tpo -c -o liblaunch_profile_a-launchd_ktrace.obj `if test -f 'launchd_ktrace.c'; then $(CYGPATH_W) 'launchd_ktrace.c'; else $(CYGPATH_W) '$(srcdir)/launchd_ktrace.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_profile_a-launchd_ktrace.Tpo $(DEPDIR)/liblaunch_profile_a-launchd_ktrace.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_ktrace.c' object='liblaunch_profile_a-launchd_ktrace.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -c -o liblaunch_profile_a-launchd_ktrace.obj `if test -f 'launchd_ktrace.c'; then $(CYGPATH_W) 'launchd_ktrace.c'; else $(CYGPATH_W) '$(srcdir)/launchd_ktrace.c'; fi` - -liblaunch_profile_a-__version.o: __version.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -MT liblaunch_profile_a-__version.o -MD -MP -MF $(DEPDIR)/liblaunch_profile_a-__version.Tpo -c -o liblaunch_profile_a-__version.o `test -f '__version.c' || echo '$(srcdir)/'`__version.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_profile_a-__version.Tpo $(DEPDIR)/liblaunch_profile_a-__version.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='__version.c' object='liblaunch_profile_a-__version.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -c -o liblaunch_profile_a-__version.o `test -f '__version.c' || echo '$(srcdir)/'`__version.c - -liblaunch_profile_a-__version.obj: __version.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -MT liblaunch_profile_a-__version.obj -MD -MP -MF $(DEPDIR)/liblaunch_profile_a-__version.Tpo -c -o liblaunch_profile_a-__version.obj `if test -f '__version.c'; then $(CYGPATH_W) '__version.c'; else $(CYGPATH_W) '$(srcdir)/__version.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/liblaunch_profile_a-__version.Tpo $(DEPDIR)/liblaunch_profile_a-__version.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='__version.c' object='liblaunch_profile_a-__version.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblaunch_profile_a_CFLAGS) $(CFLAGS) -c -o liblaunch_profile_a-__version.obj `if test -f '__version.c'; then $(CYGPATH_W) '__version.c'; else $(CYGPATH_W) '$(srcdir)/__version.c'; fi` - -SystemStarter-StartupItems.o: StartupItems.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(SystemStarter_CFLAGS) $(CFLAGS) -MT SystemStarter-StartupItems.o -MD -MP -MF $(DEPDIR)/SystemStarter-StartupItems.Tpo -c -o SystemStarter-StartupItems.o `test -f 'StartupItems.c' || echo '$(srcdir)/'`StartupItems.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/SystemStarter-StartupItems.Tpo $(DEPDIR)/SystemStarter-StartupItems.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='StartupItems.c' object='SystemStarter-StartupItems.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(SystemStarter_CFLAGS) $(CFLAGS) -c -o SystemStarter-StartupItems.o `test -f 'StartupItems.c' || echo '$(srcdir)/'`StartupItems.c - -SystemStarter-StartupItems.obj: StartupItems.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(SystemStarter_CFLAGS) $(CFLAGS) -MT SystemStarter-StartupItems.obj -MD -MP -MF $(DEPDIR)/SystemStarter-StartupItems.Tpo -c -o SystemStarter-StartupItems.obj `if test -f 'StartupItems.c'; then $(CYGPATH_W) 'StartupItems.c'; else $(CYGPATH_W) '$(srcdir)/StartupItems.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/SystemStarter-StartupItems.Tpo $(DEPDIR)/SystemStarter-StartupItems.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='StartupItems.c' object='SystemStarter-StartupItems.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(SystemStarter_CFLAGS) $(CFLAGS) -c -o SystemStarter-StartupItems.obj `if test -f 'StartupItems.c'; then $(CYGPATH_W) 'StartupItems.c'; else $(CYGPATH_W) '$(srcdir)/StartupItems.c'; fi` - -SystemStarter-IPC.o: IPC.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(SystemStarter_CFLAGS) $(CFLAGS) -MT SystemStarter-IPC.o -MD -MP -MF $(DEPDIR)/SystemStarter-IPC.Tpo -c -o SystemStarter-IPC.o `test -f 'IPC.c' || echo '$(srcdir)/'`IPC.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/SystemStarter-IPC.Tpo $(DEPDIR)/SystemStarter-IPC.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='IPC.c' object='SystemStarter-IPC.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(SystemStarter_CFLAGS) $(CFLAGS) -c -o SystemStarter-IPC.o `test -f 'IPC.c' || echo '$(srcdir)/'`IPC.c - -SystemStarter-IPC.obj: IPC.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(SystemStarter_CFLAGS) $(CFLAGS) -MT SystemStarter-IPC.obj -MD -MP -MF $(DEPDIR)/SystemStarter-IPC.Tpo -c -o SystemStarter-IPC.obj `if test -f 'IPC.c'; then $(CYGPATH_W) 'IPC.c'; else $(CYGPATH_W) '$(srcdir)/IPC.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/SystemStarter-IPC.Tpo $(DEPDIR)/SystemStarter-IPC.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='IPC.c' object='SystemStarter-IPC.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(SystemStarter_CFLAGS) $(CFLAGS) -c -o SystemStarter-IPC.obj `if test -f 'IPC.c'; then $(CYGPATH_W) 'IPC.c'; else $(CYGPATH_W) '$(srcdir)/IPC.c'; fi` - -SystemStarter-SystemStarter.o: SystemStarter.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(SystemStarter_CFLAGS) $(CFLAGS) -MT SystemStarter-SystemStarter.o -MD -MP -MF $(DEPDIR)/SystemStarter-SystemStarter.Tpo -c -o SystemStarter-SystemStarter.o `test -f 'SystemStarter.c' || echo '$(srcdir)/'`SystemStarter.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/SystemStarter-SystemStarter.Tpo $(DEPDIR)/SystemStarter-SystemStarter.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='SystemStarter.c' object='SystemStarter-SystemStarter.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(SystemStarter_CFLAGS) $(CFLAGS) -c -o SystemStarter-SystemStarter.o `test -f 'SystemStarter.c' || echo '$(srcdir)/'`SystemStarter.c - -SystemStarter-SystemStarter.obj: SystemStarter.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(SystemStarter_CFLAGS) $(CFLAGS) -MT SystemStarter-SystemStarter.obj -MD -MP -MF $(DEPDIR)/SystemStarter-SystemStarter.Tpo -c -o SystemStarter-SystemStarter.obj `if test -f 'SystemStarter.c'; then $(CYGPATH_W) 'SystemStarter.c'; else $(CYGPATH_W) '$(srcdir)/SystemStarter.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/SystemStarter-SystemStarter.Tpo $(DEPDIR)/SystemStarter-SystemStarter.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='SystemStarter.c' object='SystemStarter-SystemStarter.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(SystemStarter_CFLAGS) $(CFLAGS) -c -o SystemStarter-SystemStarter.obj `if test -f 'SystemStarter.c'; then $(CYGPATH_W) 'SystemStarter.c'; else $(CYGPATH_W) '$(srcdir)/SystemStarter.c'; fi` - -launchctl-launchctl.o: launchctl.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchctl_CFLAGS) $(CFLAGS) -MT launchctl-launchctl.o -MD -MP -MF $(DEPDIR)/launchctl-launchctl.Tpo -c -o launchctl-launchctl.o `test -f 'launchctl.c' || echo '$(srcdir)/'`launchctl.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchctl-launchctl.Tpo $(DEPDIR)/launchctl-launchctl.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchctl.c' object='launchctl-launchctl.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchctl_CFLAGS) $(CFLAGS) -c -o launchctl-launchctl.o `test -f 'launchctl.c' || echo '$(srcdir)/'`launchctl.c - -launchctl-launchctl.obj: launchctl.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchctl_CFLAGS) $(CFLAGS) -MT launchctl-launchctl.obj -MD -MP -MF $(DEPDIR)/launchctl-launchctl.Tpo -c -o launchctl-launchctl.obj `if test -f 'launchctl.c'; then $(CYGPATH_W) 'launchctl.c'; else $(CYGPATH_W) '$(srcdir)/launchctl.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchctl-launchctl.Tpo $(DEPDIR)/launchctl-launchctl.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchctl.c' object='launchctl-launchctl.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchctl_CFLAGS) $(CFLAGS) -c -o launchctl-launchctl.obj `if test -f 'launchctl.c'; then $(CYGPATH_W) 'launchctl.c'; else $(CYGPATH_W) '$(srcdir)/launchctl.c'; fi` - -launchd-launchd.o: launchd.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-launchd.o -MD -MP -MF $(DEPDIR)/launchd-launchd.Tpo -c -o launchd-launchd.o `test -f 'launchd.c' || echo '$(srcdir)/'`launchd.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-launchd.Tpo $(DEPDIR)/launchd-launchd.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd.c' object='launchd-launchd.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-launchd.o `test -f 'launchd.c' || echo '$(srcdir)/'`launchd.c - -launchd-launchd.obj: launchd.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-launchd.obj -MD -MP -MF $(DEPDIR)/launchd-launchd.Tpo -c -o launchd-launchd.obj `if test -f 'launchd.c'; then $(CYGPATH_W) 'launchd.c'; else $(CYGPATH_W) '$(srcdir)/launchd.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-launchd.Tpo $(DEPDIR)/launchd-launchd.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd.c' object='launchd-launchd.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-launchd.obj `if test -f 'launchd.c'; then $(CYGPATH_W) 'launchd.c'; else $(CYGPATH_W) '$(srcdir)/launchd.c'; fi` - -launchd-launchd_core_logic.o: launchd_core_logic.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-launchd_core_logic.o -MD -MP -MF $(DEPDIR)/launchd-launchd_core_logic.Tpo -c -o launchd-launchd_core_logic.o `test -f 'launchd_core_logic.c' || echo '$(srcdir)/'`launchd_core_logic.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-launchd_core_logic.Tpo $(DEPDIR)/launchd-launchd_core_logic.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_core_logic.c' object='launchd-launchd_core_logic.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-launchd_core_logic.o `test -f 'launchd_core_logic.c' || echo '$(srcdir)/'`launchd_core_logic.c - -launchd-launchd_core_logic.obj: launchd_core_logic.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-launchd_core_logic.obj -MD -MP -MF $(DEPDIR)/launchd-launchd_core_logic.Tpo -c -o launchd-launchd_core_logic.obj `if test -f 'launchd_core_logic.c'; then $(CYGPATH_W) 'launchd_core_logic.c'; else $(CYGPATH_W) '$(srcdir)/launchd_core_logic.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-launchd_core_logic.Tpo $(DEPDIR)/launchd-launchd_core_logic.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_core_logic.c' object='launchd-launchd_core_logic.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-launchd_core_logic.obj `if test -f 'launchd_core_logic.c'; then $(CYGPATH_W) 'launchd_core_logic.c'; else $(CYGPATH_W) '$(srcdir)/launchd_core_logic.c'; fi` - -launchd-launchd_unix_ipc.o: launchd_unix_ipc.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-launchd_unix_ipc.o -MD -MP -MF $(DEPDIR)/launchd-launchd_unix_ipc.Tpo -c -o launchd-launchd_unix_ipc.o `test -f 'launchd_unix_ipc.c' || echo '$(srcdir)/'`launchd_unix_ipc.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-launchd_unix_ipc.Tpo $(DEPDIR)/launchd-launchd_unix_ipc.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_unix_ipc.c' object='launchd-launchd_unix_ipc.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-launchd_unix_ipc.o `test -f 'launchd_unix_ipc.c' || echo '$(srcdir)/'`launchd_unix_ipc.c - -launchd-launchd_unix_ipc.obj: launchd_unix_ipc.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-launchd_unix_ipc.obj -MD -MP -MF $(DEPDIR)/launchd-launchd_unix_ipc.Tpo -c -o launchd-launchd_unix_ipc.obj `if test -f 'launchd_unix_ipc.c'; then $(CYGPATH_W) 'launchd_unix_ipc.c'; else $(CYGPATH_W) '$(srcdir)/launchd_unix_ipc.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-launchd_unix_ipc.Tpo $(DEPDIR)/launchd-launchd_unix_ipc.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_unix_ipc.c' object='launchd-launchd_unix_ipc.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-launchd_unix_ipc.obj `if test -f 'launchd_unix_ipc.c'; then $(CYGPATH_W) 'launchd_unix_ipc.c'; else $(CYGPATH_W) '$(srcdir)/launchd_unix_ipc.c'; fi` - -launchd-protocol_vprocServer.o: protocol_vprocServer.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-protocol_vprocServer.o -MD -MP -MF $(DEPDIR)/launchd-protocol_vprocServer.Tpo -c -o launchd-protocol_vprocServer.o `test -f 'protocol_vprocServer.c' || echo '$(srcdir)/'`protocol_vprocServer.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-protocol_vprocServer.Tpo $(DEPDIR)/launchd-protocol_vprocServer.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocol_vprocServer.c' object='launchd-protocol_vprocServer.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-protocol_vprocServer.o `test -f 'protocol_vprocServer.c' || echo '$(srcdir)/'`protocol_vprocServer.c - -launchd-protocol_vprocServer.obj: protocol_vprocServer.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-protocol_vprocServer.obj -MD -MP -MF $(DEPDIR)/launchd-protocol_vprocServer.Tpo -c -o launchd-protocol_vprocServer.obj `if test -f 'protocol_vprocServer.c'; then $(CYGPATH_W) 'protocol_vprocServer.c'; else $(CYGPATH_W) '$(srcdir)/protocol_vprocServer.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-protocol_vprocServer.Tpo $(DEPDIR)/launchd-protocol_vprocServer.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='protocol_vprocServer.c' object='launchd-protocol_vprocServer.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-protocol_vprocServer.obj `if test -f 'protocol_vprocServer.c'; then $(CYGPATH_W) 'protocol_vprocServer.c'; else $(CYGPATH_W) '$(srcdir)/protocol_vprocServer.c'; fi` - -launchd-notifyServer.o: notifyServer.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-notifyServer.o -MD -MP -MF $(DEPDIR)/launchd-notifyServer.Tpo -c -o launchd-notifyServer.o `test -f 'notifyServer.c' || echo '$(srcdir)/'`notifyServer.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-notifyServer.Tpo $(DEPDIR)/launchd-notifyServer.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='notifyServer.c' object='launchd-notifyServer.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-notifyServer.o `test -f 'notifyServer.c' || echo '$(srcdir)/'`notifyServer.c - -launchd-notifyServer.obj: notifyServer.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-notifyServer.obj -MD -MP -MF $(DEPDIR)/launchd-notifyServer.Tpo -c -o launchd-notifyServer.obj `if test -f 'notifyServer.c'; then $(CYGPATH_W) 'notifyServer.c'; else $(CYGPATH_W) '$(srcdir)/notifyServer.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-notifyServer.Tpo $(DEPDIR)/launchd-notifyServer.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='notifyServer.c' object='launchd-notifyServer.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-notifyServer.obj `if test -f 'notifyServer.c'; then $(CYGPATH_W) 'notifyServer.c'; else $(CYGPATH_W) '$(srcdir)/notifyServer.c'; fi` - -launchd-launchd_internalUser.o: launchd_internalUser.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-launchd_internalUser.o -MD -MP -MF $(DEPDIR)/launchd-launchd_internalUser.Tpo -c -o launchd-launchd_internalUser.o `test -f 'launchd_internalUser.c' || echo '$(srcdir)/'`launchd_internalUser.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-launchd_internalUser.Tpo $(DEPDIR)/launchd-launchd_internalUser.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_internalUser.c' object='launchd-launchd_internalUser.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-launchd_internalUser.o `test -f 'launchd_internalUser.c' || echo '$(srcdir)/'`launchd_internalUser.c - -launchd-launchd_internalUser.obj: launchd_internalUser.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-launchd_internalUser.obj -MD -MP -MF $(DEPDIR)/launchd-launchd_internalUser.Tpo -c -o launchd-launchd_internalUser.obj `if test -f 'launchd_internalUser.c'; then $(CYGPATH_W) 'launchd_internalUser.c'; else $(CYGPATH_W) '$(srcdir)/launchd_internalUser.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-launchd_internalUser.Tpo $(DEPDIR)/launchd-launchd_internalUser.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_internalUser.c' object='launchd-launchd_internalUser.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-launchd_internalUser.obj `if test -f 'launchd_internalUser.c'; then $(CYGPATH_W) 'launchd_internalUser.c'; else $(CYGPATH_W) '$(srcdir)/launchd_internalUser.c'; fi` - -launchd-launchd_internalServer.o: launchd_internalServer.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-launchd_internalServer.o -MD -MP -MF $(DEPDIR)/launchd-launchd_internalServer.Tpo -c -o launchd-launchd_internalServer.o `test -f 'launchd_internalServer.c' || echo '$(srcdir)/'`launchd_internalServer.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-launchd_internalServer.Tpo $(DEPDIR)/launchd-launchd_internalServer.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_internalServer.c' object='launchd-launchd_internalServer.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-launchd_internalServer.o `test -f 'launchd_internalServer.c' || echo '$(srcdir)/'`launchd_internalServer.c - -launchd-launchd_internalServer.obj: launchd_internalServer.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-launchd_internalServer.obj -MD -MP -MF $(DEPDIR)/launchd-launchd_internalServer.Tpo -c -o launchd-launchd_internalServer.obj `if test -f 'launchd_internalServer.c'; then $(CYGPATH_W) 'launchd_internalServer.c'; else $(CYGPATH_W) '$(srcdir)/launchd_internalServer.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-launchd_internalServer.Tpo $(DEPDIR)/launchd-launchd_internalServer.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_internalServer.c' object='launchd-launchd_internalServer.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-launchd_internalServer.obj `if test -f 'launchd_internalServer.c'; then $(CYGPATH_W) 'launchd_internalServer.c'; else $(CYGPATH_W) '$(srcdir)/launchd_internalServer.c'; fi` - -launchd-job_replyUser.o: job_replyUser.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-job_replyUser.o -MD -MP -MF $(DEPDIR)/launchd-job_replyUser.Tpo -c -o launchd-job_replyUser.o `test -f 'job_replyUser.c' || echo '$(srcdir)/'`job_replyUser.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-job_replyUser.Tpo $(DEPDIR)/launchd-job_replyUser.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='job_replyUser.c' object='launchd-job_replyUser.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-job_replyUser.o `test -f 'job_replyUser.c' || echo '$(srcdir)/'`job_replyUser.c - -launchd-job_replyUser.obj: job_replyUser.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-job_replyUser.obj -MD -MP -MF $(DEPDIR)/launchd-job_replyUser.Tpo -c -o launchd-job_replyUser.obj `if test -f 'job_replyUser.c'; then $(CYGPATH_W) 'job_replyUser.c'; else $(CYGPATH_W) '$(srcdir)/job_replyUser.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-job_replyUser.Tpo $(DEPDIR)/launchd-job_replyUser.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='job_replyUser.c' object='launchd-job_replyUser.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-job_replyUser.obj `if test -f 'job_replyUser.c'; then $(CYGPATH_W) 'job_replyUser.c'; else $(CYGPATH_W) '$(srcdir)/job_replyUser.c'; fi` - -launchd-launchd_runtime.o: launchd_runtime.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-launchd_runtime.o -MD -MP -MF $(DEPDIR)/launchd-launchd_runtime.Tpo -c -o launchd-launchd_runtime.o `test -f 'launchd_runtime.c' || echo '$(srcdir)/'`launchd_runtime.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-launchd_runtime.Tpo $(DEPDIR)/launchd-launchd_runtime.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_runtime.c' object='launchd-launchd_runtime.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-launchd_runtime.o `test -f 'launchd_runtime.c' || echo '$(srcdir)/'`launchd_runtime.c - -launchd-launchd_runtime.obj: launchd_runtime.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-launchd_runtime.obj -MD -MP -MF $(DEPDIR)/launchd-launchd_runtime.Tpo -c -o launchd-launchd_runtime.obj `if test -f 'launchd_runtime.c'; then $(CYGPATH_W) 'launchd_runtime.c'; else $(CYGPATH_W) '$(srcdir)/launchd_runtime.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-launchd_runtime.Tpo $(DEPDIR)/launchd-launchd_runtime.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_runtime.c' object='launchd-launchd_runtime.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-launchd_runtime.obj `if test -f 'launchd_runtime.c'; then $(CYGPATH_W) 'launchd_runtime.c'; else $(CYGPATH_W) '$(srcdir)/launchd_runtime.c'; fi` - -launchd-launchd_runtime_kill.o: launchd_runtime_kill.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-launchd_runtime_kill.o -MD -MP -MF $(DEPDIR)/launchd-launchd_runtime_kill.Tpo -c -o launchd-launchd_runtime_kill.o `test -f 'launchd_runtime_kill.c' || echo '$(srcdir)/'`launchd_runtime_kill.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-launchd_runtime_kill.Tpo $(DEPDIR)/launchd-launchd_runtime_kill.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_runtime_kill.c' object='launchd-launchd_runtime_kill.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-launchd_runtime_kill.o `test -f 'launchd_runtime_kill.c' || echo '$(srcdir)/'`launchd_runtime_kill.c - -launchd-launchd_runtime_kill.obj: launchd_runtime_kill.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-launchd_runtime_kill.obj -MD -MP -MF $(DEPDIR)/launchd-launchd_runtime_kill.Tpo -c -o launchd-launchd_runtime_kill.obj `if test -f 'launchd_runtime_kill.c'; then $(CYGPATH_W) 'launchd_runtime_kill.c'; else $(CYGPATH_W) '$(srcdir)/launchd_runtime_kill.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-launchd_runtime_kill.Tpo $(DEPDIR)/launchd-launchd_runtime_kill.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_runtime_kill.c' object='launchd-launchd_runtime_kill.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-launchd_runtime_kill.obj `if test -f 'launchd_runtime_kill.c'; then $(CYGPATH_W) 'launchd_runtime_kill.c'; else $(CYGPATH_W) '$(srcdir)/launchd_runtime_kill.c'; fi` - -launchd-job_forwardUser.o: job_forwardUser.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-job_forwardUser.o -MD -MP -MF $(DEPDIR)/launchd-job_forwardUser.Tpo -c -o launchd-job_forwardUser.o `test -f 'job_forwardUser.c' || echo '$(srcdir)/'`job_forwardUser.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-job_forwardUser.Tpo $(DEPDIR)/launchd-job_forwardUser.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='job_forwardUser.c' object='launchd-job_forwardUser.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-job_forwardUser.o `test -f 'job_forwardUser.c' || echo '$(srcdir)/'`job_forwardUser.c - -launchd-job_forwardUser.obj: job_forwardUser.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-job_forwardUser.obj -MD -MP -MF $(DEPDIR)/launchd-job_forwardUser.Tpo -c -o launchd-job_forwardUser.obj `if test -f 'job_forwardUser.c'; then $(CYGPATH_W) 'job_forwardUser.c'; else $(CYGPATH_W) '$(srcdir)/job_forwardUser.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-job_forwardUser.Tpo $(DEPDIR)/launchd-job_forwardUser.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='job_forwardUser.c' object='launchd-job_forwardUser.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-job_forwardUser.obj `if test -f 'job_forwardUser.c'; then $(CYGPATH_W) 'job_forwardUser.c'; else $(CYGPATH_W) '$(srcdir)/job_forwardUser.c'; fi` - -launchd-mach_excServer.o: mach_excServer.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-mach_excServer.o -MD -MP -MF $(DEPDIR)/launchd-mach_excServer.Tpo -c -o launchd-mach_excServer.o `test -f 'mach_excServer.c' || echo '$(srcdir)/'`mach_excServer.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-mach_excServer.Tpo $(DEPDIR)/launchd-mach_excServer.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mach_excServer.c' object='launchd-mach_excServer.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-mach_excServer.o `test -f 'mach_excServer.c' || echo '$(srcdir)/'`mach_excServer.c - -launchd-mach_excServer.obj: mach_excServer.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-mach_excServer.obj -MD -MP -MF $(DEPDIR)/launchd-mach_excServer.Tpo -c -o launchd-mach_excServer.obj `if test -f 'mach_excServer.c'; then $(CYGPATH_W) 'mach_excServer.c'; else $(CYGPATH_W) '$(srcdir)/mach_excServer.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-mach_excServer.Tpo $(DEPDIR)/launchd-mach_excServer.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mach_excServer.c' object='launchd-mach_excServer.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-mach_excServer.obj `if test -f 'mach_excServer.c'; then $(CYGPATH_W) 'mach_excServer.c'; else $(CYGPATH_W) '$(srcdir)/mach_excServer.c'; fi` - -launchd-launchd_ktrace.o: launchd_ktrace.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-launchd_ktrace.o -MD -MP -MF $(DEPDIR)/launchd-launchd_ktrace.Tpo -c -o launchd-launchd_ktrace.o `test -f 'launchd_ktrace.c' || echo '$(srcdir)/'`launchd_ktrace.c - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-launchd_ktrace.Tpo $(DEPDIR)/launchd-launchd_ktrace.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_ktrace.c' object='launchd-launchd_ktrace.o' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-launchd_ktrace.o `test -f 'launchd_ktrace.c' || echo '$(srcdir)/'`launchd_ktrace.c - -launchd-launchd_ktrace.obj: launchd_ktrace.c - at am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -MT launchd-launchd_ktrace.obj -MD -MP -MF $(DEPDIR)/launchd-launchd_ktrace.Tpo -c -o launchd-launchd_ktrace.obj `if test -f 'launchd_ktrace.c'; then $(CYGPATH_W) 'launchd_ktrace.c'; else $(CYGPATH_W) '$(srcdir)/launchd_ktrace.c'; fi` - at am__fastdepCC_TRUE@ mv -f $(DEPDIR)/launchd-launchd_ktrace.Tpo $(DEPDIR)/launchd-launchd_ktrace.Po - at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='launchd_ktrace.c' object='launchd-launchd_ktrace.obj' libtool=no @AMDEPBACKSLASH@ - at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ - at am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(launchd_CFLAGS) $(CFLAGS) -c -o launchd-launchd_ktrace.obj `if test -f 'launchd_ktrace.c'; then $(CYGPATH_W) 'launchd_ktrace.c'; else $(CYGPATH_W) '$(srcdir)/launchd_ktrace.c'; fi` -install-man1: $(man1_MANS) $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" - @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ - else file=$$i; fi; \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 1*) ;; \ - *) ext='1' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ - done -uninstall-man1: - @$(NORMAL_UNINSTALL) - @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 1*) ;; \ - *) ext='1' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ - rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ - done -install-man5: $(man5_MANS) $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man5dir)" || $(MKDIR_P) "$(DESTDIR)$(man5dir)" - @list='$(man5_MANS) $(dist_man5_MANS) $(nodist_man5_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.5*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ - else file=$$i; fi; \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 5*) ;; \ - *) ext='5' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst"; \ - done -uninstall-man5: - @$(NORMAL_UNINSTALL) - @list='$(man5_MANS) $(dist_man5_MANS) $(nodist_man5_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.5*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 5*) ;; \ - *) ext='5' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " rm -f '$(DESTDIR)$(man5dir)/$$inst'"; \ - rm -f "$(DESTDIR)$(man5dir)/$$inst"; \ - done -install-man8: $(man8_MANS) $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)" - @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.8*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ - else file=$$i; fi; \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 8*) ;; \ - *) ext='8' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst"; \ - done -uninstall-man8: - @$(NORMAL_UNINSTALL) - @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.8*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 8*) ;; \ - *) ext='8' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " rm -f '$(DESTDIR)$(man8dir)/$$inst'"; \ - rm -f "$(DESTDIR)$(man8dir)/$$inst"; \ - done -install-sysconfDATA: $(sysconf_DATA) - @$(NORMAL_INSTALL) - test -z "$(sysconfdir)" || $(MKDIR_P) "$(DESTDIR)$(sysconfdir)" - @list='$(sysconf_DATA)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f=$(am__strip_dir) \ - echo " $(sysconfDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(sysconfdir)/$$f'"; \ - $(sysconfDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(sysconfdir)/$$f"; \ - done - -uninstall-sysconfDATA: - @$(NORMAL_UNINSTALL) - @list='$(sysconf_DATA)'; for p in $$list; do \ - f=$(am__strip_dir) \ - echo " rm -f '$(DESTDIR)$(sysconfdir)/$$f'"; \ - rm -f "$(DESTDIR)$(sysconfdir)/$$f"; \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(MANS) $(DATA) config.h -installdirs: - for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(sysconfdir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-binPROGRAMS clean-generic clean-libexecPROGRAMS \ - clean-noinstLIBRARIES clean-sbinPROGRAMS mostlyclean-am - -distclean: distclean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-hdr distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: install-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook - -install-dvi: install-dvi-am - -install-exec-am: install-binPROGRAMS install-libexecPROGRAMS \ - install-sbinPROGRAMS install-sysconfDATA - -install-html: install-html-am - -install-info: install-info-am - -install-man: install-man1 install-man5 install-man8 - -install-pdf: install-pdf-am - -install-ps: install-ps-am - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-binPROGRAMS uninstall-libexecPROGRAMS \ - uninstall-man uninstall-sbinPROGRAMS uninstall-sysconfDATA - -uninstall-man: uninstall-man1 uninstall-man5 uninstall-man8 - -.MAKE: install-am install-data-am install-strip - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ - clean-generic clean-libexecPROGRAMS clean-noinstLIBRARIES \ - clean-sbinPROGRAMS ctags distclean distclean-compile \ - distclean-generic distclean-hdr distclean-tags distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-binPROGRAMS install-data install-data-am \ - install-data-hook install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-libexecPROGRAMS install-man \ - install-man1 install-man5 install-man8 install-pdf \ - install-pdf-am install-ps install-ps-am install-sbinPROGRAMS \ - install-strip install-sysconfDATA installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ - ps ps-am tags uninstall uninstall-am uninstall-binPROGRAMS \ - uninstall-libexecPROGRAMS uninstall-man uninstall-man1 \ - uninstall-man5 uninstall-man8 uninstall-sbinPROGRAMS \ - uninstall-sysconfDATA - - -protocol_vproc.h protocol_vprocServer.c protocol_vprocUser.c protocol_vprocServer.h: $(srcdir)/protocol_job.defs - mig $(MIGFLAGS) -sheader protocol_vprocServer.h $(srcdir)/protocol_job.defs - - at LIBS_ONLY_TRUE@$(srcdir)/libvproc.c:: protocol_vproc.h - - at LIBS_ONLY_TRUE@$(srcdir)/protocol_vprocUser.c:: protocol_vproc.h - - at LIBS_ONLY_TRUE@__version.c: - at LIBS_ONLY_TRUE@ /Developer/Makefiles/bin/version.pl launchd_libs > $@ - - at LIBS_ONLY_TRUE@install-data-hook: - at LIBS_ONLY_TRUE@ mkdir -p $(DESTDIR)/usr/local/lib/system - at LIBS_ONLY_TRUE@ cp liblaunch.a $(DESTDIR)/usr/local/lib/system - at LIBS_ONLY_TRUE@ cp liblaunch.a $(DESTDIR)/usr/local/lib/system/liblaunch_debug.a - at LIBS_ONLY_TRUE@ cp liblaunch_profile.a $(DESTDIR)/usr/local/lib/system/liblaunch_profile.a - - at LIBS_ONLY_FALSE@launchd_runtime.c:: notifyServer.h launchd_internal.h mach_excServer.h - at LIBS_ONLY_FALSE@launchd_core_logic.c:: protocol_vproc.h job_reply.h protocol_vprocServer.h job_forward.h - - at LIBS_ONLY_FALSE@job_forwardUser.c job_forward.h: $(srcdir)/protocol_job_forward.defs - at LIBS_ONLY_FALSE@ mig $(MIGFLAGS) -sheader /dev/null -server /dev/null $(srcdir)/protocol_job_forward.defs - - at LIBS_ONLY_FALSE@notifyServer.c notifyServer.h: /usr/include/mach/notify.defs - at LIBS_ONLY_FALSE@ mig $(MIGFLAGS) -header /dev/null -user /dev/null -sheader notifyServer.h /usr/include/mach/notify.defs - - at LIBS_ONLY_FALSE@mach_excServer.c mach_excServer.h: /usr/include/mach/mach_exc.defs - at LIBS_ONLY_FALSE@ mig $(MIGFLAGS) -header /dev/null -user /dev/null -sheader mach_excServer.h /usr/include/mach/mach_exc.defs - - at LIBS_ONLY_FALSE@job_replyUser.c job_reply.h: $(srcdir)/protocol_job_reply.defs - at LIBS_ONLY_FALSE@ mig $(MIGFLAGS) -sheader /dev/null -server /dev/null $(srcdir)/protocol_job_reply.defs - - at LIBS_ONLY_FALSE@launchd_internal.h launchd_internalServer.c launchd_internalUser.c launchd_internalServer.h: $(srcdir)/launchd_internal.defs - at LIBS_ONLY_FALSE@ mig $(MIGFLAGS) -sheader launchd_internalServer.h $(srcdir)/launchd_internal.defs - - at LIBS_ONLY_FALSE@install-data-hook: - at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/usr/libexec - at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/usr/include/servers - at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/usr/local/include - at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/$(sysconfdir)/mach_init.d - at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/$(sysconfdir)/mach_init_per_user.d - at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/$(sysconfdir)/mach_init_per_login_session.d - at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/Library/LaunchDaemons - at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/Library/LaunchAgents - at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/System/Library/LaunchAgents - at LIBS_ONLY_FALSE@ mkdir -p $(DESTDIR)/System/Library/LaunchDaemons - at LIBS_ONLY_FALSE@ cp $(srcdir)/liblaunch_public.h $(DESTDIR)/usr/include/launch.h - at LIBS_ONLY_FALSE@ cp $(srcdir)/libvproc_public.h $(DESTDIR)/usr/include/vproc.h - at LIBS_ONLY_FALSE@ cp $(srcdir)/libbootstrap_public.h $(DESTDIR)/usr/include/servers/bootstrap.h - at LIBS_ONLY_FALSE@ cp $(srcdir)/libbootstrap_public.h $(DESTDIR)/usr/include/servers/bootstrap_defs.h - at LIBS_ONLY_FALSE@ cp $(srcdir)/libbootstrap_private.h $(DESTDIR)/usr/local/include/bootstrap_priv.h - at LIBS_ONLY_FALSE@ cp $(srcdir)/liblaunch_private.h $(DESTDIR)/usr/local/include/launch_priv.h - at LIBS_ONLY_FALSE@ cp $(srcdir)/libvproc_private.h $(DESTDIR)/usr/local/include/vproc_priv.h - at LIBS_ONLY_FALSE@ cp $(srcdir)/reboot2.h $(DESTDIR)/usr/local/include/reboot2.h - at DO_EMBEDDED_MAGIC_FALSE@@LIBS_ONLY_FALSE@ cp $(srcdir)/StartupItemContext $(DESTDIR)/usr/libexec - at DO_EMBEDDED_MAGIC_FALSE@@LIBS_ONLY_FALSE@ cp $(srcdir)/com.apple.SystemStarter.plist $(DESTDIR)/System/Library/LaunchDaemons -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: Modified: trunk/launchd/src/bootstrap.h =================================================================== --- trunk/launchd/src/bootstrap.h 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/bootstrap.h 2008-11-22 22:31:20 UTC (rev 23754) @@ -96,18 +96,21 @@ typedef name_t *name_array_t; typedef int bootstrap_status_t; typedef bootstrap_status_t *bootstrap_status_array_t; +typedef unsigned int bootstrap_property_t; +typedef bootstrap_property_t * bootstrap_property_array_t; typedef boolean_t *bool_array_t; #define BOOTSTRAP_MAX_LOOKUP_COUNT 20 -#define BOOTSTRAP_SUCCESS 0 +#define BOOTSTRAP_SUCCESS 0 #define BOOTSTRAP_NOT_PRIVILEGED 1100 #define BOOTSTRAP_NAME_IN_USE 1101 #define BOOTSTRAP_UNKNOWN_SERVICE 1102 #define BOOTSTRAP_SERVICE_ACTIVE 1103 -#define BOOTSTRAP_BAD_COUNT 1104 -#define BOOTSTRAP_NO_MEMORY 1105 +#define BOOTSTRAP_BAD_COUNT 1104 +#define BOOTSTRAP_NO_MEMORY 1105 +#define BOOTSTRAP_NO_CHILDREN 1106 #define BOOTSTRAP_STATUS_INACTIVE 0 #define BOOTSTRAP_STATUS_ACTIVE 1 Modified: trunk/launchd/src/bootstrap_priv.h =================================================================== --- trunk/launchd/src/bootstrap_priv.h 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/bootstrap_priv.h 2008-11-22 22:31:20 UTC (rev 23754) @@ -32,6 +32,9 @@ #define BOOTSTRAP_DENY_JOB_CREATION 0x4 #define BOOTSTRAP_PRIVILEGED_SERVER 0x8 +#define BOOTSTRAP_PROPERTY_SUBSET 1 << 1 +#define BOOTSTRAP_PROPERTY_PERUSER 1 << 2 + kern_return_t bootstrap_register2(mach_port_t bp, name_t service_name, mach_port_t sp, uint64_t flags); kern_return_t bootstrap_look_up2(mach_port_t bp, const name_t service_name, mach_port_t *sp, pid_t target_pid, uint64_t flags); @@ -40,7 +43,7 @@ kern_return_t bootstrap_look_up_per_user(mach_port_t bp, const name_t service_name, uid_t target_user, mach_port_t *sp); -kern_return_t bootstrap_set_policy(mach_port_t bp, pid_t target_pid, uint64_t flags, const char *target_service); +kern_return_t bootstrap_lookup_children(mach_port_t bp, mach_port_array_t *children, name_array_t *names, bootstrap_property_array_t *properties, mach_msg_type_number_t *n_children); #pragma GCC visibility pop Modified: trunk/launchd/src/launch_priv.h =================================================================== --- trunk/launchd/src/launch_priv.h 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/launch_priv.h 2008-11-22 22:31:20 UTC (rev 23754) @@ -64,6 +64,7 @@ #define LAUNCH_JOBKEY_MACH_TASKSPECIALPORT "TaskSpecialPort" #define LAUNCH_JOBKEY_MACH_HOSTSPECIALPORT "HostSpecialPort" #define LAUNCH_JOBKEY_MACH_ENTERKERNELDEBUGGERONCLOSE "EnterKernelDebuggerOnClose" +#define LAUNCH_JOBKEY_MACH_DRAINMESSAGESONCRASH "DrainMessagesOnCrash" typedef struct _launch *launch_t; Modified: trunk/launchd/src/launchctl.c =================================================================== --- trunk/launchd/src/launchctl.c 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/launchctl.c 2008-11-22 22:31:20 UTC (rev 23754) @@ -26,6 +26,7 @@ #include "vproc.h" #include "vproc_priv.h" #include "vproc_internal.h" +#include "bootstrap_priv.h" #include #include @@ -184,7 +185,10 @@ static int umask_cmd(int argc, char *const argv[]); static int getrusage_cmd(int argc, char *const argv[]); static int bsexec_cmd(int argc, char *const argv[]); +static int _bslist_cmd(mach_port_t bport, unsigned int depth); static int bslist_cmd(int argc, char *const argv[]); +static int _bstree_cmd(mach_port_t bsport, unsigned int depth); +static int bstree_cmd(int argc __attribute__((unused)), char * const argv[] __attribute__((unused))); static int exit_cmd(int argc, char *const argv[]) __attribute__((noreturn)); static int help_cmd(int argc, char *const argv[]); @@ -217,6 +221,7 @@ { "umask", umask_cmd, "Change launchd's umask" }, { "bsexec", bsexec_cmd, "Execute a process within a different Mach bootstrap subset" }, { "bslist", bslist_cmd, "List Mach bootstrap services and optional servers" }, + { "bstree", bstree_cmd, "Show the entire Mach bootstrap tree. Requires root privileges." }, { "exit", exit_cmd, "Exit the interactive invocation of launchctl" }, { "quit", exit_cmd, "Quit the interactive invocation of launchctl" }, { "help", help_cmd, "This help output" }, @@ -1398,7 +1403,7 @@ exit_at_sigterm(int sig) { if( sig == SIGTERM ) { - exit(EXIT_SUCCESS); + _exit(EXIT_SUCCESS); } } @@ -1429,6 +1434,13 @@ apply_sysctls_from_file("/etc/sysctl.conf"); +#if TARGET_OS_EMBEDDED + if (path_check("/etc/rc.boot")) { + const char *rcboot_tool[] = { "/etc/rc.boot", NULL }; + assumes(fwexec(rcboot_tool, NULL) != -1); + } +#endif + if (path_check("/etc/rc.cdrom")) { const char *rccdrom_tool[] = { _PATH_BSHELL, "/etc/rc.cdrom", "multiuser", NULL }; @@ -1454,13 +1466,6 @@ assumes(fwexec(rcserver_tool, NULL) != -1); } -#if TARGET_OS_EMBEDDED - if (path_check("/etc/rc.boot")) { - const char *rcboot_tool[] = { "/etc/rc.boot", NULL }; - assumes(fwexec(rcboot_tool, true) != -1); - } -#endif - read_launchd_conf(); if (path_check("/var/account/acct")) { @@ -1635,11 +1640,9 @@ } else { char *load_launchd_items[] = { "load", "-S", session_type, "-D", "all", NULL, NULL, NULL, NULL, NULL, NULL }; int the_argc = 5; - - /* + char *load_launchd_items_user[] = { "load", "-S", session_type, "-D", "user", NULL }; int the_argc_user = 0; - */ if (is_safeboot()) { load_launchd_items[4] = "system"; @@ -1656,6 +1659,7 @@ load_launchd_items[the_argc] = "/etc/mach_init_per_login_session.d"; the_argc += 1; } else { + #if 0 /* If we're a per-user launchd initializing our Background session, * don't forget about the user's launchd jobs that may be specified as * LimitLoadToSessionType = Background. We also @@ -1663,15 +1667,31 @@ * jobs in the local sessions may be responsible for mounting the home * directory. */ - /* if( getppid() != 1 ) { + #else + /* This deadlocks against mount_url when logging in with a network home + * directory. For now, we'll just load user Background agents when + * bootstrapping the Aqua or StandardIO sessions. This way, we can + * safely assume that the home directory is present. Yes it's a hack, + * but it satisfies the user expectation in 99% of cases. + */ + if( 0 ) { + #endif the_argc_user = 5; } - */ } } else if (strcasecmp(session_type, VPROCMGR_SESSION_AQUA) == 0) { load_launchd_items[5] = "/etc/mach_init_per_user.d"; the_argc += 1; + /* If we're bootstrapping the Aqua session, bootstrap the user's Background + * agents. + */ + the_argc_user = 5; + } else if (strcasecmp(session_type, VPROCMGR_SESSION_AQUA) == 0) { + /* If we're bootstrapping the StandardIO session, bootstrap the user's Background + * agents. + */ + the_argc_user = 5; } if (strcasecmp(session_type, VPROCMGR_SESSION_BACKGROUND) == 0) { @@ -1682,20 +1702,17 @@ } int retval = load_and_unload_cmd(the_argc, load_launchd_items); - #if 0 /* Maybe someday. */ if( retval == 0 && the_argc_user != 0 ) { optind = 1; - /* Load user jobs. But first, we tell launchd to resume listening to - * other clients, since this operation could potentially block if the user's - * home directory is on a network volume or something. - */ - int64_t junk = 0; - vproc_err_t err = vproc_swap_integer(NULL, VPROC_GSK_WEIRD_BOOTSTRAP, &junk, NULL); - if( !err ) { - retval = load_and_unload_cmd(the_argc_user, load_launchd_items_user); + pid_t p = getpid(); + if( sysctlbyname("vfs.generic.noremotehang", NULL, NULL, &p, sizeof(p)) == 0 ) { + int64_t junk = 0; + vproc_err_t err = vproc_swap_integer(NULL, VPROC_GSK_WEIRD_BOOTSTRAP, &junk, NULL); + if( !err ) { + retval = load_and_unload_cmd(the_argc_user, load_launchd_items_user); + } } } - #endif return retval; } @@ -2608,6 +2625,8 @@ return 1; } } while (getrootbs && last_bport != bport); + } else if( strcmp(s, "0") == 0 || strcmp(s, "NULL") == 0 ) { + bport = MACH_PORT_NULL; } else { int pid = atoi(s); @@ -2661,37 +2680,101 @@ } int -bslist_cmd(int argc, char *const argv[]) +_bslist_cmd(mach_port_t bport, unsigned int depth) { kern_return_t result; - mach_port_t bport = bootstrap_port; name_array_t service_names; mach_msg_type_number_t service_cnt, service_active_cnt; bootstrap_status_array_t service_actives; unsigned int i; - - if (argc == 2) - bport = str2bsport(argv[1]); - + if (bport == MACH_PORT_NULL) { fprintf(stderr, "Invalid bootstrap port\n"); return 1; } - + result = bootstrap_info(bport, &service_names, &service_cnt, &service_actives, &service_active_cnt); if (result != BOOTSTRAP_SUCCESS) { fprintf(stderr, "bootstrap_info(): %d\n", result); return 1; } + + #define bport_state(x) (((x) == BOOTSTRAP_STATUS_ACTIVE) ? "A" : ((x) == BOOTSTRAP_STATUS_ON_DEMAND) ? "D" : "I") + + for (i = 0; i < service_cnt ; i++) { + fprintf(stdout, "%*s%-3s%s\n", depth, "", bport_state((service_actives[i])), service_names[i]); + } + + return 0; +} -#define bport_state(x) (((x) == BOOTSTRAP_STATUS_ACTIVE) ? "A" : ((x) == BOOTSTRAP_STATUS_ON_DEMAND) ? "D" : "I") +int +bslist_cmd(int argc, char *const argv[]) +{ + mach_port_t bport = bootstrap_port; + if( argc == 2 ) { + bport = str2bsport(argv[1]); + } + + if( bport == MACH_PORT_NULL ) { + fprintf(stderr, "Invalid bootstrap port\n"); + return 1; + } + + return _bslist_cmd(bport, 0); +} - for (i = 0; i < service_cnt ; i++) - fprintf(stdout, "%-3s%s\n", bport_state((service_actives[i])), service_names[i]); +int +_bstree_cmd(mach_port_t bsport, unsigned int depth) +{ + if( bsport == MACH_PORT_NULL ) { + fprintf(stderr, "No root port!\n"); + return 1; + } + + mach_port_array_t child_ports = NULL; + name_array_t child_names = NULL; + bootstrap_property_array_t child_props = NULL; + unsigned int cnt = 0; + + kern_return_t kr = bootstrap_lookup_children(bsport, &child_ports, &child_names, &child_props, (mach_msg_type_number_t *)&cnt); + if( kr != BOOTSTRAP_SUCCESS && kr != BOOTSTRAP_NO_CHILDREN ) { + if( kr == BOOTSTRAP_NOT_PRIVILEGED ) { + fprintf(stderr, "You must be root to perform this operation.\n"); + } else { + fprintf(stderr, "bootstrap_lookup_children(): %d\n", kr); + } + return 1; + } + + unsigned int i = 0; + _bslist_cmd(bsport, depth); + + for( i = 0; i < cnt; i++ ) { + char *type = ( child_props[i] & BOOTSTRAP_PROPERTY_PERUSER ) ? "Per-user" : "Subset"; + fprintf(stdout, "%*s%s (%s)/\n", depth, "", child_names[i], type); + if( child_ports[i] != MACH_PORT_NULL ) { + _bstree_cmd(child_ports[i], depth + 4); + } + } + return 0; } +int +bstree_cmd(int argc __attribute__((unused)), char * const argv[] __attribute__((unused))) +{ + if( geteuid() != 0 ) { + fprintf(stderr, "You must be root to perform this operation.\n"); + return 1; + } else { + fprintf(stdout, "System/\n"); + } + + return _bstree_cmd(str2bsport("/"), 4); +} + bool is_legacy_mach_job(launch_data_t obj) { Modified: trunk/launchd/src/launchd.c =================================================================== --- trunk/launchd/src/launchd.c 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/launchd.c 2008-11-22 22:31:20 UTC (rev 23754) @@ -68,6 +68,7 @@ #include #include #include +#include #include "bootstrap.h" #include "vproc.h" @@ -84,7 +85,7 @@ extern char **environ; -INTERNAL_ABI static void pfsystem_callback(void *, struct kevent *); +static void pfsystem_callback(void *, struct kevent *); static kq_callback kqpfsystem_callback = pfsystem_callback; @@ -296,7 +297,7 @@ } -INTERNAL_ABI int +int _fd(int fd) { if (fd >= 0) { @@ -305,7 +306,7 @@ return fd; } -INTERNAL_ABI void +void launchd_shutdown(void) { int64_t now; @@ -336,7 +337,7 @@ launchd_assert(jobmgr_shutdown(root_jobmgr) != NULL); } -INTERNAL_ABI void +void launchd_single_user(void) { runtime_syslog(LOG_NOTICE, "Going to single-user mode"); @@ -350,7 +351,7 @@ runtime_kill(-1, SIGKILL); } -INTERNAL_ABI void +void launchd_SessionCreate(void) { #if HAVE_SECURITY @@ -443,7 +444,7 @@ launchd_assumes(kevent_mod(pfs, EVFILT_READ, EV_ADD, 0, 0, &kqpfsystem_callback) != -1); } -INTERNAL_ABI void +void pfsystem_callback(void *obj __attribute__((unused)), struct kevent *kev) { bool new_networking_state; @@ -459,7 +460,7 @@ } } -INTERNAL_ABI void +void _log_launchd_bug(const char *rcs_rev, const char *path, unsigned int line, const char *test) { int saved_errno = errno; Modified: trunk/launchd/src/launchd.h =================================================================== --- trunk/launchd/src/launchd.h 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/launchd.h 2008-11-22 22:31:20 UTC (rev 23754) @@ -35,16 +35,16 @@ extern bool g_force_old_kill_path; extern FILE *g_console; -INTERNAL_ABI bool init_check_pid(pid_t); +bool init_check_pid(pid_t); -INTERNAL_ABI launch_data_t launchd_setstdio(int d, launch_data_t o); -INTERNAL_ABI void launchd_SessionCreate(void); -INTERNAL_ABI void launchd_shutdown(void); -INTERNAL_ABI void launchd_single_user(void); +launch_data_t launchd_setstdio(int d, launch_data_t o); +void launchd_SessionCreate(void); +void launchd_shutdown(void); +void launchd_single_user(void); boolean_t launchd_mach_ipc_demux(mach_msg_header_t *Request, mach_msg_header_t *Reply); -INTERNAL_ABI void mach_start_shutdown(void); +void mach_start_shutdown(void); -INTERNAL_ABI int _fd(int fd); +int _fd(int fd); #endif Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/launchd_core_logic.c 2008-11-22 22:31:20 UTC (rev 23754) @@ -99,6 +99,7 @@ #include "protocol_vprocServer.h" #include "protocol_job_reply.h" #include "protocol_job_forward.h" +#include "mach_excServer.h" /* * LAUNCHD_SAMPLE_TIMEOUT @@ -148,12 +149,22 @@ SLIST_ENTRY(machservice) special_port_sle; LIST_ENTRY(machservice) name_hash_sle; LIST_ENTRY(machservice) port_hash_sle; - job_t job; + job_t job; unsigned int gen_num; mach_port_name_t port; - unsigned int isActive:1, reset:1, recv:1, hide:1, - kUNCServer:1, per_user_hack:1, debug_on_close:1, per_pid:1, - delete_on_destruction:1, special_port_num:23; + unsigned int isActive :1, + reset :1, + recv :1, + hide :1, + kUNCServer :1, + per_user_hack :1, + debug_on_close :1, + per_pid :1, + delete_on_destruction :1, + drain_one :1, + drain_all :1, + special_port_num :22; + const char name[0]; }; @@ -178,6 +189,7 @@ static bool machservice_active(struct machservice *); static const char *machservice_name(struct machservice *); static bootstrap_status_t machservice_status(struct machservice *); +void machservice_drain_port(struct machservice *); struct socketgroup { SLIST_ENTRY(socketgroup) sle; @@ -285,6 +297,7 @@ #define ACTIVE_JOB_HASH_SIZE 32 #define ACTIVE_JOB_HASH(x) (IS_POWER_OF_TWO(ACTIVE_JOB_HASH_SIZE) ? (x & (ACTIVE_JOB_HASH_SIZE - 1)) : (x % ACTIVE_JOB_HASH_SIZE)) + #define MACHSERVICE_HASH_SIZE 37 struct jobmgr_s { @@ -295,7 +308,7 @@ LIST_HEAD(, job_s) active_jobs[ACTIVE_JOB_HASH_SIZE]; LIST_HEAD(, machservice) ms_hash[MACHSERVICE_HASH_SIZE]; LIST_HEAD(, job_s) global_env_jobs; - LIST_HEAD(, job_s) pending_samples; + STAILQ_HEAD(, job_s) pending_samples; mach_port_t jm_port; mach_port_t req_port; jobmgr_t parentmgr; @@ -310,7 +323,7 @@ killed_hopefully_first_jobs :1, killed_normal_jobs :1, killed_hopefully_last_jobs :1, - __junk :25; + created_via_subset :1; char sample_log_file[PATH_MAX]; union { const char name[0]; @@ -333,11 +346,12 @@ static void jobmgr_dispatch_all(jobmgr_t jm, bool newmounthack); static void jobmgr_dequeue_next_sample(jobmgr_t jm); static job_t jobmgr_init_session(jobmgr_t jm, const char *session_type, bool sflag); +static job_t jobmgr_find_by_pid_deep(jobmgr_t jm, pid_t p); static job_t jobmgr_find_by_pid(jobmgr_t jm, pid_t p, bool create_anon); static jobmgr_t jobmgr_find_by_name(jobmgr_t jm, const char *where); static job_t job_mig_intran2(jobmgr_t jm, mach_port_t mport, pid_t upid); static void job_export_all2(jobmgr_t jm, launch_data_t where); -INTERNAL_ABI static void jobmgr_callback(void *obj, struct kevent *kev); +static void jobmgr_callback(void *obj, struct kevent *kev); static void jobmgr_setup_env_from_other_jobs(jobmgr_t jm); static void jobmgr_export_env_from_other_jobs(jobmgr_t jm, launch_data_t dict); static struct machservice *jobmgr_lookup_service(jobmgr_t jm, const char *name, bool check_parent, pid_t target_pid); @@ -354,7 +368,7 @@ LIST_ENTRY(job_s) pid_hash_sle; LIST_ENTRY(job_s) label_hash_sle; LIST_ENTRY(job_s) global_env_sle; - LIST_ENTRY(job_s) pending_samples_sle; + STAILQ_ENTRY(job_s) pending_samples_sle; SLIST_ENTRY(job_s) curious_jobs_sle; SLIST_HEAD(, socketgroup) sockets; SLIST_HEAD(, calendarinterval) cal_intervals; @@ -459,7 +473,9 @@ pending_sample :1, /* This job needs to be sampled for some reason. */ kill_after_sample :1, /* The job is to be killed after sampling. */ reap_after_sample :1, /* The job exited before sample did, so we should reap it after sample is done. */ - nosy :1; /* The job has an OtherJobEnabled KeepAlive criterion. */ + nosy :1, /* The job has an OtherJobEnabled KeepAlive criterion. */ + crashed :1, /* The job is the default Mach exception handler, and it crashed. */ + reaped :1; /* We've received NOTE_EXIT for the job. */ mode_t mask; pid_t sample_pid; const char label[0]; @@ -502,11 +518,8 @@ #endif static void job_postfork_test_user(job_t j); static void job_log_pids_with_weird_uids(job_t j); -#if 0 -static void job_force_sampletool(job_t j); -#endif static void job_setup_exception_port(job_t j, task_t target_task); -INTERNAL_ABI static void job_callback(void *obj, struct kevent *kev); +static void job_callback(void *obj, struct kevent *kev); static void job_callback_proc(job_t j, struct kevent *kev); static void job_callback_timer(job_t j, void *ident); static void job_callback_read(job_t j, int ident); @@ -549,7 +562,6 @@ /* miscellaneous file local functions */ static size_t get_kern_max_proc(void); -static void ensure_root_bkgd_setup(void); static int dir_has_files(job_t j, const char *path); static char **mach_cmd2argv(const char *string); static size_t our_strhash(const char *s) __attribute__((pure)); @@ -563,7 +575,6 @@ static mach_port_t the_exception_server; static bool did_first_per_user_launchd_BootCache_hack; #define JOB_BOOTCACHE_HACK_CHECK(j) (unlikely(j->per_user && !did_first_per_user_launchd_BootCache_hack && (j->mach_uid >= 500) && (j->mach_uid != (uid_t)-2))) -static jobmgr_t background_jobmgr; static job_t workaround_5477111; /* process wide globals */ @@ -631,7 +642,7 @@ } } -INTERNAL_ABI void +void job_stop(job_t j) { char extralog[100]; @@ -696,7 +707,7 @@ } } -INTERNAL_ABI launch_data_t +launch_data_t job_export(job_t j) { launch_data_t tmp, tmp2, tmp3, r = launch_data_alloc(LAUNCH_DATA_DICTIONARY); @@ -846,7 +857,7 @@ } -INTERNAL_ABI static void +static void jobmgr_still_alive_with_check(jobmgr_t jm) { jobmgr_log(jm, LOG_NOTICE | LOG_CONSOLE, "Still alive with %lu/%lu (normal/anonymous) children", total_children, total_anon_children); @@ -927,7 +938,7 @@ runtime_closelog(); /* hack to flush logs */ } -INTERNAL_ABI jobmgr_t +jobmgr_t jobmgr_shutdown(jobmgr_t jm) { jobmgr_t jmi, jmn; @@ -991,10 +1002,6 @@ jobmgr_assumes(jm, launchd_mport_close_recv(jm->jm_port) == KERN_SUCCESS); } - if (jm == background_jobmgr) { - background_jobmgr = NULL; - } - if (jm->parentmgr) { runtime_del_weak_ref(); SLIST_REMOVE(&jm->parentmgr->submgrs, jm, jobmgr_s, sle); @@ -1017,7 +1024,7 @@ free(jm); } -INTERNAL_ABI void +void job_remove(job_t j, bool force) { struct waiting_for_removal *w4r; @@ -1028,7 +1035,7 @@ struct limititem *li; struct mspolicy *msp; struct envitem *ei; - + if (unlikely(j->p)) { if (j->anonymous) { job_reap(j); @@ -1534,7 +1541,7 @@ return NULL; } -INTERNAL_ABI job_t +job_t job_import(launch_data_t pload) { job_t j = jobmgr_import2(root_jobmgr, pload); @@ -1547,7 +1554,7 @@ return job_dispatch(j, false); } -INTERNAL_ABI launch_data_t +launch_data_t job_import_bulk(launch_data_t pload) { launch_data_t resp = launch_data_alloc(LAUNCH_DATA_ARRAY); @@ -2246,7 +2253,7 @@ return true; } -INTERNAL_ABI job_t +job_t job_find(const char *label) { job_t ji; @@ -2265,7 +2272,28 @@ return NULL; } +/* Should try and consolidate with job_mig_intran2() and jobmgr_find_by_pid(). */ job_t +jobmgr_find_by_pid_deep(jobmgr_t jm, pid_t p) +{ + job_t ji = NULL; + LIST_FOREACH( ji, &jm->active_jobs[ACTIVE_JOB_HASH(p)], pid_hash_sle ) { + if (ji->p == p && !ji->anonymous) { + return ji; + } + } + + jobmgr_t jmi = NULL; + SLIST_FOREACH( jmi, &jm->submgrs, sle ) { + if( (ji = jobmgr_find_by_pid_deep(jmi, p)) ) { + break; + } + } + + return ji; +} + +job_t jobmgr_find_by_pid(jobmgr_t jm, pid_t p, bool create_anon) { job_t ji; @@ -2306,7 +2334,7 @@ return NULL; } -INTERNAL_ABI job_t +job_t job_mig_intran(mach_port_t p) { struct ldcred *ldc = runtime_get_caller_creds(); @@ -2331,7 +2359,7 @@ return jr; } -INTERNAL_ABI job_t +job_t job_find_by_service_port(mach_port_t p) { struct machservice *ms; @@ -2345,7 +2373,7 @@ return NULL; } -INTERNAL_ABI void +void job_mig_destructor(job_t j) { /* @@ -2383,7 +2411,7 @@ } } -INTERNAL_ABI launch_data_t +launch_data_t job_export_all(void) { launch_data_t resp = launch_data_alloc(LAUNCH_DATA_DICTIONARY); @@ -2526,6 +2554,12 @@ j->wait_reply_port = MACH_PORT_NULL; } + if( j->pending_sample ) { + job_log(j, LOG_NOTICE | LOG_CONSOLE, "Job exited before we could sample it."); + STAILQ_REMOVE(&j->mgr->pending_samples, j, job_s, pending_samples_sle); + j->pending_sample = false; + } + if (j->sent_signal_time) { uint64_t td_sec, td_usec, td = runtime_get_nanoseconds_since(j->sent_signal_time); @@ -2561,10 +2595,39 @@ if (SIGKILL == s || SIGTERM == s) { job_log(j, LOG_NOTICE, "Exited: %s", strsignal(s)); } else { - job_log(j, LOG_WARNING, "Exited abnormally: %s", strsignal(s)); + switch( s ) { + /* Signals which indicate a crash. */ + case SIGILL : + case SIGABRT : + case SIGFPE : + case SIGBUS : + case SIGSEGV : + case SIGSYS : + /* If the kernel has posted NOTE_EXIT and the signal sent to the process was + * SIGTRAP, assume that it's a crash. + */ + case SIGTRAP : + j->crashed = true; + job_log(j, LOG_WARNING, "Job appears to have crashed: %s", strsignal(s)); + break; + default : + job_log(j, LOG_WARNING, "Exited abnormally: %s", strsignal(s)); + break; + } } } + j->reaped = true; + + struct machservice *msi = NULL; + if( j->crashed ) { + SLIST_FOREACH( msi, &j->machservices, sle ) { + if( !msi->isActive && (msi->drain_one || msi->drain_all) ) { + machservice_drain_port(msi); + } + } + } + if (j->hopefully_exits_first) { j->mgr->hopefully_first_cnt--; } else if (!j->anonymous && !j->hopefully_exits_last) { @@ -2612,13 +2675,13 @@ void jobmgr_dequeue_next_sample(jobmgr_t jm) { - if( LIST_EMPTY(&jm->pending_samples) ) { + if( STAILQ_EMPTY(&jm->pending_samples) ) { jobmgr_log(jm, LOG_DEBUG | LOG_CONSOLE, "Sample queue is empty."); return; } /* Dequeue the next in line. */ - job_t j = LIST_FIRST(&jm->pending_samples); + job_t j = STAILQ_FIRST(&jm->pending_samples); if( j->sample_pid ) { job_log(j, LOG_DEBUG | LOG_CONSOLE, "Sampling is in progress. Not dequeuing next job."); return; @@ -2642,27 +2705,32 @@ snprintf(pidstr, sizeof(pidstr), "%u", j->p); snprintf(j->mgr->sample_log_file, sizeof(j->mgr->sample_log_file), SHUTDOWN_LOG_DIR "/%s-%u.sample.txt", j->label, j->p); job_log(j, LOG_DEBUG | LOG_CONSOLE, "Going to write sample to %s.", j->mgr->sample_log_file); - exception_mask_t exceptions = EXC_MASK_BAD_ACCESS | - EXC_MASK_BAD_INSTRUCTION | - EXC_MASK_ARITHMETIC | - EXC_MASK_CRASH ; if (job_assumes(j, unlink(jm->sample_log_file) != -1 || errno == ENOENT)) { pid_t sp = 0; char *sample_args[] = { "/usr/bin/sample", pidstr, "1", "-unsupportedShowArch", "-mayDie", "-file", j->mgr->sample_log_file, NULL }; + thread_state_flavor_t f = 0; + #if defined (__ppc__) || defined(__ppc64__) + f = PPC_THREAD_STATE64; + #elif defined(__i386__) || defined(__x86_64__) + f = x86_THREAD_STATE; + #elif defined(__arm__) + f = ARM_THREAD_STATE; + #else + #error "unknown architecture" + #endif + #if NEEDS_MULTI_THREADED_EXEC posix_spawnattr_t psattr; posix_spawnattr_init(psattr); - posix_spawnattr_setexceptionports_np(&psattr, exceptions, MACH_PORT_NULL, EXCEPTION_DEFAULT, 0); + posix_spawnattr_setexceptionports_np(&psattr, EXC_MASK_CRASH, runtime_get_kernel_port(), EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES , f); if (!job_assumes(j, (errno = posix_spawnp(&sp, sample_args[0], NULL, &psattr, sample_args, environ)) == 0)) { - job_log(j, LOG_ERR | LOG_CONSOLE, "Sampling failed for job! Kill it! Kill it with fire!"); - LIST_REMOVE(j, pending_samples_sle); - job_kill(j); + job_log(j, LOG_ERR | LOG_CONSOLE, "Sampling for job failed!"); + STAILQ_REMOVE(&jm->pending_samples, j, job_s, pending_samples_sle); jobmgr_dequeue_next_sample(jm); } else { j->sample_pid = sp; - j->pending_sample = false; /* Let us know when sample is done. ONESHOT is implicit if we're just interested in NOTE_EXIT. */ job_assumes(j, kevent_mod(sp, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, j) != -1); @@ -2672,8 +2740,8 @@ #else switch( (sp = vfork()) ) { case 0 : - /* Neuter the exception port so that crashes don't hang sample, making it unreapable. */ - task_set_exception_ports(mach_task_self(), exceptions, MACH_PORT_NULL, EXCEPTION_DEFAULT, 0); + /* Handle sample's exceptions directly, since ReportCrash may not be able to. */ + task_set_exception_ports(mach_task_self(), EXC_MASK_CRASH, runtime_get_kernel_port(), EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES, f); execve(sample_args[0], sample_args, environ); job_log(j, LOG_NOTICE | LOG_CONSOLE, "Could not exec(2): %d", errno); _exit(EXIT_FAILURE); @@ -2686,18 +2754,20 @@ if( sp != -1 ) { j->sample_pid = sp; - j->pending_sample = false; /* Let us know when sample is done. ONESHOT is implicit if we're just interested in NOTE_EXIT. */ job_assumes(j, kevent_mod(sp, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, j) != -1); } else { - job_log(j, LOG_ERR | LOG_CONSOLE, "Sampling failed for job! Kill it! Kill it with fire!"); - LIST_REMOVE(j, pending_samples_sle); - job_kill(j); + job_log(j, LOG_ERR | LOG_CONSOLE, "Sampling for job failed!"); + STAILQ_REMOVE(&jm->pending_samples, j, job_s, pending_samples_sle); jobmgr_dequeue_next_sample(jm); } #endif + } else { + STAILQ_REMOVE(&jm->pending_samples, j, job_s, pending_samples_sle); } + + j->pending_sample = false; } void @@ -2718,7 +2788,7 @@ } } -INTERNAL_ABI job_t +job_t job_dispatch(job_t j, bool kickstart) { /* @@ -2871,62 +2941,15 @@ void job_reap_sample(job_t j) { - char *contents = NULL; int wstatus = 0; - int logfile_fd = -1; if (!job_assumes(j, waitpid(j->sample_pid, &wstatus, 0) != -1)) { goto out; } - /* - * This won't work if the VFS or filesystems are sick: - * sync(); - */ - - if (!job_assumes(j, WIFEXITED(wstatus) && WEXITSTATUS(wstatus) == 0)) { - goto out; - } - - /* Echo our sample file contents to the console. */ - if (!job_assumes(j, (logfile_fd = open(root_jobmgr->sample_log_file, O_RDONLY|O_NOCTTY)) != -1)) { - job_log(j, LOG_NOTICE | LOG_CONSOLE, "No sample present at %s.", j->mgr->sample_log_file); - goto out; - } - - struct stat sb; - if (!job_assumes(j, fstat(logfile_fd, &sb) != -1)) { - goto out; - } - - if (sizeof(size_t) == 4 && !job_assumes(j, !(sb.st_size & 0xffffffff00000000llu))) { - goto out; - } - - size_t contents_sz = (size_t)sb.st_size; - contents = (char *)malloc(contents_sz); - - if (!job_assumes(j, contents != NULL)) { - goto out; - } - - if (!job_assumes(j, read(logfile_fd, contents, contents_sz) == (ssize_t)contents_sz)) { - goto out; - } - - /* Special case here. We don't want any formatting, just the sample contents. */ - job_assumes(j, write(fileno(g_console), contents, contents_sz) == (ssize_t)contents_sz); - + job_assumes(j, WIFEXITED(wstatus) && WEXITSTATUS(wstatus) == 0); + out: - if (contents) { - free(contents); - } - - if (logfile_fd != -1) { - job_assumes(j, runtime_fsync(logfile_fd) != -1); - job_assumes(j, runtime_close(logfile_fd) != -1); - } - if( j->kill_after_sample ) { if (unlikely(j->debug_before_kill)) { job_log(j, LOG_NOTICE, "Exit timeout elapsed. Entering the kernel debugger"); @@ -2939,7 +2962,7 @@ j->sample_pid = 0; j->sampled = true; - LIST_REMOVE(j, pending_samples_sle); + STAILQ_REMOVE(&j->mgr->pending_samples, j, job_s, pending_samples_sle); if( j->reap_after_sample ) { job_log(j, LOG_NOTICE | LOG_CONSOLE, "Sampling complete. Reaping."); @@ -3053,24 +3076,29 @@ td -= j->exit_timeout; job_log(j, LOG_WARNING | LOG_CONSOLE, "Did not die after sending SIGKILL %llu seconds ago...", td); - } else if ((!j->sampled && !j->sample_pid) && (!j->exit_timeout || (LAUNCHD_SAMPLE_TIMEOUT < j->exit_timeout))) { - /* This should work even if the job changes its exit_timeout midstream */ - job_log(j, LOG_NOTICE | LOG_CONSOLE, "Sampling timeout elapsed (%u seconds). Scheduling a sample...", LAUNCHD_SAMPLE_TIMEOUT); - if (j->exit_timeout) { - unsigned int ttk = (j->exit_timeout - LAUNCHD_SAMPLE_TIMEOUT); - job_assumes(j, kevent_mod((uintptr_t)&j->exit_timeout, EVFILT_TIMER, - EV_ADD|EV_ONESHOT, NOTE_SECONDS, ttk, j) != -1); - job_log(j, LOG_NOTICE | LOG_CONSOLE, "Scheduled new exit timeout for %u seconds later", ttk); + } else if (!(j->sampled || j->sample_pid || j->pending_sample) && (!j->exit_timeout || (LAUNCHD_SAMPLE_TIMEOUT < j->exit_timeout))) { + if( do_apple_internal_logging ) { + /* This should work even if the job changes its exit_timeout midstream */ + job_log(j, LOG_NOTICE | LOG_CONSOLE, "Sampling timeout elapsed (%u seconds). Scheduling a sample...", LAUNCHD_SAMPLE_TIMEOUT); + if (j->exit_timeout) { + unsigned int ttk = (j->exit_timeout - LAUNCHD_SAMPLE_TIMEOUT); + job_assumes(j, kevent_mod((uintptr_t)&j->exit_timeout, EVFILT_TIMER, + EV_ADD|EV_ONESHOT, NOTE_SECONDS, ttk, j) != -1); + job_log(j, LOG_NOTICE | LOG_CONSOLE, "Scheduled new exit timeout for %u seconds later", ttk); + } + + STAILQ_INSERT_TAIL(&j->mgr->pending_samples, j, pending_samples_sle); + j->pending_sample = true; + jobmgr_dequeue_next_sample(j->mgr); } - - LIST_INSERT_HEAD(&j->mgr->pending_samples, j, pending_samples_sle); - jobmgr_dequeue_next_sample(j->mgr); } else { - if( !j->sampled ) { + if( !(j->sampled || j->sample_pid || j->pending_sample) && do_apple_internal_logging ) { job_log(j, LOG_WARNING | LOG_CONSOLE, "Exit timeout elapsed (%u seconds). Will kill after sampling.", j->exit_timeout); - LIST_INSERT_HEAD(&j->mgr->pending_samples, j, pending_samples_sle); + STAILQ_INSERT_TAIL(&j->mgr->pending_samples, j, pending_samples_sle); + j->pending_sample = true; + j->kill_after_sample = true; + jobmgr_dequeue_next_sample(j->mgr); - j->kill_after_sample = true; } else { if (unlikely(j->debug_before_kill)) { job_log(j, LOG_NOTICE, "Exit timeout elapsed. Entering the kernel debugger"); @@ -3113,7 +3141,7 @@ } } -INTERNAL_ABI void +void jobmgr_callback(void *obj, struct kevent *kev) { jobmgr_t jm = obj; @@ -3174,7 +3202,7 @@ } } -INTERNAL_ABI void +void job_callback(void *obj, struct kevent *kev) { job_t j = obj; @@ -3244,8 +3272,6 @@ sipc = (!SLIST_EMPTY(&j->sockets) || !SLIST_EMPTY(&j->machservices)); } - j->checkedin = false; - if (sipc) { job_assumes(j, socketpair(AF_UNIX, SOCK_STREAM, 0, spair) != -1); } @@ -3257,7 +3283,7 @@ job_assumes(j, fcntl(j->log_redirect_fd, F_SETFL, O_NONBLOCK) != -1); job_assumes(j, kevent_mod(j->log_redirect_fd, EVFILT_READ, EV_ADD, 0, 0, j) != -1); } - + switch (c = runtime_fork(j->weird_bootstrap ? j->j_port : j->mgr->jm_port)) { case -1: job_log_error(j, LOG_ERR, "fork() failed, will try again in one second"); @@ -3299,6 +3325,8 @@ job_log(j, LOG_DEBUG, "Started as PID: %u", c); j->start_pending = false; + j->reaped = false; + j->crashed = false; runtime_add_ref(); total_children++; @@ -4063,7 +4091,7 @@ va_end(ap); } -INTERNAL_ABI void +void job_log(job_t j, int pri, const char *msg, ...) { va_list ap; @@ -4938,10 +4966,16 @@ } SLIST_INSERT_HEAD(&j->machservices, ms, sle); - LIST_INSERT_HEAD(&j->mgr->ms_hash[hash_ms(ms->name)], ms, name_hash_sle); + + jobmgr_t jm_to_insert = j->mgr; + if( g_flat_mach_namespace ) { + jm_to_insert = j->mgr->created_via_subset ? j->mgr : root_jobmgr; + } + + LIST_INSERT_HEAD(&jm_to_insert->ms_hash[hash_ms(ms->name)], ms, name_hash_sle); LIST_INSERT_HEAD(&port_hash[HASH_PORT(ms->port)], ms, port_hash_sle); - job_log(j, LOG_INFO, "Mach service added: %s", name); + job_log(j, LOG_DEBUG, "Mach service added%s: %s", j->mgr->created_via_subset ? " to private namespace" : "", name); return ms; out_bad2: @@ -4994,12 +5028,10 @@ #endif 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); + 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 (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); + job_assumes(j, host_set_exception_ports(mhp, EXC_MASK_CRASH, the_exception_server, EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES, f) == KERN_SUCCESS); job_assumes(j, launchd_mport_deallocate(mhp) == KERN_SUCCESS); } } @@ -5068,6 +5100,16 @@ job_assumes(ms->job, host_set_UNDServer(mhp, ms->port) == KERN_SUCCESS); } break; + case LAUNCH_DATA_STRING: + if( strcasecmp(key, LAUNCH_JOBKEY_MACH_DRAINMESSAGESONCRASH) == 0 ) { + const char *option = launch_data_get_string(obj); + if( strcasecmp(option, "One") == 0 ) { + ms->drain_one = true; + } else if( strcasecmp(option, "All") == 0 ) { + ms->drain_all = true; + } + } + break; case LAUNCH_DATA_DICTIONARY: job_set_exception_port(ms->job, ms->port); break; @@ -5408,6 +5450,7 @@ jmr->killed_hopefully_first_jobs = false; jmr->killed_normal_jobs = false; jmr->killed_hopefully_last_jobs = false; + STAILQ_INIT(&jmr->pending_samples); jobmgr_log(jmr, LOG_DEBUG, "Created job manager%s%s", jm ? " with parent: " : ".", jm ? jm->name : ""); @@ -5453,7 +5496,7 @@ return bootstrapper; } -INTERNAL_ABI jobmgr_t +jobmgr_t jobmgr_delete_anything_with_port(jobmgr_t jm, mach_port_t port) { struct machservice *ms, *next_ms; @@ -5504,7 +5547,6 @@ if (target_pid) { //jobmgr_assumes(jm, !check_parent); - if (unlikely((target_j = jobmgr_find_by_pid(jm, target_pid, false)) == NULL)) { return NULL; } @@ -5517,8 +5559,9 @@ return NULL; } - - LIST_FOREACH(ms, &jm->ms_hash[hash_ms(name)], name_hash_sle) { + + jobmgr_t jm_to_search = ( g_flat_mach_namespace && !jm->created_via_subset ) ? root_jobmgr : jm; + LIST_FOREACH(ms, &jm_to_search->ms_hash[hash_ms(name)], name_hash_sle) { if (!ms->per_pid && strcmp(name, ms->name) == 0) { return ms; } @@ -5562,6 +5605,54 @@ } void +machservice_drain_port(struct machservice *ms) +{ + if (!job_assumes(ms->job, ms->job->crashed == true)) { + return; + } + + if( ms->drain_one == false && ms->drain_all == false ) { + return; + } + + job_log(ms->job, LOG_NOTICE, "Draining %s...", ms->name); + + char req_buff[sizeof(union __RequestUnion__catch_mach_exc_subsystem) * 2]; + char rep_buff[sizeof(union __ReplyUnion__catch_mach_exc_subsystem)]; + mig_reply_error_t *req_hdr = (mig_reply_error_t *)&req_buff; + mig_reply_error_t *rep_hdr = (mig_reply_error_t *)&rep_buff; + + mach_msg_return_t mr = ~MACH_MSG_SUCCESS; + + do { + /* This should be a direct check on the Mach service to see if it's an exception-handling + * port, and it will break things if ReportCrash or SafetyNet start advertising other + * Mach services. But for now, it should be okay. + */ + if( ms->job->alt_exc_handler || ms->job->internal_exc_handler ) { + mr = launchd_exc_runtime_once(ms->port, sizeof(req_buff), sizeof(rep_buff), req_hdr, rep_hdr, 0); + } else { + mach_msg_options_t options = MACH_RCV_MSG | + MACH_RCV_TIMEOUT ; + + mr = mach_msg((mach_msg_header_t *)req_hdr, options, 0, sizeof(req_buff), ms->port, 0, MACH_PORT_NULL); + switch( mr ) { + case MACH_MSG_SUCCESS : + mach_msg_destroy((mach_msg_header_t *)req_hdr); + break; + case MACH_RCV_TIMED_OUT : + break; + case MACH_RCV_TOO_LARGE : + runtime_syslog(LOG_WARNING, "Tried to receive message that was larger than %lu bytes", sizeof(req_buff)); + break; + default : + break; + } + } + } while( ms->drain_all && mr != MACH_RCV_TIMED_OUT ); +} + +void machservice_delete(job_t j, struct machservice *ms, bool port_died) { if (unlikely(ms->debug_on_close)) { @@ -5570,6 +5661,7 @@ } if (ms->recv && job_assumes(j, !machservice_active(ms))) { + job_log(j, LOG_NOTICE, "Closing receive right for %s", ms->name); job_assumes(j, launchd_mport_close_recv(ms->port) == KERN_SUCCESS); } @@ -5579,7 +5671,7 @@ the_exception_server = 0; } - job_log(j, LOG_INFO, "Mach service deleted%s: %s", port_died ? " (port died)" : "", ms->name); + job_log(j, LOG_NOTICE, "Mach service deleted%s: %s", port_died ? " (port died)" : "", ms->name); if (ms->special_port_num) { SLIST_REMOVE(&special_ports, ms, machservice, special_port_sle); @@ -5660,13 +5752,13 @@ return argv_ret; } -INTERNAL_ABI void +void job_checkin(job_t j) { j->checkedin = true; } -INTERNAL_ABI bool +bool job_ack_port_destruction(mach_port_t p) { struct machservice *ms; @@ -5684,8 +5776,37 @@ j = ms->job; - job_log(j, LOG_DEBUG, "Receive right returned to us: %s", ms->name); - + jobmgr_log(root_jobmgr, LOG_DEBUG, "Receive right returned to us: %s", ms->name); + + /* Without being the exception handler, NOTE_EXIT is our only way to tell if the job + * crashed, and we can't rely on NOTE_EXIT always being processed after all the job's + * receive rights have been returned. + * + * So when we get receive rights back, check to see if the job has been reaped yet. If + * not, then we add this service to a list of services to be drained on crash if it's + * requested that behavior. So, for a job with N receive rights all requesting that they + * be drained on crash, we can safely handle the following sequence of events. + * + * ReceiveRight0Returned + * ReceiveRight1Returned + * ReceiveRight2Returned + * NOTE_EXIT (reap, get exit status) + * ReceiveRight3Returned + * . + * . + * . + * ReceiveRight(N - 1)Returned + */ + + if( ms->drain_one || ms->drain_all ) { + if( j->crashed && j->reaped ) { + job_log(j, LOG_DEBUG, "Job has crashed. Draining port..."); + machservice_drain_port(ms); + } else if( !(j->crashed || j->reaped) ) { + job_log(j, LOG_DEBUG, "Job's exit status is still unknown. Deferring drain."); + } + } + ms->isActive = false; if (ms->delete_on_destruction) { @@ -5693,7 +5814,7 @@ } else if (ms->reset) { machservice_resetport(j, ms); } - + job_dispatch(j, false); root_jobmgr = jobmgr_do_garbage_collection(root_jobmgr); @@ -5701,7 +5822,7 @@ return true; } -INTERNAL_ABI void +void job_ack_no_senders(job_t j) { j->priv_port_has_senders = false; @@ -5714,115 +5835,6 @@ job_dispatch(j, false); } -#if 0 -void -job_force_sampletool(job_t j) -{ - struct stat sb; - char logfile[PATH_MAX]; - char pidstr[100]; - char *sample_args[] = { "sample", pidstr, "1", "-unsupportedShowArch", "-mayDie", "-file", logfile, NULL }; - char *contents = NULL; - size_t contents_sz; - int logfile_fd = -1; - int console_fd = -1; - int wstatus; - pid_t sp; - - if (j->sampled || j->per_user) { - return; - } - - j->sampled = true; - - if (!job_assumes(j, do_apple_internal_logging)) { - return; - } - - if (!job_assumes(j, mkdir(SHUTDOWN_LOG_DIR, S_IRWXU) != -1 || errno == EEXIST)) { - return; - } - - snprintf(pidstr, sizeof(pidstr), "%u", j->p); - snprintf(logfile, sizeof(logfile), SHUTDOWN_LOG_DIR "/%s-%u.sample.txt", j->label, j->p); - - if (!job_assumes(j, unlink(logfile) != -1 || errno == ENOENT)) { - goto out; - } - - /* - * This will stall launchd for as long as the 'sample' tool runs. - * - * We didn't give the 'sample' tool a bootstrap port, so it therefore - * can't deadlock against launchd. - */ - if (!job_assumes(j, (errno = posix_spawnp(&sp, sample_args[0], NULL, NULL, sample_args, environ)) == 0)) { - goto out; - } - - job_log(j, LOG_DEBUG, "Waiting for 'sample' to finish."); - - if (!job_assumes(j, waitpid(sp, &wstatus, 0) != -1)) { - goto out; - } - - /* - * This won't work if the VFS or filesystems are sick: - * sync(); - */ - - if (!job_assumes(j, WIFEXITED(wstatus) && WEXITSTATUS(wstatus) == 0)) { - goto out; - } - - if (!job_assumes(j, (logfile_fd = open(logfile, O_RDONLY|O_NOCTTY)) != -1)) { - goto out; - } - - if (!job_assumes(j, (console_fd = open(_PATH_CONSOLE, O_WRONLY|O_APPEND|O_NOCTTY)) != -1)) { - goto out; - } - - if (!job_assumes(j, fstat(logfile_fd, &sb) != -1)) { - goto out; - } - - if (sizeof (size_t) == 4 && !job_assumes(j, !(sb.st_size & 0xffffffff00000000llu))) { - goto out; - } - - contents_sz = (size_t) sb.st_size; - - contents = malloc(contents_sz); - - if (!job_assumes(j, contents != NULL)) { - goto out; - } - - if (!job_assumes(j, read(logfile_fd, contents, contents_sz) == (ssize_t) contents_sz)) { - goto out; - } - - job_assumes(j, write(console_fd, contents, contents_sz) == (ssize_t) contents_sz); - -out: - if (contents) { - free(contents); - } - - if (logfile_fd != -1) { - job_assumes(j, runtime_fsync(logfile_fd) != -1); - job_assumes(j, runtime_close(logfile_fd) != -1); - } - - if (console_fd != -1) { - job_assumes(j, runtime_close(console_fd) != -1); - } - - job_log(j, LOG_DEBUG, "Finished sampling."); -} -#endif - bool semaphoreitem_new(job_t j, semaphore_reason_t why, const char *what) { @@ -5960,7 +5972,7 @@ } } -INTERNAL_ABI void +void jobmgr_dispatch_all_semaphores(jobmgr_t jm) { jobmgr_t jmi, jmn; @@ -6418,7 +6430,7 @@ if (invalCnt) switch (inkey) { case VPROC_GSK_ENVIRONMENT: - job_assumes(j, false); + break; case 0: break; @@ -6724,21 +6736,6 @@ return 0; } -void -ensure_root_bkgd_setup(void) -{ - if (likely(background_jobmgr) || !pid1_magic) { - return; - } - - if (!jobmgr_assumes(root_jobmgr, (background_jobmgr = jobmgr_new(root_jobmgr, mach_task_self(), MACH_PORT_NULL, false, VPROCMGR_SESSION_BACKGROUND)) != NULL)) { - return; - } - - background_jobmgr->req_port = 0; - jobmgr_assumes(root_jobmgr, launchd_mport_make_send(background_jobmgr->jm_port) == KERN_SUCCESS); -} - kern_return_t job_mig_lookup_per_user_context(job_t j, uid_t which_user, mach_port_t *up_cont) { @@ -6762,14 +6759,6 @@ *up_cont = MACH_PORT_NULL; - if (which_user == 0) { - ensure_root_bkgd_setup(); - - *up_cont = background_jobmgr->jm_port; - - return 0; - } - LIST_FOREACH(ji, &root_jobmgr->jobs, sle) { if (!ji->per_user) { continue; @@ -6844,7 +6833,7 @@ if (unlikely((ms = machservice_new(j, servicename, serviceportp, per_pid_service)) == NULL)) { return BOOTSTRAP_NO_MEMORY; } - + /* Treat this like a legacy job. */ if( !j->legacy_mach_job ) { ms->isActive = true; @@ -6870,6 +6859,7 @@ job_log(j, LOG_WARNING, "Check-in of Mach service failed. Already active: %s", servicename); return BOOTSTRAP_SERVICE_ACTIVE; } + } machservice_request_notifications(ms); @@ -7051,21 +7041,19 @@ 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; if (!launchd_assumes(j != NULL)) { return BOOTSTRAP_NO_MEMORY; } - jm = j->mgr; + jm = g_flat_mach_namespace ? root_jobmgr : j->mgr; - LIST_FOREACH(ji, &jm->jobs, sle) { - SLIST_FOREACH(ms, &ji->machservices, sle) { - if (!ms->per_pid) { - cnt++; - } + unsigned int i = 0; + struct machservice *msi = NULL; + for( i = 0; i < MACHSERVICE_HASH_SIZE; i++ ) { + LIST_FOREACH( msi, &jm->ms_hash[i], name_hash_sle ) { + cnt += !msi->per_pid ? 1 : 0; } } @@ -7083,11 +7071,11 @@ goto out_bad; } - LIST_FOREACH(ji, &jm->jobs, sle) { - SLIST_FOREACH(ms, &ji->machservices, sle) { - if (!ms->per_pid) { - strlcpy(service_names[cnt2], machservice_name(ms), sizeof(service_names[0])); - service_actives[cnt2] = machservice_status(ms); + for( i = 0; i < MACHSERVICE_HASH_SIZE; i++ ) { + LIST_FOREACH( msi, &jm->ms_hash[i], name_hash_sle ) { + if( !msi->per_pid ) { + strlcpy(service_names[cnt2], machservice_name(msi), sizeof(service_names[0])); + service_actives[cnt2] = machservice_status(msi); cnt2++; } } @@ -7113,13 +7101,193 @@ return BOOTSTRAP_NO_MEMORY; } +kern_return_t +job_mig_lookup_children(job_t j, mach_port_array_t *child_ports, mach_msg_type_number_t *child_ports_cnt, + name_array_t *child_names, mach_msg_type_number_t *child_names_cnt, + bootstrap_property_array_t *child_properties, mach_msg_type_number_t *child_properties_cnt) +{ + kern_return_t kr = BOOTSTRAP_NO_MEMORY; + if( !launchd_assumes(j != NULL) ) { + return BOOTSTRAP_NO_MEMORY; + } + + struct ldcred *ldc = runtime_get_caller_creds(); + + /* Only allow root processes to look up children, even if we're in the per-user laucnhd. + * Otherwise, this could be used to cross sessions, which counts as a security vulnerability + * in a non-flat namespace. + */ + if( ldc->euid != 0 ) { + job_log(j, LOG_WARNING, "Attempt to look up children of bootstrap by unprivileged job."); + return BOOTSTRAP_NOT_PRIVILEGED; + } + + unsigned int cnt = 0; + + jobmgr_t jmr = j->mgr; + jobmgr_t jmi = NULL; + SLIST_FOREACH( jmi, &jmr->submgrs, sle ) { + cnt += g_flat_mach_namespace ? ( jmi->created_via_subset ? 1 : 0 ) : 1; + } + + /* Find our per-user launchds if we're PID 1. */ + job_t ji = NULL; + if( pid1_magic ) { + LIST_FOREACH( ji, &jmr->jobs, sle ) { + cnt += ji->per_user ? 1 : 0; + } + } + + if( cnt == 0 ) { + return BOOTSTRAP_NO_CHILDREN; + } + + mach_port_array_t _child_ports = NULL; + mig_allocate((vm_address_t *)&_child_ports, cnt * sizeof(_child_ports[0])); + if( !job_assumes(j, _child_ports != NULL) ) { + kr = BOOTSTRAP_NO_MEMORY; + goto out_bad; + } + + name_array_t _child_names = NULL; + mig_allocate((vm_address_t *)&_child_names, cnt * sizeof(_child_names[0])); + if( !job_assumes(j, _child_names != NULL) ) { + kr = BOOTSTRAP_NO_MEMORY; + goto out_bad; + } + + bootstrap_property_array_t _child_properties = NULL; + mig_allocate((vm_address_t *)&_child_properties, cnt * sizeof(_child_properties[0])); + if( !job_assumes(j, _child_properties != NULL) ) { + kr = BOOTSTRAP_NO_MEMORY; + goto out_bad; + } + + unsigned int cnt2 = 0; + SLIST_FOREACH( jmi, &jmr->submgrs, sle ) { + if( (g_flat_mach_namespace && jmi->created_via_subset) || !g_flat_mach_namespace ) { + if( jobmgr_assumes(jmi, launchd_mport_make_send(jmi->jm_port)) == KERN_SUCCESS ) { + _child_ports[cnt2] = jmi->jm_port; + } else { + _child_ports[cnt2] = MACH_PORT_NULL; + } + + strlcpy(_child_names[cnt2], jmi->name, sizeof(_child_names[0])); + _child_properties[cnt2] |= BOOTSTRAP_PROPERTY_SUBSET; + + cnt2++; + } + } + + if( pid1_magic ) { + LIST_FOREACH( ji, &jmr->jobs, sle ) { + if( ji->per_user ) { + if( job_assumes(ji, SLIST_FIRST(&ji->machservices)->per_user_hack == true) ) { + mach_port_t port = machservice_port(SLIST_FIRST(&ji->machservices)); + + if( job_assumes(ji, launchd_mport_copy_send(port)) == KERN_SUCCESS ) { + _child_ports[cnt2] = port; + } else { + _child_ports[cnt2] = MACH_PORT_NULL; + } + } else { + _child_ports[cnt2] = MACH_PORT_NULL; + } + + strlcpy(_child_names[cnt2], ji->label, sizeof(_child_names[0])); + _child_properties[cnt2] |= BOOTSTRAP_PROPERTY_PERUSER; + + cnt2++; + } + } + } + + *child_names_cnt = cnt; + *child_ports_cnt = cnt; + *child_properties_cnt = cnt; + + *child_names = _child_names; + *child_ports = _child_ports; + *child_properties = _child_properties; + + unsigned int i = 0; + for( i = 0; i < cnt; i++ ) { + job_log(j, LOG_DEBUG, "child_names[%u] = %s", i, (char *)_child_names[i]); + } + + return BOOTSTRAP_SUCCESS; +out_bad: + if( _child_ports ) { + mig_deallocate((vm_address_t)_child_ports, cnt * sizeof(_child_ports[0])); + } + + if( _child_names ) { + mig_deallocate((vm_address_t)_child_names, cnt * sizeof(_child_ports[0])); + } + + if( _child_properties ) { + mig_deallocate((vm_address_t)_child_properties, cnt * sizeof(_child_properties[0])); + } + + return kr; +} + +kern_return_t +job_mig_transaction_count_for_pid(job_t j, pid_t p, int32_t *cnt, boolean_t *condemned) +{ + kern_return_t kr = KERN_FAILURE; + struct ldcred *ldc = runtime_get_caller_creds(); + if( (ldc->euid != geteuid()) && (ldc->euid != 0) ) { + return BOOTSTRAP_NOT_PRIVILEGED; + } + + job_t j_for_pid = jobmgr_find_by_pid_deep(j->mgr, p); + if( j_for_pid ) { + if( j_for_pid->kill_via_shmem ) { + if( j_for_pid->shmem ) { + *cnt = j_for_pid->shmem->vp_shmem_transaction_cnt; + *condemned = j_for_pid->shmem->vp_shmem_flags & VPROC_SHMEM_EXITING; + *cnt += *condemned ? 1 : 0; + } else { + *cnt = 0; + *condemned = false; + } + + kr = BOOTSTRAP_SUCCESS; + } else { + kr = BOOTSTRAP_NO_MEMORY; + } + } else { + kr = BOOTSTRAP_UNKNOWN_SERVICE; + } + + return kr; +} + +kern_return_t +job_mig_pid_is_managed(job_t j __attribute__((unused)), pid_t p, boolean_t *managed) +{ + struct ldcred *ldc = runtime_get_caller_creds(); + if( (ldc->euid != geteuid()) && (ldc->euid != 0) ) { + return BOOTSTRAP_NOT_PRIVILEGED; + } + + /* This is so loginwindow doesn't try to quit GUI apps that have been launched + * directly by launchd as agents. + */ + job_t j_for_pid = jobmgr_find_by_pid_deep(root_jobmgr, p); + if( j_for_pid && !j_for_pid->anonymous && !j_for_pid->legacy_LS_job ) { + *managed = true; + } + + return BOOTSTRAP_SUCCESS; +} + jobmgr_t jobmgr_find_by_name(jobmgr_t jm, const char *where) { jobmgr_t jmi, jmi2; - ensure_root_bkgd_setup(); - /* NULL is only passed for our custom API for LaunchServices. If that is the case, we do magic. */ if (where == NULL) { if (strcasecmp(jm->name, VPROCMGR_SESSION_LOGINWINDOW) == 0) { @@ -7178,50 +7346,9 @@ job_t j2; if (j->mgr->session_initialized) { - if (ldc->uid == 0 && pid1_magic) { - if (strcmp(j->mgr->name, VPROCMGR_SESSION_LOGINWINDOW) == 0) { - job_t ji, jn; - - LIST_FOREACH_SAFE(ji, &j->mgr->jobs, sle, jn) { - if (!ji->anonymous) { - job_remove(ji, false); - } - } - - ensure_root_bkgd_setup(); - - SLIST_REMOVE(&j->mgr->parentmgr->submgrs, j->mgr, jobmgr_s, sle); - j->mgr->parentmgr = background_jobmgr; - SLIST_INSERT_HEAD(&j->mgr->parentmgr->submgrs, j->mgr, sle); - - /* - * We really should wait for all the jobs to die before proceeding. See 5351245 for more info. - * - * We have hacked around this in job_find() by ignoring jobs that are pending removal. - */ - - } else if (strcmp(j->mgr->name, VPROCMGR_SESSION_AQUA) == 0) { - job_log(j, LOG_DEBUG, "Tried to move the Aqua session."); - return 0; - } else if (strcmp(j->mgr->name, VPROCMGR_SESSION_BACKGROUND) == 0) { - job_log(j, LOG_DEBUG, "Tried to move the background session."); - return 0; - } else { - job_log(j, LOG_ERR, "Tried to initialize an already setup session!"); - kr = BOOTSTRAP_NOT_PRIVILEGED; - goto out; - } - } else { - job_log(j, LOG_ERR, "Tried to initialize an already setup session!"); - kr = BOOTSTRAP_NOT_PRIVILEGED; - goto out; - } - } 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); - j->mgr->parentmgr = background_jobmgr; - SLIST_INSERT_HEAD(&j->mgr->parentmgr->submgrs, j->mgr, sle); + job_log(j, LOG_ERR, "Tried to initialize an already setup session!"); + kr = BOOTSTRAP_NOT_PRIVILEGED; + goto out; } else if (strcmp(session_type, VPROCMGR_SESSION_LOGINWINDOW) == 0) { jobmgr_t jmi; @@ -7332,6 +7459,55 @@ } kern_return_t +job_mig_detach_from_console(job_t j, mach_port_t *new_bsport) +{ + if( j->mgr == root_jobmgr ) { + return BOOTSTRAP_NOT_PRIVILEGED; + } + + if( !j->anonymous ) { + job_log(j, LOG_NOTICE, "Non-anonymous job tried to move to Background session. Please set LimitLoadToSessionType in the launchd property list to \"Background\" instead."); + return BOOTSTRAP_NOT_PRIVILEGED; + } + + job_log(j, LOG_NOTICE, "Detaching from console session."); + + /* Remove the job from it's current job manager. */ + LIST_REMOVE(j, sle); + LIST_REMOVE(j, pid_hash_sle); + + job_t ji = NULL, jit = NULL; + LIST_FOREACH_SAFE( ji, &j->mgr->global_env_jobs, global_env_sle, jit ) { + if( ji == j ) { + LIST_REMOVE(ji, global_env_sle); + break; + } + } + + /* Put the job into the background job manager. */ + LIST_INSERT_HEAD(&root_jobmgr->jobs, j, sle); + LIST_INSERT_HEAD(&root_jobmgr->active_jobs[ACTIVE_JOB_HASH(j->p)], j, pid_hash_sle); + + if( ji ) { + LIST_INSERT_HEAD(&root_jobmgr->global_env_jobs, j, global_env_sle); + } + + /* Move our Mach services over. */ + if( !g_flat_mach_namespace && !SLIST_EMPTY(&j->machservices) ) { + struct machservice *msi = NULL, *msit = NULL; + SLIST_FOREACH_SAFE( msi, &j->machservices, sle, msit ) { + LIST_REMOVE(msi, name_hash_sle); + LIST_INSERT_HEAD(&root_jobmgr->ms_hash[hash_ms(msi->name)], msi, name_hash_sle); + } + } + + j->mgr = root_jobmgr; + *new_bsport = root_jobmgr->jm_port; + + return KERN_SUCCESS; +} + +kern_return_t job_mig_take_subset(job_t j, mach_port_t *reqport, mach_port_t *rcvright, vm_offset_t *outdata, mach_msg_type_number_t *outdataCnt, mach_port_array_t *portsp, unsigned int *ports_cnt) @@ -7501,6 +7677,9 @@ } *subsetportp = jmr->jm_port; + jmr->created_via_subset = true; + + job_log(j, LOG_NOTICE, "Job created a subset named \"%s\"", jmr->name); return BOOTSTRAP_SUCCESS; } @@ -7523,7 +7702,7 @@ } kern_return_t -job_mig_kickstart(job_t j, name_t targetlabel, pid_t *out_pid, mach_port_t *out_name_port, mach_port_t *obsrvr_port) +job_mig_kickstart(job_t j, name_t targetlabel, pid_t *out_pid, mach_port_t *out_name_port, mach_port_t *obsrvr_port, unsigned int flags) { struct ldcred *ldc = runtime_get_caller_creds(); job_t otherj; @@ -7546,6 +7725,11 @@ return BOOTSTRAP_NOT_PRIVILEGED; } + if( otherj->p && (flags & VPROCFLAG_STALL_JOB_EXEC) ) { + return BOOTSTRAP_SERVICE_ACTIVE; + } + + otherj->stall_before_exec = ( flags & VPROCFLAG_STALL_JOB_EXEC ); otherj = job_dispatch(otherj, true); if (!job_assumes(j, otherj && otherj->p)) { @@ -7597,65 +7781,6 @@ } kern_return_t -job_mig_set_service_policy(job_t j, pid_t target_pid, uint64_t flags, name_t target_service) -{ - struct ldcred *ldc = runtime_get_caller_creds(); - job_t target_j = NULL; - - if (!launchd_assumes(j != NULL)) { - return BOOTSTRAP_NO_MEMORY; - } - - target_j = jobmgr_find_by_pid(j->mgr, target_pid, true); - - if (ldc->euid && (ldc->euid != getuid())) { - int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, target_pid }; - struct kinfo_proc kp; - size_t len = sizeof(kp); - - job_assumes(j, sysctl(mib, 4, &kp, &len, NULL, 0) != -1); - job_assumes(j, len == sizeof(kp)); - - uid_t kp_euid = kp.kp_eproc.e_ucred.cr_uid; - uid_t kp_uid = kp.kp_eproc.e_pcred.p_ruid; - - if( ldc->euid == kp_euid ) { - job_log(j, LOG_WARNING, "Working around rdar://problem/5982485 and allowing job to set policy for PID %u. We should discuss having %s run under a per-user launchd.", target_pid, target_j->label); - } else { - job_log(j, LOG_ERR, "Denied Mach service policy update requested by UID/EUID %u/%u against PID %u with UID/EUID %u/%u due to mismatched credentials.", ldc->uid, ldc->euid, target_pid, kp_uid, kp_euid); - - return BOOTSTRAP_NOT_PRIVILEGED; - } - } - - if (unlikely(!SLIST_EMPTY(&j->mspolicies))) { - job_log(j, LOG_WARNING, "Jobs that have policies assigned to them may not set policies."); - return BOOTSTRAP_NOT_PRIVILEGED; - } - - if (unlikely(target_j == NULL)) { - if (job_assumes(j, errno == ESRCH)) { - job_log(j, LOG_ERR, "Could not find PID %u while trying to set Mach bootstrap service policy: %s", target_pid, target_service); - } - return BOOTSTRAP_NO_MEMORY; - } - - job_log(j, LOG_DEBUG, "Setting policy on job \"%s\" for Mach service: %s", target_j->label, target_service); - if (target_service[0]) { - bool r = mspolicy_new(target_j, target_service, flags & BOOTSTRAP_ALLOW_LOOKUP, flags & BOOTSTRAP_PER_PID_SERVICE, false); - - if (unlikely(!r) && job_assumes(j, errno == EEXIST)) { - job_log(j, LOG_ERR, "Tried to update a known policy on PID %u: %s", target_pid, target_service); - } - } else { - target_j->deny_unknown_mslookups = !(flags & BOOTSTRAP_ALLOW_LOOKUP); - target_j->deny_job_creation = flags & BOOTSTRAP_DENY_JOB_CREATION; - } - - return 0; -} - -kern_return_t job_mig_spawn(job_t j, vm_offset_t indata, mach_msg_type_number_t indataCnt, pid_t *child_pid, mach_port_t *obsvr_port) { launch_data_t input_obj = NULL; @@ -7743,7 +7868,7 @@ return BOOTSTRAP_SUCCESS; } -INTERNAL_ABI void +void jobmgr_init(bool sflag) { const char *root_session_type = pid1_magic ? VPROCMGR_SESSION_SYSTEM : VPROCMGR_SESSION_BACKGROUND; Modified: trunk/launchd/src/launchd_core_logic.h =================================================================== --- trunk/launchd/src/launchd_core_logic.h 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/launchd_core_logic.h 2008-11-22 22:31:20 UTC (rev 23754) @@ -29,29 +29,31 @@ extern jobmgr_t root_jobmgr; extern mach_port_t inherited_bootstrap_port; +extern bool g_flat_mach_namespace; -INTERNAL_ABI void jobmgr_init(bool); -INTERNAL_ABI jobmgr_t jobmgr_shutdown(jobmgr_t jm); -INTERNAL_ABI void jobmgr_dispatch_all_semaphores(jobmgr_t jm); +void jobmgr_init(bool); +jobmgr_t jobmgr_shutdown(jobmgr_t jm); +void jobmgr_dispatch_all_semaphores(jobmgr_t jm); void jobmgr_dispatch_all_interested(jobmgr_t jm, job_t j); -INTERNAL_ABI jobmgr_t jobmgr_delete_anything_with_port(jobmgr_t jm, mach_port_t port); +jobmgr_t jobmgr_delete_anything_with_port(jobmgr_t jm, mach_port_t port); -INTERNAL_ABI launch_data_t job_export_all(void); +launch_data_t job_export_all(void); -INTERNAL_ABI job_t job_dispatch(job_t j, bool kickstart); /* returns j on success, NULL on job removal */ -INTERNAL_ABI job_t job_find(const char *label); -INTERNAL_ABI job_t job_find_by_service_port(mach_port_t p); -INTERNAL_ABI bool job_ack_port_destruction(mach_port_t p); -INTERNAL_ABI bool job_is_anonymous(job_t j); -INTERNAL_ABI launch_data_t job_export(job_t j); -INTERNAL_ABI void job_stop(job_t j); -INTERNAL_ABI void job_checkin(job_t j); -INTERNAL_ABI void job_remove(job_t j, bool force); -INTERNAL_ABI job_t job_import(launch_data_t pload); -INTERNAL_ABI launch_data_t job_import_bulk(launch_data_t pload); -INTERNAL_ABI job_t job_mig_intran(mach_port_t mp); -INTERNAL_ABI void job_mig_destructor(job_t j); -INTERNAL_ABI void job_ack_no_senders(job_t j); -INTERNAL_ABI void job_log(job_t j, int pri, const char *msg, ...) __attribute__((format(printf, 3, 4))); +job_t job_dispatch(job_t j, bool kickstart); /* returns j on success, NULL on job removal */ +job_t job_find(const char *label); +job_t job_find_by_service_port(mach_port_t p); +bool job_ack_port_destruction(mach_port_t p); +bool job_is_anonymous(job_t j); +launch_data_t job_export(job_t j); +void job_stop(job_t j); +void job_checkin(job_t j); +void job_remove(job_t j, bool force); +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); +void job_ack_no_senders(job_t j); +void job_log(job_t j, int pri, const char *msg, ...) __attribute__((format(printf, 3, 4))); +void job_set_pid_crashed(pid_t p); #endif Modified: trunk/launchd/src/launchd_internal.defs =================================================================== --- trunk/launchd/src/launchd_internal.defs 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/launchd_internal.defs 2008-11-22 22:31:20 UTC (rev 23754) @@ -28,6 +28,3 @@ routine handle_kqueue( __port : mach_port_t; __fd : integer_t); - -routine handle_mport( - __port : mach_port_t); \ No newline at end of file Modified: trunk/launchd/src/launchd_ktrace.c =================================================================== --- trunk/launchd/src/launchd_ktrace.c 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/launchd_ktrace.c 2008-11-22 22:31:20 UTC (rev 23754) @@ -1,6 +1,6 @@ #include "launchd_ktrace.h" -INTERNAL_ABI void +void runtime_ktrace1(runtime_ktrace_code_t code) { void *ra = __builtin_extract_return_addr(__builtin_return_address(1)); @@ -11,7 +11,7 @@ } } -INTERNAL_ABI void +void runtime_ktrace0(runtime_ktrace_code_t code) { void *ra = __builtin_extract_return_addr(__builtin_return_address(0)); @@ -22,7 +22,7 @@ } } -INTERNAL_ABI void +void runtime_ktrace(runtime_ktrace_code_t code, long a, long b, long c) { void *ra = __builtin_extract_return_addr(__builtin_return_address(0)); Modified: trunk/launchd/src/launchd_ktrace.h =================================================================== --- trunk/launchd/src/launchd_ktrace.h 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/launchd_ktrace.h 2008-11-22 22:31:20 UTC (rev 23754) @@ -6,14 +6,6 @@ extern bool do_apple_internal_logging; -#ifndef INTERNAL_ABI -#ifdef __i386__ - #define INTERNAL_ABI __attribute__((regparm(3))) /* Enable register-passing for the first 3 arguments on i386. */ -#else - #define INTERNAL_ABI -#endif -#endif - #ifndef DBG_LAUNCHD #define DBG_LAUNCHD 34 #endif @@ -38,8 +30,8 @@ } runtime_ktrace_code_t; /* All of these log the return address as "arg4" */ -INTERNAL_ABI void runtime_ktrace1(runtime_ktrace_code_t code); -INTERNAL_ABI void runtime_ktrace0(runtime_ktrace_code_t code); -INTERNAL_ABI void runtime_ktrace(runtime_ktrace_code_t code, long a, long b, long c); +void runtime_ktrace1(runtime_ktrace_code_t code); +void runtime_ktrace0(runtime_ktrace_code_t code); +void runtime_ktrace(runtime_ktrace_code_t code, long a, long b, long c); #endif /* __LAUNCHD_KTRACE_H__ */ Modified: trunk/launchd/src/launchd_mig_types.defs =================================================================== --- trunk/launchd/src/launchd_mig_types.defs 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/launchd_mig_types.defs 2008-11-22 22:31:20 UTC (rev 23754) @@ -25,13 +25,15 @@ type pid_t = integer_t; type pid_array_t = ^array [] of pid_t; -type uid_t = integer_t; -type gid_t = integer_t; +type uid_t = natural_t; +type gid_t = natural_t; type vproc_gsk_t = integer_t; type logmsg_t = c_string[*:2048]; type cmd_t = c_string[512]; type name_t = c_string[128]; type name_array_t = ^array [] of name_t; +type bootstrap_property_t = natural_t; +type bootstrap_property_array_t = ^array [] of bootstrap_property_t; type bootstrap_status_t = integer_t; type bootstrap_status_array_t = ^array [] of bootstrap_status_t; Modified: trunk/launchd/src/launchd_runtime.c =================================================================== --- trunk/launchd/src/launchd_runtime.c 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/launchd_runtime.c 2008-11-22 22:31:20 UTC (rev 23754) @@ -64,7 +64,7 @@ #include "launchd_internalServer.h" #include "launchd_internal.h" #include "notifyServer.h" -#include "excServer.h" +#include "mach_excServer.h" /* We shouldn't be including these */ #include "launch.h" @@ -86,13 +86,13 @@ static int bulk_kev_cnt; static pthread_t kqueue_demand_thread; -static pthread_t demand_thread; -static void *mport_demand_loop(void *arg); +static void mportset_callback(void); +static kq_callback kqmportset_callback = (kq_callback)mportset_callback; static void *kqueue_demand_loop(void *arg); static void log_kevent_struct(int level, struct kevent *kev_base, int indx); -static boolean_t launchd_internal_demux(mach_msg_header_t *Request, mach_msg_header_t *Reply); +boolean_t launchd_internal_demux(mach_msg_header_t *Request, mach_msg_header_t *Reply); 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; @@ -131,8 +131,9 @@ bool do_apple_internal_logging; bool low_level_debug; bool g_force_old_kill_path = false; +bool g_flat_mach_namespace = false; -INTERNAL_ABI mach_port_t +mach_port_t runtime_get_kernel_port(void) { return launchd_internal_port; @@ -143,7 +144,7 @@ static int internal_mask_pri = LOG_UPTO(LOG_NOTICE); -INTERNAL_ABI void +void launchd_runtime_init(void) { mach_msg_size_t mxmsgsz; @@ -155,6 +156,8 @@ launchd_assert((errno = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_PORT_SET, &demand_port_set)) == KERN_SUCCESS); launchd_assert((errno = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_PORT_SET, &ipc_port_set)) == KERN_SUCCESS); + launchd_assert(kevent_mod(demand_port_set, EVFILT_MACHPORT, EV_ADD, 0, 0, &kqmportset_callback) != -1); + launchd_assert(launchd_mport_create_recv(&launchd_internal_port) == KERN_SUCCESS); launchd_assert(launchd_mport_make_send(launchd_internal_port) == KERN_SUCCESS); @@ -172,16 +175,10 @@ launchd_assert(pthread_create(&kqueue_demand_thread, &attr, kqueue_demand_loop, NULL) == 0); pthread_attr_destroy(&attr); - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN); - launchd_assert(pthread_create(&demand_thread, &attr, mport_demand_loop, NULL) == 0); - pthread_attr_destroy(&attr); - launchd_assumes(sysctlbyname("vfs.generic.noremotehang", NULL, NULL, &p, sizeof(p)) != -1); } -INTERNAL_ABI void +void launchd_runtime_init2(void) { size_t i; @@ -192,26 +189,7 @@ } } -void * -mport_demand_loop(void *arg __attribute__((unused))) -{ - mach_msg_empty_rcv_t dummy; - kern_return_t kr; - - for (;;) { - kr = mach_msg(&dummy.header, MACH_RCV_MSG|MACH_RCV_LARGE, 0, 0, demand_port_set, 0, MACH_PORT_NULL); - if (unlikely(kr == MACH_RCV_PORT_CHANGED)) { - break; - } else if (!launchd_assumes(kr == MACH_RCV_TOO_LARGE)) { - continue; - } - launchd_assumes(handle_mport(launchd_internal_port) == 0); - } - - return NULL; -} - -INTERNAL_ABI const char * +const char * proc_flags_to_C_names(unsigned int flags) { #define MAX_PFLAG_STR "P_ADVLOCK|P_CONTROLT|P_LP64|P_NOCLDSTOP|P_PPWAIT|P_PROFIL|P_SELECT|P_CONTINUED|P_SUGID|P_SYSTEM|P_TIMEOUT|P_TRACED|P_RESV3|P_WEXIT|P_EXEC|P_OWEUPC|P_AFFINITY|P_TRANSLATED|P_RESV5|P_CHECKOPENEVT|P_DEPENDENCY_CAPABLE|P_REBOOT|P_TBE|P_RESV7|P_THCWD|P_RESV9|P_RESV10|P_RESV11|P_NOSHLIB|P_FORCEQUOTA|P_NOCLDWAIT|P_NOREMOTEHANG|0xdeadbeeffeedface" @@ -275,7 +253,7 @@ return flags_buf; } -INTERNAL_ABI const char * +const char * reboot_flags_to_C_names(unsigned int flags) { #define MAX_RB_STR "RB_ASKNAME|RB_SINGLE|RB_NOSYNC|RB_HALT|RB_INITNAME|RB_DFLTROOT|RB_ALTBOOT|RB_UNIPROC|RB_SAFEBOOT|RB_UPSDELAY|0xdeadbeeffeedface" @@ -314,7 +292,7 @@ return flags_buf; } -INTERNAL_ABI const char * +const char * signal_to_C_name(unsigned int sig) { static char unknown[25]; @@ -531,8 +509,8 @@ indx, kev->udata, kev->data, ident_buf, filter_str, flags_buf, fflags_buf); } -kern_return_t -x_handle_mport(mach_port_t junk __attribute__((unused))) +void +mportset_callback(void) { mach_port_name_array_t members; mach_msg_type_number_t membersCnt; @@ -542,7 +520,7 @@ unsigned int i; if (!launchd_assumes((errno = mach_port_get_set_status(mach_task_self(), demand_port_set, &members, &membersCnt)) == KERN_SUCCESS)) { - return 1; + return; } for (i = 0; i < membersCnt; i++) { @@ -570,8 +548,6 @@ launchd_assumes(vm_deallocate(mach_task_self(), (vm_address_t)members, (vm_size_t) membersCnt * sizeof(mach_port_name_t)) == KERN_SUCCESS); - - return 0; } void * @@ -646,7 +622,7 @@ -INTERNAL_ABI void +void launchd_runtime(void) { mig_reply_error_t *req = NULL, *resp = NULL; @@ -678,19 +654,19 @@ } } -INTERNAL_ABI kern_return_t +kern_return_t launchd_set_bport(mach_port_t name) { return errno = task_set_bootstrap_port(mach_task_self(), name); } -INTERNAL_ABI kern_return_t +kern_return_t launchd_get_bport(mach_port_t *name) { return errno = task_get_bootstrap_port(mach_task_self(), name); } -INTERNAL_ABI kern_return_t +kern_return_t launchd_mport_notify_req(mach_port_t name, mach_msg_id_t which) { mach_port_mscount_t msgc = (which == MACH_NOTIFY_PORT_DESTROYED) ? 0 : 1; @@ -714,7 +690,7 @@ return errno; } -INTERNAL_ABI pid_t +pid_t runtime_fork(mach_port_t bsport) { sigset_t emptyset, oset; @@ -755,7 +731,7 @@ } -INTERNAL_ABI void +void runtime_set_timeout(timeout_callback to_cb, unsigned int sec) { if (sec == 0 || to_cb == NULL) { @@ -767,7 +743,7 @@ runtime_idle_timeout = sec * 1000; } -INTERNAL_ABI kern_return_t +kern_return_t runtime_add_mport(mach_port_t name, mig_callback demux, mach_msg_size_t msg_size) { size_t needed_table_sz = (MACH_PORT_INDEX(name) + 1) * sizeof(mig_callback); @@ -801,7 +777,7 @@ return errno = mach_port_move_member(mach_task_self(), name, target_set); } -INTERNAL_ABI kern_return_t +kern_return_t runtime_remove_mport(mach_port_t name) { mig_cb_table[MACH_PORT_INDEX(name)] = NULL; @@ -809,31 +785,37 @@ return errno = mach_port_move_member(mach_task_self(), name, MACH_PORT_NULL); } -INTERNAL_ABI kern_return_t +kern_return_t launchd_mport_make_send(mach_port_t name) { return errno = mach_port_insert_right(mach_task_self(), name, name, MACH_MSG_TYPE_MAKE_SEND); } -INTERNAL_ABI kern_return_t +kern_return_t +launchd_mport_copy_send(mach_port_t name) +{ + return errno = mach_port_insert_right(mach_task_self(), name, name, MACH_MSG_TYPE_COPY_SEND); +} + +kern_return_t launchd_mport_close_recv(mach_port_t name) { return errno = mach_port_mod_refs(mach_task_self(), name, MACH_PORT_RIGHT_RECEIVE, -1); } -INTERNAL_ABI kern_return_t +kern_return_t launchd_mport_create_recv(mach_port_t *name) { return errno = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, name); } -INTERNAL_ABI kern_return_t +kern_return_t launchd_mport_deallocate(mach_port_t name) { return errno = mach_port_deallocate(mach_task_self(), name); } -INTERNAL_ABI int +int kevent_bulk_mod(struct kevent *kev, size_t kev_cnt) { size_t i; @@ -845,7 +827,7 @@ return kevent(mainkq, kev, kev_cnt, kev, kev_cnt, NULL); } -INTERNAL_ABI int +int kevent_mod(uintptr_t ident, short filter, u_short flags, u_int fflags, intptr_t data, void *udata) { struct kevent kev; @@ -901,7 +883,7 @@ } else if (notify_server_routine(Request)) { return notify_server(Request, Reply); } else { - return exc_server(Request, Reply); + return mach_exc_server(Request, Reply); } } @@ -1000,12 +982,65 @@ } -INTERNAL_ABI struct ldcred * +struct ldcred * runtime_get_caller_creds(void) { return &ldc; } +mach_msg_return_t +launchd_exc_runtime_once(mach_port_t port, mach_msg_size_t rcv_msg_size, mach_msg_size_t send_msg_size, mig_reply_error_t *bufRequest, mig_reply_error_t *bufReply, mach_msg_timeout_t to) +{ + mach_msg_return_t mr = ~MACH_MSG_SUCCESS; + mach_msg_option_t rcv_options = MACH_RCV_MSG | + MACH_RCV_TIMEOUT | + MACH_RCV_TRAILER_ELEMENTS(MACH_RCV_TRAILER_AUDIT) | + MACH_RCV_TRAILER_TYPE(MACH_MSG_TRAILER_FORMAT_0) ; + + do { + mr = mach_msg(&bufRequest->Head, rcv_options, 0, rcv_msg_size, port, to, MACH_PORT_NULL); + switch( mr ) { + case MACH_RCV_TIMED_OUT : + runtime_syslog(LOG_NOTICE, "Message queue is empty."); + break; + case MACH_RCV_TOO_LARGE : + runtime_syslog(LOG_NOTICE, "Message is larger than %u bytes.", rcv_msg_size); + break; + default : + launchd_assumes(mr == MACH_MSG_SUCCESS); + } + + if( mr == MACH_MSG_SUCCESS ) { + if( !launchd_assumes(mach_exc_server(&bufRequest->Head, &bufReply->Head) == TRUE) ) { + runtime_syslog(LOG_WARNING, "Exception server routine failed."); + break; + } + + mach_msg_return_t smr = ~MACH_MSG_SUCCESS; + mach_msg_option_t send_options = MACH_SEND_MSG | + MACH_SEND_TIMEOUT ; + + launchd_assumes(bufReply->Head.msgh_size <= send_msg_size); + smr = mach_msg(&bufReply->Head, send_options, bufReply->Head.msgh_size, 0, MACH_PORT_NULL, to + 100, MACH_PORT_NULL); + switch( smr ) { + case MACH_SEND_TIMED_OUT : + runtime_syslog(LOG_WARNING, "Timed out while trying to send reply to exception message."); + break; + case MACH_SEND_INVALID_DEST : + runtime_syslog(LOG_WARNING, "Tried sending a message to a port that we don't possess a send right to."); + break; + default : + if( !launchd_assumes(smr == MACH_MSG_SUCCESS) ) { + runtime_syslog(LOG_WARNING, "Couldn't deliver exception reply: 0x%x", smr); + } + break; + } + } + } while( 0 ); + + return mr; +} + void launchd_runtime2(mach_msg_size_t msg_size, mig_reply_error_t *bufRequest, mig_reply_error_t *bufReply) { @@ -1026,7 +1061,7 @@ to = MACH_MSG_TIMEOUT_NONE; if (unlikely(msg_size != max_msg_size)) { - /* The buffer isn't big enougth to receive messages anymore... */ + /* The buffer isn't big enough to receive messages anymore... */ tmp_options &= ~MACH_RCV_MSG; options &= ~MACH_RCV_MSG; if (!(tmp_options & MACH_SEND_MSG)) { @@ -1143,7 +1178,7 @@ } } -INTERNAL_ABI int +int runtime_close(int fd) { int i; @@ -1165,7 +1200,7 @@ return close(fd); } -INTERNAL_ABI void +void runtime_closelog(void) { runtime_log_push(); @@ -1176,7 +1211,7 @@ } } -INTERNAL_ABI int +int runtime_fsync(int fd) { #if 0 @@ -1190,7 +1225,7 @@ #endif } -INTERNAL_ABI int +int runtime_setlogmask(int maskpri) { internal_mask_pri = maskpri; @@ -1198,7 +1233,7 @@ return internal_mask_pri; } -INTERNAL_ABI void +void runtime_syslog(int pri, const char *message, ...) { bool log_to_console = pri & LOG_CONSOLE; @@ -1217,7 +1252,7 @@ va_end(ap); } -INTERNAL_ABI void +void runtime_vsyslog(struct runtime_syslog_attr *attr, bool echo_to_console, const char *message, va_list args) { int saved_errno = errno; @@ -1357,7 +1392,7 @@ mig_deallocate(outval, outvalCnt); } -INTERNAL_ABI void +void runtime_log_push(void) { static pthread_mutex_t ourlock = PTHREAD_MUTEX_INITIALIZER; @@ -1411,7 +1446,7 @@ } } -INTERNAL_ABI kern_return_t +kern_return_t runtime_log_forward(uid_t forward_uid, gid_t forward_gid, vm_offset_t inval, mach_msg_type_number_t invalCnt) { struct logmsg_s *lm, *lm_walk; @@ -1447,7 +1482,7 @@ return 0; } -INTERNAL_ABI kern_return_t +kern_return_t runtime_log_drain(mach_port_t srp, vm_offset_t *outval, mach_msg_type_number_t *outvalCnt) { launchd_assumes(drain_reply_port == 0); @@ -1471,7 +1506,7 @@ * In the long run, reference counting should completely automate when a * process can and should exit. */ -INTERNAL_ABI void +void runtime_add_ref(void) { if (!pid1_magic) { @@ -1480,7 +1515,7 @@ runtime_busy_cnt++; } -INTERNAL_ABI void +void runtime_del_ref(void) { if (!pid1_magic) { @@ -1489,7 +1524,7 @@ runtime_busy_cnt--; } -INTERNAL_ABI void +void runtime_add_weak_ref(void) { if (!pid1_magic) { @@ -1498,7 +1533,7 @@ runtime_standby_cnt++; } -INTERNAL_ABI void +void runtime_del_weak_ref(void) { if (!pid1_magic) { @@ -1508,40 +1543,40 @@ } kern_return_t -catch_exception_raise(mach_port_t exception_port __attribute__((unused)), mach_port_t thread, mach_port_t task, - exception_type_t exception, exception_data_t code, mach_msg_type_number_t codeCnt) +catch_mach_exception_raise(mach_port_t exception_port __attribute__((unused)), mach_port_t thread, mach_port_t task, + exception_type_t exception, mach_exception_data_t code, mach_msg_type_number_t codeCnt) { pid_t p4t = -1; launchd_assumes(pid_for_task(task, &p4t) == 0); - + runtime_syslog(LOG_NOTICE, "%s(): PID: %u thread: 0x%x type: 0x%x code: %p codeCnt: 0x%x", __func__, p4t, thread, exception, code, codeCnt); - + launchd_assumes(launchd_mport_deallocate(thread) == KERN_SUCCESS); launchd_assumes(launchd_mport_deallocate(task) == KERN_SUCCESS); - return 0; + return KERN_SUCCESS; } kern_return_t -catch_exception_raise_state(mach_port_t exception_port __attribute__((unused)), - exception_type_t exception, const exception_data_t code, mach_msg_type_number_t codeCnt, +catch_mach_exception_raise_state(mach_port_t exception_port __attribute__((unused)), + exception_type_t exception, const mach_exception_data_t code, mach_msg_type_number_t codeCnt, int *flavor, const thread_state_t old_state, mach_msg_type_number_t old_stateCnt, thread_state_t new_state, mach_msg_type_number_t *new_stateCnt) { runtime_syslog(LOG_NOTICE, "%s(): type: 0x%x code: %p codeCnt: 0x%x flavor: %p old_state: %p old_stateCnt: 0x%x new_state: %p new_stateCnt: %p", __func__, exception, code, codeCnt, flavor, old_state, old_stateCnt, new_state, new_stateCnt); - + memcpy(new_state, old_state, old_stateCnt * sizeof(old_state[0])); *new_stateCnt = old_stateCnt; - return 0; + return KERN_SUCCESS; } kern_return_t -catch_exception_raise_state_identity(mach_port_t exception_port __attribute__((unused)), mach_port_t thread, mach_port_t task, - exception_type_t exception, exception_data_t code, mach_msg_type_number_t codeCnt, +catch_mach_exception_raise_state_identity(mach_port_t exception_port __attribute__((unused)), mach_port_t thread, mach_port_t task, + exception_type_t exception, mach_exception_data_t code, mach_msg_type_number_t codeCnt, int *flavor, thread_state_t old_state, mach_msg_type_number_t old_stateCnt, thread_state_t new_state, mach_msg_type_number_t *new_stateCnt) { @@ -1551,17 +1586,17 @@ runtime_syslog(LOG_NOTICE, "%s(): PID: %u thread: 0x%x type: 0x%x code: %p codeCnt: 0x%x flavor: %p old_state: %p old_stateCnt: 0x%x new_state: %p new_stateCnt: %p", __func__, p4t, thread, exception, code, codeCnt, flavor, old_state, old_stateCnt, new_state, new_stateCnt); - + memcpy(new_state, old_state, old_stateCnt * sizeof(old_state[0])); *new_stateCnt = old_stateCnt; launchd_assumes(launchd_mport_deallocate(thread) == KERN_SUCCESS); launchd_assumes(launchd_mport_deallocate(task) == KERN_SUCCESS); - return 0; + return KERN_SUCCESS; } -INTERNAL_ABI void +void launchd_log_vm_stats(void) { static struct vm_statistics orig_stats; @@ -1609,7 +1644,7 @@ launchd_mport_deallocate(mhs); } -INTERNAL_ABI int64_t +int64_t runtime_get_wall_time(void) { struct timeval tv; @@ -1624,25 +1659,25 @@ return r; } -INTERNAL_ABI uint64_t +uint64_t runtime_get_opaque_time(void) { return mach_absolute_time(); } -INTERNAL_ABI uint64_t +uint64_t runtime_get_opaque_time_of_event(void) { return time_of_mach_msg_return; } -INTERNAL_ABI uint64_t +uint64_t runtime_get_nanoseconds_since(uint64_t o) { return runtime_opaque_time_to_nano(runtime_get_opaque_time_of_event() - o); } -INTERNAL_ABI uint64_t +uint64_t runtime_opaque_time_to_nano(uint64_t o) { #if defined(__i386__) || defined(__x86_64__) @@ -1698,4 +1733,8 @@ if( stat("/var/db/.launchd_disable_sudden_termination", &sb) == 0 ) { g_force_old_kill_path = true; } + + if( !pid1_magic && stat("/var/db/.launchd_flat_per_user_namespace", &sb) == 0 ) { + g_flat_mach_namespace = true; + } } Modified: trunk/launchd/src/launchd_runtime.h =================================================================== --- trunk/launchd/src/launchd_runtime.h 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/launchd_runtime.h 2008-11-22 22:31:20 UTC (rev 23754) @@ -71,14 +71,6 @@ #endif -#ifndef INTERNAL_ABI -#ifdef __i386__ -#define INTERNAL_ABI __attribute__((regparm(3))) -#else -#define INTERNAL_ABI -#endif -#endif - #define likely(x) __builtin_expect((bool)(x), true) #define unlikely(x) __builtin_expect((bool)(x), false) @@ -100,51 +92,54 @@ #define launchd_assert(e) if (__builtin_constant_p(e)) { char __compile_time_assert__[e ? 1 : -1] __attribute__((unused)); } else if (!launchd_assumes(e)) { abort(); } -INTERNAL_ABI void _log_launchd_bug(const char *rcs_rev, const char *path, unsigned int line, const char *test); +void _log_launchd_bug(const char *rcs_rev, const char *path, unsigned int line, const char *test); -typedef INTERNAL_ABI void (*kq_callback)(void *, struct kevent *); +typedef void (*kq_callback)(void *, struct kevent *); typedef boolean_t (*mig_callback)(mach_msg_header_t *, mach_msg_header_t *); -typedef INTERNAL_ABI void (*timeout_callback)(void); +typedef void (*timeout_callback)(void); extern bool pid1_magic; extern bool low_level_debug; extern char g_username[128]; -INTERNAL_ABI mach_port_t runtime_get_kernel_port(void); +mach_port_t runtime_get_kernel_port(void); +extern boolean_t launchd_internal_demux(mach_msg_header_t *Request, mach_msg_header_t *Reply); -INTERNAL_ABI void runtime_add_ref(void); -INTERNAL_ABI void runtime_del_ref(void); -INTERNAL_ABI void runtime_add_weak_ref(void); -INTERNAL_ABI void runtime_del_weak_ref(void); +void runtime_add_ref(void); +void runtime_del_ref(void); +void runtime_add_weak_ref(void); +void runtime_del_weak_ref(void); -INTERNAL_ABI void launchd_runtime_init(void); -INTERNAL_ABI void launchd_runtime_init2(void); -INTERNAL_ABI void launchd_runtime(void) __attribute__((noreturn)); +void launchd_runtime_init(void); +void launchd_runtime_init2(void); +void launchd_runtime(void) __attribute__((noreturn)); -INTERNAL_ABI void launchd_log_vm_stats(void); +void launchd_log_vm_stats(void); -INTERNAL_ABI int runtime_close(int fd); -INTERNAL_ABI int runtime_fsync(int fd); +int runtime_close(int fd); +int runtime_fsync(int fd); #define RUNTIME_ADVISABLE_IDLE_TIMEOUT 30 -INTERNAL_ABI void runtime_set_timeout(timeout_callback to_cb, unsigned int sec); -INTERNAL_ABI kern_return_t runtime_add_mport(mach_port_t name, mig_callback demux, mach_msg_size_t msg_size); -INTERNAL_ABI kern_return_t runtime_remove_mport(mach_port_t name); -INTERNAL_ABI struct ldcred *runtime_get_caller_creds(void); +void runtime_set_timeout(timeout_callback to_cb, unsigned int sec); +kern_return_t runtime_add_mport(mach_port_t name, mig_callback demux, mach_msg_size_t msg_size); +kern_return_t runtime_remove_mport(mach_port_t name); +struct ldcred *runtime_get_caller_creds(void); -INTERNAL_ABI const char *signal_to_C_name(unsigned int sig); -INTERNAL_ABI const char *reboot_flags_to_C_names(unsigned int flags); -INTERNAL_ABI const char *proc_flags_to_C_names(unsigned int flags); +const char *signal_to_C_name(unsigned int sig); +const char *reboot_flags_to_C_names(unsigned int flags); +const char *proc_flags_to_C_names(unsigned int flags); -INTERNAL_ABI int kevent_bulk_mod(struct kevent *kev, size_t kev_cnt); -INTERNAL_ABI int kevent_mod(uintptr_t ident, short filter, u_short flags, u_int fflags, intptr_t data, void *udata); +int kevent_bulk_mod(struct kevent *kev, size_t kev_cnt); +int kevent_mod(uintptr_t ident, short filter, u_short flags, u_int fflags, intptr_t data, void *udata); -INTERNAL_ABI pid_t runtime_fork(mach_port_t bsport); +pid_t runtime_fork(mach_port_t bsport); -INTERNAL_ABI kern_return_t runtime_log_forward(uid_t forward_uid, gid_t forward_gid, vm_offset_t inval, mach_msg_type_number_t invalCnt); -INTERNAL_ABI kern_return_t runtime_log_drain(mach_port_t srp, vm_offset_t *outval, mach_msg_type_number_t *outvalCnt); +mach_msg_return_t launchd_exc_runtime_once(mach_port_t port, mach_msg_size_t rcv_msg_size, mach_msg_size_t send_msg_size, mig_reply_error_t *bufRequest, mig_reply_error_t *bufReply, mach_msg_timeout_t to); +kern_return_t runtime_log_forward(uid_t forward_uid, gid_t forward_gid, vm_offset_t inval, mach_msg_type_number_t invalCnt); +kern_return_t runtime_log_drain(mach_port_t srp, vm_offset_t *outval, mach_msg_type_number_t *outvalCnt); + #define LOG_APPLEONLY 0x4141504c /* AAPL in hex */ #define LOG_CONSOLE (1 << 31) @@ -158,25 +153,26 @@ pid_t about_pid; }; -INTERNAL_ABI int runtime_setlogmask(int maskpri); -INTERNAL_ABI void runtime_closelog(void); -INTERNAL_ABI void runtime_syslog(int pri, const char *message, ...) __attribute__((format(printf, 2, 3))); -INTERNAL_ABI void runtime_vsyslog(struct runtime_syslog_attr *attr, bool log_to_console, const char *message, va_list args) __attribute__((format(printf, 3, 0))); -INTERNAL_ABI void runtime_log_push(void); +int runtime_setlogmask(int maskpri); +void runtime_closelog(void); +void runtime_syslog(int pri, const char *message, ...) __attribute__((format(printf, 2, 3))); +void runtime_vsyslog(struct runtime_syslog_attr *attr, bool log_to_console, const char *message, va_list args) __attribute__((format(printf, 3, 0))); +void runtime_log_push(void); -INTERNAL_ABI int64_t runtime_get_wall_time(void) __attribute__((warn_unused_result)); -INTERNAL_ABI uint64_t runtime_get_opaque_time(void) __attribute__((warn_unused_result)); -INTERNAL_ABI uint64_t runtime_get_opaque_time_of_event(void) __attribute__((pure, warn_unused_result)); -INTERNAL_ABI uint64_t runtime_opaque_time_to_nano(uint64_t o) __attribute__((const, warn_unused_result)); -INTERNAL_ABI uint64_t runtime_get_nanoseconds_since(uint64_t o) __attribute__((pure, warn_unused_result)); +int64_t runtime_get_wall_time(void) __attribute__((warn_unused_result)); +uint64_t runtime_get_opaque_time(void) __attribute__((warn_unused_result)); +uint64_t runtime_get_opaque_time_of_event(void) __attribute__((pure, warn_unused_result)); +uint64_t runtime_opaque_time_to_nano(uint64_t o) __attribute__((const, warn_unused_result)); +uint64_t runtime_get_nanoseconds_since(uint64_t o) __attribute__((pure, warn_unused_result)); -INTERNAL_ABI kern_return_t launchd_set_bport(mach_port_t name); -INTERNAL_ABI kern_return_t launchd_get_bport(mach_port_t *name); -INTERNAL_ABI kern_return_t launchd_mport_notify_req(mach_port_t name, mach_msg_id_t which); -INTERNAL_ABI kern_return_t launchd_mport_notify_cancel(mach_port_t name, mach_msg_id_t which); -INTERNAL_ABI kern_return_t launchd_mport_create_recv(mach_port_t *name); -INTERNAL_ABI kern_return_t launchd_mport_deallocate(mach_port_t name); -INTERNAL_ABI kern_return_t launchd_mport_make_send(mach_port_t name); -INTERNAL_ABI kern_return_t launchd_mport_close_recv(mach_port_t name); +kern_return_t launchd_set_bport(mach_port_t name); +kern_return_t launchd_get_bport(mach_port_t *name); +kern_return_t launchd_mport_notify_req(mach_port_t name, mach_msg_id_t which); +kern_return_t launchd_mport_notify_cancel(mach_port_t name, mach_msg_id_t which); +kern_return_t launchd_mport_create_recv(mach_port_t *name); +kern_return_t launchd_mport_deallocate(mach_port_t name); +kern_return_t launchd_mport_make_send(mach_port_t name); +kern_return_t launchd_mport_copy_send(mach_port_t name); +kern_return_t launchd_mport_close_recv(mach_port_t name); #endif Modified: trunk/launchd/src/launchd_unix_ipc.c =================================================================== --- trunk/launchd/src/launchd_unix_ipc.c 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/launchd_unix_ipc.c 2008-11-22 22:31:20 UTC (rev 23754) @@ -62,7 +62,7 @@ static void ipc_readmsg2(launch_data_t data, const char *cmd, void *context); static void ipc_readmsg(launch_data_t msg, void *context); -INTERNAL_ABI static void ipc_listen_callback(void *obj __attribute__((unused)), struct kevent *kev); +static void ipc_listen_callback(void *obj __attribute__((unused)), struct kevent *kev); static kq_callback kqipc_listen_callback = ipc_listen_callback; @@ -87,7 +87,7 @@ } } -INTERNAL_ABI void +void ipc_server_init(void) { struct sockaddr_un sun; @@ -177,7 +177,7 @@ } } -INTERNAL_ABI void +void ipc_open(int fd, job_t j) { struct conncb *c = calloc(1, sizeof(struct conncb)); @@ -191,7 +191,7 @@ kevent_mod(fd, EVFILT_READ, EV_ADD, 0, 0, &c->kqconn_callback); } -INTERNAL_ABI void +void ipc_listen_callback(void *obj __attribute__((unused)), struct kevent *kev) { struct sockaddr_un sun; @@ -205,7 +205,7 @@ ipc_open(cfd, NULL); } -INTERNAL_ABI void +void ipc_callback(void *obj, struct kevent *kev) { struct conncb *c = obj; @@ -239,7 +239,7 @@ setenv(key, launch_data_get_string(obj), 1); } -INTERNAL_ABI void +void ipc_close_all_with_job(job_t j) { struct conncb *ci, *cin; @@ -251,7 +251,7 @@ } } -INTERNAL_ABI void +void ipc_close_fds(launch_data_t o) { size_t i; @@ -274,7 +274,7 @@ } } -INTERNAL_ABI void +void ipc_revoke_fds(launch_data_t o) { size_t i; @@ -425,7 +425,7 @@ return runtime_close(fd); } -INTERNAL_ABI void +void ipc_close(struct conncb *c) { LIST_REMOVE(c, sle); Modified: trunk/launchd/src/launchd_unix_ipc.h =================================================================== --- trunk/launchd/src/launchd_unix_ipc.h 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/launchd_unix_ipc.h 2008-11-22 22:31:20 UTC (rev 23754) @@ -35,12 +35,12 @@ extern char *sockpath; -INTERNAL_ABI void ipc_open(int fd, job_t j); -INTERNAL_ABI void ipc_close_all_with_job(job_t j); -INTERNAL_ABI void ipc_close(struct conncb *c); -INTERNAL_ABI void ipc_callback(void *, struct kevent *); -INTERNAL_ABI void ipc_revoke_fds(launch_data_t o); -INTERNAL_ABI void ipc_close_fds(launch_data_t o); -INTERNAL_ABI void ipc_server_init(void); +void ipc_open(int fd, job_t j); +void ipc_close_all_with_job(job_t j); +void ipc_close(struct conncb *c); +void ipc_callback(void *, struct kevent *); +void ipc_revoke_fds(launch_data_t o); +void ipc_close_fds(launch_data_t o); +void ipc_server_init(void); #endif Modified: trunk/launchd/src/libbootstrap.c =================================================================== --- trunk/launchd/src/libbootstrap.c 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/libbootstrap.c 2008-11-22 22:31:20 UTC (rev 23754) @@ -82,12 +82,6 @@ } kern_return_t -bootstrap_set_policy(mach_port_t bp, pid_t target_pid, uint64_t flags, const char *target_service) -{ - return vproc_mig_set_service_policy(bp, target_pid, flags, target_service ? (char *)target_service : ""); -} - -kern_return_t bootstrap_register(mach_port_t bp, name_t service_name, mach_port_t sp) { return bootstrap_register2(bp, service_name, sp, 0); @@ -154,12 +148,22 @@ return kr; } - kr = vproc_mig_look_up2(puc, (char *)service_name, sp, &au_tok, 0, 0); - mach_port_deallocate(mach_task_self(), puc); + if( !service_name ) { + *sp = puc; + } else { + kr = vproc_mig_look_up2(puc, (char *)service_name, sp, &au_tok, 0, 0); + mach_port_deallocate(mach_task_self(), puc); + } return kr; } +kern_return_t +bootstrap_lookup_children(mach_port_t bp, mach_port_array_t *children, name_array_t *names, bootstrap_property_array_t *properties, mach_msg_type_number_t *n_children) +{ + mach_msg_type_number_t junk = 0; + return vproc_mig_lookup_children(bp, children, &junk, names, n_children, properties, &junk); +} kern_return_t bootstrap_look_up(mach_port_t bp, const name_t service_name, mach_port_t *sp) @@ -211,16 +215,13 @@ mach_port_deallocate(mach_task_self(), puc); out: - if (!per_pid_lookup && kr == 0 && prev_sp == 0 - && mach_port_mod_refs(mach_task_self(), *sp, MACH_PORT_RIGHT_SEND, 1) == 0) { + if (!per_pid_lookup && kr == 0 && prev_sp == 0 && mach_port_mod_refs(mach_task_self(), *sp, MACH_PORT_RIGHT_SEND, 1) == 0) { /* We're going to hold on to a send right as a MRU cache */ prev_bp = bp; prev_sp = *sp; strlcpy(prev_name, service_name, sizeof(name_t)); } - pthread_mutex_unlock(&bslu2_lock); - if ((kr == 0) && (flags & BOOTSTRAP_PRIVILEGED_SERVER) && !privileged_server_okay) { uid_t server_euid; @@ -243,7 +244,9 @@ } } - + /* If performance becomes a problem, we should restructure this. */ + pthread_mutex_unlock(&bslu2_lock); + return kr; } Modified: trunk/launchd/src/libvproc.c =================================================================== --- trunk/launchd/src/libvproc.c 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/libvproc.c 2008-11-22 22:31:20 UTC (rev 23754) @@ -157,6 +157,22 @@ return likely(vproc_shmem) ? vproc_shmem->vp_shmem_standby_timeout : 0; } +bool +_vproc_pid_is_managed(pid_t p) +{ + boolean_t result = false; + vproc_mig_pid_is_managed(bootstrap_port, p, &result); + + return result; +} + +kern_return_t +_vproc_transaction_count_for_pid(pid_t p, int32_t *count, bool *condemned) +{ + boolean_t _condemned = false; + return vproc_mig_transaction_count_for_pid(bootstrap_port, p, count, (boolean_t *)condemned ? : &_condemned); +} + void _vproc_transaction_try_exit(int status) { @@ -356,25 +372,21 @@ return (vproc_err_t)_vprocmgr_move_subset_to_user; } - if (is_bkgd || target_user) { - mach_port_t puc = 0, rootbs = get_root_bootstrap_port(); - - if (vproc_mig_lookup_per_user_context(rootbs, target_user, &puc) != 0) { - return (vproc_err_t)_vprocmgr_move_subset_to_user; - } - - if (is_bkgd) { - task_set_bootstrap_port(mach_task_self(), puc); - mach_port_deallocate(mach_task_self(), bootstrap_port); - bootstrap_port = puc; - } else { - kr = vproc_mig_move_subset(puc, bootstrap_port, (char *)session_type); - mach_port_deallocate(mach_task_self(), puc); - } + mach_port_t puc = 0, rootbs = get_root_bootstrap_port(); + + if (vproc_mig_lookup_per_user_context(rootbs, target_user, &puc) != 0) { + return (vproc_err_t)_vprocmgr_move_subset_to_user; + } + + if( is_bkgd ) { + task_set_bootstrap_port(mach_task_self(), puc); + mach_port_deallocate(mach_task_self(), bootstrap_port); + bootstrap_port = puc; } else { - kr = _vprocmgr_init(session_type) ? 1 : 0; + kr = vproc_mig_move_subset(puc, bootstrap_port, (char *)session_type); + mach_port_deallocate(mach_task_self(), puc); } - + cached_pid = -1; if (kr) { @@ -402,6 +414,20 @@ return !issetugid() ? _vproc_post_fork_ping() : NULL; } +vproc_err_t +_vprocmgr_detach_from_console(uint32_t flags __attribute__((unused))) +{ + mach_port_t new_bsport = MACH_PORT_NULL; + if( vproc_mig_detach_from_console(bootstrap_port, &new_bsport) != KERN_SUCCESS ) { + return (vproc_err_t)_vprocmgr_detach_from_console; + } + + task_set_bootstrap_port(mach_task_self(), new_bsport); + mach_port_deallocate(mach_task_self(), bootstrap_port); + bootstrap_port = new_bsport; + + return !issetugid() ? _vproc_post_fork_ping() : NULL; +} pid_t _spawn_via_launchd(const char *label, const char *const *argv, const struct spawn_via_launchd_attr *spawn_attrs, int struct_version) @@ -822,12 +848,13 @@ } vproc_err_t -_vproc_kickstart_by_label(const char *label, pid_t *out_pid, mach_port_t *out_port_name, mach_port_t *out_obsrvr_port) +_vproc_kickstart_by_label(const char *label, pid_t *out_pid, mach_port_t *out_port_name, mach_port_t *out_obsrvr_port, vproc_flags_t flags) { mach_port_t junk = MACH_PORT_NULL; mach_port_t junk2 = MACH_PORT_NULL; - if( vproc_mig_kickstart(bootstrap_port, (char *)label, out_pid, out_port_name ?: &junk, out_obsrvr_port ?: &junk2) == 0 ) { + kern_return_t kr = vproc_mig_kickstart(bootstrap_port, (char *)label, out_pid, out_port_name ?: &junk, out_obsrvr_port ?: &junk2, flags); + if( kr == KERN_SUCCESS ) { if( !out_port_name ) { mach_port_mod_refs(mach_task_self(), junk, MACH_PORT_RIGHT_SEND, -1); } Modified: trunk/launchd/src/protocol_job_reply.defs =================================================================== --- trunk/launchd/src/protocol_job_reply.defs 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/protocol_job_reply.defs 2008-11-22 22:31:20 UTC (rev 23754) @@ -66,8 +66,6 @@ skip; /* swap_integer */ -skip; /* set_service_policy */ - skip; /* log */ skip; /* lookup_per_user_context */ @@ -79,4 +77,4 @@ simpleroutine job_mig_log_drain_reply( __r_port : mach_port_move_send_once_t; __result : kern_return_t, RetCode; - __outval : pointer_t); + __outval : pointer_t); Modified: trunk/launchd/src/protocol_vproc.defs =================================================================== --- trunk/launchd/src/protocol_vproc.defs 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/protocol_vproc.defs 2008-11-22 22:31:20 UTC (rev 23754) @@ -35,7 +35,6 @@ type mach_port_move_send_array_t = array[] of mach_port_move_send_t ctype: mach_port_array_t; - userprefix vproc_mig_; serverprefix job_mig_; @@ -132,12 +131,6 @@ __inval : int64_t; out __outval : int64_t); -routine set_service_policy( - __bs_port : job_t; - __target_pid : pid_t; - __flags : uint64_t; - __service : name_t); - routine log( __bs_port : job_t; __pri : integer_t; @@ -175,9 +168,32 @@ __label : name_t; out __pid : pid_t; out __name_port : mach_port_t; -out __obsrvr_port : mach_port_make_send_t); +out __obsrvr_port : mach_port_make_send_t; + __flags : natural_t); routine embedded_wait( __bs_port : job_t; __label : name_t; out __waitval : integer_t); + +routine lookup_children( + __bs_port : job_t; +out __child_ports : mach_port_move_send_array_t, dealloc; +out __child_names : name_array_t, dealloc; +out __child_properties : bootstrap_property_array_t, dealloc); + +routine detach_from_console( + __bs_port : job_t; +out __new_bs_port : mach_port_make_send_t); + +routine transaction_count_for_pid( + __bs_port : job_t; + __pid : pid_t; +out __cnt : integer_t; +out __condemend : boolean_t); + +routine pid_is_managed( + __bs_port : job_t; + __pid : pid_t; +out __managed : boolean_t); + Modified: trunk/launchd/src/vproc_priv.h =================================================================== --- trunk/launchd/src/vproc_priv.h 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd/src/vproc_priv.h 2008-11-22 22:31:20 UTC (rev 23754) @@ -61,6 +61,10 @@ VPROC_GSK_WEIRD_BOOTSTRAP, } vproc_gsk_t; +typedef unsigned int vproc_flags_t; +/* For _vproc_kickstart_by_label() -- instructs launchd to kickstart the job to stall before exec(2). */ +#define VPROCFLAG_STALL_JOB_EXEC 1 << 1 + vproc_err_t vproc_swap_integer(vproc_t vp, vproc_gsk_t key, int64_t *inval, int64_t *outval); vproc_err_t vproc_swap_complex(vproc_t vp, vproc_gsk_t key, launch_data_t inval, launch_data_t *outval); @@ -72,7 +76,7 @@ vproc_err_t _vprocmgr_log_drain(vproc_t vp, pthread_mutex_t *optional_mutex_around_callback, _vprocmgr_log_drain_callback_t func); vproc_err_t _vproc_send_signal_by_label(const char *label, int sig); -vproc_err_t _vproc_kickstart_by_label(const char *label, pid_t *out_pid, mach_port_t *out_port_name, mach_port_t *out_obsrvr_port); +vproc_err_t _vproc_kickstart_by_label(const char *label, pid_t *out_pid, mach_port_t *out_port_name, mach_port_t *out_obsrvr_port, vproc_flags_t flags); vproc_err_t _vproc_wait_by_label(const char *label, int *out_wstatus); void _vproc_log(int pri, const char *msg, ...) __attribute__((format(printf, 2, 3))); @@ -86,16 +90,19 @@ #define VPROCMGR_SESSION_SYSTEM "System" vproc_err_t _vprocmgr_move_subset_to_user(uid_t target_user, const char *session_type); +vproc_err_t _vprocmgr_detach_from_console(vproc_flags_t flags); -void _vproc_standby_begin(void) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); -void _vproc_standby_end(void) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); -size_t _vproc_standby_count(void) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); -size_t _vproc_standby_timeout(void) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); +void _vproc_standby_begin(void) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); +void _vproc_standby_end(void) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); +size_t _vproc_standby_count(void) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); +size_t _vproc_standby_timeout(void) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); -void _vproc_transaction_try_exit(int status) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); -void _vproc_transaction_begin(void) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); -void _vproc_transaction_end(void) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); -size_t _vproc_transaction_count(void) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); +kern_return_t _vproc_transaction_count_for_pid(pid_t p, int32_t *count, bool *condemned) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); +bool _vproc_pid_is_managed(pid_t p) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); +void _vproc_transaction_try_exit(int status) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); +void _vproc_transaction_begin(void) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); +void _vproc_transaction_end(void) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); +size_t _vproc_transaction_count(void) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA); #pragma GCC visibility pop Modified: trunk/launchd.xcodeproj/project.pbxproj =================================================================== --- trunk/launchd.xcodeproj/project.pbxproj 2008-11-10 21:30:04 UTC (rev 23753) +++ trunk/launchd.xcodeproj/project.pbxproj 2008-11-22 22:31:20 UTC (rev 23754) @@ -52,7 +52,7 @@ /* Begin PBXBuildFile section */ 4B9EDCA20EAFC77E00A78496 /* DiskArbitration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B9EDCA10EAFC77E00A78496 /* DiskArbitration.framework */; }; 721FBEBC0EA7AE2F0057462B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 721FBEBB0EA7AE2F0057462B /* Security.framework */; }; - 726055EC0EA7EC2400D65FE7 /* exc.defs in Sources */ = {isa = PBXBuildFile; fileRef = FC36291F0E9349410054F1A3 /* exc.defs */; settings = {ATTRIBUTES = (Server, ); }; }; + 726055EC0EA7EC2400D65FE7 /* mach_exc.defs in Sources */ = {isa = PBXBuildFile; fileRef = FC36291F0E9349410054F1A3 /* mach_exc.defs */; settings = {ATTRIBUTES = (Server, ); }; }; 726056090EA7FCF200D65FE7 /* launchd_ktrace.c in Sources */ = {isa = PBXBuildFile; fileRef = 72FDB15D0EA7D7B200B2AC84 /* launchd_ktrace.c */; }; 72FDB15F0EA7D7B200B2AC84 /* launchd_ktrace.c in Sources */ = {isa = PBXBuildFile; fileRef = 72FDB15D0EA7D7B200B2AC84 /* launchd_ktrace.c */; }; 72FDB1C00EA7E21C00B2AC84 /* protocol_job_forward.defs in Sources */ = {isa = PBXBuildFile; fileRef = 72FDB1BF0EA7E21C00B2AC84 /* protocol_job_forward.defs */; }; @@ -298,7 +298,7 @@ FC36283E0E93463C0054F1A3 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = ""; }; FC36290C0E93475F0054F1A3 /* notify.defs */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.mig; name = notify.defs; path = /usr/include/mach/notify.defs; sourceTree = ""; }; FC3629160E9348390054F1A3 /* protocol_job_reply.defs */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.mig; name = protocol_job_reply.defs; path = launchd/src/protocol_job_reply.defs; sourceTree = ""; }; - FC36291F0E9349410054F1A3 /* exc.defs */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.mig; name = exc.defs; path = /usr/include/mach/exc.defs; sourceTree = ""; }; + FC36291F0E9349410054F1A3 /* mach_exc.defs */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.mig; name = mach_exc.defs; path = /usr/include/mach/mach_exc.defs; sourceTree = ""; }; FC36292C0E934AA40054F1A3 /* libbsm.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libbsm.dylib; path = /usr/lib/libbsm.dylib; sourceTree = ""; }; FC59A0540E8C884700D41150 /* launchd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = launchd; sourceTree = BUILT_PRODUCTS_DIR; }; FC59A0600E8C885100D41150 /* liblaunch.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = liblaunch.a; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -419,7 +419,7 @@ FC3629160E9348390054F1A3 /* protocol_job_reply.defs */, FC3627DF0E9344BF0054F1A3 /* protocol_vproc.defs */, FC59A0BD0E8C8A2A00D41150 /* launchd_internal.defs */, - FC36291F0E9349410054F1A3 /* exc.defs */, + FC36291F0E9349410054F1A3 /* mach_exc.defs */, FC36290C0E93475F0054F1A3 /* notify.defs */, ); name = MIG; @@ -837,7 +837,7 @@ FC59A0BF0E8C8A2A00D41150 /* launchd_internal.defs in Sources */, FC3627E10E9344BF0054F1A3 /* protocol_vproc.defs in Sources */, FC3629170E9348390054F1A3 /* protocol_job_reply.defs in Sources */, - 726055EC0EA7EC2400D65FE7 /* exc.defs in Sources */, + 726055EC0EA7EC2400D65FE7 /* mach_exc.defs in Sources */, FC36290D0E93475F0054F1A3 /* notify.defs in Sources */, FC59A0C50E8C8A4700D41150 /* launchd.c in Sources */, FC59A0BA0E8C8A1F00D41150 /* launchd_runtime.c in Sources */, @@ -998,6 +998,7 @@ INSTALL_PATH = /sbin; PREBINDING = NO; PRODUCT_NAME = launchd; + STRIP_STYLE = debugging; ZERO_LINK = NO; }; name = Release; @@ -1014,6 +1015,7 @@ COPY_PHASE_STRIP = YES; CURRENT_PROJECT_VERSION = "$(RC_ProjectSourceVersion)"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + INSTALLHDRS_SCRIPT_PHASE = YES; INSTALL_PATH = /usr/local/lib/system; OTHER_CFLAGS = ( "-D__MigTypeCheck=1", @@ -1039,6 +1041,7 @@ INSTALL_PATH = /bin; PREBINDING = NO; PRODUCT_NAME = launchctl; + STRIP_STYLE = debugging; ZERO_LINK = NO; }; name = Release; @@ -1075,6 +1078,7 @@ INSTALL_PATH = /sbin; PREBINDING = NO; PRODUCT_NAME = SystemStarter; + STRIP_STYLE = debugging; ZERO_LINK = NO; }; name = Release; @@ -1089,6 +1093,7 @@ INSTALL_PATH = /usr/libexec; PREBINDING = NO; PRODUCT_NAME = launchproxy; + STRIP_STYLE = debugging; ZERO_LINK = NO; }; name = Release; @@ -1103,6 +1108,7 @@ INSTALL_PATH = /bin; PREBINDING = NO; PRODUCT_NAME = wait4path; + STRIP_STYLE = debugging; ZERO_LINK = NO; }; name = Release; -------------- next part -------------- An HTML attachment was scrubbed... URL: From source_changes at macosforge.org Sat Nov 22 14:31:37 2008 From: source_changes at macosforge.org (source_changes at macosforge.org) Date: Sat, 22 Nov 2008 14:31:37 -0800 (PST) Subject: [launchd-changes] [23755] tags/launchd-291/ Message-ID: <20081122223137.541DB72FC4D@beta.macosforge.org> Revision: 23755 http://trac.macosforge.org/projects/launchd/changeset/23755 Author: dsorresso at apple.com Date: 2008-11-22 14:31:37 -0800 (Sat, 22 Nov 2008) Log Message: ----------- "Tagging launchd-291 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-291/ Property changes on: tags/launchd-291 ___________________________________________________________________ Added: svn:ignore + build Added: svn:mergeinfo + /branches/PR-5092682:23731-23742 /branches/PR-5898404:23681-23700 /branches/PR-5978442:23651-23701 /branches/PR-6132016:23719-23738 -------------- next part -------------- An HTML attachment was scrubbed... URL: From source_changes at macosforge.org Tue Nov 25 15:48:06 2008 From: source_changes at macosforge.org (source_changes at macosforge.org) Date: Tue, 25 Nov 2008 15:48:06 -0800 (PST) Subject: [launchd-changes] [23756] trunk/launchd/src Message-ID: <20081125234807.289E277F799@beta.macosforge.org> Revision: 23756 http://trac.macosforge.org/projects/launchd/changeset/23756 Author: dsorresso at apple.com Date: 2008-11-25 15:48:06 -0800 (Tue, 25 Nov 2008) Log Message: ----------- Support allowing Launchd to launch by label (take 2) Mach exception chain does not cleanly unwind Race condition in sampling path, other changes to make sampling more robust 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 2008-11-22 22:31:37 UTC (rev 23755) +++ trunk/launchd/src/launchd.c 2008-11-25 23:48:06 UTC (rev 23756) @@ -188,6 +188,11 @@ if( pid1_magic ) { runtime_syslog(LOG_NOTICE | LOG_CONSOLE, "*** launchd[1] has started up. ***"); + + struct stat sb; + if( stat("/var/db/.launchd_flat_per_user_namespace", &sb) == 0 ) { + runtime_syslog(LOG_NOTICE | LOG_CONSOLE, "Flat per-user Mach namespaces enabled."); + } } monitor_networking_state(); Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2008-11-22 22:31:37 UTC (rev 23755) +++ trunk/launchd/src/launchd_core_logic.c 2008-11-25 23:48:06 UTC (rev 23756) @@ -2699,12 +2699,9 @@ return; } - job_log(j, LOG_DEBUG | LOG_CONSOLE, "Going to sample job."); - char pidstr[32]; snprintf(pidstr, sizeof(pidstr), "%u", j->p); snprintf(j->mgr->sample_log_file, sizeof(j->mgr->sample_log_file), SHUTDOWN_LOG_DIR "/%s-%u.sample.txt", j->label, j->p); - job_log(j, LOG_DEBUG | LOG_CONSOLE, "Going to write sample to %s.", j->mgr->sample_log_file); if (job_assumes(j, unlink(jm->sample_log_file) != -1 || errno == ENOENT)) { pid_t sp = 0; @@ -2738,33 +2735,74 @@ posix_spawnattr_destroy(&psattr); #else - switch( (sp = vfork()) ) { + int execpair[2] = { 0, 0 }; + job_assumes(j, socketpair(AF_UNIX, SOCK_STREAM, 0, execpair) != -1); + + switch( (sp = fork()) ) { case 0 : - /* Handle sample's exceptions directly, since ReportCrash may not be able to. */ + job_assumes(j, runtime_close(execpair[0]) != -1); + /* Handle sample's exceptions directly, since ReportCrash will not be able to. */ task_set_exception_ports(mach_task_self(), EXC_MASK_CRASH, runtime_get_kernel_port(), EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES, f); + + /* Wait for the parent to attach a kevent. */ + read(_fd(execpair[1]), &sp, sizeof(sp)); execve(sample_args[0], sample_args, environ); job_log(j, LOG_NOTICE | LOG_CONSOLE, "Could not exec(2): %d", errno); _exit(EXIT_FAILURE); case -1 : - job_log(j, LOG_NOTICE | LOG_CONSOLE, "vfork(2) failed: %d", errno); + job_assumes(j, runtime_close(execpair[0]) != -1); + job_assumes(j, runtime_close(execpair[1]) != -1); + execpair[0] = -1; + execpair[1] = -1; + job_log(j, LOG_NOTICE | LOG_CONSOLE, "fork(2) failed: %d", errno); break; default : + job_assumes(j, runtime_close(execpair[1]) != -1); + execpair[1] = -1; break; } + int r = -1; if( sp != -1 ) { - j->sample_pid = sp; + /* Let us know when sample is done. ONESHOT is implicit if we're just interested in NOTE_EXIT. */ + if( job_assumes(j, (r = kevent_mod(sp, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, j)) != -1) ) { + if( job_assumes(j, write(execpair[0], &sp, sizeof(sp)) == sizeof(sp)) ) { + j->sample_pid = sp; + } else { + job_assumes(j, kevent_mod(sp, EVFILT_PROC, EV_DELETE, 0, 0, NULL) != -1); + job_assumes(j, runtime_kill(sp, SIGKILL) != -1); + r = -1; + } + } else { + job_assumes(j, runtime_kill(sp, SIGKILL) != -1); + } - /* Let us know when sample is done. ONESHOT is implicit if we're just interested in NOTE_EXIT. */ - job_assumes(j, kevent_mod(sp, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, j) != -1); - } else { + int status = 0; + if( r == -1 ) { + job_assumes(j, waitpid(sp, &status, WNOHANG) != -1); + } + } + + if( execpair[0] != -1 ) { + job_assumes(j, runtime_close(execpair[0]) != -1); + } + + if( execpair[1] != -1 ) { + job_assumes(j, runtime_close(execpair[0]) != -1); + } + + if( r == -1 ) { job_log(j, LOG_ERR | LOG_CONSOLE, "Sampling for job failed!"); STAILQ_REMOVE(&jm->pending_samples, j, job_s, pending_samples_sle); + j->sampled = true; jobmgr_dequeue_next_sample(jm); + } else { + job_log(j, LOG_DEBUG | LOG_CONSOLE, "Sampling job (sample PID: %i, file: %s).", sp, j->mgr->sample_log_file); } #endif } else { STAILQ_REMOVE(&jm->pending_samples, j, job_s, pending_samples_sle); + j->sampled = true; } j->pending_sample = false; @@ -2960,12 +2998,13 @@ job_kill(j); } + job_log(j, LOG_DEBUG | LOG_CONSOLE, "sample[%i] finished with job.", j->sample_pid); j->sample_pid = 0; j->sampled = true; STAILQ_REMOVE(&j->mgr->pending_samples, j, job_s, pending_samples_sle); if( j->reap_after_sample ) { - job_log(j, LOG_NOTICE | LOG_CONSOLE, "Sampling complete. Reaping."); + job_log(j, LOG_DEBUG | LOG_CONSOLE, "Reaping job now that sample is done."); struct kevent kev; EV_SET(&kev, 1, 0, 0, NOTE_EXIT, 0, 0); @@ -2973,8 +3012,6 @@ job_callback_proc(j, &kev); } - job_log(j, LOG_DEBUG | LOG_CONSOLE, "Finished sampling."); - jobmgr_dequeue_next_sample(j->mgr); } @@ -2986,14 +3023,13 @@ if( j->sample_pid == (pid_t)kev->ident ) { job_assumes(j, (fflags & NOTE_EXIT) != 0); - job_log(j, LOG_NOTICE | LOG_CONSOLE, "Sampling for job done. Reaping sample..."); job_reap_sample(j); return; } else if( j->sample_pid && !j->reap_after_sample ) { /* The job exited before our sample completed. */ - job_log(j, LOG_NOTICE | LOG_CONSOLE, "Job exited. Will reap after sample is complete."); + job_log(j, LOG_NOTICE | LOG_CONSOLE, "Job has exited. Will reap after sample[%i] is complete.", j->sample_pid); j->reap_after_sample = true; return; } @@ -3069,6 +3105,10 @@ * - once for the SIGKILL_TIMER timer, at which point we log an issue * with the long SIGKILL */ + + bool was_is_or_will_be_sampled = ( j->sampled || j->sample_pid || j->pending_sample ); + bool should_enqueue = ( !was_is_or_will_be_sampled && do_apple_internal_logging ); + if (j->sent_sigkill) { uint64_t td = runtime_get_nanoseconds_since(j->sent_signal_time); @@ -3076,28 +3116,34 @@ td -= j->exit_timeout; job_log(j, LOG_WARNING | LOG_CONSOLE, "Did not die after sending SIGKILL %llu seconds ago...", td); - } else if (!(j->sampled || j->sample_pid || j->pending_sample) && (!j->exit_timeout || (LAUNCHD_SAMPLE_TIMEOUT < j->exit_timeout))) { - if( do_apple_internal_logging ) { - /* This should work even if the job changes its exit_timeout midstream */ - job_log(j, LOG_NOTICE | LOG_CONSOLE, "Sampling timeout elapsed (%u seconds). Scheduling a sample...", LAUNCHD_SAMPLE_TIMEOUT); - if (j->exit_timeout) { - unsigned int ttk = (j->exit_timeout - LAUNCHD_SAMPLE_TIMEOUT); - job_assumes(j, kevent_mod((uintptr_t)&j->exit_timeout, EVFILT_TIMER, - EV_ADD|EV_ONESHOT, NOTE_SECONDS, ttk, j) != -1); - job_log(j, LOG_NOTICE | LOG_CONSOLE, "Scheduled new exit timeout for %u seconds later", ttk); - } - - STAILQ_INSERT_TAIL(&j->mgr->pending_samples, j, pending_samples_sle); - j->pending_sample = true; - jobmgr_dequeue_next_sample(j->mgr); + } else if( should_enqueue && (!j->exit_timeout || (LAUNCHD_SAMPLE_TIMEOUT < j->exit_timeout)) ) { + /* This should work even if the job changes its exit_timeout midstream */ + job_log(j, LOG_NOTICE | LOG_CONSOLE, "Sampling timeout elapsed (%u seconds). Scheduling a sample...", LAUNCHD_SAMPLE_TIMEOUT); + if (j->exit_timeout) { + unsigned int ttk = (j->exit_timeout - LAUNCHD_SAMPLE_TIMEOUT); + job_assumes(j, kevent_mod((uintptr_t)&j->exit_timeout, EVFILT_TIMER, + EV_ADD|EV_ONESHOT, NOTE_SECONDS, ttk, j) != -1); + job_log(j, LOG_NOTICE | LOG_CONSOLE, "Scheduled new exit timeout for %u seconds later", ttk); } + + STAILQ_INSERT_TAIL(&j->mgr->pending_samples, j, pending_samples_sle); + j->pending_sample = true; + jobmgr_dequeue_next_sample(j->mgr); } else { - if( !(j->sampled || j->sample_pid || j->pending_sample) && do_apple_internal_logging ) { - job_log(j, LOG_WARNING | LOG_CONSOLE, "Exit timeout elapsed (%u seconds). Will kill after sampling.", j->exit_timeout); - STAILQ_INSERT_TAIL(&j->mgr->pending_samples, j, pending_samples_sle); - j->pending_sample = true; - j->kill_after_sample = true; - + if( do_apple_internal_logging && !j->sampled ) { + if( j->sample_pid || j->pending_sample ) { + char pidstr[24] = { 0 }; + snprintf(pidstr, sizeof(pidstr), "[%i] ", j->sample_pid); + + job_log(j, LOG_DEBUG | LOG_CONSOLE, "Exit timeout elapsed (%u seconds). Will kill after sample%shas completed.", j->exit_timeout, j->sample_pid ? pidstr : " "); + j->kill_after_sample = true; + } else { + job_log(j, LOG_DEBUG | LOG_CONSOLE, "Exit timeout elapsed (%u seconds). Will sample and then kill.", j->exit_timeout); + + STAILQ_INSERT_TAIL(&j->mgr->pending_samples, j, pending_samples_sle); + j->pending_sample = true; + } + jobmgr_dequeue_next_sample(j->mgr); } else { if (unlikely(j->debug_before_kill)) { -------------- next part -------------- An HTML attachment was scrubbed... URL: From source_changes at macosforge.org Tue Nov 25 15:49:26 2008 From: source_changes at macosforge.org (source_changes at macosforge.org) Date: Tue, 25 Nov 2008 15:49:26 -0800 (PST) Subject: [launchd-changes] [23757] tags/launchd-292/ Message-ID: <20081125234926.DD68577F7F8@beta.macosforge.org> Revision: 23757 http://trac.macosforge.org/projects/launchd/changeset/23757 Author: dsorresso at apple.com Date: 2008-11-25 15:49:26 -0800 (Tue, 25 Nov 2008) Log Message: ----------- "Tagging launchd-292 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-292/ Property changes on: tags/launchd-292 ___________________________________________________________________ Added: svn:ignore + build Added: svn:mergeinfo + /branches/PR-5092682:23731-23742 /branches/PR-5898404:23681-23700 /branches/PR-5978442:23651-23701 /branches/PR-6132016:23719-23738 -------------- next part -------------- An HTML attachment was scrubbed... URL: From source_changes at macosforge.org Tue Nov 25 22:55:01 2008 From: source_changes at macosforge.org (source_changes at macosforge.org) Date: Tue, 25 Nov 2008 22:55:01 -0800 (PST) Subject: [launchd-changes] [23758] trunk/launchd/src Message-ID: <20081126065501.E76267865BB@beta.macosforge.org> Revision: 23758 http://trac.macosforge.org/projects/launchd/changeset/23758 Author: dsorresso at apple.com Date: 2008-11-25 22:55:01 -0800 (Tue, 25 Nov 2008) Log Message: ----------- Fixing pre-build issues introduced by remove unneeded include files from audit.h and xnu-1366. Modified Paths: -------------- trunk/launchd/src/launchd.c trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/launchd_unix_ipc.c Modified: trunk/launchd/src/launchd.c =================================================================== --- trunk/launchd/src/launchd.c 2008-11-25 23:49:26 UTC (rev 23757) +++ trunk/launchd/src/launchd.c 2008-11-26 06:55:01 UTC (rev 23758) @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include @@ -68,7 +69,6 @@ #include #include #include -#include #include "bootstrap.h" #include "vproc.h" Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2008-11-25 23:49:26 UTC (rev 23757) +++ trunk/launchd/src/launchd_core_logic.c 2008-11-26 06:55:01 UTC (rev 23758) @@ -51,6 +51,7 @@ #include #include #include +#include #include #include #include Modified: trunk/launchd/src/launchd_unix_ipc.c =================================================================== --- trunk/launchd/src/launchd_unix_ipc.c 2008-11-25 23:49:26 UTC (rev 23757) +++ trunk/launchd/src/launchd_unix_ipc.c 2008-11-26 06:55:01 UTC (rev 23758) @@ -23,6 +23,7 @@ #include "config.h" #include "launchd_unix_ipc.h" +#include #include #include #include -------------- next part -------------- An HTML attachment was scrubbed... URL: From source_changes at macosforge.org Tue Nov 25 22:56:06 2008 From: source_changes at macosforge.org (source_changes at macosforge.org) Date: Tue, 25 Nov 2008 22:56:06 -0800 (PST) Subject: [launchd-changes] [23759] tags/launchd-292.1/ Message-ID: <20081126065606.D1A217865F0@beta.macosforge.org> Revision: 23759 http://trac.macosforge.org/projects/launchd/changeset/23759 Author: dsorresso at apple.com Date: 2008-11-25 22:56:06 -0800 (Tue, 25 Nov 2008) Log Message: ----------- "Tagging launchd-292.1 from https://svn.macosforge.org/repository/launchd/trunk" Added Paths: ----------- tags/launchd-292.1/ Property changes on: tags/launchd-292.1 ___________________________________________________________________ Added: svn:ignore + build Added: svn:mergeinfo + /branches/PR-5092682:23731-23742 /branches/PR-5898404:23681-23700 /branches/PR-5978442:23651-23701 /branches/PR-6132016:23719-23738 -------------- next part -------------- An HTML attachment was scrubbed... URL: