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 XrdPosixCallBack; 00053 class XrdPosixCallBackIO; 00054 class XrdPosixFile; 00055 class XrdPosixInfo; 00056 00057 //----------------------------------------------------------------------------- 00059 //----------------------------------------------------------------------------- 00060 00061 class XrdPosixXrootd 00062 { 00063 public: 00064 friend class XrdPosixConfig; 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 static void Fsync(int fildes, XrdPosixCallBackIO *cbp); // Async extension! 00110 00111 //----------------------------------------------------------------------------- 00113 //----------------------------------------------------------------------------- 00114 00115 static int Ftruncate(int fildes, off_t offset); 00116 00117 //----------------------------------------------------------------------------- 00135 00136 static long long Getxattr (const char *path, const char *name, 00137 void *value, unsigned long long size); 00138 00139 //----------------------------------------------------------------------------- 00141 //----------------------------------------------------------------------------- 00142 00143 static off_t Lseek(int fildes, off_t offset, int whence); 00144 00145 //----------------------------------------------------------------------------- 00147 //----------------------------------------------------------------------------- 00148 00149 static int Mkdir(const char *path, mode_t mode); 00150 00151 //----------------------------------------------------------------------------- 00161 //----------------------------------------------------------------------------- 00162 00163 static const int isStream = 0x40000000; // Internal for Open oflag 00164 00165 static int Open(const char *path, int oflag, mode_t mode=0, 00166 XrdPosixCallBack *cbP=0); 00167 00168 //----------------------------------------------------------------------------- 00170 //----------------------------------------------------------------------------- 00171 00172 static DIR* Opendir(const char *path); 00173 00174 //----------------------------------------------------------------------------- 00176 //----------------------------------------------------------------------------- 00177 00178 static ssize_t Pread(int fildes, void *buf, size_t nbyte, off_t offset); 00179 00180 static void Pread(int fildes, void *buf, size_t nbyte, off_t offset, 00181 XrdPosixCallBackIO *cbp); // Async extension! 00182 00183 //----------------------------------------------------------------------------- 00185 //----------------------------------------------------------------------------- 00186 00187 static ssize_t Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset); 00188 00189 static void Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset, 00190 XrdPosixCallBackIO *cbp); // Async extension! 00191 00192 //----------------------------------------------------------------------------- 00203 //----------------------------------------------------------------------------- 00204 00205 static int QueryChksum(const char *path, time_t &mtime, 00206 char *buff, int blen); 00207 00208 //----------------------------------------------------------------------------- 00218 //----------------------------------------------------------------------------- 00219 00220 static long long QueryOpaque(const char *path, char *buff, int blen); 00221 00222 //----------------------------------------------------------------------------- 00224 //----------------------------------------------------------------------------- 00225 00226 static ssize_t Read(int fildes, void *buf, size_t nbyte); 00227 00228 //----------------------------------------------------------------------------- 00230 //----------------------------------------------------------------------------- 00231 00232 static ssize_t Readv(int fildes, const struct iovec *iov, int iovcnt); 00233 00234 //----------------------------------------------------------------------------- 00238 //----------------------------------------------------------------------------- 00239 00240 static struct dirent* Readdir (DIR *dirp); 00241 static struct dirent64* Readdir64(DIR *dirp); 00242 00243 //----------------------------------------------------------------------------- 00247 //----------------------------------------------------------------------------- 00248 00249 static int Readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result); 00250 static int Readdir64_r(DIR *dirp, struct dirent64 *entry, struct dirent64 **result); 00251 00252 //----------------------------------------------------------------------------- 00254 //----------------------------------------------------------------------------- 00255 00256 static int Rename(const char *oldpath, const char *newpath); 00257 00258 //----------------------------------------------------------------------------- 00260 //----------------------------------------------------------------------------- 00261 00262 static void Rewinddir(DIR *dirp); 00263 00264 //----------------------------------------------------------------------------- 00266 //----------------------------------------------------------------------------- 00267 00268 static int Rmdir(const char *path); 00269 00270 //----------------------------------------------------------------------------- 00272 //----------------------------------------------------------------------------- 00273 00274 static void Seekdir(DIR *dirp, long loc); 00275 00276 //----------------------------------------------------------------------------- 00278 //----------------------------------------------------------------------------- 00279 00280 static int Stat(const char *path, struct stat *buf); 00281 00282 //----------------------------------------------------------------------------- 00285 //----------------------------------------------------------------------------- 00286 00287 static int Statfs(const char *path, struct statfs *buf); 00288 00289 //----------------------------------------------------------------------------- 00291 //----------------------------------------------------------------------------- 00292 00293 static int Statvfs(const char *path, struct statvfs *buf); 00294 00295 //----------------------------------------------------------------------------- 00297 //----------------------------------------------------------------------------- 00298 00299 static long Telldir(DIR *dirp); 00300 00301 //----------------------------------------------------------------------------- 00303 //----------------------------------------------------------------------------- 00304 00305 static int Truncate(const char *path, off_t offset); 00306 00307 //----------------------------------------------------------------------------- 00309 //----------------------------------------------------------------------------- 00310 00311 static int Unlink(const char *path); 00312 00313 //----------------------------------------------------------------------------- 00326 //----------------------------------------------------------------------------- 00327 00328 static void VRead(int fildes, const XrdOucIOVec *readV, int n, 00329 XrdPosixCallBackIO *cbp); // Async extension! 00330 00331 static ssize_t VRead(int fildes, const XrdOucIOVec *readV, int n); 00332 00333 //----------------------------------------------------------------------------- 00335 //----------------------------------------------------------------------------- 00336 00337 static ssize_t Write(int fildes, const void *buf, size_t nbyte); 00338 00339 //----------------------------------------------------------------------------- 00341 //----------------------------------------------------------------------------- 00342 00343 static ssize_t Writev(int fildes, const struct iovec *iov, int iovcnt); 00344 00345 //----------------------------------------------------------------------------- 00348 //----------------------------------------------------------------------------- 00349 00350 inline int fdOrigin() {return baseFD;} 00351 00352 static bool isXrootdDir(DIR *dirp); 00353 00354 static bool myFD(int fd); 00355 00356 /* There must be one instance of this object per executable image. Typically, 00357 this object is declared in main() or at file level. This is necessary to 00358 properly do one-time initialization of the static members. When declaring 00359 this object, you can pass the following information: 00360 maxfd - maximum number of simultaneous files and directories to support. 00361 The value returned by getrlimit() over-rides the passed value 00362 unless maxfd is negative. When negative, abs(maxfd) becomes the 00363 absolute maximum and shadow file descriptors are not used. 00364 maxdir - Ignored, only here for backward compatability. 00365 maxthr - Ignored, only here for backward compatability. 00366 */ 00367 XrdPosixXrootd(int maxfd=255, int maxdir=0, int maxthr=0); 00368 ~XrdPosixXrootd(); 00369 00370 private: 00371 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 int Open(const char *path, int oflag, mode_t mode, 00377 XrdPosixCallBack *cbP, XrdPosixInfo *infoP); 00378 static bool OpenCache(XrdPosixFile &file, XrdPosixInfo &Info); 00379 00380 static int baseFD; 00381 static int initDone; 00382 }; 00383 #endif