xrootd
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 XrdPosixCallBack;
53 class XrdPosixCallBackIO;
54 class XrdPosixFile;
55 class XrdPosixInfo;
56 
57 //-----------------------------------------------------------------------------
59 //-----------------------------------------------------------------------------
60 
62 {
63 public:
64 friend class XrdPosixConfig;
65 
66 //-----------------------------------------------------------------------------
68 //-----------------------------------------------------------------------------
69 
70 static int Access(const char *path, int amode);
71 
72 //-----------------------------------------------------------------------------
74 //-----------------------------------------------------------------------------
75 
76 static int Close(int fildes);
77 
78 //-----------------------------------------------------------------------------
80 //-----------------------------------------------------------------------------
81 
82 static int Closedir(DIR *dirp);
83 
84 //-----------------------------------------------------------------------------
93 //-----------------------------------------------------------------------------
94 
95 static int endPoint(int FD, char *Buff, int Blen);
96 
97 //-----------------------------------------------------------------------------
99 //-----------------------------------------------------------------------------
100 
101 static int Fstat(int fildes, struct stat *buf);
102 
103 //-----------------------------------------------------------------------------
105 //-----------------------------------------------------------------------------
106 
107 static int Fsync(int fildes);
108 
109 static void Fsync(int fildes, XrdPosixCallBackIO *cbp); // Async extension!
110 
111 //-----------------------------------------------------------------------------
113 //-----------------------------------------------------------------------------
114 
115 static int Ftruncate(int fildes, off_t offset);
116 
117 //-----------------------------------------------------------------------------
135 
136 static long long Getxattr (const char *path, const char *name,
137  void *value, unsigned long long size);
138 
139 //-----------------------------------------------------------------------------
141 //-----------------------------------------------------------------------------
142 
143 static off_t Lseek(int fildes, off_t offset, int whence);
144 
145 //-----------------------------------------------------------------------------
147 //-----------------------------------------------------------------------------
148 
149 static int Mkdir(const char *path, mode_t mode);
150 
151 //-----------------------------------------------------------------------------
161 //-----------------------------------------------------------------------------
162 
163 static const int isStream = 0x40000000; // Internal for Open oflag
164 
165 static int Open(const char *path, int oflag, mode_t mode=0,
166  XrdPosixCallBack *cbP=0);
167 
168 //-----------------------------------------------------------------------------
170 //-----------------------------------------------------------------------------
171 
172 static DIR* Opendir(const char *path);
173 
174 //-----------------------------------------------------------------------------
176 //-----------------------------------------------------------------------------
177 
178 static ssize_t Pread(int fildes, void *buf, size_t nbyte, off_t offset);
179 
180 static void Pread(int fildes, void *buf, size_t nbyte, off_t offset,
181  XrdPosixCallBackIO *cbp); // Async extension!
182 
183 //-----------------------------------------------------------------------------
185 //-----------------------------------------------------------------------------
186 
187 static ssize_t Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset);
188 
189 static void Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset,
190  XrdPosixCallBackIO *cbp); // Async extension!
191 
192 //-----------------------------------------------------------------------------
203 //-----------------------------------------------------------------------------
204 
205 static int QueryChksum(const char *path, time_t &mtime,
206  char *buff, int blen);
207 
208 //-----------------------------------------------------------------------------
218 //-----------------------------------------------------------------------------
219 
220 static long long QueryOpaque(const char *path, char *buff, int blen);
221 
222 //-----------------------------------------------------------------------------
224 //-----------------------------------------------------------------------------
225 
226 static ssize_t Read(int fildes, void *buf, size_t nbyte);
227 
228 //-----------------------------------------------------------------------------
230 //-----------------------------------------------------------------------------
231 
232 static ssize_t Readv(int fildes, const struct iovec *iov, int iovcnt);
233 
234 //-----------------------------------------------------------------------------
238 //-----------------------------------------------------------------------------
239 
240 static struct dirent* Readdir (DIR *dirp);
241 static struct dirent64* Readdir64(DIR *dirp);
242 
243 //-----------------------------------------------------------------------------
247 //-----------------------------------------------------------------------------
248 
249 static int Readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result);
250 static int Readdir64_r(DIR *dirp, struct dirent64 *entry, struct dirent64 **result);
251 
252 //-----------------------------------------------------------------------------
254 //-----------------------------------------------------------------------------
255 
256 static int Rename(const char *oldpath, const char *newpath);
257 
258 //-----------------------------------------------------------------------------
260 //-----------------------------------------------------------------------------
261 
262 static void Rewinddir(DIR *dirp);
263 
264 //-----------------------------------------------------------------------------
266 //-----------------------------------------------------------------------------
267 
268 static int Rmdir(const char *path);
269 
270 //-----------------------------------------------------------------------------
272 //-----------------------------------------------------------------------------
273 
274 static void Seekdir(DIR *dirp, long loc);
275 
276 //-----------------------------------------------------------------------------
278 //-----------------------------------------------------------------------------
279 
280 static int Stat(const char *path, struct stat *buf);
281 
282 //-----------------------------------------------------------------------------
285 //-----------------------------------------------------------------------------
286 
287 static int Statfs(const char *path, struct statfs *buf);
288 
289 //-----------------------------------------------------------------------------
291 //-----------------------------------------------------------------------------
292 
293 static int Statvfs(const char *path, struct statvfs *buf);
294 
295 //-----------------------------------------------------------------------------
297 //-----------------------------------------------------------------------------
298 
299 static long Telldir(DIR *dirp);
300 
301 //-----------------------------------------------------------------------------
303 //-----------------------------------------------------------------------------
304 
305 static int Truncate(const char *path, off_t offset);
306 
307 //-----------------------------------------------------------------------------
309 //-----------------------------------------------------------------------------
310 
311 static int Unlink(const char *path);
312 
313 //-----------------------------------------------------------------------------
326 //-----------------------------------------------------------------------------
327 
328 static void VRead(int fildes, const XrdOucIOVec *readV, int n,
329  XrdPosixCallBackIO *cbp); // Async extension!
330 
331 static ssize_t VRead(int fildes, const XrdOucIOVec *readV, int n);
332 
333 //-----------------------------------------------------------------------------
335 //-----------------------------------------------------------------------------
336 
337 static ssize_t Write(int fildes, const void *buf, size_t nbyte);
338 
339 //-----------------------------------------------------------------------------
341 //-----------------------------------------------------------------------------
342 
343 static ssize_t Writev(int fildes, const struct iovec *iov, int iovcnt);
344 
345 //-----------------------------------------------------------------------------
348 //-----------------------------------------------------------------------------
349 
350 inline int fdOrigin() {return baseFD;}
351 
352 static bool isXrootdDir(DIR *dirp);
353 
354 static bool myFD(int fd);
355 
356 /* There must be one instance of this object per executable image. Typically,
357  this object is declared in main() or at file level. This is necessary to
358  properly do one-time initialization of the static members. When declaring
359  this object, you can pass the following information:
360  maxfd - maximum number of simultaneous files and directories to support.
361  The value returned by getrlimit() over-rides the passed value
362  unless maxfd is negative. When negative, abs(maxfd) becomes the
363  absolute maximum and shadow file descriptors are not used.
364  maxdir - Ignored, only here for backward compatability.
365  maxthr - Ignored, only here for backward compatability.
366 */
367  XrdPosixXrootd(int maxfd=255, int maxdir=0, int maxthr=0);
368  ~XrdPosixXrootd();
369 
370 private:
371 
372 static int Fault(XrdPosixFile *fp, int ecode);
373 
374 static int Open(const char *path, int oflag, mode_t mode,
375  XrdPosixCallBack *cbP, XrdPosixInfo *infoP);
376 static bool OpenCache(XrdPosixFile &file, XrdPosixInfo &Info);
377 
378 static int baseFD;
379 static int initDone;
380 };
381 #endif
static int baseFD
Definition: XrdPosixXrootd.hh:378
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:163
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: XrdPosixFile.hh:57
#define statfs(a, b)
Definition: XrdPosix.hh:98
int fdOrigin()
Definition: XrdPosixXrootd.hh:350
static long long QueryOpaque(const char *path, char *buff, int blen)
static ssize_t Pread(int fildes, void *buf, size_t nbyte, off_t offset)
Pread() conforms to POSIX.1-2001 pread()
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()
static int Fsync(int fildes)
Fsync() conforms to POSIX.1-2001 fsync()
static bool OpenCache(XrdPosixFile &file, XrdPosixInfo &Info)
Definition: XrdOucIOVec.hh:65
static int Truncate(const char *path, off_t offset)
Telldir() conforms to POSIX.1-2001 telldir()
static bool myFD(int fd)
static ssize_t Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset)
Pwrite() conforms to POSIX.1-2001 pwrite()
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:61
static int initDone
Definition: XrdPosixXrootd.hh:379
static bool isXrootdDir(DIR *dirp)
static struct dirent * Readdir(DIR *dirp)
static int Statfs(const char *path, struct statfs *buf)
static void VRead(int fildes, const XrdOucIOVec *readV, int n, XrdPosixCallBackIO *cbp)
Definition: XrdPosixConfig.hh:46
static int Fstat(int fildes, struct stat *buf)
Fstat() conforms to POSIX.1-2001 fstat()
#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()
Definition: XrdPosixInfo.hh:39
Definition: XrdMacaroonsHandler.hh:18
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 ssize_t Writev(int fildes, const struct iovec *iov, int iovcnt)
Writev() conforms to POSIX.1-2001 writev()
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)