xref: /NextBSD/usr.bin/mach-tests/bootstrap/client/bootstrap-client.c (revision 33da5adc555b3bc29986eeadca03829e4ad06b1e)
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