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 XrdOucEnv; 00055 class XrdPosixCallBack; 00056 class XrdPosixFile; 00057 00058 //----------------------------------------------------------------------------- 00060 //----------------------------------------------------------------------------- 00061 00062 class XrdPosixXrootd 00063 { 00064 public: 00065 00066 //----------------------------------------------------------------------------- 00068 //----------------------------------------------------------------------------- 00069 00070 static int Access(const char *path, int amode); 00071 00072 //----------------------------------------------------------------------------- 00074 //----------------------------------------------------------------------------- 00075 00076 static int Close(int fildes); 00077 00078 //----------------------------------------------------------------------------- 00080 //----------------------------------------------------------------------------- 00081 00082 static int Closedir(DIR *dirp); 00083 00084 //----------------------------------------------------------------------------- 00093 //----------------------------------------------------------------------------- 00094 00095 static int endPoint(int FD, char *Buff, int Blen); 00096 00097 //----------------------------------------------------------------------------- 00099 //----------------------------------------------------------------------------- 00100 00101 static int Fstat(int fildes, struct stat *buf); 00102 00103 //----------------------------------------------------------------------------- 00105 //----------------------------------------------------------------------------- 00106 00107 static int Fsync(int fildes); 00108 00109 //----------------------------------------------------------------------------- 00111 //----------------------------------------------------------------------------- 00112 00113 static int Ftruncate(int fildes, off_t offset); 00114 00115 //----------------------------------------------------------------------------- 00133 00134 static long long Getxattr (const char *path, const char *name, 00135 void *value, unsigned long long size); 00136 00137 //----------------------------------------------------------------------------- 00139 //----------------------------------------------------------------------------- 00140 00141 static off_t Lseek(int fildes, off_t offset, int whence); 00142 00143 //----------------------------------------------------------------------------- 00145 //----------------------------------------------------------------------------- 00146 00147 static int Mkdir(const char *path, mode_t mode); 00148 00149 //----------------------------------------------------------------------------- 00159 //----------------------------------------------------------------------------- 00160 00161 static const int isStream = 0x40000000; // Internal for Open oflag 00162 00163 static int Open(const char *path, int oflag, mode_t mode=0, 00164 XrdPosixCallBack *cbP=0); 00165 00166 //----------------------------------------------------------------------------- 00168 //----------------------------------------------------------------------------- 00169 00170 static DIR* Opendir(const char *path); 00171 00172 //----------------------------------------------------------------------------- 00174 //----------------------------------------------------------------------------- 00175 00176 static ssize_t Pread(int fildes, void *buf, size_t nbyte, off_t offset); 00177 00178 //----------------------------------------------------------------------------- 00180 //----------------------------------------------------------------------------- 00181 00182 static ssize_t Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset); 00183 00184 //----------------------------------------------------------------------------- 00195 //----------------------------------------------------------------------------- 00196 00197 static int QueryChksum(const char *path, time_t &mtime, 00198 char *buff, int blen); 00199 00200 //----------------------------------------------------------------------------- 00210 //----------------------------------------------------------------------------- 00211 00212 static long long QueryOpaque(const char *path, char *buff, int blen); 00213 00214 //----------------------------------------------------------------------------- 00216 //----------------------------------------------------------------------------- 00217 00218 static ssize_t Read(int fildes, void *buf, size_t nbyte); 00219 00220 //----------------------------------------------------------------------------- 00222 //----------------------------------------------------------------------------- 00223 00224 static ssize_t Readv(int fildes, const struct iovec *iov, int iovcnt); 00225 00226 //----------------------------------------------------------------------------- 00230 //----------------------------------------------------------------------------- 00231 00232 static struct dirent* Readdir (DIR *dirp); 00233 static struct dirent64* Readdir64(DIR *dirp); 00234 00235 //----------------------------------------------------------------------------- 00239 //----------------------------------------------------------------------------- 00240 00241 static int Readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result); 00242 static int Readdir64_r(DIR *dirp, struct dirent64 *entry, struct dirent64 **result); 00243 00244 //----------------------------------------------------------------------------- 00246 //----------------------------------------------------------------------------- 00247 00248 static int Rename(const char *oldpath, const char *newpath); 00249 00250 //----------------------------------------------------------------------------- 00252 //----------------------------------------------------------------------------- 00253 00254 static void Rewinddir(DIR *dirp); 00255 00256 //----------------------------------------------------------------------------- 00258 //----------------------------------------------------------------------------- 00259 00260 static int Rmdir(const char *path); 00261 00262 //----------------------------------------------------------------------------- 00264 //----------------------------------------------------------------------------- 00265 00266 static void Seekdir(DIR *dirp, long loc); 00267 00268 //----------------------------------------------------------------------------- 00270 //----------------------------------------------------------------------------- 00271 00272 static int Stat(const char *path, struct stat *buf); 00273 00274 //----------------------------------------------------------------------------- 00277 //----------------------------------------------------------------------------- 00278 00279 static int Statfs(const char *path, struct statfs *buf); 00280 00281 //----------------------------------------------------------------------------- 00283 //----------------------------------------------------------------------------- 00284 00285 static int Statvfs(const char *path, struct statvfs *buf); 00286 00287 //----------------------------------------------------------------------------- 00289 //----------------------------------------------------------------------------- 00290 00291 static long Telldir(DIR *dirp); 00292 00293 //----------------------------------------------------------------------------- 00295 //----------------------------------------------------------------------------- 00296 00297 static int Truncate(const char *path, off_t offset); 00298 00299 //----------------------------------------------------------------------------- 00301 //----------------------------------------------------------------------------- 00302 00303 static int Unlink(const char *path); 00304 00305 //----------------------------------------------------------------------------- 00316 //----------------------------------------------------------------------------- 00317 00318 static ssize_t VRead(int fildes, const XrdOucIOVec *readV, int n); 00319 00320 //----------------------------------------------------------------------------- 00322 //----------------------------------------------------------------------------- 00323 00324 static ssize_t Write(int fildes, const void *buf, size_t nbyte); 00325 00326 //----------------------------------------------------------------------------- 00328 //----------------------------------------------------------------------------- 00329 00330 static ssize_t Writev(int fildes, const struct iovec *iov, int iovcnt); 00331 00332 //----------------------------------------------------------------------------- 00335 //----------------------------------------------------------------------------- 00336 00337 inline int fdOrigin() {return baseFD;} 00338 00339 static bool isXrootdDir(DIR *dirp); 00340 00341 static bool myFD(int fd); 00342 00343 static void setCache(XrdOucCache *cP); 00344 00345 static void setDebug(int val, bool doDebug=false); 00346 00347 static void setEnv(const char *kword, int kval); 00348 00349 static void setIPV4(bool userv4); 00350 00351 static void setSched(XrdScheduler *sP); 00352 00353 /* There must be one instance of this object per executable image. Typically, 00354 this object is declared in main() or at file level. This is necessary to 00355 properly do one-time initialization of the static members. When declaring 00356 this object, you can pass the following information: 00357 maxfd - maximum number of simultaneous files and directories to support. 00358 The value returned by getrlimit() over-rides the passed value 00359 unless maxfd is negative. When negative, abs(maxfd) becomes the 00360 absolute maximum and shadow file descriptors are not used. 00361 maxdir - Ignored, only here for backward compatability. 00362 maxthr - Ignored, only here for backward compatability. 00363 */ 00364 XrdPosixXrootd(int maxfd=255, int maxdir=0, int maxthr=0); 00365 ~XrdPosixXrootd(); 00366 00367 private: 00368 00369 static void initEnv(); 00370 static void initEnv(char *eData); 00371 static void initEnv(XrdOucEnv &, const char *, long long &); 00372 static int Fault(XrdPosixFile *fp, int ecode); 00373 static void initStat(struct stat *buf); 00374 static void initXdev(dev_t &st_dev, dev_t &st_rdev); 00375 00376 static XrdOucCache *myCache; 00377 static int baseFD; 00378 static int initDone; 00379 }; 00380 #endif