diff --git a/lib/libxpc/include/xpc/msg.h b/lib/libxpc/include/xpc/msg.h index 4ab0e15..d2d0297 100644 --- a/lib/libxpc/include/xpc/msg.h +++ b/lib/libxpc/include/xpc/msg.h @@ -17,10 +17,21 @@ typedef struct xpc_msg_header { typedef struct xpc_msg { xpc_endpoint_t msg_sender; - xpc_msg_header_t msg_header; - size_t msg_handles_count; + kern_msg_type_t msg_type; - kern_msg_handle_t msg_handles[KERN_MSG_MAX_HANDLES]; + union { + /* msg_type = KERN_MSG_TYPE_DATA */ + struct { + xpc_msg_header_t msg_header; + size_t msg_handles_count; + kern_msg_handle_t msg_handles[KERN_MSG_MAX_HANDLES]; + }; + + /* msg_type = KERN_MSG_TYPE_EVENT */ + struct { + kern_msg_event_type_t msg_event; + }; + }; } xpc_msg_t; extern void xpc_msg_header_init( diff --git a/lib/libxpc/msg.c b/lib/libxpc/msg.c index fab2434..fa2bb7c 100644 --- a/lib/libxpc/msg.c +++ b/lib/libxpc/msg.c @@ -54,14 +54,24 @@ static kern_status_t __msg_recv( return status; } - if (!xpc_msg_header_validate(&out->msg_header)) { - return KERN_INVALID_ARGUMENT; + switch (msg.msg_type) { + case KERN_MSG_TYPE_DATA: + if (!xpc_msg_header_validate(&out->msg_header)) { + return KERN_INVALID_ARGUMENT; + } + break; + case KERN_MSG_TYPE_EVENT: + out->msg_event = msg.msg_event; + break; + default: + break; } out->msg_sender.e_channel = channel; out->msg_sender.e_task = msg.msg_sender; out->msg_sender.e_port = msg.msg_endpoint; out->msg_sender.e_msg = msg.msg_id; + out->msg_type = msg.msg_type; return KERN_OK; }