/*
 *	@file 	mprOs.h
 *  @brief 	Include O/S headers and smooth out per-O/S differences
 *	@copy	default
 *	
 *	Copyright (c) Mbedthis Software LLC, 2003-2005. All Rights Reserved.
 *	
 *	This software is distributed under commercial and open source licenses.
 *	You may use the GPL open source license described below or you may acquire 
 *	a commercial license from Mbedthis Software. You agree to be fully bound 
 *	by the terms of either license. Consult the LICENSE.TXT distributed with 
 *	this software for full details.
 *	
 *	This software is open source; you can redistribute it and/or modify it 
 *	under the terms of the GNU General Public License as published by the 
 *	Free Software Foundation; either version 2 of the License, or (at your 
 *	option) any later version. See the GNU General Public License for more 
 *	details at: http://www.mbedthis.com/downloads/gplLicense.html
 *	
 *	This program is distributed WITHOUT ANY WARRANTY; without even the 
 *	implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
 *	
 *	This GPL license does NOT permit incorporating this software into 
 *	proprietary programs. If you are unable to comply with the GPL, you must
 *	acquire a commercial license to use this software. Commercial licenses 
 *	for this software and support services are available from Mbedthis 
 *	Software at http://www.mbedthis.com 
 *	
 *	@end
 ******************************* Documentation *********************************
 *
 *	This header is part of the Mbedthis Portable Runtime and aims to include
 *	all necessary O/S headers and to unify the constants and declarations
 *	required by Mbedthis products. It can be included by C or C++ programs.
 *
 ********************************************************************************/

#error foo

blah blah;

#ifndef _h_MPR_OS_HDRS
#define _h_MPR_OS_HDRS 1

#include	"lib/ejs/config.h"

/********************************* CPU Families *********************************/
/*
 *	Porters, add your CPU families here and update configure code.
 */
#define MPR_CPU_UNKNOWN		0
#define MPR_CPU_IX86		1
#define MPR_CPU_PPC 		2
#define MPR_CPU_SPARC 		3
#define MPR_CPU_XSCALE 		4
#define MPR_CPU_ARM 		5
#define MPR_CPU_MIPS 		6
#define MPR_CPU_68K 		7
#define MPR_CPU_SIMNT 		8			/*	VxWorks NT simulator */
#define MPR_CPU_SIMSPARC 	9			/*	VxWorks sparc simulator */

/********************************* O/S Includes *********************************/

#if LINUX || SOLARIS
	#include	<sys/types.h>
	#include	<time.h>
	#include	<arpa/inet.h>
	#include	<ctype.h>
	#include	<dlfcn.h>
	#include	<fcntl.h>
	#include	<grp.h> 
	#include	<errno.h>
	#include	<libgen.h>
	#include	<limits.h>
	#include	<netdb.h>
	#include	<net/if.h>
	#include	<netinet/in.h>
	#include	<netinet/tcp.h>
	#include	<netinet/ip.h>
	#include	<pthread.h> 
	#include	<pwd.h> 
	#include	<resolv.h>
	#include	<signal.h>
	#include	<stdarg.h>
	#include	<stdio.h>
	#include	<stdlib.h>
	#include	<string.h>
	#include	<syslog.h>
	#include	<sys/ioctl.h>
	#include	<sys/stat.h>
	#include	<sys/param.h>
	#include	<sys/resource.h>
	#include	<sys/sem.h>
	#include	<sys/shm.h>
	#include	<sys/socket.h>
	#include	<sys/select.h>
	#include	<sys/time.h>
	#include	<sys/times.h>
	#include	<sys/utsname.h>
	#include	<sys/wait.h>
	#include	<unistd.h>

#if LINUX
	#include	<stdint.h>
#endif

#if SOLARIS
	#include	<netinet/in_systm.h>
#endif

#if BLD_FEATURE_FLOATING_POINT
	#define __USE_ISOC99 1
	#include	<math.h>
	#include	<values.h>
