00001 #ifndef __XRDPOSIXXROOTD_H__ 00002 #define __XRDPOSIXXROOTD_H__ 00003 /******************************************************************************/ 00004 /* */ 00005 /* X r d P o s i x X r o o t d */ 00006 /* */ 00007 /* (c) 2010 by the Board of Trustees of the Leland Stanford, Jr., University */ 00008 /* All Rights Reserved */ 00009 /* Produced by Andrew Hanushevsky for Stanford University under contract */ 00010 /* DE-AC02-76-SFO0515 with the Department of Energy */ 00011 /* */ 00012 /* This file is part of the XRootD software suite. */ 00013 /* */ 00014 /* XRootD is free software: you can redistribute it and/or modify it under */ 00015 /* the terms of the GNU Lesser General Public License as published by the */ 00016 /* Free Software Foundation, either version 3 of the License, or (at your */ 00017 /* option) any later version. */ 00018 /* */ 00019 /* XRootD is distributed in the hope that it will be useful, but WITHOUT */ 00020 /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ 00021 /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */ 00022 /* License for more details. */ 00023 /* */ 00024 /* You should have received a copy of the GNU Lesser General Public License */ 00025 /* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */ 00026 /* COPYING (GPL license). If not, see <http://www.gnu.org/licenses/>. */ 00027 /* */ 00028 /* The copyright holder's institutional names and contributor's names may not */ 00029 /* be used to endorse or promote products derived from this software without */ 00030 /* specific prior written permission of the institution or contributor. */ 00031 /* Modified by Frank Winklmeier to add the full Posix file system definition. */ 00032 /******************************************************************************/ 00033 00034 #include <dirent.h> 00035 #include <unistd.h> 00036 #include <sys/stat.h> 00037 #include <sys/statvfs.h> 00038 #include <sys/types.h> 00039 00040 #if defined(__APPLE__) || defined(__FreeBSD__) 00041 #include <sys/param.h> 00042 #include <sys/mount.h> 00043 #else 00044 #include <sys/statfs.h> 00045 #endif 00046 00047 #include "XrdPosix/XrdPosixOsDep.hh" 00048 #include "XrdSys/XrdSysPthread.hh" 00049 00050 struct XrdOucIOVec; 00051 00052 class XrdScheduler; 00053 class XrdOucCache; 00054 class XrdOucCache2; 00055 class XrdOucEnv; 00056 class XrdOucName2Name; 00057 class XrdSysLogger; 00058 class XrdPosixCallBack; 00059 class XrdPosixCallBackIO; 00060 class XrdPosixFile; 00061 00062 //----------------------------------------------------------------------------- 00064 //----------------------------------------------------------------------------- 00065 00066 class XrdPosixXrootd 00067 { 00068 public: 00069 00070 //----------------------------------------------------------------------------- 00072 //----------------------------------------------------------------------------- 00073 00074 static int Access(const char *path, int amode); 00075 00076 //----------------------------------------------------------------------------- 00078 //----------------------------------------------------------------------------- 00079 00080 static int Close(int fildes); 00081 00082 //----------------------------------------------------------------------------- 00084 //----------------------------------------------------------------------------- 00085 00086 static int Closedir(DIR *dirp); 00087 00088 //----------------------------------------------------------------------------- 00097 //----------------------------------------------------------------------------- 00098 00099 static int endPoint(int FD, char *Buff, int Blen); 00100 00101 //----------------------------------------------------------------------------- 00103 //----------------------------------------------------------------------------- 00104 00105 static int Fstat(int fildes, struct stat *buf); 00106 00107 //----------------------------------------------------------------------------- 00109 //----------------------------------------------------------------------------- 00110 00111 static int Fsync(int fildes); 00112 00113 static void Fsync(int fildes, XrdPosixCallBackIO *cbp); // Async extension! 00114 00115 //----------------------------------------------------------------------------- 00117 //----------------------------------------------------------------------------- 00118 00119 static int Ftruncate(int fildes, off_t offset); 00120 00121 //----------------------------------------------------------------------------- 00139 00140 static long long Getxattr (const char *path, const char *name, 00141 void *value, unsigned long long size); 00142 00143 //----------------------------------------------------------------------------- 00145 //----------------------------------------------------------------------------- 00146 00147 static off_t Lseek(int fildes, off_t offset, int whence); 00148 00149 //----------------------------------------------------------------------------- 00151 //----------------------------------------------------------------------------- 00152 00153 static int Mkdir(const char *path, mode_t mode); 00154 00155 //----------------------------------------------------------------------------- 00165 //----------------------------------------------------------------------------- 00166 00167 static const int isStream = 0x40000000; // Internal for Open oflag 00168 00169 static int Open(const char *path, int oflag, mode_t mode=0, 00170 XrdPosixCallBack *cbP=0); 00171 00172 //----------------------------------------------------------------------------- 00174 //----------------------------------------------------------------------------- 00175 00176 static DIR* Opendir(const char *path); 00177 00178 //----------------------------------------------------------------------------- 00180 //----------------------------------------------------------------------------- 00181 00182 static ssize_t Pread(int fildes, void *buf, size_t nbyte, off_t offset); 00183 00184 static void Pread(int fildes, void *buf, size_t nbyte, off_t offset, 00185 XrdPosixCallBackIO *cbp); // Async extension! 00186 00187 //----------------------------------------------------------------------------- 00189 //----------------------------------------------------------------------------- 00190 00191 static ssize_t Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset); 00192 00193 static void Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset, 00194 XrdPosixCallBackIO *cbp); // Async extension! 00195 00196 //----------------------------------------------------------------------------- 00207 //----------------------------------------------------------------------------- 00208 00209 static int QueryChksum(const char *path, time_t &mtime, 00210 char *buff, int blen); 00211 00212 //----------------------------------------------------------------------------- 00222 //----------------------------------------------------------------------------- 00223 00224 static long long QueryOpaque(const char *path, char *buff, int blen); 00225 00226 //----------------------------------------------------------------------------- 00228 //----------------------------------------------------------------------------- 00229 00230 static ssize_t Read(int fildes, void *buf, size_t nbyte); 00231 00232 //----------------------------------------------------------------------------- 00234 //----------------------------------------------------------------------------- 00235 00236 static ssize_t Readv(int fildes, const struct iovec *iov, int iovcnt); 00237 00238 //----------------------------------------------------------------------------- 00242 //----------------------------------------------------------------------------- 00243 00244 static struct dirent* Readdir (DIR *dirp); 00245 static struct dirent64* Readdir64(DIR *dirp); 00246 00247 //----------------------------------------------------------------------------- 00251 //----------------------------------------------------------------------------- 00252 00253 static int Readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result); 00254 static int Readdir64_r(DIR *dirp, struct dirent64 *entry, struct dirent64 **result); 00255 00256 //----------------------------------------------------------------------------- 00258 //----------------------------------------------------------------------------- 00259 00260 static int Rename(const char *oldpath, const char *newpath); 00261 00262 //----------------------------------------------------------------------------- 00264 //----------------------------------------------------------------------------- 00265 00266 static void Rewinddir(DIR *dirp); 00267 00268 //----------------------------------------------------------------------------- 00270 //----------------------------------------------------------------------------- 00271 00272 static int Rmdir(const char *path); 00273 00274 //----------------------------------------------------------------------------- 00276 //----------------------------------------------------------------------------- 00277 00278 static void Seekdir(DIR *dirp, long loc); 00279 00280 //----------------------------------------------------------------------------- 00282 //----------------------------------------------------------------------------- 00283 00284 static int Stat(const char *path, struct stat *buf); 00285 00286 //----------------------------------------------------------------------------- 00289 //----------------------------------------------------------------------------- 00290 00291 static int Statfs(const char *path, struct statfs *buf); 00292 00293 //----------------------------------------------------------------------------- 00295 //----------------------------------------------------------------------------- 00296 00297 static int Statvfs(const char *path, struct statvfs *buf); 00298 00299 //----------------------------------------------------------------------------- 00301 //----------------------------------------------------------------------------- 00302 00303 static long Telldir(DIR *dirp); 00304 00305 //----------------------------------------------------------------------------- 00307 //----------------------------------------------------------------------------- 00308 00309 static int Truncate(const char *path, off_t offset); 00310 00311 //----------------------------------------------------------------------------- 00313 //----------------------------------------------------------------------------- 00314 00315 static int Unlink(const char *path); 00316 00317 //----------------------------------------------------------------------------- 00330 //----------------------------------------------------------------------------- 00331 00332 static void VRead(int fildes, const XrdOucIOVec *readV, int n, 00333 XrdPosixCallBackIO *cbp); // Async extension! 00334 00335 static ssize_t VRead(int fildes, const XrdOucIOVec *readV, int n); 00336 00337 //----------------------------------------------------------------------------- 00339 //----------------------------------------------------------------------------- 00340 00341 static ssize_t Write(int fildes, const void *buf, size_t nbyte); 00342 00343 //----------------------------------------------------------------------------- 00345 //----------------------------------------------------------------------------- 00346 00347 static ssize_t Writev(int fildes, const struct iovec *iov, int iovcnt); 00348 00349 //----------------------------------------------------------------------------- 00352 //----------------------------------------------------------------------------- 00353 00354 inline int fdOrigin() {return baseFD;} 00355 00356 static bool isXrootdDir(DIR *dirp); 00357 00358 static bool myFD(int fd); 00359 00360 /* There must be one instance of this object per executable image. Typically, 00361 this object is declared in main() or at file level. This is necessary to 00362 properly do one-time initialization of the static members. When declaring 00363 this object, you can pass the following information: 00364 maxfd - maximum number of simultaneous files and directories to support. 00365 The value returned by getrlimit() over-rides the passed value 00366 unless maxfd is negative. When negative, abs(maxfd) becomes the 00367 absolute maximum and shadow file descriptors are not used. 00368 maxdir - Ignored, only here for backward compatability. 00369 maxthr - Ignored, only here for backward compatability. 00370 */ 00371 XrdPosixXrootd(int maxfd=255, int maxdir=0, int maxthr=0); 00372 ~XrdPosixXrootd(); 00373 00374 // The following methods were always considered private. They are no longer 00375 // used and will be removed on the next major release! They are only here for 00376 // now to keep ABI compatability for the 4.x and prior releases. 00377 // 00378 static void setCache(XrdOucCache *cP); 00379 static void setCache(XrdOucCache2 *cP); 00380 static void setDebug(int val, bool doDebug=false); 00381 static void setEnv(const char *kword, int kval); 00382 static void setIPV4(bool userv4); 00383 static void setLogger(XrdSysLogger *logP); 00384 static void setNumCB(int numcb); 00385 static void setN2N(XrdOucName2Name *pN2N, int opts=0); 00386 static void setSched(XrdScheduler *sP); 00387 00388 private: 00389 00390 static int Fault(XrdPosixFile *fp, int ecode); 00391 static void initStat(struct stat *buf); 00392 static void initXdev(dev_t &st_dev, dev_t &st_rdev); 00393 00394 static int baseFD; 00395 static int initDone; 00396 }; 00397 #endif