XrdPosixXrootd.hh

Go to the documentation of this file.
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

Generated on 12 Dec 2014 for xrootd by  doxygen 1.4.7