#endif

#endif /* LINUX || SOLARIS */

#if VXWORKS
	#include	<vxWorks.h>
	#include	<envLib.h>
	#include	<sys/types.h>
	#include	<time.h>
	#include	<arpa/inet.h>
	#include	<ctype.h>
	#include	<fcntl.h>
	#include	<errno.h>
	#include	<limits.h>
	#include	<loadLib.h>
	#include	<netdb.h>
	#include	<net/if.h>
	#include	<netinet/tcp.h>
	#include	<netinet/in.h>
	#include	<netinet/ip.h>
	#include	<signal.h>
	#include	<stdarg.h>
	#include	<stdio.h>
	#include	<stdlib.h>
	#include	<string.h>
	#include	<sysSymTbl.h>
	#include	<sys/fcntlcom.h>
	#include	<sys/ioctl.h>
	#include	<sys/stat.h>
	#include	<sys/socket.h>
	#include	<sys/times.h>
	#include	<sys/wait.h>
	#include	<unistd.h>
	#include	<unldLib.h>

	#if BLD_FEATURE_FLOATING_POINT
	#include	<float.h>
	#define __USE_ISOC99 1
	#include	<math.h>
	#endif

	#include	<sockLib.h>
	#include	<inetLib.h>
	#include	<ioLib.h>
	#include	<pipeDrv.h>
	#include	<hostLib.h>
	#include	<netdb.h>
	#include	<tickLib.h>
	#include	<taskHookLib.h>

#endif /* VXWORKS */

#if MACOSX
	#include	<time.h>
	#include	<arpa/inet.h>
	#include	<ctype.h>
	#include	<fcntl.h>
	#include	<grp.h> 
	#include	<errno.h>
	#include	<libgen.h>
	#include	<limits.h>
	#include	<mach-o/dyld.h>
	#include	<netdb.h>
	#include	<net/if.h>
	#include	<netinet/in_systm.h>
	#include	<netinet/in.h>
	#include	<netinet/tcp.h>
	#include	<netinet/ip.h>
	#include	<pthread.h> 
	#include	<pwd.h> 
	#include	<resolv.h>
	#include	<signal.h>
	#include	<stdarg.h>
	#include	<stdio.h>
	#include	<stdlib.h>
	#include	<stdint.h>
	#include	<string.h>
	#include	<syslog.h>
	#include	<sys/ioctl.h>
	#include	<sys/types.h>
	#include	<sys/stat.h>
	#include	<sys/param.h>
	#include 	<sys/resource.h>
	#include	<sys/sem.h>
	#include	<sys/shm.h>
	#include	<sys/socket.h>
	#include	<sys/select.h>
	#include	<sys/time.h>
	#include	<sys/times.h>
	#include	<sys/types.h>
	#include	<sys/utsname.h>
	#include	<sys/wait.h>
	#include	<unistd.h>
#endif /* MACOSX */

#if WIN
	#include	<ctype.h>
	#include	<conio.h>
	#include	<direct.h>
	#include	<errno.h>
	#include	<fcntl.h>
	#include	<io.h>
	#include	<limits.h>
	#include	<malloc.h>
	#include	<process.h>
	#include	<sys/stat.h>
	#include	<sys/types.h>
	#include	<stddef.h>
	#include	<stdio.h>
	#include	<stdlib.h>
	#include	<string.h>
	#include	<stdarg.h>
	#include	<time.h>
	#define WIN32_LEAN_AND_MEAN
	#include	<winsock2.h>
	#include	<windows.h>
	#include	<winbase.h>
	#if BLD_FEATURE_FLOATING_POINT
	#include	<float.h>
	#endif
	#include	<shlobj.h>
	#include	<shellapi.h>
	#include	<wincrypt.h>
#endif /* WIN  */

