00001 /******************************************************************************/ 00002 /* */ 00003 /* X r d P o s i x L i n k a g e . c c */ 00004 /* */ 00005 /* (c) 2005 by the Board of Trustees of the Leland Stanford, Jr., University */ 00006 /* All Rights Reserved */ 00007 /* Produced by Andrew Hanushevsky for Stanford University under contract */ 00008 /* DE-AC02-76-SFO0515 with the Department of Energy */ 00009 /******************************************************************************/ 00010 00011 // $Id: XrdPosixLinkage.cc 35287 2010-09-14 21:19:35Z ganis $ 00012 00013 const char *XrdPosixLinkageCVSID = "$Id: XrdPosixLinkage.cc 35287 2010-09-14 21:19:35Z ganis $"; 00014 00015 // Bypass Solaris ELF madness 00016 // 00017 #ifdef __solaris__ 00018 #include <sys/isa_defs.h> 00019 #if defined(_ILP32) && (_FILE_OFFSET_BITS != 32) 00020 #undef _FILE_OFFSET_BITS 00021 #define _FILE_OFFSET_BITS 32 00022 #undef _LARGEFILE_SOURCE 00023 #endif 00024 #endif 00025 00026 #include <dlfcn.h> 00027 #if !defined(__macos__) && !defined(__CYGWIN__) 00028 #include <link.h> 00029 #endif 00030 00031 #include <errno.h> 00032 00033 #include "XrdSys/XrdSysHeaders.hh" 00034 #include "XrdPosix/XrdPosixLinkage.hh" 00035 00036 /******************************************************************************/ 00037 /* G l o b a l D e c l a r a t i o n s */ 00038 /******************************************************************************/ 00039 00040 XrdPosixLinkage Xunix; 00041 00042 /******************************************************************************/ 00043 /* M a c r o L o a d e r */ 00044 /******************************************************************************/ 00045 00046 #define LOOKUP_UNIX(symb) symb = (Retv_ ## symb (*)(Args_ ## symb)) \ 00047 dlsym(RTLD_NEXT, Symb_ ## symb); \ 00048 if (!symb) {symb = Xrd_U_ ## symb; \ 00049 Missing(Symb_ ## symb);} 00050 00051 /******************************************************************************/ 00052 /* 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 */ 00053 /******************************************************************************/ 00054 00055 Retv_Access Xrd_U_Access(Args_Access) 00056 {return (Retv_Access)Xunix.Load_Error("access");} 00057 Retv_Acl Xrd_U_Acl(Args_Acl) 00058 {return (Retv_Acl)Xunix.Load_Error("acl");} 00059 Retv_Chdir Xrd_U_Chdir(Args_Chdir) 00060 {return (Retv_Chdir)Xunix.Load_Error("chdir");} 00061 Retv_Close Xrd_U_Close(Args_Close) 00062 {return (Retv_Close)Xunix.Load_Error("close");} 00063 Retv_Closedir Xrd_U_Closedir(Args_Closedir) 00064 {return (Retv_Closedir)Xunix.Load_Error("closedir");} 00065 Retv_Fclose Xrd_U_Fclose(Args_Fclose) 00066 {return (Retv_Fclose)Xunix.Load_Error("fclose");} 00067 Retv_Fcntl Xrd_U_Fcntl(Args_Fcntl) 00068 {Xunix.Load_Error("fcntl"); return (Retv_Fcntl)0;} 00069 Retv_Fcntl64 Xrd_U_Fcntl64(Args_Fcntl64) 00070 {Xunix.Load_Error("fcntl"); return (Retv_Fcntl64)0;} 00071 Retv_Fdatasync Xrd_U_Fdatasync(Args_Fdatasync) 00072 {return (Retv_Fdatasync)Xunix.Load_Error("fdatasync");} 00073 Retv_Fflush Xrd_U_Fflush(Args_Fflush) 00074 {return (Retv_Fflush)Xunix.Load_Error("fflush");} 00075 Retv_Fopen Xrd_U_Fopen(Args_Fopen) 00076 {Xunix.Load_Error("fopen"); return (Retv_Fopen)0;} 00077 Retv_Fopen64 Xrd_U_Fopen64(Args_Fopen64) 00078 {Xunix.Load_Error("fopen"); return (Retv_Fopen64)0;} 00079 Retv_Fread Xrd_U_Fread(Args_Fread) 00080 {return (Retv_Fread)Xunix.Load_Error("fread");} 00081 Retv_Fseek Xrd_U_Fseek(Args_Fseek) 00082 {return (Retv_Fseek)Xunix.Load_Error("fseek");} 00083 Retv_Fseeko Xrd_U_Fseeko(Args_Fseeko) 00084 {return (Retv_Fseeko)Xunix.Load_Error("fseeko");} 00085 Retv_Fseeko64 Xrd_U_Fseeko64(Args_Fseeko64) 00086 {return (Retv_Fseeko64)Xunix.Load_Error("fseeko64");} 00087 Retv_Fstat Xrd_U_Fstat(Args_Fstat) 00088 {return (Retv_Fstat)Xunix.Load_Error("fstat");} 00089 Retv_Fstat64 Xrd_U_Fstat64(Args_Fstat64) 00090 {return (Retv_Fstat64)Xunix.Load_Error("fstat64");} 00091 Retv_Fsync Xrd_U_Fsync(Args_Fsync) 00092 {return (Retv_Fsync)Xunix.Load_Error("fsync");} 00093 Retv_Ftell Xrd_U_Ftell(Args_Ftell) 00094 {return (Retv_Ftell)Xunix.Load_Error("ftell");} 00095 Retv_Ftello Xrd_U_Ftello(Args_Ftello) 00096 {return (Retv_Ftello)Xunix.Load_Error("ftello");} 00097 Retv_Ftello64 Xrd_U_Ftello64(Args_Ftello64) 00098 {return (Retv_Ftello64)Xunix.Load_Error("ftello64");} 00099 Retv_Ftruncate Xrd_U_Ftruncate(Args_Ftruncate) 00100 {return (Retv_Ftruncate)Xunix.Load_Error("ftruncate");} 00101 Retv_Ftruncate64 Xrd_U_Ftruncate64(Args_Ftruncate64) 00102 {return (Retv_Ftruncate64)Xunix.Load_Error("ftruncate64");} 00103 Retv_Fwrite Xrd_U_Fwrite(Args_Fwrite) 00104 {return (Retv_Fwrite)Xunix.Load_Error("fwrite");} 00105 Retv_Fgetxattr Xrd_U_Fgetxattr(Args_Fgetxattr) 00106 {return (Retv_Fgetxattr)Xunix.Load_Error("fgetxattr");} 00107 Retv_Getxattr Xrd_U_Getxattr(Args_Getxattr) 00108 {return (Retv_Getxattr)Xunix.Load_Error("getxattr");} 00109 Retv_Lgetxattr Xrd_U_Lgetxattr(Args_Lgetxattr) 00110 {return (Retv_Lgetxattr)Xunix.Load_Error("lgetxattr");} 00111 Retv_Lseek Xrd_U_Lseek(Args_Lseek) 00112 {return (Retv_Lseek)Xunix.Load_Error("lseek");} 00113 Retv_Lseek64 Xrd_U_Lseek64(Args_Lseek64) 00114 {return (Retv_Lseek64)Xunix.Load_Error("lseek");} 00115 Retv_Lstat Xrd_U_Lstat(Args_Lstat) 00116 {return (Retv_Lstat)Xunix.Load_Error("lstat");} 00117 Retv_Lstat64 Xrd_U_Lstat64(Args_Lstat64) 00118 {return (Retv_Lstat64)Xunix.Load_Error("lstat");} 00119 Retv_Mkdir Xrd_U_Mkdir(Args_Mkdir) 00120 {return (Retv_Mkdir)Xunix.Load_Error("mkdir");} 00121 Retv_Open Xrd_U_Open(Args_Open) 00122 {return (Retv_Open)Xunix.Load_Error("open");} 00123 Retv_Open64 Xrd_U_Open64(Args_Open64) 00124 {return (Retv_Open64)Xunix.Load_Error("open");} 00125 Retv_Opendir Xrd_U_Opendir(Args_Opendir) 00126 {Xunix.Load_Error("opendir"); return (Retv_Opendir)0;} 00127 Retv_Pathconf Xrd_U_Pathconf(Args_Pathconf) 00128 {return (Retv_Pathconf)Xunix.Load_Error("pathconf");} 00129 Retv_Pread Xrd_U_Pread(Args_Pread) 00130 {return (Retv_Pread)Xunix.Load_Error("pread");} 00131 Retv_Pread64 Xrd_U_Pread64(Args_Pread64) 00132 {return (Retv_Pread64)Xunix.Load_Error("pread");} 00133 Retv_Pwrite Xrd_U_Pwrite(Args_Pwrite) 00134 {return (Retv_Pwrite)Xunix.Load_Error("pwrite");} 00135 Retv_Pwrite64 Xrd_U_Pwrite64(Args_Pwrite64) 00136 {return (Retv_Pwrite64)Xunix.Load_Error("pwrite");} 00137 Retv_Read Xrd_U_Read(Args_Read) 00138 {return (Retv_Read)Xunix.Load_Error("read");} 00139 Retv_Readv Xrd_U_Readv(Args_Readv) 00140 {return (Retv_Readv)Xunix.Load_Error("readv");} 00141 Retv_Readdir Xrd_U_Readdir(Args_Readdir) 00142 {Xunix.Load_Error("readdir"); return (Retv_Readdir)0;} 00143 Retv_Readdir64 Xrd_U_Readdir64(Args_Readdir64) 00144 {Xunix.Load_Error("readdir64");return (Retv_Readdir64)0;} 00145 Retv_Readdir_r Xrd_U_Readdir_r(Args_Readdir_r) 00146 {return (Retv_Readdir_r)Xunix.Load_Error("readdir_r", ELIBACC);} 00147 Retv_Readdir64_r Xrd_U_Readdir64_r(Args_Readdir64_r) 00148 {return (Retv_Readdir64_r)Xunix.Load_Error("readdir64_r", ELIBACC);} 00149 Retv_Rename Xrd_U_Rename(Args_Rename) 00150 {return (Retv_Rename)Xunix.Load_Error("rename");} 00151 Retv_Rewinddir Xrd_U_Rewinddir(Args_Rewinddir) 00152 { Xunix.Load_Error("rewinddir"); abort();} 00153 Retv_Rmdir Xrd_U_Rmdir(Args_Rmdir) 00154 {return (Retv_Rmdir)Xunix.Load_Error("rmdir");} 00155 Retv_Seekdir Xrd_U_Seekdir(Args_Seekdir) 00156 { Xunix.Load_Error("seekdir"); abort();} 00157 Retv_Stat Xrd_U_Stat(Args_Stat) 00158 {return (Retv_Stat)Xunix.Load_Error("stat");} 00159 Retv_Stat64 Xrd_U_Stat64(Args_Stat64) 00160 {return (Retv_Stat64)Xunix.Load_Error("stat");} 00161 Retv_Statfs Xrd_U_Statfs(Args_Statfs) 00162 {return (Retv_Statfs)Xunix.Load_Error("statfs");} 00163 Retv_Statfs64 Xrd_U_Statfs64(Args_Statfs64) 00164 {return (Retv_Statfs64)Xunix.Load_Error("statfs64");} 00165 Retv_Statvfs Xrd_U_Statvfs(Args_Statvfs) 00166 {return (Retv_Statvfs)Xunix.Load_Error("statvfs");} 00167 Retv_Statvfs64 Xrd_U_Statvfs64(Args_Statvfs64) 00168 {return (Retv_Statvfs64)Xunix.Load_Error("statvfs64");} 00169 Retv_Telldir Xrd_U_Telldir(Args_Telldir) 00170 {return (Retv_Telldir)Xunix.Load_Error("telldir");} 00171 Retv_Truncate Xrd_U_Truncate(Args_Truncate) 00172 {return (Retv_Truncate)Xunix.Load_Error("truncate");} 00173 Retv_Truncate64 Xrd_U_Truncate64(Args_Truncate64) 00174 {return (Retv_Truncate64)Xunix.Load_Error("truncate64");} 00175 Retv_Unlink Xrd_U_Unlink(Args_Unlink) 00176 {return (Retv_Unlink)Xunix.Load_Error("unlink");} 00177 Retv_Write Xrd_U_Write(Args_Write) 00178 {return (Retv_Write)Xunix.Load_Error("write");} 00179 Retv_Writev Xrd_U_Writev(Args_Writev) 00180 {return (Retv_Writev)Xunix.Load_Error("writev");} 00181 00182 /******************************************************************************/ 00183 /* 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 */ 00184 /******************************************************************************/ 00185 00186 int XrdPosixLinkage::Resolve() 00187 { 00188 LOOKUP_UNIX(Access) 00189 LOOKUP_UNIX(Acl) 00190 LOOKUP_UNIX(Chdir) 00191 LOOKUP_UNIX(Close) 00192 LOOKUP_UNIX(Closedir) 00193 LOOKUP_UNIX(Fclose) 00194 LOOKUP_UNIX(Fcntl) 00195 LOOKUP_UNIX(Fcntl64) 00196 LOOKUP_UNIX(Fdatasync) 00197 LOOKUP_UNIX(Fflush) 00198 LOOKUP_UNIX(Fopen) 00199 LOOKUP_UNIX(Fopen64) 00200 LOOKUP_UNIX(Fread) 00201 LOOKUP_UNIX(Fseek) 00202 LOOKUP_UNIX(Fseeko) 00203 LOOKUP_UNIX(Fseeko64) 00204 LOOKUP_UNIX(Fstat) 00205 LOOKUP_UNIX(Fstat64) 00206 LOOKUP_UNIX(Fsync) 00207 LOOKUP_UNIX(Ftell) 00208 LOOKUP_UNIX(Ftello) 00209 LOOKUP_UNIX(Ftello64) 00210 LOOKUP_UNIX(Ftruncate) 00211 LOOKUP_UNIX(Ftruncate64) 00212 LOOKUP_UNIX(Fwrite) 00213 LOOKUP_UNIX(Fgetxattr) 00214 LOOKUP_UNIX(Getxattr) 00215 LOOKUP_UNIX(Lgetxattr) 00216 LOOKUP_UNIX(Lseek) 00217 LOOKUP_UNIX(Lseek64) 00218 LOOKUP_UNIX(Lstat) 00219 LOOKUP_UNIX(Lstat64) 00220 LOOKUP_UNIX(Fsync) 00221 LOOKUP_UNIX(Mkdir) 00222 LOOKUP_UNIX(Open) 00223 LOOKUP_UNIX(Open64) 00224 LOOKUP_UNIX(Opendir) 00225 LOOKUP_UNIX(Pathconf) 00226 LOOKUP_UNIX(Pread) 00227 LOOKUP_UNIX(Pread64) 00228 LOOKUP_UNIX(Pwrite) 00229 LOOKUP_UNIX(Pwrite64) 00230 LOOKUP_UNIX(Read) 00231 LOOKUP_UNIX(Readv) 00232 LOOKUP_UNIX(Readdir) 00233 LOOKUP_UNIX(Readdir64) 00234 LOOKUP_UNIX(Readdir_r) 00235 LOOKUP_UNIX(Readdir64_r) 00236 LOOKUP_UNIX(Rename) 00237 LOOKUP_UNIX(Rewinddir) 00238 LOOKUP_UNIX(Rmdir) 00239 LOOKUP_UNIX(Seekdir) 00240 LOOKUP_UNIX(Stat) 00241 LOOKUP_UNIX(Stat64) 00242 LOOKUP_UNIX(Statfs) 00243 LOOKUP_UNIX(Statfs64) 00244 LOOKUP_UNIX(Statvfs) 00245 LOOKUP_UNIX(Statvfs64) 00246 LOOKUP_UNIX(Telldir) 00247 LOOKUP_UNIX(Truncate) 00248 LOOKUP_UNIX(Truncate64) 00249 LOOKUP_UNIX(Unlink) 00250 LOOKUP_UNIX(Write) 00251 LOOKUP_UNIX(Writev) 00252 if (getenv("XRDPOSIX_REPORT")) Missing(0); 00253 return 1; 00254 } 00255 00256 /******************************************************************************/ 00257 /* X r d P o s i x L i n k a g e : : L o a d _ E r r o r */ 00258 /******************************************************************************/ 00259 00260 int XrdPosixLinkage::Load_Error(const char *epname, int retv) 00261 { 00262 if (*Write != &Xrd_U_Write && *Writev != &Xrd_U_Writev) 00263 cerr << "PosixPreload: Unable to resolve Unix '" <<epname <<"()'" <<endl; 00264 errno = ELIBACC; 00265 return retv; 00266 } 00267 00268 /******************************************************************************/ 00269 /* M i s s i n g */ 00270 /******************************************************************************/ 00271 00272 void XrdPosixLinkage::Missing(const char *epname) 00273 { 00274 struct Missing 00275 {struct Missing *Next; 00276 const char *What; 00277 00278 Missing(Missing *Prev, const char *That) 00279 : Next(Prev), What(That) {} 00280 ~Missing() {} 00281 }; 00282 00283 static Missing *epList = 0; 00284 00285 if (epname) epList = new Missing(epList, epname); 00286 else {Missing *np = epList; 00287 while(np) cerr << "PosixPreload: Unable to resolve Unix '" 00288 <<epname <<"()'" <<endl; 00289 np = np->Next; 00290 } 00291 }