// -*- mode: C++; tab-width: 4; -*- // vi:ts=8 sw=4 noexpandtab autoindent /* * Copyright 2011 Perforce Software. All rights reserved. * * This file is part of Perforce - the FAST SCM System. * * System- and compiler-dependent definitions for portability. */ // network portability definitions moved from nettcp.cc // I tried to make it uglier, but that wasn't easy # ifdef OS_NT # include <winsock2.h> # include <ws2tcpip.h> # ifndef OS_MINGW # include <wspiapi.h> // required for p4v win2k build # endif # else # ifdef OS_BEOS # include <net/socket.h> # else # ifdef OS_LYNX # define __NO_INCLUDE_WARN__ # endif # ifdef OS_ZETA # include <arpa/inet.h> # endif extern "C" { // because PTX doesn't do this for socket.h # include <sys/socket.h> # include <netinet/in.h> } # endif #ifdef OS_HPUX # if !defined(_XOPEN_SOURCE_EXTENDED) && defined(__ia64) && !defined(_LIBC) # define TYPE_SOCKLEN int # endif # ifndef _INCLUDE_HPUX_SOURCE /* * _INCLUDE_HPUX_SOURCE is needed for getaddrinfo and friends (netdb.h) * unfortunately, this will enable lots of other stuff, * so we'll define it and include netdb.h here and then turn it off * afterwards. */ # define _INCLUDE_HPUX_SOURCE # include <netdb.h> # undef _INCLUDE_HPUX_SOURCE # else // _INCLUDE_HPUX_SOURCE was already defined # include <netdb.h> # endif // end of _INCLUDE_HPUX_SOURCE # else // not HPUX # include <netdb.h> # endif // end of !OS_HPUX # include <unistd.h> # if defined(OS_FREEBSD) || defined(OS_MACHTEN) || defined(OS_LINUX) # include <netinet/tcp.h> # endif # ifdef OS_OS2 # include <utils.h> # endif # ifdef OS_VMS # include <unixio.h> # endif # endif /* OS_NT */ # if defined( AF_UNIX ) && !defined( OS_NT ) # include <sys/time.h> # endif # if defined( OS_AIX43 ) || defined( OS_AIX53 ) # include <strings.h> # endif # if defined(OS_MACHTEN) || \ defined(OS_AIX32) || \ defined(OS_MVS) || \ defined(OS_SUNOS) extern "C" int accept(int, struct sockaddr *, int *); extern "C" int bind(int, const struct sockaddr *, int); extern "C" int connect(int, const struct sockaddr *, int); extern "C" int listen(int, int); extern "C" int socket(int, int, int); extern "C" int getsockname( int, const struct sockaddr *, int * ); extern "C" int getpeername (int, struct sockaddr *, int *); extern "C" int getsockopt( int, int, int, void *, int * ); extern "C" int setsockopt( int, int, int, void *, int ); # endif # if !defined(OS_NT) && !defined(OS_OS2) && \ !defined(OS_NCR) && !defined(OS_NEXT) //extern "C" unsigned long inet_addr(const char *); # endif # if defined(NEED_SOCKET_IO) # if defined(OS_NT) || defined(OS_BEOS) # define close( s ) closesocket( s ) # define read( s, b, l ) recv( s, b, l, 0 ) # define write( s, b, l ) send( s, b, l, 0 ) # ifndef INADDR_LOOPBACK # define INADDR_LOOPBACK 0x7f000001 # endif # endif # endif # if defined(NEED_SOCKET_IO) # ifdef OS_OS2 # define close( s ) soclose( s ) # define read( s, b, l ) recv( s, b, l, 0 ) # define write( s, b, l ) send( s, b, l, 0 ) # endif # endif # ifdef OS_MVS # define htons(x) (x) // yeeuck! # define htonl(x) (x) # define ntohs(x) (x) # endif # ifdef OS_AS400 # define NI_MAXHOST 255 // needed by our call to getnameinfo(), but not // defined in any header files. Value is just a // guess. Should perhaps be larger/smaller? // RFCs 2143, 2553 suggest 1025 # endif // __BITS_SOCKET_H is an attempt to catch > 4.2 linux # ifdef OS_VMS # define TYPE_SOCKLEN unsigned # endif # if defined( OS_LINUX42AXP ) || defined( OS_AIX41 ) || defined( OS_AIX43 ) || \ defined( OS_AIX5IA64 ) # define TYPE_SOCKLEN unsigned long # endif # if defined( OS_UNIXWARE ) || defined( OS_SINIX ) || defined( OS_QNXNTO ) # define TYPE_SOCKLEN size_t # endif # if defined( __BITS_SOCKET_H ) || \ defined( OS_FREEBSD ) || defined( OS_OPENBSD) || \ defined( OS_NETBSD ) || defined( OS_LYNX ) || \ defined( OS_SOLARIS8 ) || defined( OS_SOLARIS10 ) || \ defined( OS_MACOSX104 ) || defined( OS_DARWIN ) || \ defined( OS_AIX53 ) # define TYPE_SOCKLEN socklen_t # endif # ifdef OS_AIX /* * I'm guessing that this is needed for all versions of AIX; * It would be safer to define __ss_family to ss_family for all * except AIX, and use __ss_family in all the source code, * but that's really ugly. */ # define ss_family __ss_family # endif # if defined( OS_LINUX ) && !defined( TYPE_SOCKLEN ) # define TYPE_SOCKLEN unsigned int # endif # if defined (OS_MACOSX) && (__GNUC__ == 4) # define TYPE_SOCKLEN socklen_t # endif # ifndef TYPE_SOCKLEN # define TYPE_SOCKLEN int # endif # define DARWIN_MAX 32*1024