#ifndef __XRDSYS_PLATFORM_H__ #define __XRDSYS_PLATFORM_H__ /******************************************************************************/ /* */ /* X r d S y s P l a t f o r m . h h */ /* */ /* (c) 2004 by the Board of Trustees of the Leland Stanford, Jr., University */ /* Produced by Andrew Hanushevsky for Stanford University under contract */ /* DE-AC02-76-SFO0515 with the Department of Energy */ /* */ /* This file is part of the XRootD software suite. */ /* */ /* XRootD 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 3 of the License, or (at your */ /* option) any later version. */ /* */ /* XRootD 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 XRootD in a file called COPYING.LESSER (LGPL license) and file */ /* COPYING (GPL license). If not, see . */ /* */ /* The copyright holder's institutional names and contributor's names may not */ /* be used to endorse or promote products derived from this software without */ /* specific prior written permission of the institution or contributor. */ /******************************************************************************/ // Include stdlib so that ENDIAN macros are defined properly // #include #include #ifdef __linux__ #include #include #include #include #include #define MAXNAMELEN NAME_MAX #endif #ifdef __APPLE__ #include #include #include #include #define fdatasync(x) fsync(x) #define MAXNAMELEN NAME_MAX #ifndef dirent64 # define dirent64 dirent #endif #ifndef off64_t #define off64_t int64_t #endif #if (!defined(MAC_OS_X_VERSION_10_5) || \ MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5) #ifndef stat64 # define stat64 stat #endif #endif #endif #if defined(__FreeBSD__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__)) #include #include #if defined(__FreeBSD__) #include #else #include #endif #define MAXNAMELEN NAME_MAX #endif #ifdef __GNU__ #include #include #include // These are undefined on purpose in GNU/Hurd. // The values below are the ones used in Linux. // The proper fix is to rewrite the code to not use hardcoded values, // but instead allocate memory dynamically at runtime when sizes are known. // This is true also for systems where these constants are defined. #define MAXNAMELEN 255 #define MAXPATHLEN 4096 #define MAXHOSTNAMELEN 64 #endif #ifdef WIN32 #define MAXNAMELEN 256 #define MAXPATHLEN 1024 #endif // The following provides historical support for Solaris 5.10.x // #if defined(__solaris__) && defined(__SunOS_5_10) #define posix_memalign(memp, algn, sz) \ ((*memp = memalign(algn, sz)) ? 0 : ENOMEM) #define __USE_LEGACY_PROTOTYPES__ 1 #endif #if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__GNU__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__)) #define S_IAMB 0x1FF /* access mode bits */ #define STATFS statfs #define STATFS_BUFF struct statfs #define FS_BLKFACT 4 #define FLOCK_t struct flock typedef off_t offset_t; #define GTZ_NULL (struct timezone *)0 #else #define STATFS statvfs #define STATFS_BUFF struct statvfs #define FS_BLKFACT 1 #define SHMDT_t char * #define FLOCK_t flock_t #define GTZ_NULL (void *)0 #endif #ifdef __linux__ #define SHMDT_t const void * #endif // For alternative platforms // #ifdef __APPLE__ #ifndef POLLRDNORM #define POLLRDNORM 0 #endif #ifndef POLLRDBAND #define POLLRDBAND 0 #endif #ifndef POLLWRNORM #define POLLWRNORM 0 #endif #define O_LARGEFILE 0 #define SHMDT_t void * #ifndef EDEADLOCK #define EDEADLOCK EDEADLK #endif #endif #ifdef __FreeBSD__ #define O_LARGEFILE 0 typedef off_t off64_t; #endif #if defined(__APPLE__) #define bswap_16 OSSwapInt16 #define bswap_32 OSSwapInt32 #define bswap_64 OSSwapInt64 #endif #if defined(__FreeBSD__) #define bswap_16 bswap16 #define bswap_32 bswap32 #define bswap_64 bswap64 #endif static inline uint16_t bswap(uint16_t x) { return bswap_16(x); } static inline uint32_t bswap(uint32_t x) { return bswap_32(x); } static inline uint64_t bswap(uint64_t x) { return bswap_64(x); } // Only sparc platforms have structure alignment problems w/ optimization // so the h2xxx() variants are used when converting network streams. #if defined(_BIG_ENDIAN) || defined(__BIG_ENDIAN__) || \ defined(__IEEE_BIG_ENDIAN) || \ (defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN) #define Xrd_Big_Endian #ifndef htonll #define htonll(_x_) _x_ #endif #ifndef h2nll #define h2nll(_x_, _y_) memcpy((void *)&_y_,(const void *)&_x_,sizeof(long long)) #endif #ifndef ntohll #define ntohll(_x_) _x_ #endif #ifndef n2hll #define n2hll(_x_, _y_) memcpy((void *)&_y_,(const void *)&_x_,sizeof(long long)) #endif #elif defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__) || \ defined(__IEEE_LITTLE_ENDIAN) || \ (defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN) #if !defined(__GNUC__) || defined(__APPLE__) #if !defined(__sun) || (defined(__sun) && (!defined(_LP64) || defined(__SunOS_5_10))) extern "C" unsigned long long Swap_n2hll(unsigned long long x); #ifndef htonll #define htonll(_x_) Swap_n2hll(_x_) #endif #ifndef ntohll #define ntohll(_x_) Swap_n2hll(_x_) #endif #endif #else #ifndef htonll #define htonll(_x_) __bswap_64(_x_) #endif #ifndef ntohll #define ntohll(_x_) __bswap_64(_x_) #endif #endif #ifndef h2nll #define h2nll(_x_, _y_) memcpy((void *)&_y_,(const void *)&_x_,sizeof(long long));\ _y_ = htonll(_y_) #endif #ifndef n2hll #define n2hll(_x_, _y_) memcpy((void *)&_y_,(const void *)&_x_,sizeof(long long));\ _y_ = ntohll(_y_) #endif #else #ifndef WIN32 #error Unable to determine target architecture endianness! #endif #endif #ifndef HAVE_STRLCPY extern "C" {extern size_t strlcpy(char *dst, const char *src, size_t size);} #endif // // To make socklen_t portable use SOCKLEN_t // #if defined(__solaris__) && !defined(__linux__) # if __GNUC__ >= 3 || __GNUC_MINOR__ >= 90 # define XR__SUNGCC3 # endif #endif #if defined(__linux__) # include # if __GNU_LIBRARY__ == 6 # ifndef XR__GLIBC # define XR__GLIBC # endif # endif #endif #if defined(__GNU__) # define XR__GLIBC #endif #if defined(_AIX) || \ (defined(XR__SUNGCC3) && !defined(__arch64__)) # define SOCKLEN_t size_t #elif !defined(SOCKLEN_t) # define SOCKLEN_t socklen_t #endif #ifdef _LP64 #define PTR2INT(x) static_cast((long long)x) #else #define PTR2INT(x) int(x) #endif #ifdef WIN32 #include "XrdSys/XrdWin32.hh" #define Netdata_t void * #define Sokdata_t char * #define IOV_INIT(data,dlen) dlen,data #define MAKEDIR(path,mode) mkdir(path) #define CHMOD(path, mode) {} #define net_errno WSAGetLastError() #else #define O_BINARY 0 #define Netdata_t char * #define Sokdata_t void * #define IOV_INIT(data,dlen) data,dlen #define MAKEDIR(path,mode) mkdir(path,mode) #define CHMOD(path, mode) chmod(path,mode) #define net_errno errno #endif // The following gets arround a relative new gcc compiler bug // #define XRDABS(x) (x < 0 ? -x : x) #ifndef LT_MODULE_EXT #define LT_MODULE_EXT ".so" #endif namespace XrdSys { //-------------------------------------------------------------------------- //! @return : maximum size of I/O vector //-------------------------------------------------------------------------- int getIovMax(); } #endif // __XRDSYS_PLATFORM_H__