xrootd
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
XrdPosixXrootd.hh
Go to the documentation of this file.
1 #ifndef __XRDPOSIXXROOTD_H__
2 #define __XRDPOSIXXROOTD_H__
3 /******************************************************************************/
4 /* */
5 /* X r d P o s i x X r o o t d */
6 /* */
7 /* (c) 2010 by the Board of Trustees of the Leland Stanford, Jr., University */
8 /* All Rights Reserved */
9 /* Produced by Andrew Hanushevsky for Stanford University under contract */
10 /* DE-AC02-76-SFO0515 with the Department of Energy */
11 /* */
12 /* This file is part of the XRootD software suite. */
13 /* */
14 /* XRootD is free software: you can redistribute it and/or modify it under */
15 /* the terms of the GNU Lesser General Public License as published by the */
16 /* Free Software Foundation, either version 3 of the License, or (at your */
17 /* option) any later version. */
18 /* */
19 /* XRootD is distributed in the hope that it will be useful, but WITHOUT */
20 /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
21 /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
22 /* License for more details. */
23 /* */
24 /* You should have received a copy of the GNU Lesser General Public License */
25 /* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
26 /* COPYING (GPL license). If not, see <http://www.gnu.org/licenses/>. */
27 /* */
28 /* The copyright holder's institutional names and contributor's names may not */
29 /* be used to endorse or promote products derived from this software without */
30 /* specific prior written permission of the institution or contributor. */
31 /* Modified by Frank Winklmeier to add the full Posix file system definition. */
32 /******************************************************************************/
33 
34 #include <dirent.h>
35 #include <unistd.h>
36 #include <sys/stat.h>
37 #include <sys/statvfs.h>
38 #include <sys/types.h>
39 
40 #if defined(__APPLE__) || defined(__FreeBSD__)
41 #include <sys/param.h>
42 #include <sys/mount.h>
43 #else
44 #include <sys/statfs.h>
45 #endif
46 
48 #include "XrdSys/XrdSysPthread.hh"
49 
50 struct XrdOucIOVec;
51 
52 class XrdScheduler;
53 class XrdOucCache;
54 class XrdOucCache2;
55 class XrdOucEnv;
56 class XrdOucName2Name;
57 class XrdSysLogger;
58 class XrdPosixCallBack;
59 class XrdPosixCallBackIO;
60 class XrdPosixFile;
61 class XrdPosixInfo;
62 
63 //-----------------------------------------------------------------------------
65 //-----------------------------------------------------------------------------
66 
68 {
69 public:
70 friend class XrdPosixConfig;
71 
72 //-----------------------------------------------------------------------------
74 //-----------------------------------------------------------------------------
75 
76 static int Access(const char *path, int amode);
77 
78 //-----------------------------------------------------------------------------
80 //-----------------------------------------------------------------------------
81 
82 static int Close(int fildes);
83 
84 //-----------------------------------------------------------------------------
86 //-----------------------------------------------------------------------------
87 
88 static int Closedir(DIR *dirp);
89 
90 //-----------------------------------------------------------------------------
99 //-----------------------------------------------------------------------------
100 
101 static int endPoint(int FD, char *Buff, int Blen);
102 
103 //-----------------------------------------------------------------------------
105 //-----------------------------------------------------------------------------
106 
107 static int Fstat(int fildes, struct stat *buf);
108 
109 //-----------------------------------------------------------------------------
111 //-----------------------------------------------------------------------------
112 
113 static int Fsync(int fildes);
114 
115 static void Fsync(int fildes, XrdPosixCallBackIO *cbp); // Async extension!
116 
117 //-----------------------------------------------------------------------------
119 //-----------------------------------------------------------------------------
120 
121 static int Ftruncate(int fildes, off_t offset);
122 
123 //-----------------------------------------------------------------------------
141 
142 static long long Getxattr (const char *path, const char *name,
143  void *value, unsigned long long size);
144 
145 //-----------------------------------------------------------------------------
147 //-----------------------------------------------------------------------------
148 
149 static off_t Lseek(int fildes, off_t offset, int whence);
150 
151 //-----------------------------------------------------------------------------
153 //-----------------------------------------------------------------------------
154 
155 static int Mkdir(const char *path, mode_t mode);
156 
157 //-----------------------------------------------------------------------------
167 //-----------------------------------------------------------------------------
168 
169 static const int isStream = 0x40000000; // Internal for Open oflag
170 
171 static int Open(const char *path, int oflag, mode_t mode=0,
172  XrdPosixCallBack *cbP=0);
173 
174 //-----------------------------------------------------------------------------
176 //-----------------------------------------------------------------------------
177 
178 static DIR* Opendir(const char *path);
179 
180 //-----------------------------------------------------------------------------
182 //-----------------------------------------------------------------------------
183 
184 static ssize_t Pread(int fildes, void *buf, size_t nbyte, off_t offset);
185 
186 static void Pread(int fildes, void *buf, size_t nbyte, off_t offset,
187  XrdPosixCallBackIO *cbp); // Async extension!
188 
189 //-----------------------------------------------------------------------------
191 //-----------------------------------------------------------------------------
192 
193 static ssize_t Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset);
194 
195 static void Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset,
196  XrdPosixCallBackIO *cbp); // Async extension!
197 
198 //-----------------------------------------------------------------------------
209 //-----------------------------------------------------------------------------
210 
211 static int QueryChksum(const char *path, time_t &mtime,
212  char *buff, int blen);
213 
214 //-----------------------------------------------------------------------------
224 //-----------------------------------------------------------------------------
225 
226 static long long QueryOpaque(const char *path, char *buff, int blen);
227 
228 //-----------------------------------------------------------------------------
230 //-----------------------------------------------------------------------------
231 
232 static ssize_t Read(int fildes, void *buf, size_t nbyte);
233 
234 //-----------------------------------------------------------------------------
236 //-----------------------------------------------------------------------------
237 
238 static ssize_t Readv(int fildes, const struct iovec *iov, int iovcnt);
239 
240 //-----------------------------------------------------------------------------
244 //-----------------------------------------------------------------------------
245 
246 static struct dirent* Readdir (DIR *dirp);
247 static struct dirent64* Readdir64(DIR *dirp);
248 
249 //-----------------------------------------------------------------------------
253 //-----------------------------------------------------------------------------
254 
255 static int Readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result);
256 static int Readdir64_r(DIR *dirp, struct dirent64 *entry, struct dirent64 **result);
257 
258 //-----------------------------------------------------------------------------
260 //-----------------------------------------------------------------------------
261 
262 static int Rename(const char *oldpath, const char *newpath);
263 
264 //-----------------------------------------------------------------------------
266 //-----------------------------------------------------------------------------
267 
268 static void Rewinddir(DIR *dirp);
269 
270 //-----------------------------------------------------------------------------
272 //-----------------------------------------------------------------------------
273 
274 static int Rmdir(const char *path);
275 
276 //-----------------------------------------------------------------------------
278 //-----------------------------------------------------------------------------
279 
280 static void Seekdir(DIR *dirp, long loc);
281 
282 //-----------------------------------------------------------------------------
284 //-----------------------------------------------------------------------------
285 
286 static int Stat(const char *path, struct stat *buf);
287 
288 //-----------------------------------------------------------------------------
291 //-----------------------------------------------------------------------------
292 
293 static int Statfs(const char *path, struct statfs *buf);
294 
295 //-----------------------------------------------------------------------------
297 //-----------------------------------------------------------------------------
298 
299 static int Statvfs(const char *path, struct statvfs *buf);
300 
301 //-----------------------------------------------------------------------------
303 //-----------------------------------------------------------------------------
304 
305 static long Telldir(DIR *dirp);
306 
307 //-----------------------------------------------------------------------------
309 //-----------------------------------------------------------------------------
310 
311 static int Truncate(const char *path, off_t offset);
312 
313 //-----------------------------------------------------------------------------
315 //-----------------------------------------------------------------------------
316 
317 static int Unlink(const char *path);
318 
319 //-----------------------------------------------------------------------------
332 //-----------------------------------------------------------------------------
333 
334 static void VRead(int fildes, const XrdOucIOVec *readV, int n,
335  XrdPosixCallBackIO *cbp); // Async extension!
336 
337 static ssize_t VRead(int fildes, const XrdOucIOVec *readV, int n);
338 
339 //-----------------------------------------------------------------------------
341 //-----------------------------------------------------------------------------
342 
343 static ssize_t Write(int fildes, const void *buf, size_t nbyte);
344 
345 //-----------------------------------------------------------------------------
347 //-----------------------------------------------------------------------------
348 
349 static ssize_t Writev(int fildes, const struct iovec *iov, int iovcnt);
350 
351 //-----------------------------------------------------------------------------
354 //-----------------------------------------------------------------------------
355 
356 inline int fdOrigin() {return baseFD;}
357 
358 static bool isXrootdDir(DIR *dirp);
359 
360 static bool myFD(int fd);
361 
362 /* There must be one instance of this object per executable image. Typically,
363  this object is declared in main() or at file level. This is necessary to
364  properly do one-time initialization of the static members. When declaring
365  this object, you can pass the following information:
366  maxfd - maximum number of simultaneous files and directories to support.
367  The value returned by getrlimit() over-rides the passed value
368  unless maxfd is negative. When negative, abs(maxfd) becomes the
369  absolute maximum and shadow file descriptors are not used.
370  maxdir - Ignored, only here for backward compatability.
371  maxthr - Ignored, only here for backward compatability.
372 */
373  XrdPosixXrootd(int maxfd=255, int maxdir=0, int maxthr=0);
374  ~XrdPosixXrootd();
375 
376 // The following methods were always considered private. They are no longer
377 // used and will be removed on the next major release! They are only here for
378 // now to keep ABI compatability for the 4.x and prior releases.
379 //
380 static void setCache(XrdOucCache *cP);
381 static void setCache(XrdOucCache2 *cP);
382 static void setDebug(int val, bool doDebug=false);
383 static void setEnv(const char *kword, int kval);
384 static void setIPV4(bool userv4);
385 static void setLogger(XrdSysLogger *logP);
386 static void setNumCB(int numcb);
387 static void setN2N(XrdOucName2Name *pN2N, int opts=0);
388 static void setSched(XrdScheduler *sP);
389 
390 private:
391 
392 static int Fault(XrdPosixFile *fp, int ecode);
393 static void initStat(struct stat *buf);
394 static void initXdev(dev_t &st_dev, dev_t &st_rdev);
395 
396 static int Open(const char *path, int oflag, mode_t mode,
397  XrdPosixCallBack *cbP, XrdPosixInfo *infoP);
398 static bool OpenCache(XrdPosixFile &file, XrdPosixInfo &Info);
399 
400 static int baseFD;
401 static int initDone;
402 };
403 #endif
static int baseFD
Definition: XrdPosixXrootd.hh:400
static int Statvfs(const char *path, struct statvfs *buf)
Statvfs() conforms to POSIX.1-2001 statvfs()
static int Ftruncate(int fildes, off_t offset)
Ftruncate() conforms to POSIX.1-2001 ftruncate()
static ssize_t Readv(int fildes, const struct iovec *iov, int iovcnt)
Readv() conforms to POSIX.1-2001 readv()
static int Open(const char *path, int oflag, mode_t mode=0, XrdPosixCallBack *cbP=0)
static const int isStream
Definition: XrdPosixXrootd.hh:169
static long Telldir(DIR *dirp)
Telldir() conforms to POSIX.1-2001 telldir()
static long long Getxattr(const char *path, const char *name, void *value, unsigned long long size)
Definition: XrdOucCache2.hh:196
Definition: XrdPosixFile.hh:57
#define statfs(a, b)
Definition: XrdPosix.hh:98
int fdOrigin()
Definition: XrdPosixXrootd.hh:356
static long long QueryOpaque(const char *path, char *buff, int blen)
static void setLogger(XrdSysLogger *logP)
static ssize_t Pread(int fildes, void *buf, size_t nbyte, off_t offset)
Pread() conforms to POSIX.1-2001 pread()
static void setNumCB(int numcb)
Definition: XrdOucName2Name.hh:48
static ssize_t Write(int fildes, const void *buf, size_t nbyte)
Write() conforms to POSIX.1-2001 write()
static int Unlink(const char *path)
Unlink() conforms to POSIX.1-2001 unlink()
static int Access(const char *path, int amode)
Access() conforms to POSIX.1-2001 access()
XrdPosixXrootd(int maxfd=255, int maxdir=0, int maxthr=0)
static int Stat(const char *path, struct stat *buf)
Stat() conforms to POSIX.1-2001 stat()
Definition: XrdScheduler.hh:44
static int Fsync(int fildes)
Fsync() conforms to POSIX.1-2001 fsync()
static bool OpenCache(XrdPosixFile &file, XrdPosixInfo &Info)
static int Truncate(const char *path, off_t offset)
Telldir() conforms to POSIX.1-2001 telldir()
static bool myFD(int fd)
Definition: XrdOucCache.hh:282
static ssize_t Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset)
Pwrite() conforms to POSIX.1-2001 pwrite()
static void setIPV4(bool userv4)
static void setN2N(XrdOucName2Name *pN2N, int opts=0)
Definition: XrdOucEnv.hh:41
static void setEnv(const char *kword, int kval)
An abstract class to define a callback for Open() call.
Definition: XrdPosixCallBack.hh:51
Definition: XrdOucIOVec.hh:40
static int Close(int fildes)
Close() conforms to POSIX.1-2001 close()
static int Fault(XrdPosixFile *fp, int ecode)
static int QueryChksum(const char *path, time_t &mtime, char *buff, int blen)
POSIX interface to XRootD with some extensions, as noted.
Definition: XrdPosixXrootd.hh:67
static int initDone
Definition: XrdPosixXrootd.hh:401
static bool isXrootdDir(DIR *dirp)
static void initXdev(dev_t &st_dev, dev_t &st_rdev)
static struct dirent * Readdir(DIR *dirp)
static int Statfs(const char *path, struct statfs *buf)
static void setDebug(int val, bool doDebug=false)
static void VRead(int fildes, const XrdOucIOVec *readV, int n, XrdPosixCallBackIO *cbp)
Definition: XrdPosixConfig.hh:43
static int Fstat(int fildes, struct stat *buf)
Fstat() conforms to POSIX.1-2001 fstat()
Definition: XrdSysLogger.hh:52
#define Info(lvl, where, what)
Definition: XrdClientDebug.hh:52
#define stat(a, b)
Definition: XrdPosix.hh:96
static int Readdir64_r(DIR *dirp, struct dirent64 *entry, struct dirent64 **result)
static int Closedir(DIR *dirp)
Closedir() conforms to POSIX.1-2001 closedir()
static int endPoint(int FD, char *Buff, int Blen)
static void Rewinddir(DIR *dirp)
Rewinddir() conforms to POSIX.1-2001 rewinddir()
static struct dirent64 * Readdir64(DIR *dirp)
static int Rename(const char *oldpath, const char *newpath)
Rename() conforms to POSIX.1-2001 rename()
static void setCache(XrdOucCache *cP)
Definition: XrdPosixInfo.hh:38
static int Rmdir(const char *path)
Rmdir() conforms to POSIX.1-2001 rmdir()
Definition: XrdPosixCallBack.hh:75
#define statvfs(a, b)
Definition: XrdPosix.hh:100
static ssize_t Read(int fildes, void *buf, size_t nbyte)
Read() conforms to POSIX.1-2001 read()
static off_t Lseek(int fildes, off_t offset, int whence)
Lseek() conforms to POSIX.1-2001 lseek()
static void initStat(struct stat *buf)
static ssize_t Writev(int fildes, const struct iovec *iov, int iovcnt)
Writev() conforms to POSIX.1-2001 writev()
static void setSched(XrdScheduler *sP)
static void Seekdir(DIR *dirp, long loc)
Seekdir() conforms to POSIX.1-2001 seekdir()
static int Mkdir(const char *path, mode_t mode)
Mkdir() conforms to POSIX.1-2001 mkdir()
static DIR * Opendir(const char *path)
Opendir() conforms to POSIX.1-2001 opendir()
static int Readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)