/* -*- Mode: C -*- */ #include <stdlib.h> #include <dispatch/dispatch.h> #include <xpc/xpc.h> #include <vmnet/vmnet.h> static interface_ref interface; static dispatch_queue_t dispatch_queue; int main(int argc, char** argv) { xpc_object_t interfaceNames = vmnet_copy_shared_interface_list(); xpc_object_t interfaceDesc = xpc_dictionary_create (NULL, NULL, 0); const char* deviceName; int nInterfaces; vmnet_interface_completion_handler_t stopHandler = ^(vmnet_return_t status) { dispatch_release(dispatch_queue); exit(0); }; vmnet_start_interface_completion_handler_t startHandler = ^(vmnet_return_t status, xpc_object_t __nullable interface_param) { if (status == VMNET_SUCCESS) { fprintf(stderr, "vmnet_start_interface success!\n"); vmnet_stop_interface(interface, dispatch_queue, stopHandler); } else { fprintf(stderr, "vmnet_start_interface failed (status %d)!\n", status); exit(-1); } }; if (interfaceNames == NULL) { fprintf(stderr, "No network interfaces!\n"); exit(-1); } nInterfaces = xpc_array_get_count(interfaceNames); if (nInterfaces == 0) { fprintf(stderr, "No network interfaces!\n"); exit(-1); } deviceName = xpc_array_get_string(interfaceNames, 0); xpc_dictionary_set_uint64(interfaceDesc, vmnet_operation_mode_key, VMNET_BRIDGED_MODE); xpc_dictionary_set_string(interfaceDesc, vmnet_shared_interface_name_key, deviceName); dispatch_queue = dispatch_queue_create (deviceName, DISPATCH_QUEUE_SERIAL); dispatch_retain (dispatch_queue); interface = vmnet_start_interface (interfaceDesc, dispatch_queue, startHandler); sleep(60); fprintf(stderr, "No response from vmnet_start_interface after 1 minute!\n"); exit(-1); }