#ifdef __cplusplus
extern "C" {
#endif

/********************************************************************************/
/******************************* General Defines ********************************/
/********************************************************************************/

#define	MAXINT			INT_MAX
#define BITS(type)		(BITSPERBYTE * (int) sizeof(type))

#ifndef max
#define max(a,b)  (((a) > (b)) ? (a) : (b))
#endif

#ifndef min
#define min(a,b)  (((a) < (b)) ? (a) : (b))
#endif

/*
 *	Set FD_SETSIZE to the maximum number of files (sockets) that you want to
 *	support. It is used in select.cpp.
 *
 *	#ifdef FD_SETSIZE
 *		#undef FD_SETSIZE
 *	#endif
 *	#define FD_SETSIZE		128
 */

typedef char	*MprStr;					/* Used for dynamic strings */

/********************************************************************************/
/*******************************/ Linux Defines *********************************/
/********************************************************************************/

#if LINUX
	typedef unsigned char uchar;

#if BLD_FEATURE_INT64
	__extension__ typedef long long int int64;
	__extension__ typedef unsigned long long int uint64;
	#define INT64(x) (x##LL)
#endif

	#define closesocket(x)	close(x)
	#define MPR_BINARY		""
	#define MPR_TEXT		""
	#define O_BINARY		0
	#define O_TEXT			0
	#define	SOCKET_ERROR	-1
	#define MPR_DLL_EXT		".so"

#if BLD_FEATURE_FLOATING_POINT
	#define MAX_FLOAT		MAXFLOAT
#endif

	#if BLD_FEATURE_MALLOC
	/*
	 *	PORTERS: You will need add assembler code for your architecture here
	 *	only if you want to use the fast malloc (BLD_FEATURE_MALLOC)
	 */
		#if UNUSED
			#define MPR_GET_RETURN(ip)	__builtin_return_address(0)
		#else
			#if BLD_HOST_CPU_ARCH == MPR_CPU_IX86
				#define MPR_GET_RETURN(ip)	\
					asm("movl 4(%%ebp),%%eax ; movl %%eax,%0" : \
						"=g" (ip) : \
						: "eax")
			#endif
#endif /* UNUSED */
#endif /* BLD_FEATURE_MALLOC */

#if FUTURE
/*	#define mprGetHiResTime(x) __asm__ __volatile__ ("rdtsc" : "=A" (x)) */
/*	extern char *inet_ntoa_r(const struct in_addr in, char *buffer, int buflen); */

	/* */
	/*	Atomic functions */
	/* */
	typedef struct { volatile int counter; } mprAtomic_t;

	#if BLD_FEATURE_MULTITHREAD
	#define LOCK "lock ; "
	#else
	#define LOCK ""
	#endif

	static __inline__ void mprAtomicInc(mprAtomic_t* v) {
		__asm__ __volatile__(
			LOCK "incl %0"
			:"=m" (v->counter)
			:"m" (v->counter));
	}

	static __inline__ void mprAtomicDec(mprAtomic_t* v) {
		__asm__ __volatile__(
			LOCK "decl %0"
			:"=m" (v->counter)
			:"m" (v->counter));
	}
#endif	/* FUTURE */

#endif 	/* LINUX  */

/********************************************************************************/
/******************************* VxWorks Defines ********************************/
/********************************************************************************/

#if VXWORKS

	typedef unsigned char uchar;
	typedef unsigned int uint;
	typedef unsigned long ulong;

	#define HAVE_SOCKLEN_T
	typedef int 	socklen_t;

#if BLD_FEATURE_INT64
	typedef long long int int64;
	typedef unsigned long long int uint64;
	#define INT64(x) (x##LL)
#endif

	#define closesocket(x)	close(x)
	#define getpid() 		taskIdSelf()
	#define MPR_BINARY		""
	#define MPR_TEXT		""
	#define O_BINARY		0
	#define O_TEXT			0
	#define	SOCKET_ERROR	-1
	#define MPR_DLL_EXT		".so"

#if BLD_FEATURE_FLOATING_POINT
	#define MAX_FLOAT 		FLT_MAX
#endif

	#undef R_OK
	#define R_OK	4
	#undef W_OK
	#define W_OK	2
	#undef X_OK
	#define X_OK	1
	#undef F_OK
	#define F_OK	0

	#define MSG_NOSIGNAL 0
	
	extern int access(char *path, int mode);
	extern int sysClkRateGet();

	#if BLD_FEATURE_MALLOC
	/*
	 *	PORTERS: You will need add assembler code for your architecture here
	 *	only if you want to use the fast malloc (BLD_FEATURE_MALLOC)
	 */
		#if UNUSED
			#define MPR_GET_RETURN(ip)	__builtin_return_address(0)
		#else
			#if BLD_HOST_CPU_ARCH == MPR_CPU_IX86
				#define MPR_GET_RETURN(ip)	\
					asm("movl 4(%%ebp),%%eax ; movl %%eax,%0" : \
						"=g" (ip) : \
						: "eax")
			#endif
#endif /* UNUSED */
#endif /* BLD_FEATURE_MALLOC */
#endif 	/* VXWORKS  */

/********************************************************************************/
/******************************** MacOsx Defines ********************************/
/********************************************************************************/
#if MACOSX
	typedef unsigned long ulong;
	typedef unsigned char uchar;

#if BLD_FEATURE_INT64
	__extension__ typedef long long int int64;
	__extension__ typedef unsigned long long int uint64;
	#define INT64(x) (x##LL)
#endif
	#define closesocket(x)	close(x)
	#define MPR_BINARY		""
	#define MPR_TEXT		""
	#define O_BINARY		0
	#define O_TEXT			0
	#define	SOCKET_ERROR	-1
	#define MPR_DLL_EXT		".dylib"
	#define MSG_NOSIGNAL	0
	#define __WALL          0x40000000
	#define PTHREAD_MUTEX_RECURSIVE_NP  PTHREAD_MUTEX_RECURSIVE

#if BLD_FEATURE_FLOATING_POINT
	#define MAX_FLOAT		MAXFLOAT
#endif

	#if MPR_FEATURE_MALLOC
	/*
	 *	PORTERS: You will need add assembler code for your architecture here
	 *	only if you want to use the fast malloc (MPR_FEATURE_MALLOC)
	 */
	#define MPR_GET_RETURN(ip)	__builtin_return_address
	#endif

#if FUTURE
/*	#define mprGetHiResTime(x) __asm__ __volatile__ ("rdtsc" : "=A" (x)) */
/*	extern char *inet_ntoa_r(const struct in_addr in, char *buffer, int buflen); */

	/* */
	/*	Atomic functions */
	/* */
	typedef struct { volatile int counter; } mprAtomic_t;

	#if MPR_FEATURE_MULTITHREAD
	#define LOCK "lock ; "
	#else
	#define LOCK ""
	#endif

	static __inline__ void mprAtomicInc(mprAtomic_t* v) {
		__asm__ __volatile__(
			LOCK "incl %0"
			:"=m" (v->counter)
			:"m" (v->counter));
	}

	static __inline__ void mprAtomicDec(mprAtomic_t* v) {
		__asm__ __volatile__(
			LOCK "decl %0"
			:"=m" (v->counter)
			:"m" (v->counter));
	}
#endif
#endif /* MACOSX */

/********************************************************************************/
/******************************* Windows Defines ********************************/
/********************************************************************************/

#if WIN
	typedef unsigned char uchar;
	typedef unsigned int uint;
	typedef unsigned long ulong;
	typedef unsigned short ushort;

#if BLD_FEATURE_INT64
	typedef __int64 int64;
	typedef unsigned __int64 uint64;
	#define INT64(x) (x##i64)
#endif

	typedef int 	uid_t;
	typedef void 	*handle;
	typedef char 	*caddr_t;
	typedef long 	pid_t;
	typedef int	 	gid_t;
	typedef ushort 	mode_t;
	typedef void 	*siginfo_t;

	#define HAVE_SOCKLEN_T
	typedef int 	socklen_t;

	#undef R_OK
	#define R_OK	4
	#undef W_OK
	#define W_OK	2
	#undef X_OK
	#define X_OK	1
	#undef F_OK
	#define F_OK	0
	
	#ifndef EADDRINUSE
	#define EADDRINUSE		46
	#endif
	#ifndef EWOULDBLOCK
	#define EWOULDBLOCK		EAGAIN
	#endif
	#ifndef ENETDOWN
	#define ENETDOWN		43
	#endif
	#ifndef ECONNRESET
	#define ECONNRESET		44
	#endif
	#ifndef ECONNREFUSED
	#define ECONNREFUSED	45
	#endif

	#define MSG_NOSIGNAL	0
	#define MPR_BINARY		"b"
	#define MPR_TEXT		"t"

#if BLD_FEATURE_FLOATING_POINT
	#define MAX_FLOAT		DBL_MAX
#endif

#ifndef FILE_FLAG_FIRST_PIPE_INSTANCE
#define FILE_FLAG_FIRST_PIPE_INSTANCE   0x00080000
#endif

	#define access 	_access
	#define close 	_close
	#define fileno 	_fileno
	#define fstat 	_fstat
	#define getpid 	_getpid
	#define open 	_open
	#define putenv 	_putenv
	#define read 	_read
	#define stat 	_stat
	#define umask 	_umask
	#define unlink 	_unlink
	#define write 	_write
	#define strdup 	_strdup
	#define lseek 	_lseek

	#define mkdir(a,b) 	_mkdir(a)
	#define rmdir(a) 	_rmdir(a)

	#if BLD_FEATURE_MALLOC
	/*
	 *	PORTERS: You will need add assembler code for your architecture here
	 *	only if you want to use the fast malloc (BLD_FEATURE_MALLOC)
	 */
	#if MPR_CPU_IX86
	#define MPR_GET_RETURN(ip) \
		__asm {	mov	eax, 4[ebp] } \
		__asm {	mov ip, eax	}
	#endif
	#endif

	#define MPR_DLL_EXT		".dll"

	extern void		srand48(long);
	extern long		lrand48(void);
	extern long 	ulimit(int, ...);
	extern long 	nap(long);
	extern uint 	sleep(unsigned int secs);
	extern uid_t 	getuid(void);
	extern uid_t 	geteuid(void);

#endif /* WIN  */

/********************************************************************************/
/*****************************/ Solaris Defines *********************************/
/********************************************************************************/

#if SOLARIS
	typedef unsigned char uchar;

#if BLD_FEATURE_INT64
	typedef long long int int64;
	typedef unsigned long long int uint64;
	#define INT64(x) (x##LL)
#endif

	#define closesocket(x)	close(x)
	#define MPR_BINARY		""
	#define MPR_TEXT		""
	#define O_BINARY		0
	#define O_TEXT			0
	#define	SOCKET_ERROR	-1
	#define MPR_DLL_EXT		".so"
	#define MSG_NOSIGNAL	0
	#define INADDR_NONE		((in_addr_t) 0xffffffff)
	#define __WALL	0
	#define PTHREAD_MUTEX_RECURSIVE_NP  PTHREAD_MUTEX_RECURSIVE

#if BLD_FEATURE_FLOATING_POINT
	#define MAX_FLOAT		MAXFLOAT
#endif

#endif /* SOLARIS  */

/********************************************************************************/
#ifdef __cplusplus
}
#endif

#endif /* _h_MPR_OS_HDRS  */

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 * vim:tw=78
 * vim600: sw=4 ts=4 fdm=marker
 * vim<600: sw=4 ts=4
 */