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