xref: /NextBSD/usr.bin/mach-tests/bootstrap/server/bootstrap-server.c (revision 33da5adc555b3bc29986eeadca03829e4ad06b1e)
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <syslog.h>
4 #include <mach/mach.h>
5 #include <servers/bootstrap.h>
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()19 int main()
20 {
21 	kern_return_t kr;
22 	mach_port_t bport, port;
23 	struct msg_recv message;
24 	struct msg_send reply;
25 
26 	task_get_special_port(mach_task_self(), TASK_BOOTSTRAP_PORT, &bport);
27 	syslog(LOG_ERR, "bootstrap port: %d", bport);
28 
29 	kr = bootstrap_check_in(bootstrap_port, "mach.service-test", &port);
30 	if (kr != KERN_SUCCESS) {
31 		syslog(LOG_ERR, "bootstrap_check_in: kr=%d", kr);
32 		exit(1);
33 	}
34 
35 	syslog(LOG_ERR, "service port: %d", port);
36 
37 	for (;;) {
38 		message.hdr.msgh_local_port = port;
39 		message.hdr.msgh_size = sizeof(struct msg_recv);
40 
41 		kr = mach_msg_receive((mach_msg_header_t *)&message);
42 		if (kr != KERN_SUCCESS)
43 			syslog(LOG_ERR, "mach_msg_receive failure: kr=%d", kr);
44 		else
45 			syslog(LOG_ERR, "received message on port %d: body=%s", message.hdr.msgh_remote_port, message.body);
46 
47 		memset(&reply, 0, sizeof(struct msg_send));
48 		sprintf(&reply.body[0], "hello buddy");
49 		reply.hdr.msgh_local_port = MACH_PORT_NULL;
50 		reply.hdr.msgh_remote_port = message.hdr.msgh_remote_port;
51 		reply.hdr.msgh_size = sizeof(struct msg_send);
52 		reply.hdr.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0);
53 		kr = mach_msg_send((mach_msg_header_t *)&reply);
54 		if (kr != KERN_SUCCESS)
55 			syslog(LOG_ERR, "mach_msg_send failure: kr=%d", kr);
56 	}
57 }
58 
59