37#include <sys/syscall.h>
71#if defined _IO_ERR_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
73 fp->_flags |= _IO_ERR_SEEN;
74#elif defined __sferror || defined __APPLE__ || defined __DragonFly__ || defined __FreeBSD__ || defined __ANDROID__
80#elif defined __UCLIBC__
81 fp->__modeflags |= __FLAG_ERROR;
85 #error "Unsupported platform! Please report it as a bug."
94#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
96 fp->_flags |= _IO_EOF_SEEN;
97#elif defined __sferror || defined __APPLE__ || defined __DragonFly__ || defined __ANDROID__
103#elif defined __UCLIBC__
104 fp->__modeflags |= __FLAG_EOF;
106 (void)
fseek(fp, 0L, SEEK_END);
118 char *myPath, buff[2048];
122 if (!path) {errno = EFAULT;
return -1;}
126 if (!(myPath =
XrootPath.URL(path, buff,
sizeof(buff))))
127 return Xunix.Access( path, amode);
131 return Xroot.Access(myPath, amode);
143int XrdPosix_Acl(
const char *path,
int cmd,
int nentries,
void *aclbufp)
146 ?
Xunix.Acl(
"/tmp", cmd,nentries,aclbufp)
147 :
Xunix.Acl(path, cmd,nentries,aclbufp));
179 return (
Xroot.myFD(fildes) ?
Xroot.Close(fildes) :
Xunix.Close(fildes));
192 return (
Xroot.isXrootdDir(dirp) ?
Xroot.Closedir(dirp)
193 :
Xunix.Closedir(dirp));
207 return XrdPosix_Open(path, O_WRONLY | O_CREAT | O_TRUNC, mode);
219 int nullfd = fileno(stream);
227 return Xunix.Fclose(stream);
242 if (
Xroot.myFD(fd))
return 0;
244 theArg = va_arg(ap,
void *);
246 return Xunix.Fcntl64(fd, cmd, theArg);
261 return (
Xroot.myFD(fildes) ?
Xroot.Fsync(fildes)
262 :
Xunix.Fsync(fildes));
270#if defined(__linux__) || defined(__GNU__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))
273ssize_t XrdPosix_Fgetxattr (
int fd,
const char *name,
void *value,
size_t size)
275 if (
Xroot.myFD(fd)) {errno = ENOTSUP;
return -1;}
276 return Xunix.Fgetxattr(fd, name, value, size);
292 if (!stream || !
Xroot.myFD(fileno(stream)))
293 return Xunix.Fflush(stream);
295 return Xroot.Fsync(fileno(stream));
303#define ISMODE(x) !strcmp(mode, x)
309 char *myPath, buff[2048];
315 if (!(myPath =
XrootPath.URL(path, buff,
sizeof(buff))))
316 return Xunix.Fopen64(path, mode);
324 | O_CREAT | O_APPEND;
329 | O_CREAT | O_APPEND;
330 else {errno = EINVAL;
return 0;}
339 if (!(stream = fdopen(fd, mode)))
340 {erc = errno;
Xroot.Close(fd); errno = erc;}
358 int fd = fileno(stream);
360 if (!
Xroot.myFD(fd))
return Xunix.Fread(ptr, size, nitems, stream);
362 bytes =
Xroot.Read(fd, ptr, size*nitems);
366 if (bytes > 0 && size) rc = bytes/size;
367 else if (bytes < 0)
fseterr(stream);
385 if (!
Xroot.myFD(fileno(stream)))
386 return Xunix.Fseek( stream, offset, whence);
388 return (
Xroot.Lseek(fileno(stream), offset, whence) < 0 ? -1 : 0);
403 if (!
Xroot.myFD(fileno(stream)))
404 return Xunix.Fseeko64(stream, offset, whence);
406 return (
Xroot.Lseek(fileno(stream), offset, whence) < 0 ? -1 : 0);
421 return (
Xroot.myFD(fildes)
422 ?
Xroot.Fstat(fildes, buf)
423#
if defined(__linux__) and defined(_STAT_VER)
424 :
Xunix.Fstat64(_STAT_VER, fildes, (
struct stat64 *)buf));
431int XrdPosix_FstatV(
int ver,
int fildes,
struct stat *buf)
433 return (
Xroot.myFD(fildes)
434 ?
Xroot.Fstat(fildes, buf)
436 :
Xunix.Fstat64(ver, fildes, (
struct stat64 *)buf));
455 return (
Xroot.myFD(fildes) ?
Xroot.Fsync(fildes)
456 :
Xunix.Fsync(fildes));
471 if (!
Xroot.myFD(fileno(stream)))
return Xunix.Ftell(stream);
473 return static_cast<long>(
Xroot.Lseek(fileno(stream), 0, SEEK_CUR));
488 if (!
Xroot.myFD(fileno(stream)))
return Xunix.Ftello64(stream);
490 return Xroot.Lseek(fileno(stream), 0, SEEK_CUR);
505 return (
Xroot.myFD(fildes) ?
Xroot.Ftruncate (fildes, offset)
506 :
Xunix.Ftruncate64(fildes, offset));
518 size_t bytes, rc = 0;
519 int fd = fileno(stream);
521 if (!
Xroot.myFD(fd))
return Xunix.Fwrite(ptr, size, nitems, stream);
523 bytes =
Xroot.Write(fd, ptr, size*nitems);
527 if (bytes > 0 && size) rc = bytes/size;
538#if defined(__linux__) || defined(__GNU__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))
541ssize_t XrdPosix_Getxattr (
const char *path,
const char *name,
void *value,
size_t size)
543 char *myPath, buff[2048];
545 if (!(myPath =
XrootPath.URL(path, buff,
sizeof(buff))))
546 return Xunix.Getxattr(path, name, value, size);
548 return Xroot.Getxattr(myPath, name, value, size);
557#if defined(__linux__) || defined(__GNU__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))
560ssize_t XrdPosix_Lgetxattr (
const char *path,
const char *name,
void *value,
size_t size)
562 if (
XrootPath.URL(path, 0, 0)) {errno = ENOTSUP;
return -1;}
563 return Xunix.Lgetxattr(path, name, value, size);
579 return (
Xroot.myFD(fildes) ?
Xroot.Lseek (fildes, offset, whence)
580 :
Xunix.Lseek64(fildes, offset, whence));
592 char *myPath, buff[2048];
596 if (!path) {errno = EFAULT;
return -1;}
600 return (!(myPath =
XrootPath.URL(path, buff,
sizeof(buff)))
601#
if defined(__linux__) and defined(_STAT_VER)
602 ?
Xunix.Lstat64(_STAT_VER, path, (
struct stat64 *)buf)
606 :
Xroot.Stat(myPath, buf));
618 char *myPath, buff[2048];
622 if (!path) {errno = EFAULT;
return -1;}
626 if (!(myPath =
XrootPath.URL(path, buff,
sizeof(buff))))
627 return Xunix.Mkdir(path, mode);
631 return Xroot.Mkdir(myPath, mode);
643 char *myPath, buff[2048];
649 if (!path) {errno = EFAULT;
return -1;}
653 if (!(myPath =
XrootPath.URL(path, buff,
sizeof(buff))))
654 {
if (!(oflag & O_CREAT))
return Xunix.Open64(path, oflag);
656 mode = va_arg(ap,
int);
658 return Xunix.Open64(path, oflag, (mode_t)mode);
663 if (!(oflag & O_CREAT))
return Xroot.Open(myPath, oflag);
665 mode = va_arg(ap,
int);
667 return Xroot.Open(myPath, oflag, (mode_t)mode);
679 char *myPath, buff[2048];
683 if (!path) {errno = EFAULT;
return 0;}
687 if (!(myPath =
XrootPath.URL(path, buff,
sizeof(buff))))
688 return Xunix.Opendir(path);
692 return Xroot.Opendir(myPath);
707 :
Xunix.Pathconf(path, name));
722 return (
Xroot.myFD(fildes) ?
Xroot.Pread (fildes, buf, nbyte, offset)
723 :
Xunix.Pread64(fildes, buf, nbyte, offset));
738 return (
Xroot.myFD(fildes) ?
Xroot.Pwrite (fildes, buf, nbyte, offset)
739 :
Xunix.Pwrite64(fildes, buf, nbyte, offset));
754 return (
Xroot.myFD(fildes) ?
Xroot.Read(fildes, buf, nbyte)
755 :
Xunix.Read(fildes, buf, nbyte));
770 return (
Xroot.myFD(fildes) ?
Xroot.Readv(fildes,
iov, iovcnt)
771 :
Xunix.Readv(fildes,
iov, iovcnt));
788 return (
Xroot.isXrootdDir(dirp) ?
Xroot.Readdir(dirp)
789 :
Xunix.Readdir(dirp));
797 return (
Xroot.isXrootdDir(dirp) ?
Xroot.Readdir64(dirp)
798 :
Xunix.Readdir64(dirp));
813 return (
Xroot.isXrootdDir(dirp) ?
Xroot.Readdir_r(dirp,entry,result)
814 :
Xunix.Readdir_r(dirp,entry,result));
822 return (
Xroot.isXrootdDir(dirp) ?
Xroot.Readdir64_r(dirp,entry,result)
823 :
Xunix.Readdir64_r(dirp,entry,result));
835 char *oldPath, buffold[2048], *newPath, buffnew[2048];
839 if (!oldpath || !newpath) {errno = EFAULT;
return -1;}
843 if (!(oldPath =
XrootPath.URL(oldpath, buffold,
sizeof(buffold)))
844 || !(newPath =
XrootPath.URL(newpath, buffnew,
sizeof(buffnew))))
845 return Xunix.Rename(oldpath, newpath);
849 return Xroot.Rename(oldPath, newPath);
864 return (
Xroot.isXrootdDir(dirp) ?
Xroot.Rewinddir(dirp)
865 :
Xunix.Rewinddir(dirp));
877 char *myPath, buff[2048];
881 if (!path) {errno = EFAULT;
return -1;}
885 if (!(myPath =
XrootPath.URL(path, buff,
sizeof(buff))))
886 return Xunix.Rmdir(path);
890 return Xroot.Rmdir(myPath);
905 (
Xroot.isXrootdDir(dirp) ?
Xroot.Seekdir(dirp, loc)
906 :
Xunix.Seekdir(dirp, loc));
918 char *myPath, buff[2048];
922 if (!path) {errno = EFAULT;
return -1;}
926 return (!(myPath =
XrootPath.URL(path, buff,
sizeof(buff)))
927#
if defined(__linux__) and defined(_STAT_VER)
928 ?
Xunix.Stat64(_STAT_VER, path, (
struct stat64 *)buf)
932 :
Xroot.Stat(myPath, buf));
943 if (
char *myPath =
XrootPath.URL(path, buff,
sizeof(buff))) {
954 return syscall(SYS_statx,
dirfd, path, flags, mask, stx);
970 char *myPath, buff[2048];
974 if (!path) {errno = EFAULT;
return -1;}
978 return ((myPath =
XrootPath.URL(path, buff,
sizeof(buff)))
979 ?
Xroot.Statfs(myPath, buf)
992 char *myPath, buff[2048];
996 if (!path) {errno = EFAULT;
return -1;}
1000 return ((myPath =
XrootPath.URL(path, buff,
sizeof(buff)))
1001 ?
Xroot.Statvfs(myPath, buf)
1017 return (
Xroot.isXrootdDir(dirp) ?
Xroot.Telldir(dirp)
1018 :
Xunix.Telldir(dirp));
1030 char *myPath, buff[2048];
1034 if (!path) {errno = EFAULT;
return -1;}
1038 if (!(myPath =
XrootPath.URL(path, buff,
sizeof(buff))))
1039 return Xunix.Truncate64(path, offset);
1043 return Xroot.Truncate(myPath, offset);
1055 char *myPath, buff[2048];
1059 if (!path) {errno = EFAULT;
return -1;}
1063 if (!(myPath =
XrootPath.URL(path, buff,
sizeof(buff))))
1064 return Xunix.Unlink(path);
1068 return Xroot.Unlink(myPath);
1083 return (
Xroot.myFD(fildes) ?
Xroot.Write(fildes, buf, nbyte)
1084 :
Xunix.Write(fildes, buf, nbyte));
1099 return (
Xroot.myFD(fildes) ?
Xroot.Writev(fildes,
iov, iovcnt)
1100 :
Xunix.Writev(fildes,
iov, iovcnt));
1110 return (0 !=
XrootPath.URL(path, 0, 0));
int statvfs64(const char *path, struct statvfs64 *buf)
int statfs64(const char *path, struct statfs64 *buf)
int stat64(const char *path, struct stat64 *buf)
int XrdPosix_Statfs(const char *path, struct statfs *buf)
int XrdPosix_Truncate(const char *path, off_t offset)
ssize_t XrdPosix_Read(int fildes, void *buf, size_t nbyte)
int XrdPosix_Closedir(DIR *dirp)
int XrdPosix_Fsync(int fildes)
ssize_t XrdPosix_Readv(int fildes, const struct iovec *iov, int iovcnt)
static void fseterr(FILE *fp)
int XrdPosix_isMyPath(const char *path)
long long XrdPosix_Ftello(FILE *stream)
int XrdPosix_Open(const char *path, int oflag,...)
void XrdPosix_Rewinddir(DIR *dirp)
ssize_t XrdPosix_Pread(int fildes, void *buf, size_t nbyte, off_t offset)
int XrdPosix_Readdir64_r(DIR *dirp, struct dirent64 *entry, struct dirent64 **result)
int XrdPosix_Close(int fildes)
void XrdPosix_Seekdir(DIR *dirp, long loc)
int XrdPosix_Rmdir(const char *path)
int XrdPosix_Chdir(const char *path)
int XrdPosix_Stat(const char *path, struct stat *buf)
int XrdPosix_Rename(const char *oldpath, const char *newpath)
int XrdPosix_Fcntl(int fd, int cmd,...)
int XrdPosix_Fseek(FILE *stream, long offset, int whence)
long XrdPosix_Ftell(FILE *stream)
static void fseteof(FILE *fp)
int XrdPosix_Readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)
int XrdPosix_Mkdir(const char *path, mode_t mode)
int XrdPosix_Fflush(FILE *stream)
DIR * XrdPosix_Opendir(const char *path)
ssize_t XrdPosix_Writev(int fildes, const struct iovec *iov, int iovcnt)
XrdPosixXrootPath XrootPath
long XrdPosix_Telldir(DIR *dirp)
ssize_t XrdPosix_Pwrite(int fildes, const void *buf, size_t nbyte, off_t offset)
int XrdPosix_Lstat(const char *path, struct stat *buf)
int XrdPosix_Creat(const char *path, mode_t mode)
int XrdPosix_Statx(int dirfd, const char *path, int flags, unsigned int mask, XrdSysStatx *stx)
int XrdPosix_Statvfs(const char *path, struct statvfs *buf)
int XrdPosix_Acl(const char *path, int cmd, int nentries, void *aclbufp)
int XrdPosix_Fstat(int fildes, struct stat *buf)
off_t XrdPosix_Lseek(int fildes, off_t offset, int whence)
ssize_t XrdPosix_Write(int fildes, const void *buf, size_t nbyte)
FILE * XrdPosix_Fopen(const char *path, const char *mode)
size_t XrdPosix_Fwrite(const void *ptr, size_t size, size_t nitems, FILE *stream)
int XrdPosix_Fclose(FILE *stream)
int XrdPosix_Fdatasync(int fildes)
int XrdPosix_Ftruncate(int fildes, long long offset)
long XrdPosix_Pathconf(const char *path, int name)
int XrdPosix_Unlink(const char *path)
char * XrdPosix_URL(const char *path, char *buff, int blen)
struct dirent64 * XrdPosix_Readdir64(DIR *dirp)
size_t XrdPosix_Fread(void *ptr, size_t size, size_t nitems, FILE *stream)
int XrdPosix_Fseeko(FILE *stream, long long offset, int whence)
int XrdPosix_Access(const char *path, int amode)
struct dirent * XrdPosix_Readdir(DIR *dirp)
POSIX interface to XRootD with some extensions, as noted.
static const int isStream
static void Stat2Statx(const struct stat &stat, XrdSysStatx &statx)