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