1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <mach/mach.h>
4 #include <servers/bootstrap.h>
5
6 struct msg_send
7 {
8 mach_msg_header_t hdr;
9 char body[256];
10 };
11
12 struct msg_recv
13 {
14 mach_msg_header_t hdr;
15 char body[256];
16 mach_msg_trailer_t trailer;
17 };
18
main(int argc,char * argv[])19 int main(int argc, char *argv[])
20 {
21 kern_return_t kr;
22 mach_port_t bport, port, reply_port;
23 struct msg_recv message;
24
25 task_get_special_port(mach_task_self(), TASK_BOOTSTRAP_PORT, &bport);
26 printf("bootstrap port: %d\n", bport);
27
28 kr = bootstrap_look_up(bootstrap_port, "mach.service-test", &port);
29 if (kr != KERN_SUCCESS) {
30 fprintf(stderr, "bootstrap_look_up: kr=%d\n", kr);
31 exit(1);
32 }
33
34 printf("service port: %d\n", port);
35
36 kr = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &reply_port);
37 if (kr != KERN_SUCCESS) {
38 fprintf(stderr, "mach_port_allocate: kr=%d\n", kr);
39 exit(1);
40 }
41
42 kr = mach_port_insert_right(mach_task_self(), reply_port, reply_port, MACH_MSG_TYPE_MAKE_SEND);
43 if (kr != KERN_SUCCESS) {
44 fprintf(stderr, "mach_port_insert_right: kr=%d\n", kr);
45 exit(1);
46 }
47
48 message.hdr.msgh_local_port = reply_port;
49 message.hdr.msgh_remote_port = port;
50 message.hdr.msgh_size = sizeof(struct msg_send);
51 message.hdr.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND);
52 strcpy(message.body, argv[1]);
53
54 printf("message size: %d\n", message.hdr.msgh_size);
55
56 kr = mach_msg((mach_msg_header_t *)&message, MACH_SEND_MSG | MACH_RCV_MSG,
57 sizeof(struct msg_send), sizeof(struct msg_recv), reply_port,
58 MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
59
60 if (kr != KERN_SUCCESS)
61 printf("mach_msg_send failure: kr=%d\n", kr);
62 else
63 printf("sent message\n");
64 }
65
66