1 #include "mach_vm_tests.h"
2 boolean_t debug
= TRUE
;
7 dispatch_source_t parentSource
= dispatch_source_create(DISPATCH_SOURCE_TYPE_PROC
, (uintptr_t)getppid(), DISPATCH_PROC_EXIT
, NULL
);
8 dispatch_source_set_event_handler(parentSource
, ^{
9 T_LOG("Event handler got invoked. Parent process died. Exiting");
12 dispatch_activate(parentSource
);
14 const char *serviceName
= MACH_VM_TEST_SERVICE_NAME
;
17 mach_port_t bootstrap
;
18 task_get_bootstrap_port(mach_task_self(), &bootstrap
);
21 mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE
, &port
);
23 #pragma clang diagnostic push
24 #pragma clang diagnostic ignored "-Wdeprecated"
25 ret
= bootstrap_register2(bootstrap
, (char *)serviceName
, port
, BOOTSTRAP_ALLOW_LOOKUP
);
26 #pragma clang diagnostic pop
28 mach_msg_size_t messageSize
= sizeof(ipc_message_t
) + sizeof(mach_msg_trailer_t
) + 64;
29 ipc_message_t
*message
= (ipc_message_t
*)calloc(1, messageSize
);
31 message
->header
.msgh_bits
= MACH_MSGH_BITS_ZERO
;
32 message
->header
.msgh_size
= messageSize
;
33 message
->header
.msgh_remote_port
= MACH_PORT_NULL
;
34 message
->header
.msgh_local_port
= port
;
36 ret
= mach_msg(&message
->header
, MACH_RCV_MSG
, 0, messageSize
, port
, MACH_MSG_TIMEOUT_NONE
, MACH_PORT_NULL
);
37 if (ret
== KERN_SUCCESS
) {
38 if (MACH_MSGH_BITS_REMOTE(message
->header
.msgh_bits
) == MACH_MSG_TYPE_PORT_SEND
) {
39 persistentReplyPort
= message
->header
.msgh_remote_port
;
40 mach_port_mod_refs(mach_task_self(), persistentReplyPort
, MACH_PORT_RIGHT_SEND
, 1);
44 mach_server_make_memory_entry(port
);
45 mach_server_remap(port
);
46 mach_server_read(port
, VM_OP_READ
);
47 //mach_server_read(port, VM_OP_WRITE);
48 mach_server_read(port
, VM_OP_READ_OVERWRITE
);
51 message
->header
.msgh_bits
= MACH_MSGH_BITS_ZERO
;
52 message
->header
.msgh_size
= messageSize
;
53 message
->header
.msgh_remote_port
= MACH_PORT_NULL
;
54 message
->header
.msgh_local_port
= port
;
56 mach_server_construct_header(message
, port
);
57 message
->vm_op
= VM_OP_EXIT
;
58 ret
= mach_msg(&message
->header
, MACH_SEND_MSG
, message
->header
.msgh_size
, 0, MACH_PORT_NULL
, MACH_MSG_TIMEOUT_NONE
, MACH_PORT_NULL
);
59 if (ret
!= KERN_SUCCESS
) {
60 T_LOG("ERROR: Failed to send message to client: (%d) %s\n", ret
, mach_error_string(ret
));