/* Standard header for all Mach programs.
   Copyright (C) 1993-2014 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#ifndef	_MACH_H

#define	_MACH_H	1

/* We must include this before using __need_FILE with <stdio.h> below.  */
#include <features.h>


/* Get the basic types used by Mach.  */
#include <mach/mach_types.h>

/* This declares the basic variables and macros everything needs.  */
#include <mach_init.h>

/* This declares all the real system call functions.  */
#include <mach/mach_traps.h>

/* These are MiG-generated headers for the kernel interfaces commonly used.  */
#include <mach/mach_interface.h> /* From <mach/mach.defs>.  */
#include <mach/mach_port.h>
#include <mach/mach_host.h>

/* For the kernel RPCs which have system call shortcut versions,
   the MiG-generated header in fact declares `CALL_rpc' rather than `CALL'.
   This file declares the simple `CALL' functions.  */
#include <mach-shortcuts.h>


/* Receive RPC request messages on RCV_NAME and pass them to DEMUX, which
   decodes them and produces reply messages.  MAX_SIZE is the maximum size
   (in bytes) of the request and reply buffers.  */
extern mach_msg_return_t
__mach_msg_server (boolean_t (*__demux) (mach_msg_header_t *__request,
					 mach_msg_header_t *__reply),
		   mach_msg_size_t __max_size,
		   mach_port_t __rcv_name),
mach_msg_server (boolean_t (*__demux) (mach_msg_header_t *__request,
				       mach_msg_header_t *__reply),
		 mach_msg_size_t __max_size,
		 mach_port_t __rcv_name);

/* Just like `mach_msg_server', but the OPTION and TIMEOUT parameters are
   passed on to `mach_msg'.  */
extern mach_msg_return_t
__mach_msg_server_timeout (boolean_t (*__demux) (mach_msg_header_t *__request,
						 mach_msg_header_t *__reply),
			   mach_msg_size_t __max_size,
			   mach_port_t __rcv_name,
			   mach_msg_option_t __option,
			   mach_msg_timeout_t __timeout),
mach_msg_server_timeout (boolean_t (*__demux) (mach_msg_header_t *__request,
					       mach_msg_header_t *__reply),
			 mach_msg_size_t __max_size,
			 mach_port_t __rcv_name,
			 mach_msg_option_t __option,
			 mach_msg_timeout_t __timeout);


/* Deallocate all port rights and out-of-line memory in MSG. */
extern void
__mach_msg_destroy (mach_msg_header_t *msg),
mach_msg_destroy (mach_msg_header_t *msg);


#define __need_FILE
#include <stdio.h>

/* Open a stream on a Mach device.  */
extern FILE *mach_open_devstream (mach_port_t device_port, const char *mode);

/* Give THREAD a stack and set it to run at PC when resumed.
   If *STACK_SIZE is nonzero, that size of stack is allocated.
   If *STACK_BASE is nonzero, that stack location is used.
   If STACK_BASE is not null it is filled in with the chosen stack base.
   If STACK_SIZE is not null it is filled in with the chosen stack size.
   Regardless, an extra page of red zone is allocated off the end; this
   is not included in *STACK_SIZE.  */
kern_return_t __mach_setup_thread (task_t task, thread_t thread, void *pc,
				   vm_address_t *stack_base,
				   vm_size_t *stack_size);
kern_return_t mach_setup_thread (task_t task, thread_t thread, void *pc,
				 vm_address_t *stack_base,
				 vm_size_t *stack_size);


#endif	/* mach.h */
