<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre, #msg p { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[23535] trunk/launchd/src</title>
</head>
<body>
<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.macosforge.org/projects/launchd/changeset/23535">23535</a></dd>
<dt>Author</dt> <dd>zarzycki@apple.com</dd>
<dt>Date</dt> <dd>2008-03-05 18:16:37 -0800 (Wed, 05 Mar 2008)</dd>
</dl>
<h3>Log Message</h3>
<pre><rdar://problem/5783944> Deprecate bootstrap_create_service() in favor of bootstrap_check_in()</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunklaunchdsrclaunchctlc">trunk/launchd/src/launchctl.c</a></li>
<li><a href="#trunklaunchdsrclaunchd_core_logicc">trunk/launchd/src/launchd_core_logic.c</a></li>
<li><a href="#trunklaunchdsrclaunchd_runtimec">trunk/launchd/src/launchd_runtime.c</a></li>
<li><a href="#trunklaunchdsrclibbootstrapc">trunk/launchd/src/libbootstrap.c</a></li>
<li><a href="#trunklaunchdsrclibbootstrap_publich">trunk/launchd/src/libbootstrap_public.h</a></li>
<li><a href="#trunklaunchdsrclibvproc_publich">trunk/launchd/src/libvproc_public.h</a></li>
<li><a href="#trunklaunchdsrcprotocol_jobdefs">trunk/launchd/src/protocol_job.defs</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunklaunchdsrclaunchctlc"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/launchctl.c (23534 => 23535)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/launchd/src/launchctl.c        2008-03-04 21:50:35 UTC (rev 23534)
+++ trunk/launchd/src/launchctl.c        2008-03-06 02:16:37 UTC (rev 23535)
</span><span class="lines">@@ -1794,9 +1794,9 @@
</span><span class="cx">                         fprintf(stderr, "%s: bootstrap_create_server(): %d\n", getprogname(), kr);
</span><span class="cx">                         continue;
</span><span class="cx">                 }
</span><del>-                if ((kr = bootstrap_create_service(msr, (char*)sn, &msv)) != KERN_SUCCESS) {
</del><ins>+                if ((kr = bootstrap_check_in(msr, (char*)sn, &msv)) != KERN_SUCCESS) {
</ins><span class="cx">                         fprintf(stderr, "%s: bootstrap_create_service(): %d\n", getprogname(), kr);
</span><del>-                        mach_port_destroy(mach_task_self(), msr);
</del><ins>+                        mach_port_mod_refs(mach_task_self(), msv, MACH_PORT_RIGHT_RECEIVE, -1);
</ins><span class="cx">                         continue;
</span><span class="cx">                 }
</span><span class="cx">                 launch_data_dict_insert(oai, launch_data_new_machport(msr), MACHINIT_JOBKEY_SERVERPORT);
</span></span></pre></div>
<a id="trunklaunchdsrclaunchd_core_logicc"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/launchd_core_logic.c (23534 => 23535)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/launchd/src/launchd_core_logic.c        2008-03-04 21:50:35 UTC (rev 23534)
+++ trunk/launchd/src/launchd_core_logic.c        2008-03-06 02:16:37 UTC (rev 23535)
</span><span class="lines">@@ -425,7 +425,6 @@
</span><span class="cx"> static job_t job_new_anonymous(jobmgr_t jm, pid_t anonpid) __attribute__((malloc, nonnull, warn_unused_result));
</span><span class="cx"> static job_t job_new(jobmgr_t jm, const char *label, const char *prog, const char *const *argv) __attribute__((malloc, nonnull(1,2), warn_unused_result));
</span><span class="cx"> static job_t job_new_via_mach_init(job_t j, const char *cmd, uid_t uid, bool ond) __attribute__((malloc, nonnull, warn_unused_result));
</span><del>-static const char *job_prog(job_t j);
</del><span class="cx"> static void job_kill(job_t j);
</span><span class="cx"> static void job_uncork_fork(job_t j);
</span><span class="cx"> static void job_log_stdouterr(job_t j);
</span><span class="lines">@@ -4133,18 +4132,6 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> const char *
</span><del>-job_prog(job_t j)
-{
-        if (j->prog) {
-                return j->prog;
-        } else if (likely(j->argv)) {
-                return j->argv[0];
-        } else {
-                return "";
-        }
-}
-
-const char *
</del><span class="cx"> job_active(job_t j)
</span><span class="cx"> {
</span><span class="cx">         struct machservice *ms;
</span><span class="lines">@@ -5926,9 +5913,15 @@
</span><span class="cx">
</span><span class="cx">         ms = jobmgr_lookup_service(j->mgr, servicename, true, 0);
</span><span class="cx">
</span><del>-        if (unlikely(ms == NULL)) {
-                job_log(j, LOG_DEBUG, "Check-in of Mach service failed. Unknown: %s", servicename);
-                return BOOTSTRAP_UNKNOWN_SERVICE;
</del><ins>+        if (ms == NULL) {
+                *serviceportp = MACH_PORT_NULL;
+                ms = machservice_new(j, servicename, serviceportp, false);
+
+                if (unlikely(ms == NULL)) {
+                        return BOOTSTRAP_NO_MEMORY;
+                }
+
+                job_checkin(j);
</ins><span class="cx">         }
</span><span class="cx">
</span><span class="cx">         if (unlikely((jo = machservice_job(ms)) != j)) {
</span><span class="lines">@@ -6575,43 +6568,6 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> kern_return_t
</span><del>-job_mig_create_service(job_t j, name_t servicename, mach_port_t *serviceportp)
-{
-        struct machservice *ms;
-
-        if (!launchd_assumes(j != NULL)) {
-                return BOOTSTRAP_NO_MEMORY;
-        }
-
-        if (unlikely(job_prog(j)[0] == '\0')) {
-                job_log(j, LOG_ERR, "Mach service creation requires a target server: %s", servicename);
-                return BOOTSTRAP_NOT_PRIVILEGED;
-        }
-
-        if (unlikely(!j->legacy_mach_job)) {
-                job_log(j, LOG_ERR, "bootstrap_create_service() is only allowed against legacy Mach jobs: %s", servicename);
-                return BOOTSTRAP_NOT_PRIVILEGED;
-        }
-
-        ms = jobmgr_lookup_service(j->mgr, servicename, false, 0);
-        if (unlikely(ms)) {
-                job_log(j, LOG_DEBUG, "Mach service creation attempt for failed. Already exists: %s", servicename);
-                return BOOTSTRAP_NAME_IN_USE;
-        }
-
-        job_checkin(j);
-
-        *serviceportp = MACH_PORT_NULL;
-        ms = machservice_new(j, servicename, serviceportp, false);
-
-        if (!job_assumes(j, ms != NULL)) {
-                return BOOTSTRAP_NO_MEMORY;
-        }
-
-        return BOOTSTRAP_SUCCESS;
-}
-
-kern_return_t
</del><span class="cx"> job_mig_embedded_wait(job_t j, name_t targetlabel, integer_t *waitstatus)
</span><span class="cx"> {
</span><span class="cx">         job_t otherj;
</span></span></pre></div>
<a id="trunklaunchdsrclaunchd_runtimec"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/launchd_runtime.c (23534 => 23535)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/launchd/src/launchd_runtime.c        2008-03-04 21:50:35 UTC (rev 23534)
+++ trunk/launchd/src/launchd_runtime.c        2008-03-06 02:16:37 UTC (rev 23535)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (c) 1999-2006 Apple Computer, Inc. All rights reserved.
</del><ins>+ * Copyright (c) 1999-2008 Apple Computer, Inc. All rights reserved.
</ins><span class="cx"> *
</span><span class="cx"> * @APPLE_APACHE_LICENSE_HEADER_START@
</span><span class="cx"> *
</span></span></pre></div>
<a id="trunklaunchdsrclibbootstrapc"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/libbootstrap.c (23534 => 23535)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/launchd/src/libbootstrap.c        2008-03-04 21:50:35 UTC (rev 23534)
+++ trunk/launchd/src/libbootstrap.c        2008-03-06 02:16:37 UTC (rev 23535)
</span><span class="lines">@@ -100,7 +100,17 @@
</span><span class="cx"> kern_return_t
</span><span class="cx"> bootstrap_create_service(mach_port_t bp, name_t service_name, mach_port_t *sp)
</span><span class="cx"> {
</span><del>-        return vproc_mig_create_service(bp, service_name, sp);
</del><ins>+        kern_return_t kr;
+
+        if ((kr = bootstrap_check_in(bp, service_name, sp))) {
+                return kr;
+        }
+
+        if ((kr = mach_port_mod_refs(mach_task_self(), *sp, MACH_PORT_RIGHT_RECEIVE, -1))) {
+                return kr;
+        }
+
+        return bootstrap_look_up(bp, service_name, sp);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> kern_return_t
</span><span class="lines">@@ -160,19 +170,22 @@
</span><span class="cx"> kern_return_t
</span><span class="cx"> bootstrap_status(mach_port_t bp, name_t service_name, bootstrap_status_t *service_active)
</span><span class="cx"> {
</span><ins>+        kern_return_t kr;
</ins><span class="cx">         mach_port_t p;
</span><span class="cx">
</span><ins>+        if ((kr = bootstrap_look_up(bp, service_name, &p))) {
+                return kr;
+        }
+
+        mach_port_deallocate(mach_task_self(), p);
+        *service_active = BOOTSTRAP_STATUS_ACTIVE;
+
</ins><span class="cx">         if (bootstrap_check_in(bp, service_name, &p) == BOOTSTRAP_SUCCESS) {
</span><span class="cx">                 mach_port_mod_refs(mach_task_self(), p, MACH_PORT_RIGHT_RECEIVE, -1);
</span><span class="cx">                 *service_active = BOOTSTRAP_STATUS_ON_DEMAND;
</span><del>-                return BOOTSTRAP_SUCCESS;
-        } else if (bootstrap_look_up(bp, service_name, &p) == BOOTSTRAP_SUCCESS) {
-                mach_port_deallocate(mach_task_self(), p);
-                *service_active = BOOTSTRAP_STATUS_ACTIVE;
-                return BOOTSTRAP_SUCCESS;
</del><span class="cx">         }
</span><span class="cx">
</span><del>-        return BOOTSTRAP_UNKNOWN_SERVICE;
</del><ins>+        return BOOTSTRAP_SUCCESS;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> kern_return_t
</span></span></pre></div>
<a id="trunklaunchdsrclibbootstrap_publich"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/libbootstrap_public.h (23534 => 23535)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/launchd/src/libbootstrap_public.h        2008-03-04 21:50:35 UTC (rev 23534)
+++ trunk/launchd/src/libbootstrap_public.h        2008-03-06 02:16:37 UTC (rev 23535)
</span><span class="lines">@@ -233,13 +233,16 @@
</span><span class="cx"> *
</span><span class="cx"> * This API is deprecated. Old scenarios and recommendations:
</span><span class="cx"> *
</span><del>- * 1) If the code was registering a well known name, please switch to launchd.
</del><ins>+ * 1) Code that used to call bootstrap_check_in() and then bootstrap_register()
+ * can now always call bootstrap_check_in().
</ins><span class="cx"> *
</span><del>- * 2) If the code was registering a dynamically generated string and passing
</del><ins>+ * 2) If the code was registering a well known name, please switch to launchd.
+ *
+ * 3) If the code was registering a dynamically generated string and passing
</ins><span class="cx"> * the string to other applications, please rewrite the code to send a Mach
</span><span class="cx"> * send-right directly.
</span><span class="cx"> *
</span><del>- * 3) If the launchd job maintained an optional Mach service, please reserve
</del><ins>+ * 4) If the launchd job maintained an optional Mach service, please reserve
</ins><span class="cx"> * the name with launchd and control the presense of the service through
</span><span class="cx"> * ownership of the Mach receive right like so.
</span><span class="cx"> *
</span><span class="lines">@@ -261,26 +264,27 @@
</span><span class="cx"> *                Returns BOOTSTRAP_NAME_IN_USE, if service has already been
</span><span class="cx"> *                        register or checked-in.
</span><span class="cx"> */
</span><del>-kern_return_t bootstrap_register(
-                mach_port_t bp,
-                name_t service_name,
-                mach_port_t sp)
-                AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5;
</del><ins>+AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5
+kern_return_t
+bootstrap_register(mach_port_t bp, name_t service_name, mach_port_t sp);
</ins><span class="cx">
</span><span class="cx"> /*
</span><span class="cx"> * bootstrap_create_service()
</span><span class="cx"> *
</span><del>- * Creates a service named "service_name" and returns send rights to that
</del><ins>+ * Creates a service named "service_name" and returns a send right to that
</ins><span class="cx"> * port in "service_port." The port may later be checked in as if this
</span><span class="cx"> * port were configured in the bootstrap configuration file.
</span><span class="cx"> *
</span><ins>+ * This API is deprecated. Please call bootstrap_check_in() instead.
+ *
</ins><span class="cx"> * Errors:        Returns appropriate kernel errors on rpc failure.
</span><span class="cx"> *                Returns BOOTSTRAP_SERVICE_ACTIVE, if service already exists.
</span><span class="cx"> */
</span><del>-kern_return_t bootstrap_create_service(
-                mach_port_t bp,
-                name_t service_name,
-                mach_port_t *sp);
</del><ins>+#ifdef AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_6
+AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_6
+#endif
+kern_return_t
+bootstrap_create_service(mach_port_t bp, name_t service_name, mach_port_t *sp);
</ins><span class="cx">
</span><span class="cx"> /*
</span><span class="cx"> * bootstrap_check_in()
</span></span></pre></div>
<a id="trunklaunchdsrclibvproc_publich"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/libvproc_public.h (23534 => 23535)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/launchd/src/libvproc_public.h        2008-03-04 21:50:35 UTC (rev 23534)
+++ trunk/launchd/src/libvproc_public.h        2008-03-06 02:16:37 UTC (rev 23535)
</span><span class="lines">@@ -94,7 +94,7 @@
</span><span class="cx"> /*!
</span><span class="cx"> * @function vproc_transaction_complete
</span><span class="cx"> *
</span><del>- * @param
</del><ins>+ * @param        handle
</ins><span class="cx"> * The handle previously created with vproc_transaction_prepare().
</span><span class="cx"> *
</span><span class="cx"> * @abstract
</span><span class="lines">@@ -130,7 +130,7 @@
</span><span class="cx"> /*!
</span><span class="cx"> * @function vproc_standby_complete
</span><span class="cx"> *
</span><del>- * @param
</del><ins>+ * @param        handle
</ins><span class="cx"> * The handle previously created with vproc_standby_prepare().
</span><span class="cx"> *
</span><span class="cx"> * @abstract
</span></span></pre></div>
<a id="trunklaunchdsrcprotocol_jobdefs"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/protocol_job.defs (23534 => 23535)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/launchd/src/protocol_job.defs        2008-03-04 21:50:35 UTC (rev 23534)
+++ trunk/launchd/src/protocol_job.defs        2008-03-06 02:16:37 UTC (rev 23535)
</span><span class="lines">@@ -94,10 +94,7 @@
</span><span class="cx">                 __requestor_port: mach_port_t;
</span><span class="cx">         out        __subset_port        : mach_port_make_send_t);
</span><span class="cx">
</span><del>-routine create_service(
-                __bs_port        : job_t;
-                __service_name        : name_t;
-        out        __service_port        : mach_port_t);
</del><ins>+skip;        /* create_service prior to 10.6 */
</ins><span class="cx">
</span><span class="cx"> routine take_subset(
</span><span class="cx">                 __bs_port        : job_t;
</span></span></pre>
</div>
</div>
</body>
</html>