#ifndef _XRDPOSIXLINKAGE_H_ #define _XRDPOSIXLINKAGE_H_ /******************************************************************************/ /* */ /* X r d P o s i x L i n k a g e . h h */ /* */ /* (c) 2005 by the Board of Trustees of the Leland Stanford, Jr., University */ /* All Rights Reserved */ /* 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 #include #include #include #include #include #include #include #include "XrdPosix/XrdPosixOsDep.hh" #include "XrdSys/XrdSysPlatform.hh" /******************************************************************************/ /* Posix Symbols vs Return Valus and Arguments */ /******************************************************************************/ //#ifdef __linux__ //#define UNIX_PFX "__" //#else #define UNIX_PFX //#endif #define Symb_Access UNIX_PFX "access" #define Retv_Access int #define Args_Access const char *path, int amode #define Symb_Acl UNIX_PFX "acl" #define Retv_Acl int #define Args_Acl const char *, int, int, void * #define Symb_Chdir UNIX_PFX "chdir" #define Retv_Chdir int #define Args_Chdir const char *path #define Symb_Close UNIX_PFX "close" #define Retv_Close int #define Args_Close int #define Symb_Closedir UNIX_PFX "closedir" #define Retv_Closedir int #define Args_Closedir DIR * #define Symb_Fclose UNIX_PFX "fclose" #define Retv_Fclose int #define Args_Fclose FILE * #define Symb_Fcntl UNIX_PFX "fcntl" #define Retv_Fcntl int #define Args_Fcntl int, int, ... #define Symb_Fcntl64 UNIX_PFX "fcntl64" #define Retv_Fcntl64 int #define Args_Fcntl64 int, int, ... #define Symb_Fdatasync UNIX_PFX "fdatasync" #define Retv_Fdatasync int #define Args_Fdatasync int #define Symb_Fflush UNIX_PFX "fflush" #define Retv_Fflush int #define Args_Fflush FILE * #define Symb_Fopen UNIX_PFX "fopen" #define Retv_Fopen FILE * #define Args_Fopen const char *, const char * #define Symb_Fopen64 UNIX_PFX "fopen64" #define Retv_Fopen64 FILE * #define Args_Fopen64 const char *, const char * #define Symb_Fread UNIX_PFX "fread" #define Retv_Fread size_t #define Args_Fread void *, size_t, size_t, FILE * #define Symb_Fseek UNIX_PFX "fseek" #define Retv_Fseek int #define Args_Fseek FILE *, long, int #define Symb_Fseeko UNIX_PFX "fseeko" #define Retv_Fseeko int #define Args_Fseeko FILE *, off_t, int #define Symb_Fseeko64 UNIX_PFX "fseeko64" #define Retv_Fseeko64 int #define Args_Fseeko64 FILE *, off64_t, int #ifdef __linux__ #define Symb_Fstat UNIX_PFX "__fxstat" #define Retv_Fstat int #define Args_Fstat int, int, struct stat * #else #define Symb_Fstat UNIX_PFX "fstat" #define Retv_Fstat int #define Args_Fstat int, struct stat * #endif #ifdef __linux__ #define Symb_Fstat64 UNIX_PFX "__fxstat64" #define Retv_Fstat64 int #define Args_Fstat64 int, int, struct stat64 * #else #define Symb_Fstat64 UNIX_PFX "fstat64" #define Retv_Fstat64 int #define Args_Fstat64 int, struct stat64 * #endif #define Symb_Fsync UNIX_PFX "fsync" #define Retv_Fsync int #define Args_Fsync int #define Symb_Ftell UNIX_PFX "ftell" #define Retv_Ftell long #define Args_Ftell FILE * #define Symb_Ftello UNIX_PFX "ftello" #define Retv_Ftello off_t #define Args_Ftello FILE * #define Symb_Ftello64 UNIX_PFX "ftello64" #define Retv_Ftello64 off64_t #define Args_Ftello64 FILE * #define Symb_Ftruncate UNIX_PFX "ftruncate" #define Retv_Ftruncate int #define Args_Ftruncate int, off_t #define Symb_Ftruncate64 UNIX_PFX "ftruncate64" #define Retv_Ftruncate64 int #define Args_Ftruncate64 int, off64_t #define Symb_Fwrite UNIX_PFX "fwrite" #define Retv_Fwrite int #define Args_Fwrite const void *, size_t, size_t, FILE * #define Symb_Fgetxattr UNIX_PFX "fgetxattr" #define Retv_Fgetxattr ssize_t #define Args_Fgetxattr int, const char *, const void *, size_t #define Symb_Getxattr UNIX_PFX "getxattr" #define Retv_Getxattr ssize_t #define Args_Getxattr const char *, const char *, const void *, size_t #define Symb_Lgetxattr UNIX_PFX "lgetxattr" #define Retv_Lgetxattr ssize_t #define Args_Lgetxattr const char *, const char *, const void *, size_t #define Symb_Lseek UNIX_PFX "lseek" #define Retv_Lseek off_t #define Args_Lseek int, off_t, int #define Symb_Lseek64 UNIX_PFX "lseek64" #define Retv_Lseek64 off64_t #define Args_Lseek64 int, off64_t, int #ifdef __linux__ #define Symb_Lstat UNIX_PFX "__lxstat" #define Retv_Lstat int #define Args_Lstat int, const char *, struct stat * #else #define Symb_Lstat UNIX_PFX "lstat" #define Retv_Lstat int #define Args_Lstat const char *, struct stat * #endif #ifdef __linux__ #define Symb_Lstat64 UNIX_PFX "__lxstat64" #define Retv_Lstat64 int #define Args_Lstat64 int, const char *, struct stat64 * #else #define Symb_Lstat64 UNIX_PFX "lstat64" #define Retv_Lstat64 int #define Args_Lstat64 const char *, struct stat64 * #endif #define Symb_Mkdir UNIX_PFX "mkdir" #define Retv_Mkdir int #define Args_Mkdir const char *, mode_t #define Symb_Open UNIX_PFX "open" #define Retv_Open int #define Args_Open const char *, int, ... #define Symb_Open64 UNIX_PFX "open64" #define Retv_Open64 int #define Args_Open64 const char *, int, ... #define Symb_Opendir UNIX_PFX "opendir" #define Retv_Opendir DIR * #define Args_Opendir const char * #define Symb_Pathconf UNIX_PFX "pathconf" #define Retv_Pathconf long #define Args_Pathconf const char *, int #define Symb_Pread UNIX_PFX "pread" #define Retv_Pread ssize_t #define Args_Pread int, void *, size_t, off_t #define Symb_Pread64 UNIX_PFX "pread64" #define Retv_Pread64 ssize_t #define Args_Pread64 int, void *, size_t, off64_t #define Symb_Pwrite UNIX_PFX "pwrite" #define Retv_Pwrite ssize_t #define Args_Pwrite int, const void *, size_t, off_t #define Symb_Pwrite64 UNIX_PFX "pwrite64" #define Retv_Pwrite64 ssize_t #define Args_Pwrite64 int, const void *, size_t, off64_t #define Symb_Read UNIX_PFX "read" #define Retv_Read ssize_t #define Args_Read int, void *, size_t #define Symb_Readv UNIX_PFX "readv" #define Retv_Readv ssize_t #define Args_Readv int, const struct iovec *, int #define Symb_Readdir UNIX_PFX "readdir" #define Retv_Readdir struct dirent * #define Args_Readdir DIR * #define Symb_Readdir64 UNIX_PFX "readdir64" #define Retv_Readdir64 struct dirent64 * #define Args_Readdir64 DIR * #define Symb_Readdir_r UNIX_PFX "readdir_r" #define Retv_Readdir_r int #define Args_Readdir_r DIR *, struct dirent *, struct dirent ** #define Symb_Readdir64_r UNIX_PFX "readdir64_r" #define Retv_Readdir64_r int #define Args_Readdir64_r DIR *, struct dirent64 *, struct dirent64 ** #define Symb_Rename UNIX_PFX "rename" #define Retv_Rename int #define Args_Rename const char *, const char * #define Symb_Rewinddir UNIX_PFX "rewinddir" #define Retv_Rewinddir void #define Args_Rewinddir DIR * #define Symb_Rmdir UNIX_PFX "rmdir" #define Retv_Rmdir int #define Args_Rmdir const char * #define Symb_Seekdir UNIX_PFX "seekdir" #define Retv_Seekdir void #define Args_Seekdir DIR *, long #ifdef __linux__ #define Symb_Stat UNIX_PFX "__xstat" #define Retv_Stat int #define Args_Stat int, const char *, struct stat * #else #define Symb_Stat UNIX_PFX "stat" #define Retv_Stat int #define Args_Stat const char *, struct stat * #endif #ifdef __linux__ #define Symb_Stat64 UNIX_PFX "__xstat64" #define Retv_Stat64 int #define Args_Stat64 int, const char *, struct stat64 * #else #define Symb_Stat64 UNIX_PFX "stat64" #define Retv_Stat64 int #define Args_Stat64 const char *, struct stat64 * #endif #define Symb_Statfs UNIX_PFX "statfs" #define Retv_Statfs int #define Args_Statfs const char *, struct statfs * #define Symb_Statfs64 UNIX_PFX "statfs64" #define Retv_Statfs64 int #define Args_Statfs64 const char *, struct statfs64 * #define Symb_Statvfs UNIX_PFX "statvfs" #define Retv_Statvfs int #define Args_Statvfs const char *, struct statvfs * #define Symb_Statvfs64 UNIX_PFX "statvfs64" #define Retv_Statvfs64 int #define Args_Statvfs64 const char *, struct statvfs64 * #define Symb_Telldir UNIX_PFX "telldir" #define Retv_Telldir long #define Args_Telldir DIR * #define Symb_Truncate UNIX_PFX "truncate" #define Retv_Truncate int #define Args_Truncate const char *, off_t #define Symb_Truncate64 UNIX_PFX "truncate64" #define Retv_Truncate64 int #define Args_Truncate64 const char *, off64_t #define Symb_Unlink UNIX_PFX "unlink" #define Retv_Unlink int #define Args_Unlink const char * #define Symb_Write UNIX_PFX "write" #define Retv_Write ssize_t #define Args_Write int, const void *, size_t #define Symb_Writev UNIX_PFX "writev" #define Retv_Writev ssize_t #define Args_Writev int, const struct iovec *, int /******************************************************************************/ /* C a l l O u t V e c t o r D e f i n i t i o n */ /******************************************************************************/ class XrdPosixLinkage {public: int Init(int *X=0) {if (!Done) Done = Resolve(); return 0;} Retv_Access (*Access)(Args_Access); Retv_Acl (*Acl)(Args_Acl); Retv_Chdir (*Chdir)(Args_Chdir); Retv_Close (*Close)(Args_Close); Retv_Closedir (*Closedir)(Args_Closedir); Retv_Fclose (*Fclose)(Args_Fclose); Retv_Fcntl (*Fcntl)(Args_Fcntl); Retv_Fcntl64 (*Fcntl64)(Args_Fcntl64); Retv_Fdatasync (*Fdatasync)(Args_Fdatasync); Retv_Fflush (*Fflush)(Args_Fflush); Retv_Fopen (*Fopen)(Args_Fopen); Retv_Fopen64 (*Fopen64)(Args_Fopen64); Retv_Fread (*Fread)(Args_Fread); Retv_Fseek (*Fseek)(Args_Fseek); Retv_Fseeko (*Fseeko)(Args_Fseeko); Retv_Fseeko64 (*Fseeko64)(Args_Fseeko64); Retv_Fstat (*Fstat)(Args_Fstat); Retv_Fstat64 (*Fstat64)(Args_Fstat64); Retv_Fsync (*Fsync)(Args_Fsync); Retv_Ftell (*Ftell)(Args_Ftell); Retv_Ftello (*Ftello)(Args_Ftello); Retv_Ftello64 (*Ftello64)(Args_Ftello64); Retv_Ftruncate (*Ftruncate)(Args_Ftruncate); Retv_Ftruncate64 (*Ftruncate64)(Args_Ftruncate64); Retv_Fwrite (*Fwrite)(Args_Fwrite); Retv_Fgetxattr (*Fgetxattr)(Args_Fgetxattr); Retv_Lgetxattr (*Lgetxattr)(Args_Lgetxattr); Retv_Getxattr (*Getxattr)(Args_Getxattr); Retv_Lseek (*Lseek)(Args_Lseek); Retv_Lseek64 (*Lseek64)(Args_Lseek64); Retv_Lstat (*Lstat)(Args_Lstat); Retv_Lstat64 (*Lstat64)(Args_Lstat64); Retv_Mkdir (*Mkdir)(Args_Mkdir); Retv_Open (*Open)(Args_Open); Retv_Open64 (*Open64)(Args_Open64); Retv_Opendir (*Opendir)(Args_Opendir); Retv_Pathconf (*Pathconf)(Args_Pathconf); Retv_Pread (*Pread)(Args_Pread); Retv_Pread64 (*Pread64)(Args_Pread64); Retv_Pwrite (*Pwrite)(Args_Pwrite); Retv_Pwrite64 (*Pwrite64)(Args_Pwrite64); Retv_Read (*Read)(Args_Read); Retv_Readv (*Readv)(Args_Readv); Retv_Readdir (*Readdir)(Args_Readdir); Retv_Readdir64 (*Readdir64)(Args_Readdir64); Retv_Readdir_r (*Readdir_r)(Args_Readdir_r); Retv_Readdir64_r (*Readdir64_r)(Args_Readdir64_r); Retv_Rename (*Rename)(Args_Rename); Retv_Rewinddir (*Rewinddir)(Args_Rewinddir); Retv_Rmdir (*Rmdir)(Args_Rmdir); Retv_Seekdir (*Seekdir)(Args_Seekdir); Retv_Stat (*Stat)(Args_Stat); Retv_Stat64 (*Stat64)(Args_Stat64); Retv_Statfs (*Statfs)(Args_Statfs); Retv_Statfs64 (*Statfs64)(Args_Statfs64); Retv_Statvfs (*Statvfs)(Args_Statvfs); Retv_Statvfs64 (*Statvfs64)(Args_Statvfs64); Retv_Telldir (*Telldir)(Args_Telldir); Retv_Truncate (*Truncate)(Args_Truncate); Retv_Truncate64 (*Truncate64)(Args_Truncate64); Retv_Unlink (*Unlink)(Args_Unlink); Retv_Write (*Write)(Args_Write); Retv_Writev (*Writev)(Args_Writev); int Load_Error(const char *epname, int retv=-1); XrdPosixLinkage() : Done(0) {Init();} ~XrdPosixLinkage() {} private: int Done; void Missing(const char *); int Resolve(); }; // Warning! This class is meant to be defined as a static object. #endif