Projects
Browse Source     Search     Timeline     Wiki

Changeset 23125

Show
Ignore:
Timestamp:
03/03/07 15:42:02 (21 months ago)
Author:
zarzycki@…
Message:

<rdar://problem/4369850> launchd should have a per-user bootstrap context ("background session")

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/launchd/src/launchd_core_logic.c

    r23124 r23125  
    273273        unsigned int globargv:1, wait4debugger:1, unload_at_exit:1, stall_before_exec:1, only_once:1, 
    274274                     currently_ignored:1, forced_peers_to_demand_mode:1, setnice:1, hopefully_exits_last:1, removal_pending:1, 
    275                      wait4pipe_eof:1, sent_sigkill:1, debug_before_kill:1; 
     275                     wait4pipe_eof:1, sent_sigkill:1, debug_before_kill:1, weird_per_user_bootstrap:1; 
    276276        char label[0]; 
    277277}; 
     
    16501650        job_log(j, LOG_DEBUG, "Reaping"); 
    16511651 
     1652        if (j->weird_per_user_bootstrap) { 
     1653                mach_msg_size_t mxmsgsz = sizeof(union __RequestUnion__job_mig_protocol_vproc_subsystem); 
     1654 
     1655                if (job_mig_protocol_vproc_subsystem.maxsize > mxmsgsz) { 
     1656                        mxmsgsz = job_mig_protocol_vproc_subsystem.maxsize; 
     1657                } 
     1658 
     1659                job_assumes(j, runtime_add_mport(j->mgr->jm_port, protocol_vproc_server, mxmsgsz) == KERN_SUCCESS); 
     1660                j->weird_per_user_bootstrap = false; 
     1661        } 
     1662 
    16521663        if (j->log_redirect_fd && (!j->wait4pipe_eof || j->mgr->shutting_down)) { 
    16531664                job_assumes(j, close(j->log_redirect_fd) != -1); 
     
    19861997        time(&j->start_time); 
    19871998 
    1988         switch (c = runtime_fork(j->mgr->jm_port)) { 
     1999        switch (c = runtime_fork(j->weird_per_user_bootstrap ? j->j_port : j->mgr->jm_port)) { 
    19892000        case -1: 
    19902001                job_log_error(j, LOG_ERR, "fork() failed, will try again in one second"); 
     
    34663477        } 
    34673478 
    3468         if (!jobmgr_assumes(jmr, runtime_add_mport(jmr->jm_port, protocol_vproc_server, mxmsgsz) == KERN_SUCCESS)) { 
    3469                 goto out_bad; 
    3470         } 
    3471  
    34723479        jobmgr_assumes(jmr, (jmr->anonj = jobmgr_get_anonymous(jmr)) != NULL); 
    34733480 
     
    34763483        if (!jm) { 
    34773484                jobmgr_assumes(jmr, kevent_mod(SIGTERM, EVFILT_SIGNAL, EV_ADD, 0, 0, jmr) != -1); 
     3485        } 
     3486 
     3487        if (!jm && getuid() != 0) { 
     3488                /* per-user bootstrap context is messy */ 
     3489                bootstrapper->weird_per_user_bootstrap = true; 
     3490                jobmgr_assumes(jmr, job_setup_machport(bootstrapper)); 
     3491        } else { 
     3492                if (!jobmgr_assumes(jmr, runtime_add_mport(jmr->jm_port, protocol_vproc_server, mxmsgsz) == KERN_SUCCESS)) { 
     3493                        goto out_bad; 
     3494                } 
    34783495        } 
    34793496