xref: /xnu-12377.81.4/tests/ipc/ipc_utils.h (revision 043036a2b3718f7f0be807e2870f8f47d3fa0796)
1*043036a2SApple OSS Distributions #ifndef IPC_UTILS_H
2*043036a2SApple OSS Distributions #define IPC_UTILS_H
3*043036a2SApple OSS Distributions 
4*043036a2SApple OSS Distributions #include <mach/mach.h>
5*043036a2SApple OSS Distributions #include <mach/message.h>
6*043036a2SApple OSS Distributions #include <mach/mach_error.h>
7*043036a2SApple OSS Distributions #include <stdio.h>
8*043036a2SApple OSS Distributions #include <stdlib.h>
9*043036a2SApple OSS Distributions #include <stdbool.h>
10*043036a2SApple OSS Distributions #include <sys/code_signing.h>
11*043036a2SApple OSS Distributions 
12*043036a2SApple OSS Distributions /*
13*043036a2SApple OSS Distributions  * Common IPC utilities for XNU tests
14*043036a2SApple OSS Distributions  *
15*043036a2SApple OSS Distributions  * This header provides standardized message structures and utilities
16*043036a2SApple OSS Distributions  * for common IPC patterns used across multiple test files.
17*043036a2SApple OSS Distributions  */
18*043036a2SApple OSS Distributions 
19*043036a2SApple OSS Distributions #ifdef __cplusplus
20*043036a2SApple OSS Distributions extern "C" {
21*043036a2SApple OSS Distributions #endif
22*043036a2SApple OSS Distributions 
23*043036a2SApple OSS Distributions /* Message structure for sending a single port */
24*043036a2SApple OSS Distributions typedef struct {
25*043036a2SApple OSS Distributions 	mach_msg_header_t header;
26*043036a2SApple OSS Distributions 	mach_msg_body_t body;
27*043036a2SApple OSS Distributions 	mach_msg_port_descriptor_t port;
28*043036a2SApple OSS Distributions } ipc_single_port_msg_t;
29*043036a2SApple OSS Distributions 
30*043036a2SApple OSS Distributions /* Message structure for sending multiple ports in an array */
31*043036a2SApple OSS Distributions typedef struct {
32*043036a2SApple OSS Distributions 	mach_msg_header_t header;
33*043036a2SApple OSS Distributions 	mach_msg_body_t body;
34*043036a2SApple OSS Distributions 	mach_msg_ool_ports_descriptor_t ports_descriptor;
35*043036a2SApple OSS Distributions } ipc_port_array_msg_t;
36*043036a2SApple OSS Distributions 
37*043036a2SApple OSS Distributions /* Generic message structure with trailer for receiving */
38*043036a2SApple OSS Distributions typedef struct {
39*043036a2SApple OSS Distributions 	mach_msg_header_t header;
40*043036a2SApple OSS Distributions 	mach_msg_body_t body;
41*043036a2SApple OSS Distributions 	union {
42*043036a2SApple OSS Distributions 		/* Single port descriptor */
43*043036a2SApple OSS Distributions 		struct {
44*043036a2SApple OSS Distributions 			mach_msg_port_descriptor_t port;
45*043036a2SApple OSS Distributions 		} single;
46*043036a2SApple OSS Distributions 
47*043036a2SApple OSS Distributions 		/* Port array descriptor */
48*043036a2SApple OSS Distributions 		struct {
49*043036a2SApple OSS Distributions 			mach_msg_ool_ports_descriptor_t ports_descriptor;
50*043036a2SApple OSS Distributions 		} array;
51*043036a2SApple OSS Distributions 	} data;
52*043036a2SApple OSS Distributions 	mach_msg_max_trailer_t trailer;
53*043036a2SApple OSS Distributions } ipc_receive_msg_t;
54*043036a2SApple OSS Distributions 
55*043036a2SApple OSS Distributions /*
56*043036a2SApple OSS Distributions  * Port Management Functions
57*043036a2SApple OSS Distributions  */
58*043036a2SApple OSS Distributions 
59*043036a2SApple OSS Distributions /* Create a new receive port with send right */
60*043036a2SApple OSS Distributions mach_port_t ipc_create_receive_port(void);
61*043036a2SApple OSS Distributions 
62*043036a2SApple OSS Distributions /* Create a receive port with specific options */
63*043036a2SApple OSS Distributions mach_port_t ipc_create_receive_port_with_options(uint32_t mpo_flags);
64*043036a2SApple OSS Distributions 
65*043036a2SApple OSS Distributions /* Safely deallocate a port */
66*043036a2SApple OSS Distributions void ipc_deallocate_port(mach_port_t port);
67*043036a2SApple OSS Distributions 
68*043036a2SApple OSS Distributions /* Insert a send right to a receive right */
69*043036a2SApple OSS Distributions kern_return_t ipc_insert_send_right(mach_port_t receive_port);
70*043036a2SApple OSS Distributions 
71*043036a2SApple OSS Distributions /*
72*043036a2SApple OSS Distributions  * Single Port Messaging Functions
73*043036a2SApple OSS Distributions  */
74*043036a2SApple OSS Distributions 
75*043036a2SApple OSS Distributions /* Send a single port to destination */
76*043036a2SApple OSS Distributions kern_return_t ipc_send_port(mach_port_t destination, mach_port_t port,
77*043036a2SApple OSS Distributions     mach_msg_type_name_t disposition);
78*043036a2SApple OSS Distributions 
79*043036a2SApple OSS Distributions /* Receive a single port from destination */
80*043036a2SApple OSS Distributions kern_return_t ipc_receive_port(mach_port_t destination, mach_port_t *port);
81*043036a2SApple OSS Distributions 
82*043036a2SApple OSS Distributions /*
83*043036a2SApple OSS Distributions  * Port Array Messaging Functions
84*043036a2SApple OSS Distributions  */
85*043036a2SApple OSS Distributions 
86*043036a2SApple OSS Distributions /* Send an array of ports to destination */
87*043036a2SApple OSS Distributions kern_return_t ipc_send_port_array(mach_port_t destination,
88*043036a2SApple OSS Distributions     mach_port_t *ports, mach_msg_type_number_t count,
89*043036a2SApple OSS Distributions     mach_msg_type_name_t disposition);
90*043036a2SApple OSS Distributions 
91*043036a2SApple OSS Distributions /* Receive an array of ports from destination */
92*043036a2SApple OSS Distributions kern_return_t ipc_receive_port_array(mach_port_t destination,
93*043036a2SApple OSS Distributions     mach_port_t **ports, mach_msg_type_number_t *count);
94*043036a2SApple OSS Distributions 
95*043036a2SApple OSS Distributions /*
96*043036a2SApple OSS Distributions  * Generic Messaging Functions
97*043036a2SApple OSS Distributions  */
98*043036a2SApple OSS Distributions 
99*043036a2SApple OSS Distributions /* Send a pre-constructed message */
100*043036a2SApple OSS Distributions kern_return_t ipc_send_message(mach_msg_header_t *msg);
101*043036a2SApple OSS Distributions 
102*043036a2SApple OSS Distributions /* Receive a message into a pre-allocated buffer */
103*043036a2SApple OSS Distributions kern_return_t ipc_receive_message(mach_port_t destination, ipc_receive_msg_t *msg,
104*043036a2SApple OSS Distributions     mach_msg_size_t max_size);
105*043036a2SApple OSS Distributions 
106*043036a2SApple OSS Distributions /*
107*043036a2SApple OSS Distributions  * Security and Code Signing Utilities
108*043036a2SApple OSS Distributions  */
109*043036a2SApple OSS Distributions 
110*043036a2SApple OSS Distributions /* Check if IPC hardening is disabled (CS_CONFIG_GET_OUT_OF_MY_WAY) */
111*043036a2SApple OSS Distributions bool ipc_hardening_disabled(void);
112*043036a2SApple OSS Distributions 
113*043036a2SApple OSS Distributions #ifdef __cplusplus
114*043036a2SApple OSS Distributions }
115*043036a2SApple OSS Distributions #endif
116*043036a2SApple OSS Distributions 
117*043036a2SApple OSS Distributions #endif /* IPC_UTILS_H */
118