-void
-submit_mach_jobs(launch_data_t jobs)
-{
- size_t i, c;
-
- c = launch_data_array_get_count(jobs);
-
- for (i = 0; i < c; i++) {
- launch_data_t tmp, oai = launch_data_array_get_index(jobs, i);
- const char *sn = NULL, *cmd = NULL;
- bool d = true;
- mach_port_t msr, msv;
- kern_return_t kr;
- uid_t u = getuid();
-
- if ((tmp = launch_data_dict_lookup(oai, MACHINIT_JOBKEY_ONDEMAND)))
- d = launch_data_get_bool(tmp);
- if ((tmp = launch_data_dict_lookup(oai, MACHINIT_JOBKEY_SERVICENAME)))
- sn = launch_data_get_string(tmp);
- if ((tmp = launch_data_dict_lookup(oai, MACHINIT_JOBKEY_COMMAND)))
- cmd = launch_data_get_string(tmp);
-
- if ((kr = bootstrap_create_server(bootstrap_port, (char *)cmd, u, d, &msr)) != KERN_SUCCESS) {
- fprintf(stderr, "%s: bootstrap_create_server(): %s\n", getprogname(), bootstrap_strerror(kr));
- continue;
- }
- if ((kr = bootstrap_check_in(msr, (char*)sn, &msv)) != KERN_SUCCESS) {
- fprintf(stderr, "%s: bootstrap_check_in(): %s\n", getprogname(), bootstrap_strerror(kr));
- 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);
- launch_data_dict_insert(oai, launch_data_new_machport(msv), MACHINIT_JOBKEY_SERVICEPORT);
- }
-}
-
-void
-let_go_of_mach_jobs(launch_data_t jobs)
-{
- size_t i, c = launch_data_array_get_count(jobs);
-
- for (i = 0; i < c; i++) {
- launch_data_t tmp, oai = launch_data_array_get_index(jobs, i);
- if ((tmp = launch_data_dict_lookup(oai, MACHINIT_JOBKEY_SERVICEPORT))) {
- mach_port_destroy(mach_task_self(), launch_data_get_machport(tmp));
- } else {
- fprintf(stderr, "%s: ack! missing service port!\n", getprogname());
- }
- if ((tmp = launch_data_dict_lookup(oai, MACHINIT_JOBKEY_SERVERPORT))) {
- mach_port_destroy(mach_task_self(), launch_data_get_machport(tmp));
- } else {
- fprintf(stderr, "%s: ack! missing server port!\n", getprogname());
- }
- }
-}
-