XRootD
Loading...
Searching...
No Matches
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#include <cstdio>
49
52
53/******************************************************************************/
54/* G l o b a l D e c l a r a t i o n s */
55/******************************************************************************/
56
58
59/******************************************************************************/
60/* M a c r o L o a d e r */
61/******************************************************************************/
62
63#define LOOKUP_UNIX(symb) symb = (Retv_ ## symb (*)(Args_ ## symb)) \
64 dlsym(RTLD_NEXT, Symb_ ## symb); \
65 if (!symb) {symb = Xrd_U_ ## symb; \
66 Missing(Symb_ ## symb);}
67
68/******************************************************************************/
69/* 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 */
70/******************************************************************************/
71
74#if !defined(__APPLE__) && !defined(__linux__)
77#endif
132#ifndef __APPLE__
135#endif
198#ifdef HAVE_STATX
200 {return (Retv_Statx)Xunix.Load_Error("statx");}
201#else
202 // For kernels without statx, we fake a normal stat
203 Retv_Statx Xrd_U_Statx(int dirfd, const char *path,
204 int flags, unsigned int mask,
205 XrdSysStatx *stxbuf)
206 {struct stat buf;
207 int rc = stat(path, &buf);
208 if (rc == 0)
209 XrdSysStatxHelpers::Stat2Statx(buf, *stxbuf);
210 return rc;
211 }
212#endif
225
226/******************************************************************************/
227/* 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 */
228/******************************************************************************/
229
230int XrdPosixLinkage::Resolve()
231{
233#if !defined(__APPLE__) && !defined(__linux__)
235#endif
261#ifndef __APPLE__
263#endif
288#ifdef HAVE_STATX
290#else
292#endif
305 if (getenv("XRDPOSIX_REPORT")) Missing(0);
306 return 1;
307}
308
309/******************************************************************************/
310/* X r d P o s i x L i n k a g e : : L o a d _ E r r o r */
311/******************************************************************************/
312
313int XrdPosixLinkage::Load_Error(const char *epname, int retv)
314{
315 if (*Write != &Xrd_U_Write && *Writev != &Xrd_U_Writev)
316 std::cerr << "PosixPreload: Unable to resolve Unix '" <<epname <<"()'" <<std::endl;
317 errno = ELIBACC;
318 return retv;
319}
320
321/******************************************************************************/
322/* M i s s i n g */
323/******************************************************************************/
324
325void XrdPosixLinkage::Missing(const char *epname)
326{
327 struct Missing
328 {struct Missing *Next;
329 const char *What;
330
331 Missing(Missing *Prev, const char *That)
332 : Next(Prev), What(That) {}
333 ~Missing() {}
334 };
335
336 static Missing *epList = 0;
337
338 if (epname) epList = new Missing(epList, epname);
339 else {
340 Missing *np = epList;
341 while(np){
342 fprintf(stderr, "PosixPreload: Unable to resolve Unix '%s()\n", np->What);
343 np = np->Next;
344 }
345 }
346}
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_Openat Xrd_U_Openat(Args_Openat)
Retv_Fstatat Xrd_U_Fstatat(Args_Fstatat)
Retv_Fcntl Xrd_U_Fcntl(Args_Fcntl)
Retv_Fstat Xrd_U_Fstat(Args_Fstat)
Retv_Pwrite64 Xrd_U_Pwrite64(Args_Pwrite64)
Retv_Statx Xrd_U_Statx(int dirfd, const char *path, int flags, unsigned int mask, XrdSysStatx *stxbuf)
Retv_Fflush Xrd_U_Fflush(Args_Fflush)
Retv_Rmdir Xrd_U_Rmdir(Args_Rmdir)
Retv_Write Xrd_U_Write(Args_Write)
Retv_Stat Xrd_U_Stat(Args_Stat)
Retv_Closedir Xrd_U_Closedir(Args_Closedir)
Retv_Open64 Xrd_U_Open64(Args_Open64)
Retv_Fstatat64 Xrd_U_Fstatat64(Args_Fstatat64)
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_Openat64 Xrd_U_Openat64(Args_Openat64)
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_Openat
#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 Args_Fstatat
#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 Args_Openat64
#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_Statx
#define Retv_Fclose
#define Retv_Lstat64
#define Args_Fstat
#define Args_Openat
#define Retv_Fseeko64
#define Args_Fflush
#define Args_Lstat64
#define Retv_Pread
#define Args_Close
#define Retv_Opendir
#define Retv_Fstatat
#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_Fstatat64
#define Args_Fstat64
#define Retv_Ftell
#define Args_Truncate64
#define Args_Statx
#define Retv_Acl
#define Args_Ftruncate64
#define Retv_Pwrite
#define Retv_Fstatat64
#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
#define Retv_Openat64
XrdPosixLinkage Xunix
#define stat(a, b)
Definition XrdPosix.hh:105
#define dirfd(x)
Retv_Write(*) Write(Args_Write)
Retv_Close(*) Close(Args_Close)
Retv_Statfs64(*) Statfs64(Args_Statfs64)
Retv_Readv(*) Readv(Args_Readv)
Retv_Read(*) Read(Args_Read)
Retv_Getxattr(*) Getxattr(Args_Getxattr)
Retv_Lseek(*) Lseek(Args_Lseek)
Retv_Fclose(*) Fclose(Args_Fclose)
Retv_Writev(*) Writev(Args_Writev)
Retv_Rmdir(*) Rmdir(Args_Rmdir)
Retv_Unlink(*) Unlink(Args_Unlink)
Retv_Readdir(*) Readdir(Args_Readdir)
Retv_Ftell(*) Ftell(Args_Ftell)
Retv_Fseeko64(*) Fseeko64(Args_Fseeko64)
Retv_Seekdir(*) Seekdir(Args_Seekdir)
Retv_Telldir(*) Telldir(Args_Telldir)
Retv_Lstat(*) Lstat(Args_Lstat)
Retv_Truncate64(*) Truncate64(Args_Truncate64)
Retv_Lseek64(*) Lseek64(Args_Lseek64)
Retv_Statfs(*) Statfs(Args_Statfs)
Retv_Truncate(*) Truncate(Args_Truncate)
Retv_Pathconf(*) Pathconf(Args_Pathconf)
Retv_Rename(*) Rename(Args_Rename)
Retv_Fstat64(*) Fstat64(Args_Fstat64)
Retv_Open64(*) Open64(Args_Open64)
Retv_Fcntl(*) Fcntl(Args_Fcntl)
Retv_Mkdir(*) Mkdir(Args_Mkdir)
Retv_Opendir(*) Opendir(Args_Opendir)
Retv_Ftruncate64(*) Ftruncate64(Args_Ftruncate64)
Retv_Ftello(*) Ftello(Args_Ftello)
Retv_Fseek(*) Fseek(Args_Fseek)
Retv_Readdir_r(*) Readdir_r(Args_Readdir_r)
Retv_Fstat(*) Fstat(Args_Fstat)
Retv_Fgetxattr(*) Fgetxattr(Args_Fgetxattr)
Retv_Lgetxattr(*) Lgetxattr(Args_Lgetxattr)
Retv_Ftello64(*) Ftello64(Args_Ftello64)
Retv_Lstat64(*) Lstat64(Args_Lstat64)
Retv_Fcntl64(*) Fcntl64(Args_Fcntl64)
Retv_Fdatasync(*) Fdatasync(Args_Fdatasync)
Retv_Pwrite64(*) Pwrite64(Args_Pwrite64)
Retv_Fopen64(*) Fopen64(Args_Fopen64)
Retv_Pread64(*) Pread64(Args_Pread64)
Retv_Pread(*) Pread(Args_Pread)
Retv_Readdir64(*) Readdir64(Args_Readdir64)
Retv_Ftruncate(*) Ftruncate(Args_Ftruncate)
Retv_Pwrite(*) Pwrite(Args_Pwrite)
Retv_Fseeko(*) Fseeko(Args_Fseeko)
Retv_Statx(*) Statx(Args_Statx)
Retv_Closedir(*) Closedir(Args_Closedir)
Retv_Fwrite(*) Fwrite(Args_Fwrite)
Retv_Open(*) Open(Args_Open)
Retv_Readdir64_r(*) Readdir64_r(Args_Readdir64_r)
Retv_Statvfs64(*) Statvfs64(Args_Statvfs64)
Retv_Stat(*) Stat(Args_Stat)
Retv_Fread(*) Fread(Args_Fread)
Retv_Fflush(*) Fflush(Args_Fflush)
Retv_Fopen(*) Fopen(Args_Fopen)
Retv_Rewinddir(*) Rewinddir(Args_Rewinddir)
Retv_Chdir(*) Chdir(Args_Chdir)
Retv_Fsync(*) Fsync(Args_Fsync)
Retv_Acl(*) Acl(Args_Acl)
Retv_Access(*) Access(Args_Access)
Retv_Stat64(*) Stat64(Args_Stat64)
Retv_Statvfs(*) Statvfs(Args_Statvfs)
int Load_Error(const char *epname, int retv=-1)