Revision: 23535 http://trac.macosforge.org/projects/launchd/changeset/23535 Author: zarzycki@apple.com Date: 2008-03-05 18:16:37 -0800 (Wed, 05 Mar 2008) Log Message: ----------- <rdar://problem/5783944> Deprecate bootstrap_create_service() in favor of bootstrap_check_in() Modified Paths: -------------- trunk/launchd/src/launchctl.c trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/launchd_runtime.c trunk/launchd/src/libbootstrap.c trunk/launchd/src/libbootstrap_public.h trunk/launchd/src/libvproc_public.h trunk/launchd/src/protocol_job.defs Modified: trunk/launchd/src/launchctl.c =================================================================== --- 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) @@ -1794,9 +1794,9 @@ fprintf(stderr, "%s: bootstrap_create_server(): %d\n", getprogname(), kr); continue; } - if ((kr = bootstrap_create_service(msr, (char*)sn, &msv)) != KERN_SUCCESS) { + if ((kr = bootstrap_check_in(msr, (char*)sn, &msv)) != KERN_SUCCESS) { fprintf(stderr, "%s: bootstrap_create_service(): %d\n", getprogname(), kr); - mach_port_destroy(mach_task_self(), msr); + mach_port_mod_refs(mach_task_self(), msv, MACH_PORT_RIGHT_RECEIVE, -1); continue; } launch_data_dict_insert(oai, launch_data_new_machport(msr), MACHINIT_JOBKEY_SERVERPORT); Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- 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) @@ -425,7 +425,6 @@ static job_t job_new_anonymous(jobmgr_t jm, pid_t anonpid) __attribute__((malloc, nonnull, warn_unused_result)); 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)); 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)); -static const char *job_prog(job_t j); static void job_kill(job_t j); static void job_uncork_fork(job_t j); static void job_log_stdouterr(job_t j); @@ -4133,18 +4132,6 @@ } const char * -job_prog(job_t j) -{ - if (j->prog) { - return j->prog; - } else if (likely(j->argv)) { - return j->argv[0]; - } else { - return ""; - } -} - -const char * job_active(job_t j) { struct machservice *ms; @@ -5926,9 +5913,15 @@ ms = jobmgr_lookup_service(j->mgr, servicename, true, 0); - if (unlikely(ms == NULL)) { - job_log(j, LOG_DEBUG, "Check-in of Mach service failed. Unknown: %s", servicename); - return BOOTSTRAP_UNKNOWN_SERVICE; + 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); } if (unlikely((jo = machservice_job(ms)) != j)) { @@ -6575,43 +6568,6 @@ } kern_return_t -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 job_mig_embedded_wait(job_t j, name_t targetlabel, integer_t *waitstatus) { job_t otherj; Modified: trunk/launchd/src/launchd_runtime.c =================================================================== --- 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) @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2006 Apple Computer, Inc. All rights reserved. + * Copyright (c) 1999-2008 Apple Computer, Inc. All rights reserved. * * @APPLE_APACHE_LICENSE_HEADER_START@ * Modified: trunk/launchd/src/libbootstrap.c =================================================================== --- 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) @@ -100,7 +100,17 @@ kern_return_t bootstrap_create_service(mach_port_t bp, name_t service_name, mach_port_t *sp) { - return vproc_mig_create_service(bp, service_name, sp); + 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); } kern_return_t @@ -160,19 +170,22 @@ kern_return_t bootstrap_status(mach_port_t bp, name_t service_name, bootstrap_status_t *service_active) { + kern_return_t kr; mach_port_t p; + if ((kr = bootstrap_look_up(bp, service_name, &p))) { + return kr; + } + + mach_port_deallocate(mach_task_self(), p); + *service_active = BOOTSTRAP_STATUS_ACTIVE; + if (bootstrap_check_in(bp, service_name, &p) == BOOTSTRAP_SUCCESS) { mach_port_mod_refs(mach_task_self(), p, MACH_PORT_RIGHT_RECEIVE, -1); *service_active = BOOTSTRAP_STATUS_ON_DEMAND; - 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; } - return BOOTSTRAP_UNKNOWN_SERVICE; + return BOOTSTRAP_SUCCESS; } kern_return_t Modified: trunk/launchd/src/libbootstrap_public.h =================================================================== --- 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) @@ -233,13 +233,16 @@ * * This API is deprecated. Old scenarios and recommendations: * - * 1) If the code was registering a well known name, please switch to launchd. + * 1) Code that used to call bootstrap_check_in() and then bootstrap_register() + * can now always call bootstrap_check_in(). * - * 2) If the code was registering a dynamically generated string and passing + * 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 * the string to other applications, please rewrite the code to send a Mach * send-right directly. * - * 3) If the launchd job maintained an optional Mach service, please reserve + * 4) If the launchd job maintained an optional Mach service, please reserve * the name with launchd and control the presense of the service through * ownership of the Mach receive right like so. * @@ -261,26 +264,27 @@ * Returns BOOTSTRAP_NAME_IN_USE, if service has already been * register or checked-in. */ -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; +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); /* * bootstrap_create_service() * - * Creates a service named "service_name" and returns send rights to that + * Creates a service named "service_name" and returns a send right to that * port in "service_port." The port may later be checked in as if this * port were configured in the bootstrap configuration file. * + * This API is deprecated. Please call bootstrap_check_in() instead. + * * Errors: Returns appropriate kernel errors on rpc failure. * Returns BOOTSTRAP_SERVICE_ACTIVE, if service already exists. */ -kern_return_t bootstrap_create_service( - mach_port_t bp, - name_t service_name, - mach_port_t *sp); +#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); /* * bootstrap_check_in() Modified: trunk/launchd/src/libvproc_public.h =================================================================== --- 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) @@ -94,7 +94,7 @@ /*! * @function vproc_transaction_complete * - * @param + * @param handle * The handle previously created with vproc_transaction_prepare(). * * @abstract @@ -130,7 +130,7 @@ /*! * @function vproc_standby_complete * - * @param + * @param handle * The handle previously created with vproc_standby_prepare(). * * @abstract Modified: trunk/launchd/src/protocol_job.defs =================================================================== --- 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) @@ -94,10 +94,7 @@ __requestor_port: mach_port_t; out __subset_port : mach_port_make_send_t); -routine create_service( - __bs_port : job_t; - __service_name : name_t; - out __service_port : mach_port_t); +skip; /* create_service prior to 10.6 */ routine take_subset( __bs_port : job_t;
participants (1)
-
source_changes@macosforge.org