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 <string>
35 #include <dirent.h>
36 #include <unistd.h>
37 #include <sys/stat.h>
38 #include <sys/statvfs.h>
39 #include <sys/types.h>
40 
41 #if defined(__APPLE__) || defined(__FreeBSD__)
42 #include <sys/param.h>
43 #include <sys/mount.h>
44 #else
45 #include <sys/statfs.h>
46 #endif
47 
49 #include "XrdSys/XrdSysPthread.hh"
50 
51 struct XrdOucIOVec;
52 
53 class XrdPosixCallBack;
54 class XrdPosixCallBackIO;
55 class XrdPosixFile;
56 class XrdPosixInfo;
57 class XrdPosixAdmin;
58 
59 //-----------------------------------------------------------------------------
61 //-----------------------------------------------------------------------------
62 
64 {
65 public:
66 friend class XrdPosixConfig;
67 friend class XrdPosixExtra;
68 
69 //-----------------------------------------------------------------------------
71 //-----------------------------------------------------------------------------
72 
73 static int Access(const char *path, int amode);
74 
75 //-----------------------------------------------------------------------------
77 //-----------------------------------------------------------------------------
78 
79 static int Close(int fildes);
80 
81 //-----------------------------------------------------------------------------
83 //-----------------------------------------------------------------------------
84 
85 static int Closedir(DIR *dirp);
86 
87 //-----------------------------------------------------------------------------
96 //-----------------------------------------------------------------------------
97 
98 static int endPoint(int FD, char *Buff, int Blen);
99 
100 //-----------------------------------------------------------------------------
102 //-----------------------------------------------------------------------------
103 
104 static int Fstat(int fildes, struct stat *buf);
105 
106 //-----------------------------------------------------------------------------
108 //-----------------------------------------------------------------------------
109 
110 static int Fsync(int fildes);
111 
112 static void Fsync(int fildes, XrdPosixCallBackIO *cbp); // Async extension!
113 
114 //-----------------------------------------------------------------------------
116 //-----------------------------------------------------------------------------
117 
118 static int Ftruncate(int fildes, off_t offset);
119 
120 //-----------------------------------------------------------------------------
138 
139 static long long Getxattr (const char *path, const char *name,
140  void *value, unsigned long long size);
141 
142 //-----------------------------------------------------------------------------
144 //-----------------------------------------------------------------------------
145 
146 static off_t Lseek(int fildes, off_t offset, int whence);
147 
148 //-----------------------------------------------------------------------------
150 //-----------------------------------------------------------------------------
151 
152 static int Mkdir(const char *path, mode_t mode);
153 
154 //-----------------------------------------------------------------------------
164 //-----------------------------------------------------------------------------
165 
166 static const int isStream = 0x40000000; // Internal for Open oflag
167 
168 static int Open(const char *path, int oflag, mode_t mode=0,
169  XrdPosixCallBack *cbP=0);
170 
171 //-----------------------------------------------------------------------------
173 //-----------------------------------------------------------------------------
174 
175 static DIR* Opendir(const char *path);
176 
177 //-----------------------------------------------------------------------------
179 //-----------------------------------------------------------------------------
180 
181 static ssize_t Pread(int fildes, void *buf, size_t nbyte, off_t offset);
182 
183 static void Pread(int fildes, void *buf, size_t nbyte, off_t offset,
184  XrdPosixCallBackIO *cbp); // Async extension!
185 
186 //-----------------------------------------------------------------------------
188 //-----------------------------------------------------------------------------
189 
190 static ssize_t Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset);
191 
192 static void Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset,
193  XrdPosixCallBackIO *cbp); // Async extension!
194 
195 //-----------------------------------------------------------------------------
206 //-----------------------------------------------------------------------------
207 
208 static int QueryChksum(const char *path, time_t &mtime,
209  char *buff, int blen);
210 
211 //-----------------------------------------------------------------------------
226 //-----------------------------------------------------------------------------
227 
228 static int QueryError(std::string& emsg, int fd=-1, bool reset=true);
229 
230 static int QueryError(std::string& emsg, DIR* dirP, bool reset=true);
231 
232 //-----------------------------------------------------------------------------
242 //-----------------------------------------------------------------------------
243 
244 static long long QueryOpaque(const char *path, char *buff, int blen);
245 
246 //-----------------------------------------------------------------------------
248 //-----------------------------------------------------------------------------
249 
250 static ssize_t Read(int fildes, void *buf, size_t nbyte);
251 
252 //-----------------------------------------------------------------------------
254 //-----------------------------------------------------------------------------
255 
256 static ssize_t Readv(int fildes, const struct iovec *iov, int iovcnt);
257 
258 //-----------------------------------------------------------------------------
262 //-----------------------------------------------------------------------------
263 
264 static struct dirent* Readdir (DIR *dirp);
265 static struct dirent64* Readdir64(DIR *dirp);
266 
267 //-----------------------------------------------------------------------------
271 //-----------------------------------------------------------------------------
272 
273 static int Readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result);
274 static int Readdir64_r(DIR *dirp, struct dirent64 *entry, struct dirent64 **result);
275 
276 //-----------------------------------------------------------------------------
278 //-----------------------------------------------------------------------------
279 
280 static int Rename(const char *oldpath, const char *newpath);
281 
282 //-----------------------------------------------------------------------------
284 //-----------------------------------------------------------------------------
285 
286 static void Rewinddir(DIR *dirp);
287 
288 //-----------------------------------------------------------------------------
290 //-----------------------------------------------------------------------------
291 
292 static int Rmdir(const char *path);
293 
294 //-----------------------------------------------------------------------------
296 //-----------------------------------------------------------------------------
297 
298 static void Seekdir(DIR *dirp, long loc);
299 
300 //-----------------------------------------------------------------------------
302 //-----------------------------------------------------------------------------
303 
304 static int Stat(const char *path, struct stat *buf);
305 
306 //-----------------------------------------------------------------------------
309 //-----------------------------------------------------------------------------
310 
311 static int Statfs(const char *path, struct statfs *buf);
312 
313 //-----------------------------------------------------------------------------
315 //-----------------------------------------------------------------------------
316 
317 static int Statvfs(const char *path, struct statvfs *buf);
318 
319 //-----------------------------------------------------------------------------
321 //-----------------------------------------------------------------------------
322 
323 static long Telldir(DIR *dirp);
324 
325 //-----------------------------------------------------------------------------
327 //-----------------------------------------------------------------------------
328 
329 static int Truncate(const char *path, off_t offset);
330 
331 //-----------------------------------------------------------------------------
333 //-----------------------------------------------------------------------------
334 
335 static int Unlink(const char *path);
336 
337 //-----------------------------------------------------------------------------
347 //-----------------------------------------------------------------------------
348 
349 static void VRead(int fildes, const XrdOucIOVec *readV, int n,
350  XrdPosixCallBackIO *cbp); // Async extension!
351 
352 static ssize_t VRead(int fildes, const XrdOucIOVec *readV, int n);
353 
354 //-----------------------------------------------------------------------------
356 //-----------------------------------------------------------------------------
357 
358 static ssize_t Write(int fildes, const void *buf, size_t nbyte);
359 
360 //-----------------------------------------------------------------------------
362 //-----------------------------------------------------------------------------
363 
364 static ssize_t Writev(int fildes, const struct iovec *iov, int iovcnt);
365 
366 //-----------------------------------------------------------------------------
369 //-----------------------------------------------------------------------------
370 
371 inline int fdOrigin() {return baseFD;}
372 
373 static bool isXrootdDir(DIR *dirp);
374 
375 static bool myFD(int fd);
376 
377 /* There must be one instance of this object per executable image. Typically,
378  this object is declared in main() or at file level. This is necessary to
379  properly do one-time initialization of the static members. When declaring
380  this object, you can pass the following information:
381  maxfd - maximum number of simultaneous files and directories to support.
382  The value returned by getrlimit() over-rides the passed value
383  unless maxfd is negative. When negative, abs(maxfd) becomes the
384  absolute maximum and shadow file descriptors are not used.
385  maxdir - Ignored, only here for backward compatibility.
386  maxthr - Ignored, only here for backward compatibility.
387 */
388  XrdPosixXrootd(int maxfd=255, int maxdir=0, int maxthr=0);
389  ~XrdPosixXrootd();
390 
391 private:
392 
393 static int Fault(XrdPosixFile *fp, int ecode, const char *msg=0);
394 
395 static int Open(const char *path, int oflag, mode_t mode,
396  XrdPosixCallBack *cbP, XrdPosixInfo *infoP);
397 static bool OpenCache(XrdPosixFile &file, XrdPosixInfo &Info);
398 
399 // functions that will be used when XrdEC is invoked
400 static int EcRename(const char*, const char*, XrdPosixAdmin&);
401 static int EcStat(const char*, struct stat*, XrdPosixAdmin&);
402 static int EcUnlink(const char*, XrdPosixAdmin&);
403 
404 static int baseFD;
405 static int initDone;
406 };
407 #endif
@ Info
int stat(const char *path, struct stat *buf)
int statvfs(const char *path, struct statvfs *buf)
int statfs(const char *path, struct statfs *buf)
int emsg(int rc, char *msg)
An abstract class to define a callback for Open() call.
Extended POSIX interface to XRootD.
POSIX interface to XRootD with some extensions, as noted.
static ssize_t Readv(int fildes, const struct iovec *iov, int iovcnt)
Readv() conforms to POSIX.1-2001 readv()
static ssize_t Pread(int fildes, void *buf, size_t nbyte, off_t offset)
Pread() conforms to POSIX.1-2001 pread()
static int Closedir(DIR *dirp)
Closedir() conforms to POSIX.1-2001 closedir()
static void Seekdir(DIR *dirp, long loc)
Seekdir() conforms to POSIX.1-2001 seekdir()
static const int isStream
static int Stat(const char *path, struct stat *buf)
Stat() conforms to POSIX.1-2001 stat()
static int QueryChksum(const char *path, time_t &mtime, char *buff, int blen)
static int Mkdir(const char *path, mode_t mode)
Mkdir() conforms to POSIX.1-2001 mkdir()
static int Unlink(const char *path)
Unlink() conforms to POSIX.1-2001 unlink()
static int Rmdir(const char *path)
Rmdir() conforms to POSIX.1-2001 rmdir()
static void Rewinddir(DIR *dirp)
Rewinddir() conforms to POSIX.1-2001 rewinddir()
static void VRead(int fildes, const XrdOucIOVec *readV, int n, XrdPosixCallBackIO *cbp)
static int Rename(const char *oldpath, const char *newpath)
Rename() conforms to POSIX.1-2001 rename()
static int Close(int fildes)
Close() conforms to POSIX.1-2001 close()
static int Statvfs(const char *path, struct statvfs *buf)
Statvfs() conforms to POSIX.1-2001 statvfs()
static int endPoint(int FD, char *Buff, int Blen)
static ssize_t Write(int fildes, const void *buf, size_t nbyte)
Write() conforms to POSIX.1-2001 write()
static struct dirent * Readdir(DIR *dirp)
static int Readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)
static ssize_t Writev(int fildes, const struct iovec *iov, int iovcnt)
Writev() conforms to POSIX.1-2001 writev()
static int QueryError(std::string &emsg, int fd=-1, bool reset=true)
static struct dirent64 * Readdir64(DIR *dirp)
XrdPosixXrootd(int maxfd=255, int maxdir=0, int maxthr=0)
static bool myFD(int fd)
static int Ftruncate(int fildes, off_t offset)
Ftruncate() conforms to POSIX.1-2001 ftruncate()
static long Telldir(DIR *dirp)
Telldir() conforms to POSIX.1-2001 telldir()
static bool isXrootdDir(DIR *dirp)
static int Access(const char *path, int amode)
Access() conforms to POSIX.1-2001 access()
static DIR * Opendir(const char *path)
Opendir() conforms to POSIX.1-2001 opendir()
static int Fsync(int fildes)
Fsync() conforms to POSIX.1-2001 fsync()
static long long Getxattr(const char *path, const char *name, void *value, unsigned long long size)
static long long QueryOpaque(const char *path, char *buff, int blen)
static int Statfs(const char *path, struct statfs *buf)
static int Readdir64_r(DIR *dirp, struct dirent64 *entry, struct dirent64 **result)
static ssize_t Read(int fildes, void *buf, size_t nbyte)
Read() conforms to POSIX.1-2001 read()
static int Fstat(int fildes, struct stat *buf)
Fstat() conforms to POSIX.1-2001 fstat()
static off_t Lseek(int fildes, off_t offset, int whence)
Lseek() conforms to POSIX.1-2001 lseek()
static int Open(const char *path, int oflag, mode_t mode=0, XrdPosixCallBack *cbP=0)
static ssize_t Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset)
Pwrite() conforms to POSIX.1-2001 pwrite()
static int Truncate(const char *path, off_t offset)
Telldir() conforms to POSIX.1-2001 telldir()