static kern_return_t register_bootstrap_service(void) { kern_return_t kr; mach_port_t service_send_port, service_rcv_port; // Let us attempt to check in.... This routine will look up the service // by name and attempt to return receive rights to the service port. kr = bootstrap_check_in(bootstrap_port, (char *)SERVICE_NAME, &service_rcv_port); if (kr == KERN_SUCCESS) server_priv_port = bootstrap_port; else if (kr == BOOTSTRAP_UNKNOWN_SERVICE) { // The service does not exist, so let us create it.... kr = bootstrap_create_server(bootstrap_port, SERVICE_CMD, getuid(), // server uid FALSE, // not on-demand &server_priv_port); if (kr != KERN_SUCCESS) return kr; // We can now use server_priv_port to declare services associated // with this server by calling bootstrap_create_service() and passing // server_priv_port as the bootstrap port. // Create a service called SERVICE_NAME, and return send rights to // that port in service_send_port. kr = bootstrap_create_service(server_priv_port, (char *)SERVICE_NAME, &service_send_port); if (kr != KERN_SUCCESS) { mach_port_deallocate(mach_task_self(), server_priv_port); return kr; } // Check in and get receive rights to the service port of the service. kr = bootstrap_check_in(server_priv_port, (char *)SERVICE_NAME, &service_rcv_port); if (kr != KERN_SUCCESS) { mach_port_deallocate(mach_task_self(), server_priv_port); mach_port_deallocate(mach_task_self(), service_send_port); return kr; } } // We are not a Mach port server, so we do not need this port. However, // we still will have a service with the Bootstrap Server, and so we // will be relaunched if we exit. mach_port_destroy(mach_task_self(), service_rcv_port); return kr; }
static void regServ(uid_t u, bool on_demand, bool is_kunc, const char *serv_name, const char *serv_cmd) { kern_return_t kr; mach_port_t msr, msv, mhp; if ((kr = bootstrap_create_server(bootstrap_port, (char*)serv_cmd, u, on_demand, &msr)) != KERN_SUCCESS) { fprintf(stderr, "%s: bootstrap_create_server(): %d\n", argv0, kr); return; } if ((kr = bootstrap_create_service(msr, (char*)serv_name, &msv)) != KERN_SUCCESS) { fprintf(stderr, "%s: bootstrap_register(): %d\n", argv0, kr); return; } if (is_kunc) { mhp = mach_host_self(); if ((kr = host_set_UNDServer(mhp, msv)) != KERN_SUCCESS) { fprintf(stderr, "%s: host_set_UNDServer(): %s\n", argv0, mach_error_string(kr)); return; } mach_port_deallocate(mach_task_self(), mhp); } }