XrdPosixLinkage.cc

Go to the documentation of this file.
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 }

Generated on Tue Jul 5 14:46:57 2011 for ROOT_528-00b_version by  doxygen 1.5.1