XRootD
XrdPosixLinkage.cc
Go to the documentation of this file.
1 /******************************************************************************/
2 /* */
3 /* X r d P o s i x L i n k a g e . c c */
4 /* */
5 /* (c) 2005 by the Board of Trustees of the Leland Stanford, Jr., University */
6 /* All Rights Reserved */
7 /* Produced by Andrew Hanushevsky for Stanford University under contract */
8 /* DE-AC02-76-SFO0515 with the Department of Energy */
9 /* */
10 /* This file is part of the XRootD software suite. */
11 /* */
12 /* XRootD is free software: you can redistribute it and/or modify it under */
13 /* the terms of the GNU Lesser General Public License as published by the */
14 /* Free Software Foundation, either version 3 of the License, or (at your */
15 /* option) any later version. */
16 /* */
17 /* XRootD is distributed in the hope that it will be useful, but WITHOUT */
18 /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
19 /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
20 /* License for more details. */
21 /* */
22 /* You should have received a copy of the GNU Lesser General Public License */
23 /* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
24 /* COPYING (GPL license). If not, see <http://www.gnu.org/licenses/>. */
25 /* */
26 /* The copyright holder's institutional names and contributor's names may not */
27 /* be used to endorse or promote products derived from this software without */
28 /* specific prior written permission of the institution or contributor. */
29 /******************************************************************************/
30 
31 // Bypass Solaris ELF madness
32 //
33 #ifdef __solaris__
34 #include <sys/isa_defs.h>
35 #if defined(_ILP32) && (_FILE_OFFSET_BITS != 32)
36 #undef _FILE_OFFSET_BITS
37 #define _FILE_OFFSET_BITS 32
38 #undef _LARGEFILE_SOURCE
39 #endif
40 #endif
41 
42 #include <dlfcn.h>
43 #if !defined(__APPLE__) && !defined(__CYGWIN__)
44 #include <link.h>
45 #endif
46 
47 #include <cerrno>
48 
49 #include "XrdSys/XrdSysHeaders.hh"
51 
52 /******************************************************************************/
53 /* G l o b a l D e c l a r a t i o n s */
54 /******************************************************************************/
55 
57 
58 /******************************************************************************/
59 /* M a c r o L o a d e r */
60 /******************************************************************************/
61 
62 #define LOOKUP_UNIX(symb) symb = (Retv_ ## symb (*)(Args_ ## symb)) \
63  dlsym(RTLD_NEXT, Symb_ ## symb); \
64  if (!symb) {symb = Xrd_U_ ## symb; \
65  Missing(Symb_ ## symb);}
66 
67 /******************************************************************************/
68 /* U n r e s o l v e d R e f e r e n c e L i n k a g e */
69 /******************************************************************************/
70 
72  {return (Retv_Access)Xunix.Load_Error("access");}
74  {return (Retv_Acl)Xunix.Load_Error("acl");}
76  {return (Retv_Chdir)Xunix.Load_Error("chdir");}
78  {return (Retv_Close)Xunix.Load_Error("close");}
80  {return (Retv_Closedir)Xunix.Load_Error("closedir");}
82  {return (Retv_Fclose)Xunix.Load_Error("fclose");}
84  {Xunix.Load_Error("fcntl"); return (Retv_Fcntl)0;}
86  {Xunix.Load_Error("fcntl"); return (Retv_Fcntl64)0;}
88  {return (Retv_Fdatasync)Xunix.Load_Error("fdatasync");}
90  {return (Retv_Fflush)Xunix.Load_Error("fflush");}
92  {Xunix.Load_Error("fopen"); return (Retv_Fopen)0;}
94  {Xunix.Load_Error("fopen"); return (Retv_Fopen64)0;}
96  {return (Retv_Fread)Xunix.Load_Error("fread");}
98  {return (Retv_Fseek)Xunix.Load_Error("fseek");}
100  {return (Retv_Fseeko)Xunix.Load_Error("fseeko");}
102  {return (Retv_Fseeko64)Xunix.Load_Error("fseeko64");}
104  {return (Retv_Fstat)Xunix.Load_Error("fstat");}
106  {return (Retv_Fstat64)Xunix.Load_Error("fstat64");}
108  {return (Retv_Fsync)Xunix.Load_Error("fsync");}
110  {return (Retv_Ftell)Xunix.Load_Error("ftell");}
112  {return (Retv_Ftello)Xunix.Load_Error("ftello");}
114  {return (Retv_Ftello64)Xunix.Load_Error("ftello64");}
116  {return (Retv_Ftruncate)Xunix.Load_Error("ftruncate");}
118  {return (Retv_Ftruncate64)Xunix.Load_Error("ftruncate64");}
120  {return (Retv_Fwrite)Xunix.Load_Error("fwrite");}
122  {return (Retv_Fgetxattr)Xunix.Load_Error("fgetxattr");}
124  {return (Retv_Getxattr)Xunix.Load_Error("getxattr");}
126  {return (Retv_Lgetxattr)Xunix.Load_Error("lgetxattr");}
128  {return (Retv_Lseek)Xunix.Load_Error("lseek");}
130  {return (Retv_Lseek64)Xunix.Load_Error("lseek");}
132  {return (Retv_Lstat)Xunix.Load_Error("lstat");}
134  {return (Retv_Lstat64)Xunix.Load_Error("lstat");}
136  {return (Retv_Mkdir)Xunix.Load_Error("mkdir");}
138  {return (Retv_Open)Xunix.Load_Error("open");}
140  {return (Retv_Open64)Xunix.Load_Error("open");}
142  {Xunix.Load_Error("opendir"); return (Retv_Opendir)0;}
144  {return (Retv_Pathconf)Xunix.Load_Error("pathconf");}
146  {return (Retv_Pread)Xunix.Load_Error("pread");}
148  {return (Retv_Pread64)Xunix.Load_Error("pread");}
150  {return (Retv_Pwrite)Xunix.Load_Error("pwrite");}
152  {return (Retv_Pwrite64)Xunix.Load_Error("pwrite");}
154  {return (Retv_Read)Xunix.Load_Error("read");}
156  {return (Retv_Readv)Xunix.Load_Error("readv");}
158  {Xunix.Load_Error("readdir"); return (Retv_Readdir)0;}
160  {Xunix.Load_Error("readdir64");return (Retv_Readdir64)0;}
162  {return (Retv_Readdir_r)Xunix.Load_Error("readdir_r", ELIBACC);}
164  {return (Retv_Readdir64_r)Xunix.Load_Error("readdir64_r", ELIBACC);}
166  {return (Retv_Rename)Xunix.Load_Error("rename");}
168  { Xunix.Load_Error("rewinddir"); abort();}
170  {return (Retv_Rmdir)Xunix.Load_Error("rmdir");}
172  { Xunix.Load_Error("seekdir"); abort();}
174  {return (Retv_Stat)Xunix.Load_Error("stat");}
176  {return (Retv_Stat64)Xunix.Load_Error("stat");}
178  {return (Retv_Statfs)Xunix.Load_Error("statfs");}
180  {return (Retv_Statfs64)Xunix.Load_Error("statfs64");}
182  {return (Retv_Statvfs)Xunix.Load_Error("statvfs");}
184  {return (Retv_Statvfs64)Xunix.Load_Error("statvfs64");}
186  {return (Retv_Telldir)Xunix.Load_Error("telldir");}
188  {return (Retv_Truncate)Xunix.Load_Error("truncate");}
190  {return (Retv_Truncate64)Xunix.Load_Error("truncate64");}
192  {return (Retv_Unlink)Xunix.Load_Error("unlink");}
194  {return (Retv_Write)Xunix.Load_Error("write");}
196  {return (Retv_Writev)Xunix.Load_Error("writev");}
197 
198 /******************************************************************************/
199 /* X r d P o s i x L i n k a g e C o n s t r u c t o r */
200 /******************************************************************************/
201 
202 int XrdPosixLinkage::Resolve()
203 {
268  if (getenv("XRDPOSIX_REPORT")) Missing(0);
269  return 1;
270 }
271 
272 /******************************************************************************/
273 /* X r d P o s i x L i n k a g e : : L o a d _ E r r o r */
274 /******************************************************************************/
275 
276 int XrdPosixLinkage::Load_Error(const char *epname, int retv)
277 {
278  if (*Write != &Xrd_U_Write && *Writev != &Xrd_U_Writev)
279  std::cerr << "PosixPreload: Unable to resolve Unix '" <<epname <<"()'" <<std::endl;
280  errno = ELIBACC;
281  return retv;
282 }
283 
284 /******************************************************************************/
285 /* M i s s i n g */
286 /******************************************************************************/
287 
288 void XrdPosixLinkage::Missing(const char *epname)
289 {
290  struct Missing
291  {struct Missing *Next;
292  const char *What;
293 
294  Missing(Missing *Prev, const char *That)
295  : Next(Prev), What(That) {}
296  ~Missing() {}
297  };
298 
299  static Missing *epList = 0;
300 
301  if (epname) epList = new Missing(epList, epname);
302  else {Missing *np = epList;
303  while(np) std::cerr << "PosixPreload: Unable to resolve Unix '"
304  <<np->What <<"()'" <<std::endl;
305  np = np->Next;
306  }
307 }
Retv_Lstat64 Xrd_U_Lstat64(Args_Lstat64)
Retv_Readdir_r Xrd_U_Readdir_r(Args_Readdir_r)
Retv_Read Xrd_U_Read(Args_Read)
Retv_Fopen64 Xrd_U_Fopen64(Args_Fopen64)
Retv_Readdir64 Xrd_U_Readdir64(Args_Readdir64)
Retv_Fopen Xrd_U_Fopen(Args_Fopen)
Retv_Fread Xrd_U_Fread(Args_Fread)
Retv_Fgetxattr Xrd_U_Fgetxattr(Args_Fgetxattr)
Retv_Statfs Xrd_U_Statfs(Args_Statfs)
Retv_Readdir64_r Xrd_U_Readdir64_r(Args_Readdir64_r)
Retv_Stat64 Xrd_U_Stat64(Args_Stat64)
Retv_Ftello64 Xrd_U_Ftello64(Args_Ftello64)
Retv_Fwrite Xrd_U_Fwrite(Args_Fwrite)
Retv_Ftell Xrd_U_Ftell(Args_Ftell)
Retv_Fclose Xrd_U_Fclose(Args_Fclose)
Retv_Truncate Xrd_U_Truncate(Args_Truncate)
Retv_Readdir Xrd_U_Readdir(Args_Readdir)
Retv_Lseek Xrd_U_Lseek(Args_Lseek)
Retv_Chdir Xrd_U_Chdir(Args_Chdir)
Retv_Rename Xrd_U_Rename(Args_Rename)
Retv_Lstat Xrd_U_Lstat(Args_Lstat)
Retv_Truncate64 Xrd_U_Truncate64(Args_Truncate64)
Retv_Mkdir Xrd_U_Mkdir(Args_Mkdir)
Retv_Statvfs Xrd_U_Statvfs(Args_Statvfs)
Retv_Statfs64 Xrd_U_Statfs64(Args_Statfs64)
Retv_Acl Xrd_U_Acl(Args_Acl)
Retv_Readv Xrd_U_Readv(Args_Readv)
Retv_Fseek Xrd_U_Fseek(Args_Fseek)
Retv_Fdatasync Xrd_U_Fdatasync(Args_Fdatasync)
Retv_Lgetxattr Xrd_U_Lgetxattr(Args_Lgetxattr)
Retv_Ftello Xrd_U_Ftello(Args_Ftello)
Retv_Pread Xrd_U_Pread(Args_Pread)
Retv_Fseeko Xrd_U_Fseeko(Args_Fseeko)
Retv_Pathconf Xrd_U_Pathconf(Args_Pathconf)
Retv_Seekdir Xrd_U_Seekdir(Args_Seekdir)
Retv_Getxattr Xrd_U_Getxattr(Args_Getxattr)
Retv_Fseeko64 Xrd_U_Fseeko64(Args_Fseeko64)
Retv_Fcntl64 Xrd_U_Fcntl64(Args_Fcntl64)
Retv_Ftruncate Xrd_U_Ftruncate(Args_Ftruncate)
Retv_Unlink Xrd_U_Unlink(Args_Unlink)
Retv_Writev Xrd_U_Writev(Args_Writev)
Retv_Fcntl Xrd_U_Fcntl(Args_Fcntl)
Retv_Fstat Xrd_U_Fstat(Args_Fstat)
Retv_Pwrite64 Xrd_U_Pwrite64(Args_Pwrite64)
Retv_Fflush Xrd_U_Fflush(Args_Fflush)
Retv_Rmdir Xrd_U_Rmdir(Args_Rmdir)
Retv_Write Xrd_U_Write(Args_Write)
XrdPosixLinkage Xunix
Retv_Stat Xrd_U_Stat(Args_Stat)
Retv_Closedir Xrd_U_Closedir(Args_Closedir)
Retv_Open64 Xrd_U_Open64(Args_Open64)
Retv_Pwrite Xrd_U_Pwrite(Args_Pwrite)
Retv_Fstat64 Xrd_U_Fstat64(Args_Fstat64)
Retv_Rewinddir Xrd_U_Rewinddir(Args_Rewinddir)
Retv_Opendir Xrd_U_Opendir(Args_Opendir)
Retv_Fsync Xrd_U_Fsync(Args_Fsync)
Retv_Pread64 Xrd_U_Pread64(Args_Pread64)
Retv_Lseek64 Xrd_U_Lseek64(Args_Lseek64)
Retv_Access Xrd_U_Access(Args_Access)
Retv_Ftruncate64 Xrd_U_Ftruncate64(Args_Ftruncate64)
Retv_Statvfs64 Xrd_U_Statvfs64(Args_Statvfs64)
Retv_Open Xrd_U_Open(Args_Open)
Retv_Close Xrd_U_Close(Args_Close)
Retv_Telldir Xrd_U_Telldir(Args_Telldir)
#define LOOKUP_UNIX(symb)
#define Args_Fseeko64
#define Retv_Truncate
#define Args_Readdir64_r
#define Retv_Telldir
#define Args_Fseeko
#define Args_Pread
#define Retv_Pread64
#define Retv_Fwrite
#define Retv_Lstat
#define Args_Lgetxattr
#define Args_Fcntl64
#define Retv_Truncate64
#define Args_Lstat
#define Args_Fopen64
#define Retv_Fseek
#define Retv_Ftello64
#define Args_Seekdir
#define Retv_Fcntl
#define Args_Read
#define Args_Write
#define Args_Writev
#define Args_Readdir64
#define Args_Telldir
#define Retv_Close
#define Retv_Statvfs64
#define Args_Fcntl
#define Retv_Statfs
#define Retv_Fcntl64
#define Args_Truncate
#define Args_Acl
#define Args_Fopen
#define Retv_Unlink
#define Args_Fseek
#define Retv_Readdir64
#define Args_Closedir
#define Args_Stat64
#define Retv_Statvfs
#define Args_Ftello
#define Args_Fgetxattr
#define Retv_Ftello
#define Args_Access
#define Args_Statfs64
#define Retv_Stat
#define Retv_Getxattr
#define Retv_Write
#define Retv_Closedir
#define Args_Statfs
#define Retv_Fstat64
#define Args_Fread
#define Args_Fsync
#define Args_Stat
#define Retv_Access
#define Retv_Lseek64
#define Retv_Fsync
#define Args_Open
#define Retv_Ftruncate
#define Args_Ftruncate
#define Retv_Fstat
#define Retv_Chdir
#define Retv_Fclose
#define Retv_Lstat64
#define Args_Fstat
#define Retv_Fseeko64
#define Args_Fflush
#define Args_Lstat64
#define Retv_Pread
#define Args_Close
#define Retv_Opendir
#define Retv_Lgetxattr
#define Args_Pwrite64
#define Args_Chdir
#define Args_Pathconf
#define Retv_Fopen64
#define Retv_Readdir64_r
#define Args_Readdir_r
#define Args_Fstat64
#define Retv_Ftell
#define Args_Truncate64
#define Retv_Acl
#define Args_Ftruncate64
#define Retv_Pwrite
#define Args_Fdatasync
#define Retv_Pwrite64
#define Args_Fclose
#define Args_Ftell
#define Args_Rmdir
#define Retv_Mkdir
#define Retv_Seekdir
#define Retv_Rewinddir
#define Args_Readdir
#define Args_Rewinddir
#define Args_Getxattr
#define Retv_Fdatasync
#define Retv_Fflush
#define Retv_Readdir
#define Retv_Fread
#define Retv_Open64
#define Retv_Stat64
#define Retv_Ftruncate64
#define Args_Statvfs
#define Retv_Writev
#define Args_Rename
#define Retv_Rename
#define Retv_Fgetxattr
#define Args_Mkdir
#define Args_Pread64
#define Retv_Fseeko
#define Args_Open64
#define Args_Statvfs64
#define Retv_Statfs64
#define Args_Opendir
#define Retv_Pathconf
#define Retv_Read
#define Retv_Readv
#define Args_Readv
#define Args_Pwrite
#define Args_Ftello64
#define Retv_Readdir_r
#define Retv_Fopen
#define Retv_Lseek
#define Retv_Open
#define Args_Unlink
#define Retv_Rmdir
#define Args_Fwrite
#define Args_Lseek64
#define Args_Lseek
Retv_Opendir(* Opendir)(Args_Opendir)
Retv_Mkdir(* Mkdir)(Args_Mkdir)
Retv_Fcntl(* Fcntl)(Args_Fcntl)
Retv_Readdir64(* Readdir64)(Args_Readdir64)
Retv_Fflush(* Fflush)(Args_Fflush)
Retv_Fstat64(* Fstat64)(Args_Fstat64)
Retv_Fclose(* Fclose)(Args_Fclose)
Retv_Fseek(* Fseek)(Args_Fseek)
Retv_Fdatasync(* Fdatasync)(Args_Fdatasync)
Retv_Fwrite(* Fwrite)(Args_Fwrite)
Retv_Acl(* Acl)(Args_Acl)
Retv_Writev(* Writev)(Args_Writev)
Retv_Read(* Read)(Args_Read)
Retv_Stat(* Stat)(Args_Stat)
Retv_Fseeko(* Fseeko)(Args_Fseeko)
Retv_Fsync(* Fsync)(Args_Fsync)
Retv_Rename(* Rename)(Args_Rename)
Retv_Close(* Close)(Args_Close)
Retv_Statfs64(* Statfs64)(Args_Statfs64)
Retv_Statvfs(* Statvfs)(Args_Statvfs)
Retv_Lgetxattr(* Lgetxattr)(Args_Lgetxattr)
Retv_Ftruncate64(* Ftruncate64)(Args_Ftruncate64)
Retv_Lseek(* Lseek)(Args_Lseek)
Retv_Ftello(* Ftello)(Args_Ftello)
Retv_Pread(* Pread)(Args_Pread)
Retv_Rewinddir(* Rewinddir)(Args_Rewinddir)
Retv_Readdir(* Readdir)(Args_Readdir)
Retv_Lseek64(* Lseek64)(Args_Lseek64)
Retv_Statvfs64(* Statvfs64)(Args_Statvfs64)
Retv_Truncate64(* Truncate64)(Args_Truncate64)
Retv_Truncate(* Truncate)(Args_Truncate)
Retv_Ftell(* Ftell)(Args_Ftell)
Retv_Fread(* Fread)(Args_Fread)
Retv_Open64(* Open64)(Args_Open64)
Retv_Fopen64(* Fopen64)(Args_Fopen64)
Retv_Fopen(* Fopen)(Args_Fopen)
Retv_Telldir(* Telldir)(Args_Telldir)
Retv_Fseeko64(* Fseeko64)(Args_Fseeko64)
Retv_Readv(* Readv)(Args_Readv)
Retv_Stat64(* Stat64)(Args_Stat64)
Retv_Statfs(* Statfs)(Args_Statfs)
Retv_Pwrite(* Pwrite)(Args_Pwrite)
Retv_Pread64(* Pread64)(Args_Pread64)
Retv_Readdir64_r(* Readdir64_r)(Args_Readdir64_r)
Retv_Fcntl64(* Fcntl64)(Args_Fcntl64)
Retv_Seekdir(* Seekdir)(Args_Seekdir)
Retv_Lstat64(* Lstat64)(Args_Lstat64)
Retv_Chdir(* Chdir)(Args_Chdir)
Retv_Getxattr(* Getxattr)(Args_Getxattr)
Retv_Open(* Open)(Args_Open)
Retv_Access(* Access)(Args_Access)
Retv_Ftruncate(* Ftruncate)(Args_Ftruncate)
Retv_Closedir(* Closedir)(Args_Closedir)
Retv_Pathconf(* Pathconf)(Args_Pathconf)
Retv_Lstat(* Lstat)(Args_Lstat)
Retv_Write(* Write)(Args_Write)
Retv_Readdir_r(* Readdir_r)(Args_Readdir_r)
Retv_Rmdir(* Rmdir)(Args_Rmdir)
Retv_Fgetxattr(* Fgetxattr)(Args_Fgetxattr)
Retv_Fstat(* Fstat)(Args_Fstat)
Retv_Unlink(* Unlink)(Args_Unlink)
Retv_Pwrite64(* Pwrite64)(Args_Pwrite64)
int Load_Error(const char *epname, int retv=-1)
Retv_Ftello64(* Ftello64)(Args_Ftello64)