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 XrdPosixCallBack; 00057 class XrdPosixCallBackIO; 00058 class XrdPosixFile; 00059 00060 //----------------------------------------------------------------------------- 00062 //----------------------------------------------------------------------------- 00063 00064 class XrdPosixXrootd 00065 { 00066 public: 00067 00068 //----------------------------------------------------------------------------- 00070 //----------------------------------------------------------------------------- 00071 00072 static int Access(const char *path, int amode); 00073 00074 //----------------------------------------------------------------------------- 00076 //----------------------------------------------------------------------------- 00077 00078 static int Close(int fildes); 00079 00080 //----------------------------------------------------------------------------- 00082 //----------------------------------------------------------------------------- 00083 00084 static int Closedir(DIR *dirp); 00085 00086 //----------------------------------------------------------------------------- 00095 //----------------------------------------------------------------------------- 00096 00097 static int endPoint(int FD, char *Buff, int Blen); 00098 00099 //----------------------------------------------------------------------------- 00101 //----------------------------------------------------------------------------- 00102 00103 static int Fstat(int fildes, struct stat *buf); 00104 00105 //----------------------------------------------------------------------------- 00107 //----------------------------------------------------------------------------- 00108 00109 static int Fsync(int fildes); 00110 00111 static void Fsync(int fildes, XrdPosixCallBackIO *cbp); // Async extension! 00112 00113 //----------------------------------------------------------------------------- 00115 //----------------------------------------------------------------------------- 00116 00117 static int Ftruncate(int fildes, off_t offset); 00118 00119 //----------------------------------------------------------------------------- 00137 00138 static long long Getxattr (const char *path, const char *name, 00139 void *value, unsigned long long size); 00140 00141 //----------------------------------------------------------------------------- 00143 //----------------------------------------------------------------------------- 00144 00145 static off_t Lseek(int fildes, off_t offset, int whence); 00146 00147 //----------------------------------------------------------------------------- 00149 //----------------------------------------------------------------------------- 00150 00151 static int Mkdir(const char *path, mode_t mode); 00152 00153 //----------------------------------------------------------------------------- 00163 //----------------------------------------------------------------------------- 00164 00165 static const int isStream = 0x40000000; // Internal for Open oflag 00166 00167 static int Open(const char *path, int oflag, mode_t mode=0, 00168 XrdPosixCallBack *cbP=0); 00169 00170 //----------------------------------------------------------------------------- 00172 //----------------------------------------------------------------------------- 00173 00174 static DIR* Opendir(const char *path); 00175 00176 //----------------------------------------------------------------------------- 00178 //----------------------------------------------------------------------------- 00179 00180 static ssize_t Pread(int fildes, void *buf, size_t nbyte, off_t offset); 00181 00182 static void Pread(int fildes, void *buf, size_t nbyte, off_t offset, 00183 XrdPosixCallBackIO *cbp); // Async extension! 00184 00185 //----------------------------------------------------------------------------- 00187 //----------------------------------------------------------------------------- 00188 00189 static ssize_t Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset); 00190 00191 static void Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset, 00192 XrdPosixCallBackIO *cbp); // Async extension! 00193 00194 //----------------------------------------------------------------------------- 00205 //----------------------------------------------------------------------------- 00206 00207 static int QueryChksum(const char *path, time_t &mtime, 00208 char *buff, int blen); 00209 00210 //----------------------------------------------------------------------------- 00220 //----------------------------------------------------------------------------- 00221 00222 static long long QueryOpaque(const char *path, char *buff, int blen); 00223 00224 //----------------------------------------------------------------------------- 00226 //----------------------------------------------------------------------------- 00227 00228 static ssize_t Read(int fildes, void *buf, size_t nbyte); 00229 00230 //----------------------------------------------------------------------------- 00232 //----------------------------------------------------------------------------- 00233 00234 static ssize_t Readv(int fildes, const struct iovec *iov, int iovcnt); 00235 00236 //----------------------------------------------------------------------------- 00240 //----------------------------------------------------------------------------- 00241 00242 static struct dirent* Readdir (DIR *dirp); 00243 static struct dirent64* Readdir64(DIR *dirp); 00244 00245 //----------------------------------------------------------------------------- 00249 //----------------------------------------------------------------------------- 00250 00251 static int Readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result); 00252 static int Readdir64_r(DIR *dirp, struct dirent64 *entry, struct dirent64 **result); 00253 00254 //----------------------------------------------------------------------------- 00256 //----------------------------------------------------------------------------- 00257 00258 static int Rename(const char *oldpath, const char *newpath); 00259 00260 //----------------------------------------------------------------------------- 00262 //----------------------------------------------------------------------------- 00263 00264 static void Rewinddir(DIR *dirp); 00265 00266 //----------------------------------------------------------------------------- 00268 //----------------------------------------------------------------------------- 00269 00270 static int Rmdir(const char *path); 00271 00272 //----------------------------------------------------------------------------- 00274 //----------------------------------------------------------------------------- 00275 00276 static void Seekdir(DIR *dirp, long loc); 00277 00278 //----------------------------------------------------------------------------- 00280 //----------------------------------------------------------------------------- 00281 00282 static int Stat(const char *path, struct stat *buf); 00283 00284 //----------------------------------------------------------------------------- 00287 //----------------------------------------------------------------------------- 00288 00289 static int Statfs(const char *path, struct statfs *buf); 00290 00291 //----------------------------------------------------------------------------- 00293 //----------------------------------------------------------------------------- 00294 00295 static int Statvfs(const char *path, struct statvfs *buf); 00296 00297 //----------------------------------------------------------------------------- 00299 //----------------------------------------------------------------------------- 00300 00301 static long Telldir(DIR *dirp); 00302 00303 //----------------------------------------------------------------------------- 00305 //----------------------------------------------------------------------------- 00306 00307 static int Truncate(const char *path, off_t offset); 00308 00309 //----------------------------------------------------------------------------- 00311 //----------------------------------------------------------------------------- 00312 00313 static int Unlink(const char *path); 00314 00315 //----------------------------------------------------------------------------- 00328 //----------------------------------------------------------------------------- 00329 00330 static ssize_t VRead(int fildes, const XrdOucIOVec *readV, int n); 00331 00332 static void VRead(int fildes, const XrdOucIOVec *readV, int n, 00333 XrdPosixCallBackIO *cbp); // Async extension! 00334 00335 //----------------------------------------------------------------------------- 00337 //----------------------------------------------------------------------------- 00338 00339 static ssize_t Write(int fildes, const void *buf, size_t nbyte); 00340 00341 //----------------------------------------------------------------------------- 00343 //----------------------------------------------------------------------------- 00344 00345 static ssize_t Writev(int fildes, const struct iovec *iov, int iovcnt); 00346 00347 //----------------------------------------------------------------------------- 00350 //----------------------------------------------------------------------------- 00351 00352 inline int fdOrigin() {return baseFD;} 00353 00354 static bool isXrootdDir(DIR *dirp); 00355 00356 static bool myFD(int fd); 00357 00358 static void setCache(XrdOucCache *cP); 00359 00360 static void setCache(XrdOucCache2 *cP); 00361 00362 static void setDebug(int val, bool doDebug=false); 00363 00364 static void setEnv(const char *kword, int kval); 00365 00366 static void setIPV4(bool userv4); 00367 00368 static void setNumCB(int numcb); 00369 00370 static void setSched(XrdScheduler *sP); 00371 00372 /* There must be one instance of this object per executable image. Typically, 00373 this object is declared in main() or at file level. This is necessary to 00374 properly do one-time initialization of the static members. When declaring 00375 this object, you can pass the following information: 00376 maxfd - maximum number of simultaneous files and directories to support. 00377 The value returned by getrlimit() over-rides the passed value 00378 unless maxfd is negative. When negative, abs(maxfd) becomes the 00379 absolute maximum and shadow file descriptors are not used. 00380 maxdir - Ignored, only here for backward compatability. 00381 maxthr - Ignored, only here for backward compatability. 00382 */ 00383 XrdPosixXrootd(int maxfd=255, int maxdir=0, int maxthr=0); 00384 ~XrdPosixXrootd(); 00385 00386 private: 00387 00388 static void initEnv(); 00389 static void initEnv(char *eData); 00390 static void initEnv(XrdOucEnv &, const char *, long long &); 00391 static int Fault(XrdPosixFile *fp, int ecode); 00392 static void initStat(struct stat *buf); 00393 static void initXdev(dev_t &st_dev, dev_t &st_rdev); 00394 static XrdOucCache *myCache; 00395 static XrdOucCache2 *myCache2; 00396 static int baseFD; 00397 static int initDone; 00398 }; 00399 #endif