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 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

Generated on 13 Mar 2017 for xrootd by  doxygen 1.4.7