network/core/os_abstraction.h
branchcustombridgeheads
changeset 5642 bfa6074e2833
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/network/core/os_abstraction.h	Wed Jan 03 08:32:17 2007 +0000
@@ -0,0 +1,181 @@
+/* $Id$ */
+
+#ifndef NETWORK_CORE_OS_ABSTRACTION_H
+#define NETWORK_CORE_OS_ABSTRACTION_H
+
+/**
+ * @file os_abstraction.h Network stuff has many things that needs to be
+ *                        included and/or implemented by default.
+ *                        All those things are in this file.
+ */
+
+/* Include standard stuff per OS */
+
+#ifdef ENABLE_NETWORK
+
+/* Windows stuff */
+#if defined(WIN32) || defined(WIN64)
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#include <windows.h>
+
+#if !(defined(__MINGW32__) || defined(__CYGWIN__))
+	/* Windows has some different names for some types */
+	typedef SSIZE_T ssize_t;
+	typedef int socklen_t;
+#endif
+
+#define GET_LAST_ERROR() WSAGetLastError()
+#define EWOULDBLOCK WSAEWOULDBLOCK
+/* Windows has some different names for some types */
+typedef unsigned long in_addr_t;
+#endif /* WIN32 */
+
+/* UNIX stuff */
+#if defined(UNIX)
+#	define SOCKET int
+#	define INVALID_SOCKET -1
+#	if !defined(__MORPHOS__) && !defined(__AMIGA__)
+#		define ioctlsocket ioctl
+#	if !defined(BEOS_NET_SERVER)
+#		define closesocket close
+#	endif
+#		define GET_LAST_ERROR() (errno)
+#	endif
+/* Need this for FIONREAD on solaris */
+#	define BSD_COMP
+
+/* Includes needed for UNIX-like systems */
+#	include <unistd.h>
+#	include <sys/ioctl.h>
+#	if defined(__BEOS__) && defined(BEOS_NET_SERVER)
+#		include <be/net/socket.h>
+#		include <be/kernel/OS.h> // snooze()
+#		include <be/net/netdb.h>
+		typedef unsigned long in_addr_t;
+#		define INADDR_NONE INADDR_BROADCAST
+#	else
+#		include <sys/socket.h>
+#		include <netinet/in.h>
+#		include <netinet/tcp.h>
+#		include <arpa/inet.h>
+#		include <net/if.h>
+/* According to glibc/NEWS, <ifaddrs.h> appeared in glibc-2.3. */
+#		if !defined(__sgi__) && !defined(SUNOS) && !defined(__MORPHOS__) && !defined(__BEOS__) && !defined(__INNOTEK_LIBC__) \
+		   && !(defined(__GLIBC__) && (__GLIBC__ <= 2) && (__GLIBC_MINOR__ <= 2)) && !defined(__dietlibc__)
+/* If for any reason ifaddrs.h does not exist on your system, comment out
+ *   the following two lines and an alternative way will be used to fetch
+ *   the list of IPs from the system. */
+#			include <ifaddrs.h>
+#			define HAVE_GETIFADDRS
+#		endif
+#		if defined(SUNOS) || defined(__MORPHOS__) || defined(__BEOS__)
+#			define INADDR_NONE 0xffffffff
+#		endif
+#		if defined(__BEOS__) && !defined(BEOS_NET_SERVER)
+			/* needed on Zeta */
+#			include <sys/sockio.h>
+#		endif
+#	endif /* BEOS_NET_SERVER */
+
+#	if !defined(__BEOS__) && defined(__GLIBC__) && (__GLIBC__ <= 2) && (__GLIBC_MINOR__ <= 1)
+		typedef uint32_t in_addr_t;
+#	endif
+
+#	include <errno.h>
+#	include <sys/time.h>
+#	include <netdb.h>
+#endif // UNIX
+
+#ifdef __BEOS__
+	typedef int socklen_t;
+#endif
+
+/* OS/2 stuff */
+#if defined(__OS2__)
+#	define SOCKET int
+#	define INVALID_SOCKET -1
+#	define ioctlsocket ioctl
+#	define closesocket close
+#	define GET_LAST_ERROR() (sock_errno())
+
+/* Includes needed for OS/2 systems */
+#	include <types.h>
+#	include <unistd.h>
+#	include <sys/ioctl.h>
+#	include <sys/socket.h>
+#	include <netinet/in.h>
+#	include <netinet/tcp.h>
+#	include <arpa/inet.h>
+#	include <net/if.h>
+#	include <errno.h>
+#	include <sys/time.h>
+#	include <netdb.h>
+#	include <nerrno.h>
+#	define INADDR_NONE 0xffffffff
+
+typedef int socklen_t;
+#if !defined(__INNOTEK_LIBC__)
+typedef unsigned long in_addr_t;
+#endif /* __INNOTEK_LIBC__ */
+#endif /* OS/2 */
+
+/* MorphOS and Amiga stuff */
+#if defined(__MORPHOS__) || defined(__AMIGA__)
+#	include <exec/types.h>
+#	include <proto/exec.h>   // required for Open/CloseLibrary()
+#	if defined(__MORPHOS__)
+#		include <sys/filio.h>  // FIO* defines
+#		include <sys/sockio.h> // SIO* defines
+#		include <netinet/in.h>
+#	else /* __AMIGA__ */
+#		include	<proto/socket.h>
+#	endif
+
+/* Make the names compatible */
+#	define closesocket(s) CloseSocket(s)
+#	define GET_LAST_ERROR() Errno()
+#	define ioctlsocket(s,request,status) IoctlSocket((LONG)s,(ULONG)request,(char*)status)
+#	define ioctl ioctlsocket
+
+	typedef unsigned int in_addr_t;
+	typedef long         socklen_t;
+	extern struct Library *SocketBase;
+
+#	ifdef __AMIGA__
+	/* for usleep() implementation */
+	extern struct Device      *TimerBase;
+	extern struct MsgPort     *TimerPort;
+	extern struct timerequest *TimerRequest;
+#	endif
+#endif // __MORPHOS__ || __AMIGA__
+
+static inline bool SetNonBlocking(int d)
+{
+#ifdef WIN32
+	u_long nonblocking = 1;
+#else
+	int nonblocking = 1;
+#endif
+#if defined(__BEOS__) && defined(BEOS_NET_SERVER)
+	return setsockopt(d, SOL_SOCKET, SO_NONBLOCK, &nonblocking, sizeof(nonblocking)) == 0;
+#else
+	return ioctlsocket(d, FIONBIO, &nonblocking) == 0;
+#endif
+}
+
+static inline bool SetNoDelay(int d)
+{
+	/* XXX should this be done at all? */
+#if !defined(BEOS_NET_SERVER) // not implemented on BeOS net_server
+	int b = 1;
+	/* The (const char*) cast is needed for windows */
+	return setsockopt(d, IPPROTO_TCP, TCP_NODELAY, (const char*)&b, sizeof(b)) == 0;
+#else
+	return true;
+#endif
+}
+
+#endif /* ENABLE_NETWORK */
+
+#endif /* NETWORK_CORE_OS_ABSTRACTION_H */