Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 | /* * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in * compliance with the License. Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this * file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. * * @APPLE_LICENSE_HEADER_END@ */ /* * bootstrap -- fundamental service initiator and port server * Mike DeMoney, NeXT, Inc. * Copyright, 1990. All rights reserved. * * bootstrap.defs -- Mig interface definition */ subsystem bootstrap 400; /* * Interface: Bootstrap server * * The bootstrap server is the first user-mode task initiated by the Mach * kernel at system boot time. The bootstrap server provides two services, * it initiates other system tasks, and manages a table of name-port bindings * for fundamental system services (e.g. lookupd, Window Manager, etc...). * * Name-port bindings can be established with the bootstrap server by either * of two mechanisms: * * 1. The binding can be indicated, in advance of the service that backs it * being available, via a "service create" request. In this case, bootstrap * will immediately create a port and bind the indicated name with that port. * At a later time, a service may "checkin" for the name-port * binding and will be returned receive rights for the bound port. Lookup's * on bindings created by this mechanism will return send rights to the port, * even if no service has "checked-in". In this case, requests sent to the * bound port will be queued until a server has checked-in and can satisfy the * request. * * 2. Bindings can be established dynamically via a "register" request. In * this case, the register request provides bootstrap with a name and send * rights for a port. Bootstrap will provide send rights for the bound port * to any requestor via the lookup request. * * Bootstrap provides its service port to descendant tasks via the Mach * "bootstrap" special task port. All direct descendants of bootstrap receive * a "privileged" bootstrap service port. System services that initiate * untrusted tasks should replace the Mach bootstrap task special port with * a subset bootstrap port to prevent them from infecting the namespace. * * The bootstrap server creates a "backup" port for each service that it * creates. This is used to detect when a checked out service is no longer * being served. The bootstrap server regains all rights to the port and * it is marked available for check-out again. This allows crashed servers to * resume service to previous clients. Lookup's on this named port will * continue to be serviced by bootstrap while holding receive rights for the * bound port. A client may detect that the service is inactive via the * bootstrap status request. If an inactive service re-registers rather * than "checking-in" the original bound port is destroyed. * * The status of a named service may be obtained via the "status" request. * A service is "active" if a name-port binding exists and receive rights * to the bound port are held by a task other than bootstrap. * * The bootstrap server may also (re)start server processes associated with * with a set of services. The definition of the server process is done * through the "create server" request. The server will be launched in the * same bootstrap context in which it was registered. */ #include <mach/std_types.defs> #include <mach/mach_types.defs> import <servers/bootstrap_defs.h>; type cmd_t = c_string[512]; type name_t = c_string[128]; type cmd_array_t = ^array [] of cmd_t; type name_array_t = ^array [] of name_t; type bootstrap_status_t = integer_t; type bootstrap_status_array_t = ^array [] of bootstrap_status_t; serverprefix x_; /* * kern_return_t * bootstrap_create_server(mach_port_t bootstrap_port, * cmd_t server_command, * integer_t server_uid, * boolean_t on_demand, * mach_port_t *server_port) * * Declares a server that mach_init will re-spawn within the specified * bootstrap context. The server is considered already "active" * (i.e. will not be re-spawned) until the returned server_port is * deallocated. * * In the meantime, services can be declared against the server, * by using the server_port as the privileged bootstrap target of * subsequent bootstrap_create_service() calls. * * When mach_init re-spawns the server, its task bootstrap port * is set to the privileged sever_port. Through this special * bootstrap port, it can access all of parent bootstrap's context * (and all services are created in the parent's namespace). But * all additional service declarations (and declaration removals) * will be associated with this particular server. * * Only a holder of the server_port privilege bootstrap port can * check in or register over those services. * * When all services associated with a server are deleted, and the server * exits, it will automatically be deleted itself. * * If the server is declared "on_demand," then a non-running server * will be re-launched on first use of one of the service ports * registered against it. Otherwise, it will be re-launched * immediately upon exiting (whether any client is actively using * any of the service ports or not). * * Errors: Returns appropriate kernel errors on rpc failure. * Returns BOOTSTRAP_NOT_PRIVILEGED, bootstrap or uid invalid. */ routine bootstrap_create_server( bootstrap_port : mach_port_t; server_cmd : cmd_t; server_uid : integer_t; on_demand : boolean_t; ServerSecToken token : security_token_t; out server_port : mach_port_make_send_t); /* * kern_return_t * bootstrap_unprivileged(mach_port_t bootstrap_port, * mach_port_t *unpriv_port) * * Given a bootstrap port, return its unprivileged equivalent. If * the port is already unprivileged, another reference to the same * port is returned. * * This is most often used by servers, which are launched with their * bootstrap port set to the privileged port for the server, to get * an unprivileged version of the same port for use by its unprivileged * children (or any offspring that it does not want to count as part * of the "server" for mach_init registration and re-launch purposes). */ routine bootstrap_unprivileged( bootstrap_port : mach_port_t; out unpriv_port : mach_port_t); /* * kern_return_t * bootstrap_check_in(mach_port_t bootstrap_port, * name_t service_name, * mach_port_t *service_port) * * Returns the receive right for the service named by service_name. The * service must have previously been declared in this bootstrap context via * a call to bootstrap_create_service(). Attempts to check_in a service * which is already active are not allowed. * * If the service was declared as being associated with a server, the * check_in must come from the server's privileged port (server_port). * * Errors: Returns appropriate kernel errors on rpc failure. * Returns BOOTSTRAP_UNKNOWN_SERVICE, if service does not exist. * Returns BOOTSTRAP_NOT_PRIVILEGED, if request directed to * bootstrap port without privilege. * Returns BOOTSTRAP_SERVICE_ACTIVE, if service has already been * registered or checked-in. */ routine bootstrap_check_in( bootstrap_port : mach_port_t; service_name : name_t; out service_port : mach_port_move_receive_t); /* * kern_return_t * bootstrap_register(mach_port_t bootstrap_port, * name_t service_name, * mach_port_t service_port) * * Registers a send right for service_port with the service identified by * service_name. Attempts to register a service where an active binding * already exists are rejected. * * If the service was previously declared with bootstrap_create_service(), * but is not currently active, this call can be used to undeclare the * service. The bootstrap port used must have sufficient privilege to * do so. (Registering MACH_PORT_NULL is especially useful for shutting * down declared services). * * Errors: Returns appropriate kernel errors on rpc failure. * Returns BOOTSTRAP_NOT_PRIVILEGED, if request directed to * bootstrap port without privilege. * Returns BOOTSTRAP_NAME_IN_USE, if service has already been * register or checked-in. */ routine bootstrap_register( bootstrap_port : mach_port_t; service_name : name_t; service_port : mach_port_t); /* * kern_return_t * bootstrap_look_up(mach_port_t bootstrap_port, * name_t service_name, * mach_port_t *service_port) * * Returns a send right for the service port declared/registered under the * name service_name. The service is not guaranteed to be active. Use the * bootstrap_status call to determine the status of the service. * * Errors: Returns appropriate kernel errors on rpc failure. * Returns BOOTSTRAP_UNKNOWN_SERVICE, if service does not exist. */ routine bootstrap_look_up( bootstrap_port : mach_port_t; service_name : name_t; out service_port : mach_port_t); /* * kern_return_t * bootstrap_look_up_array(mach_port_t bootstrap_port, * name_array_t service_names, * int service_names_cnt, * port_array_t *service_port, * int *service_ports_cnt, * boolean_t *all_services_known) * * Returns port send rights in corresponding entries of the array service_ports * for all services named in the array service_names. Service_ports_cnt is * returned and will always equal service_names_cnt (assuming service_names_cnt * is greater than or equal to zero). * * Errors: Returns appropriate kernel errors on rpc failure. * Returns BOOTSTRAP_NO_MEMORY, if server couldn't obtain memory * for response. * Unknown service names have the corresponding service port set * to PORT_NULL. * If all services are known, all_services_known is true on * return, if any service is unknown, it's false. */ routine bootstrap_look_up_array( bootstrap_port : mach_port_t; service_names : name_array_t; out service_ports : mach_port_array_t; out all_services_known: boolean_t); /* * kern_return_t * bootstrap_parent(mach_port_t bootstrap_port, * mach_port_t *parent_port); * * Given a bootstrap subset port, return the parent bootstrap port. * If the specified bootstrap port is already the root subset, * MACH_PORT_NULL will be returned. * * Errors: * Returns BOOTSTRAP_NOT_PRIVILEGED if the caller is not running * with an effective user id of root (as determined by the security * token in the message trailer). */ routine bootstrap_parent( bootstrap_port : mach_port_t; ServerSecToken token : security_token_t; out parent_port : mach_port_t); /* * kern_return_t * bootstrap_status(mach_port_t bootstrap_port, * name_t service_name, * bootstrap_status_t *service_active); * * Returns: service_active indicates if service is active, inactive, or * associated with a launch-on-demand server. * * Errors: Returns appropriate kernel errors on rpc failure. * Returns BOOTSTRAP_UNKNOWN_SERVICE, if service does not exist. */ routine bootstrap_status( bootstrap_port : mach_port_t; service_name : name_t; out service_active : bootstrap_status_t); /* * kern_return_t * bootstrap_info(port_t bootstrap_port, * name_array_t *service_names, * int *service_names_cnt, * name_array_t *server_names, * int *server_names_cnt, * bool_array_t *service_active, * int *service_active_cnt); * * Errors: Returns appropriate kernel errors on rpc failure. */ routine bootstrap_info( bootstrap_port : mach_port_t; out service_names : name_array_t, dealloc; out server_names : name_array_t, dealloc; out service_active : bootstrap_status_array_t, dealloc); /* * kern_return_t * bootstrap_subset(mach_port_t bootstrap_port, * mach_port_t requestor_port, * mach_port_t *subset_port); * * Returns a new port to use as a bootstrap port. This port behaves * exactly like the previous bootstrap_port, except that ports dynamically * registered via bootstrap_register() are available only to users of this * specific subset_port. Lookups on the subset_port will return ports * registered with this port specifically, and ports registered with * ancestors of this subset_port. Duplications of services already * registered with an ancestor port may be registered with the subset port * are allowed. Services already advertised may then be effectively removed * by registering PORT_NULL for the service. * When it is detected that the requestor_port is destroyed the subset * port and all services advertized by it are destroied as well. * * Errors: Returns appropriate kernel errors on rpc failure. */ routine bootstrap_subset( bootstrap_port : mach_port_t; requestor_port : mach_port_t; out subset_port : mach_port_t); /* * kern_return_t * bootstrap_create_service(mach_port_t bootstrap_port, * name_t service_name, * mach_port_t *service_port) * * Creates a service named "service_name" and returns send rights to that * port in "service_port." The port may later be checked in as if this * port were configured in the bootstrap configuration file. * * Errors: Returns appropriate kernel errors on rpc failure. * Returns BOOTSTRAP_SERVICE_ACTIVE, if service already exists. */ routine bootstrap_create_service( bootstrap_port : mach_port_t; service_name : name_t; out service_port : mach_port_t); |