xrootd
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 friend class XrdPosixExtra;
66 
67 //-----------------------------------------------------------------------------
69 //-----------------------------------------------------------------------------
70 
71 static int Access(const char *path, int amode);
72 
73 //-----------------------------------------------------------------------------
75 //-----------------------------------------------------------------------------
76 
77 static int Close(int fildes);
78 
79 //-----------------------------------------------------------------------------
81 //-----------------------------------------------------------------------------
82 
83 static int Closedir(DIR *dirp);
84 
85 //-----------------------------------------------------------------------------
94 //-----------------------------------------------------------------------------
95 
96 static int endPoint(int FD, char *Buff, int Blen);
97 
98 //-----------------------------------------------------------------------------
100 //-----------------------------------------------------------------------------
101 
102 static int Fstat(int fildes, struct stat *buf);
103 
104 //-----------------------------------------------------------------------------
106 //-----------------------------------------------------------------------------
107 
108 static int Fsync(int fildes);
109 
110 static void Fsync(int fildes, XrdPosixCallBackIO *cbp); // Async extension!
111 
112 //-----------------------------------------------------------------------------
114 //-----------------------------------------------------------------------------
115 
116 static int Ftruncate(int fildes, off_t offset);
117 
118 //-----------------------------------------------------------------------------
136 
137 static long long Getxattr (const char *path, const char *name,
138  void *value, unsigned long long size);
139 
140 //-----------------------------------------------------------------------------
142 //-----------------------------------------------------------------------------
143 
144 static off_t Lseek(int fildes, off_t offset, int whence);
145 
146 //-----------------------------------------------------------------------------
148 //-----------------------------------------------------------------------------
149 
150 static int Mkdir(const char *path, mode_t mode);
151 
152 //-----------------------------------------------------------------------------
162 //-----------------------------------------------------------------------------
163 
164 static const int isStream = 0x40000000; // Internal for Open oflag
165 
166 static int Open(const char *path, int oflag, mode_t mode=0,
167  XrdPosixCallBack *cbP=0);
168 
169 //-----------------------------------------------------------------------------
171 //-----------------------------------------------------------------------------
172 
173 static DIR* Opendir(const char *path);
174 
175 //-----------------------------------------------------------------------------
177 //-----------------------------------------------------------------------------
178 
179 static ssize_t Pread(int fildes, void *buf, size_t nbyte, off_t offset);
180 
181 static void Pread(int fildes, void *buf, size_t nbyte, off_t offset,
182  XrdPosixCallBackIO *cbp); // Async extension!
183 
184 //-----------------------------------------------------------------------------
186 //-----------------------------------------------------------------------------
187 
188 static ssize_t Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset);
189 
190 static void Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset,
191  XrdPosixCallBackIO *cbp); // Async extension!
192 
193 //-----------------------------------------------------------------------------
204 //-----------------------------------------------------------------------------
205 
206 static int QueryChksum(const char *path, time_t &mtime,
207  char *buff, int blen);
208 
209 //-----------------------------------------------------------------------------
219 //-----------------------------------------------------------------------------
220 
221 static long long QueryOpaque(const char *path, char *buff, int blen);
222 
223 //-----------------------------------------------------------------------------
225 //-----------------------------------------------------------------------------
226 
227 static ssize_t Read(int fildes, void *buf, size_t nbyte);
228 
229 //-----------------------------------------------------------------------------
231 //-----------------------------------------------------------------------------
232 
233 static ssize_t Readv(int fildes, const struct iovec *iov, int iovcnt);
234 
235 //-----------------------------------------------------------------------------
239 //-----------------------------------------------------------------------------
240 
241 static struct dirent* Readdir (DIR *dirp);
242 static struct dirent64* Readdir64(DIR *dirp);
243 
244 //-----------------------------------------------------------------------------
248 //-----------------------------------------------------------------------------
249 
250 static int Readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result);
251 static int Readdir64_r(DIR *dirp, struct dirent64 *entry, struct dirent64 **result);
252 
253 //-----------------------------------------------------------------------------
255 //-----------------------------------------------------------------------------
256 
257 static int Rename(const char *oldpath, const char *newpath);
258 
259 //-----------------------------------------------------------------------------
261 //-----------------------------------------------------------------------------
262 
263 static void Rewinddir(DIR *dirp);
264 
265 //-----------------------------------------------------------------------------
267 //-----------------------------------------------------------------------------
268 
269 static int Rmdir(const char *path);
270 
271 //-----------------------------------------------------------------------------
273 //-----------------------------------------------------------------------------
274 
275 static void Seekdir(DIR *dirp, long loc);
276 
277 //-----------------------------------------------------------------------------
279 //-----------------------------------------------------------------------------
280 
281 static int Stat(const char *path, struct stat *buf);
282 
283 //-----------------------------------------------------------------------------
286 //-----------------------------------------------------------------------------
287 
288 static int Statfs(const char *path, struct statfs *buf);
289 
290 //-----------------------------------------------------------------------------
292 //-----------------------------------------------------------------------------
293 
294 static int Statvfs(const char *path, struct statvfs *buf);
295 
296 //-----------------------------------------------------------------------------
298 //-----------------------------------------------------------------------------
299 
300 static long Telldir(DIR *dirp);
301 
302 //-----------------------------------------------------------------------------
304 //-----------------------------------------------------------------------------
305 
306 static int Truncate(const char *path, off_t offset);
307 
308 //-----------------------------------------------------------------------------
310 //-----------------------------------------------------------------------------
311 
312 static int Unlink(const char *path);
313 
314 //-----------------------------------------------------------------------------
327 //-----------------------------------------------------------------------------
328 
329 static void VRead(int fildes, const XrdOucIOVec *readV, int n,
330  XrdPosixCallBackIO *cbp); // Async extension!
331 
332 static ssize_t VRead(int fildes, const XrdOucIOVec *readV, int n);
333 
334 //-----------------------------------------------------------------------------
336 //-----------------------------------------------------------------------------
337 
338 static ssize_t Write(int fildes, const void *buf, size_t nbyte);
339 
340 //-----------------------------------------------------------------------------
342 //-----------------------------------------------------------------------------
343 
344 static ssize_t Writev(int fildes, const struct iovec *iov, int iovcnt);
345 
346 //-----------------------------------------------------------------------------
349 //-----------------------------------------------------------------------------
350 
351 inline int fdOrigin() {return baseFD;}
352 
353 static bool isXrootdDir(DIR *dirp);
354 
355 static bool myFD(int fd);
356 
357 /* There must be one instance of this object per executable image. Typically,
358  this object is declared in main() or at file level. This is necessary to
359  properly do one-time initialization of the static members. When declaring
360  this object, you can pass the following information:
361  maxfd - maximum number of simultaneous files and directories to support.
362  The value returned by getrlimit() over-rides the passed value
363  unless maxfd is negative. When negative, abs(maxfd) becomes the
364  absolute maximum and shadow file descriptors are not used.
365  maxdir - Ignored, only here for backward compatibility.
366  maxthr - Ignored, only here for backward compatibility.
367 */
368  XrdPosixXrootd(int maxfd=255, int maxdir=0, int maxthr=0);
369  ~XrdPosixXrootd();
370 
371 private:
372 
373 static int Fault(XrdPosixFile *fp, int ecode);
374 
375 static int Open(const char *path, int oflag, mode_t mode,
376  XrdPosixCallBack *cbP, XrdPosixInfo *infoP);
377 static bool OpenCache(XrdPosixFile &file, XrdPosixInfo &Info);
378 
379 static int baseFD;
380 static int initDone;
381 };
382 #endif
static int baseFD
Definition: XrdPosixXrootd.hh:379
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:164
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:351
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:380
static bool isXrootdDir(DIR *dirp)
Extended POSIX interface to XRootD.
Definition: XrdPosixExtra.hh:46
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)