- for (;;) {
- struct rep_msg {
- mach_msg_header_t Head;
- NDR_record_t NDR;
- kern_return_t RetCode;
- } rep_msg;
- struct exc_msg {
- mach_msg_header_t Head;
- /* start of the kernel processed data */
- mach_msg_body_t msgh_body;
- mach_msg_port_descriptor_t thread;
- mach_msg_port_descriptor_t task;
- /* end of the kernel processed data */
- NDR_record_t NDR;
- exception_type_t exception;
- mach_msg_type_number_t codeCnt;
- exception_data_t code;
- /* some times RCV_TO_LARGE probs */
- char pad[512];
- } exc_msg;
- mach_port_name_t reply_port;
- kern_return_t result;
-
- exc_msg.Head.msgh_local_port = (mach_port_t)exc_set_name;
- exc_msg.Head.msgh_size = sizeof (exc_msg);
-#if 0
- result = mach_msg_receive(&exc_msg.Head);
-#else
- result = mach_msg_receive(&exc_msg.Head, MACH_RCV_MSG,
- sizeof (exc_msg), exc_set_name,
- MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL,
- 0);
-#endif
- if (result == MACH_MSG_SUCCESS) {
- reply_port = (mach_port_name_t)exc_msg.Head.msgh_remote_port;
-
- if (exc_server(&exc_msg.Head, &rep_msg.Head))
- (void) mach_msg_send(&rep_msg.Head, MACH_SEND_MSG,
- sizeof (rep_msg),MACH_MSG_TIMEOUT_NONE,MACH_PORT_NULL);
-
- if (reply_port != MACH_PORT_NULL)
- (void) mach_port_deallocate(get_task_ipcspace(ux_handler_self), reply_port);