static void launch_msg_getmsgs(launch_data_t m, void *context) { launch_data_t async_resp, *sync_resp = context; if ((LAUNCH_DATA_DICTIONARY == launch_data_get_type(m)) && (async_resp = launch_data_dict_lookup(m, "_AsyncMessage"))) { launch_data_array_set_index(_lc->async_resp, launch_data_copy(async_resp), launch_data_array_get_count(_lc->async_resp)); } else { *sync_resp = launch_data_copy(m); } }
kern_return_t _vproc_grab_subset(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright, launch_data_t *outval, mach_port_array_t *ports, mach_msg_type_number_t *portCnt) { mach_msg_type_number_t outdata_cnt; vm_offset_t outdata = 0; size_t data_offset = 0; launch_data_t out_obj; kern_return_t kr; if ((kr = vproc_mig_take_subset(bp, reqport, rcvright, &outdata, &outdata_cnt, ports, portCnt))) { goto out; } if ((out_obj = launch_data_unpack((void *)outdata, outdata_cnt, NULL, 0, &data_offset, NULL))) { *outval = launch_data_copy(out_obj); } else { kr = 1; } out: if (outdata) { mig_deallocate(outdata, outdata_cnt); } return kr; }
launch_data_t launch_data_copy(launch_data_t o) { launch_data_t r = launch_data_alloc(o->type); size_t i; memcpy(r, o, sizeof(struct _launch_data)); switch (o->type) { case LAUNCH_DATA_DICTIONARY: case LAUNCH_DATA_ARRAY: r->_array = calloc(1, o->_array_cnt * sizeof(launch_data_t)); for (i = 0; i < o->_array_cnt; i++) { if (o->_array[i]) r->_array[i] = launch_data_copy(o->_array[i]); } break; case LAUNCH_DATA_STRING: r->string = strdup(o->string); break; case LAUNCH_DATA_OPAQUE: r->opaque = malloc(o->opaque_size); memcpy(r->opaque, o->opaque, o->opaque_size); break; default: break; } return r; }