2 * Copyright (c) 1999-2005 Apple Computer, Inc. All rights reserved.
4 * @APPLE_APACHE_LICENSE_HEADER_START@
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * @APPLE_APACHE_LICENSE_HEADER_END@
22 #include "bootstrap.h"
23 #include "bootstrap_priv.h"
26 #include "vproc_priv.h"
28 #include <mach/mach.h>
29 #include <mach/vm_map.h>
30 #include <sys/types.h>
31 #include <sys/syslog.h>
35 #include "protocol_vproc.h"
38 bootstrap_create_server(mach_port_t bp
, cmd_t server_cmd
, uid_t server_uid
, boolean_t on_demand
, mach_port_t
*server_port
)
40 return vproc_mig_create_server(bp
, server_cmd
, server_uid
, on_demand
, server_port
);
44 bootstrap_subset(mach_port_t bp
, mach_port_t requestor_port
, mach_port_t
*subset_port
)
46 return vproc_mig_subset(bp
, requestor_port
, subset_port
);
50 bootstrap_unprivileged(mach_port_t bp
, mach_port_t
*unpriv_port
)
54 *unpriv_port
= MACH_PORT_NULL
;
56 kr
= mach_port_mod_refs(mach_task_self(), bp
, MACH_PORT_RIGHT_SEND
, 1);
58 if (kr
== KERN_SUCCESS
) {
66 bootstrap_parent(mach_port_t bp
, mach_port_t
*parent_port
)
68 return vproc_mig_parent(bp
, parent_port
);
72 bootstrap_set_policy(mach_port_t bp
, pid_t target_pid
, uint64_t flags
, const char *target_service
)
74 return vproc_mig_set_service_policy(bp
, target_pid
, flags
, target_service
? (char *)target_service
: "");
78 bootstrap_register(mach_port_t bp
, name_t service_name
, mach_port_t sp
)
80 return bootstrap_register2(bp
, service_name
, sp
, 0);
84 bootstrap_register2(mach_port_t bp
, name_t service_name
, mach_port_t sp
, uint64_t flags
)
86 kern_return_t kr
= vproc_mig_register2(bp
, service_name
, sp
, flags
);
88 if (kr
== VPROC_ERR_TRY_PER_USER
) {
91 if (vproc_mig_lookup_per_user_context(bp
, 0, &puc
) == 0) {
92 kr
= vproc_mig_register2(puc
, service_name
, sp
, flags
);
93 mach_port_deallocate(mach_task_self(), puc
);
101 bootstrap_create_service(mach_port_t bp
, name_t service_name
, mach_port_t
*sp
)
103 return vproc_mig_create_service(bp
, service_name
, sp
);
107 bootstrap_check_in(mach_port_t bp
, name_t service_name
, mach_port_t
*sp
)
109 return vproc_mig_check_in(bp
, service_name
, sp
);
113 bootstrap_look_up_per_user(mach_port_t bp
, name_t service_name
, uid_t target_user
, mach_port_t
*sp
)
119 if (pthread_main_np() && (stat("/AppleInternal", &sb
) != -1)) {
120 _vproc_log(LOG_WARNING
, "Please review the comments in 4890134.");
123 if ((kr
= vproc_mig_lookup_per_user_context(bp
, target_user
, &puc
)) != 0) {
127 kr
= vproc_mig_look_up2(puc
, service_name
, sp
, 0, 0);
128 mach_port_deallocate(mach_task_self(), puc
);
135 bootstrap_look_up(mach_port_t bp
, name_t service_name
, mach_port_t
*sp
)
137 return bootstrap_look_up2(bp
, service_name
, sp
, 0, 0);
141 bootstrap_look_up2(mach_port_t bp
, name_t service_name
, mach_port_t
*sp
, pid_t target_pid
, uint64_t flags
)
146 if ((kr
= vproc_mig_look_up2(bp
, service_name
, sp
, target_pid
, flags
)) != VPROC_ERR_TRY_PER_USER
) {
150 if ((kr
= vproc_mig_lookup_per_user_context(bp
, 0, &puc
)) != 0) {
154 kr
= vproc_mig_look_up2(puc
, service_name
, sp
, target_pid
, flags
);
155 mach_port_deallocate(mach_task_self(), puc
);
161 bootstrap_status(mach_port_t bp
, name_t service_name
, bootstrap_status_t
*service_active
)
165 if (bootstrap_check_in(bp
, service_name
, &p
) == BOOTSTRAP_SUCCESS
) {
166 mach_port_mod_refs(mach_task_self(), p
, MACH_PORT_RIGHT_RECEIVE
, -1);
167 *service_active
= BOOTSTRAP_STATUS_ON_DEMAND
;
168 return BOOTSTRAP_SUCCESS
;
169 } else if (bootstrap_look_up(bp
, service_name
, &p
) == BOOTSTRAP_SUCCESS
) {
170 mach_port_deallocate(mach_task_self(), p
);
171 *service_active
= BOOTSTRAP_STATUS_ACTIVE
;
172 return BOOTSTRAP_SUCCESS
;
175 return BOOTSTRAP_UNKNOWN_SERVICE
;
179 bootstrap_info(mach_port_t bp
,
180 name_array_t
*service_names
, mach_msg_type_number_t
*service_namesCnt
,
181 bootstrap_status_array_t
*service_active
, mach_msg_type_number_t
*service_activeCnt
)
183 return vproc_mig_info(bp
, service_names
, service_namesCnt
,
184 service_active
, service_activeCnt
);
188 bootstrap_strerror(kern_return_t r
)
191 case BOOTSTRAP_SUCCESS
:
193 case BOOTSTRAP_NOT_PRIVILEGED
:
194 return "Permission denied";
195 case BOOTSTRAP_NAME_IN_USE
:
196 case BOOTSTRAP_SERVICE_ACTIVE
:
197 return "Service name already exists";
198 case BOOTSTRAP_UNKNOWN_SERVICE
:
199 return "Unknown service name";
200 case BOOTSTRAP_BAD_COUNT
:
201 return "Too many lookups were requested in one request";
202 case BOOTSTRAP_NO_MEMORY
:
203 return "Out of memory";
205 return mach_error_string(r
);