xref: /trueos/usr.bin/mach-tests/bootstrap-kqueue/server-libdispatch/bootstrap-libdispatch-server.c (revision cb2de5a914fb4eb8a09e3f16bd2d923437d9a368)
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <syslog.h>
4 #include <errno.h>
5 #include <mach/mach.h>
6 #include <sys/types.h>
7 #include <sys/event.h>
8 #include <sys/time.h>
9 #include <dispatch/dispatch.h>
10 #include <servers/bootstrap.h>
11 
12 struct msg_send
13 {
14 	mach_msg_header_t hdr;
15 	char body[256];
16 };
17 
18 struct msg_recv
19 {
20 	mach_msg_header_t hdr;
21 	char body[256];
22 	mach_msg_trailer_t trailer;
23 };
24 
main()25 int main()
26 {
27 	__block kern_return_t kr;
28 	mach_port_t bport, port;
29 	dispatch_source_t source;
30 
31 	task_get_special_port(mach_task_self(), TASK_BOOTSTRAP_PORT, &bport);
32 	syslog(LOG_ERR, "bootstrap port: %d", bport);
33 
34 	kr = bootstrap_check_in(bootstrap_port, "mach.service-test", &port);
35 	if (kr != KERN_SUCCESS) {
36 		syslog(LOG_ERR, "bootstrap_check_in: kr=%d", kr);
37 		exit(1);
38 	}
39 
40 	syslog(LOG_ERR, "service port: %d", port);
41 
42 	source = dispatch_source_create(
43 	    DISPATCH_SOURCE_TYPE_MACH_RECV, port, 0,
44 	    dispatch_get_main_queue());
45 
46 	dispatch_source_set_event_handler(source, ^{
47 		struct msg_recv message;
48 		struct msg_send reply;
49 
50 		message.hdr.msgh_local_port = port;
51 		message.hdr.msgh_size = sizeof(struct msg_recv);
52 
53 		kr = mach_msg_receive((mach_msg_header_t *)&message);
54 		if (kr != KERN_SUCCESS)
55 			syslog(LOG_ERR, "mach_msg_receive failure: kr=%d", kr);
56 		else
57 			syslog(LOG_ERR, "received message on port %d: body=%s", message.hdr.msgh_remote_port, message.body);
58 
59 		memset(&reply, 0, sizeof(struct msg_send));
60 		sprintf(&reply.body[0], "hello buddy");
61 		reply.hdr.msgh_local_port = MACH_PORT_NULL;
62 		reply.hdr.msgh_remote_port = message.hdr.msgh_remote_port;
63 		reply.hdr.msgh_size = sizeof(struct msg_send);
64 		reply.hdr.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0);
65 		kr = mach_msg_send((mach_msg_header_t *)&reply);
66 		if (kr != KERN_SUCCESS)
67 			syslog(LOG_ERR, "mach_msg_send failure: kr=%d", kr);
68 	});
69 
70 	dispatch_resume(source);
71 	dispatch_main();
72 }
73 
74