]>
Commit | Line | Data |
---|---|---|
f427ee49 A |
1 | #include "mach_vm_tests.h" |
2 | boolean_t debug = TRUE; | |
3 | ||
4 | int | |
5 | main() | |
6 | { | |
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"); | |
10 | exit(1); | |
11 | }); | |
12 | dispatch_activate(parentSource); | |
13 | ||
14 | const char *serviceName = MACH_VM_TEST_SERVICE_NAME; | |
15 | ||
16 | kern_return_t ret; | |
17 | mach_port_t bootstrap; | |
18 | task_get_bootstrap_port(mach_task_self(), &bootstrap); | |
19 | ||
20 | mach_port_t port; | |
21 | mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port); | |
22 | ||
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 | |
27 | ||
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); | |
30 | ||
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; | |
35 | ||
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); | |
41 | } | |
42 | } | |
43 | ||
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); | |
49 | ||
50 | ||
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; | |
55 | ||
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)); | |
61 | return 1; | |
62 | } | |
63 | ||
64 | (void)parentSource; | |
65 | ||
66 | return 0; | |
67 | } |