37#include <sys/syscall.h>
72#if defined _IO_ERR_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
74 fp->_flags |= _IO_ERR_SEEN;
75#elif defined __sferror || defined __APPLE__ || defined __DragonFly__ || defined __FreeBSD__ || defined __ANDROID__
81#elif defined __UCLIBC__
82 fp->__modeflags |= __FLAG_ERROR;
86 #error "Unsupported platform! Please report it as a bug."
95#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
97 fp->_flags |= _IO_EOF_SEEN;
98#elif defined __sferror || defined __APPLE__ || defined __DragonFly__ || defined __ANDROID__
100 fp->_flags |= __SEOF;
104#elif defined __UCLIBC__
105 fp->__modeflags |= __FLAG_EOF;
107 (void)
fseek(fp, 0L, SEEK_END);
123 char unref[2049], filename[2049];
124 char *result = realpath(path,
nullptr);
127 strlcpy(filename, result,
sizeof(filename));
130 bzero(filename,
sizeof(filename));
131 bzero(unref,
sizeof(unref));
133 strlcpy(filename, path,
sizeof(filename));
138 while (readlink(filename, unref,
sizeof(unref)) > 0 && ++i < 10) {
139 strlcpy(filename, unref,
sizeof(filename));
140 bzero(unref,
sizeof(unref));
148 if (errno != EINVAL && errno != ENOENT)
151 size_t len = strlen(filename);
153 errno = ENAMETOOLONG;
156 strlcpy(resolved, filename, rsize);
167 char *myPath, buff[2048];
174 if (!(myPath =
XrootPath.
URL(unref, buff,
sizeof(buff))))
194int XrdPosix_Acl(
const char *path,
int cmd,
int nentries,
void *aclbufp)
199 if (res < 0)
return res;
201 ?
Xunix.
Acl(
"/tmp", cmd,nentries,aclbufp)
202 :
Xunix.
Acl(path, cmd,nentries,aclbufp));
218 if (res < 0)
return res;
266 return XrdPosix_Open(path, O_WRONLY | O_CREAT | O_TRUNC, mode);
278 int nullfd = fileno(stream);
303 theArg = va_arg(ap,
void *);
329#if defined(__linux__) || defined(__GNU__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))
332ssize_t XrdPosix_Fgetxattr (
int fd,
const char *name,
void *value,
size_t size)
334 if (
Xroot.
myFD(fd)) {errno = ENOTSUP;
return -1;}
351 if (!stream || !
Xroot.
myFD(fileno(stream)))
362#define ISMODE(x) !strcmp(mode, x)
368 char *myPath, buff[2048];
375 if (res < 0)
return 0;
379 if (!(myPath =
XrootPath.
URL(unref, buff,
sizeof(buff))))
388 | O_CREAT | O_APPEND;
393 | O_CREAT | O_APPEND;
394 else {errno = EINVAL;
return 0;}
403 if (!(stream = fdopen(fd, mode)))
422 int fd = fileno(stream);
426 bytes =
Xroot.
Read(fd, ptr, size*nitems);
430 if (bytes > 0 && size) rc = bytes/size;
431 else if (bytes < 0)
fseterr(stream);
452 return (
Xroot.
Lseek(fileno(stream), offset, whence) < 0 ? -1 : 0);
470 return (
Xroot.
Lseek(fileno(stream), offset, whence) < 0 ? -1 : 0);
486 return syscall(SYS_fstat, fildes, buf);
499 return syscall(SYS_fstat, fildes, buf);
520 if (!(flags & AT_SYMLINK_NOFOLLOW)) {
523 if (res < 0)
return res;
526 strncpy(unref, path, 2048);
528 if (
char *myPath =
XrootPath.
URL(unref, buff,
sizeof(buff))) {
534 return syscall(SYS_newfstatat,
dirfd, path, buf, flags);
537 return syscall(SYS_fstatat,
dirfd, path, buf, flags);
580 return static_cast<long>(
Xroot.
Lseek(fileno(stream), 0, SEEK_CUR));
597 return Xroot.
Lseek(fileno(stream), 0, SEEK_CUR);
625 size_t bytes, rc = 0;
626 int fd = fileno(stream);
634 if (bytes > 0 && size) rc = bytes/size;
645#if defined(__linux__) || defined(__GNU__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))
648ssize_t XrdPosix_Getxattr (
const char *path,
const char *name,
void *value,
size_t size)
650 char *myPath, buff[2048];
654 if (res < 0)
return res;
655 if (!(myPath =
XrootPath.
URL(unref, buff,
sizeof(buff))))
667#if defined(__linux__) || defined(__GNU__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))
670ssize_t XrdPosix_Lgetxattr (
const char *path,
const char *name,
void *value,
size_t size)
675 if (res < 0)
return res;
677 if (
XrootPath.
URL(unref, 0, 0)) {errno = ENOTSUP;
return -1;}
707 char *myPath, buff[2048];
711 if (!path) {errno = EFAULT;
return -1;}
720 return syscall(SYS_lstat, path, buf);
737 char *myPath, buff[2048];
741 if (res < 0)
return res;
745 if (!(myPath =
XrootPath.
URL(unref, buff,
sizeof(buff))))
762 char *myPath, buff[2048];
767 if (res < 0)
return res;
770 if (!(myPath =
XrootPath.
URL(unref, buff,
sizeof(buff))))
771 {
if (!(oflag & O_CREAT))
return Xunix.
Open64(unref, oflag);
773 mode = va_arg(ap,
int);
780 if (!(oflag & O_CREAT))
return Xroot.
Open(myPath, oflag);
782 mode = va_arg(ap,
int);
784 return Xroot.
Open(myPath, oflag, (mode_t)mode);
796 char *myPath, buff[2048];
801 if (res < 0)
return res;
803 if (!(myPath =
XrootPath.
URL(unref, buff,
sizeof(buff)))){
805 if (flag & (O_CREAT)) {
807 mode = va_arg(ap,
int);
811 return (syscall(SYS_openat,
dirfd, path, flag, (mode_t)mode));
819 if (!(flag & O_CREAT))
return Xroot.
Open(myPath, flag);
821 mode = va_arg(ap,
int);
823 return Xroot.
Open(myPath, flag, (mode_t)mode);
836 char *myPath, buff[2048];
840 if (res < 0)
return NULL;
844 if (!(myPath =
XrootPath.
URL(unref, buff,
sizeof(buff))))
866 if (res < 0)
return res;
997 char *oldPath, buffold[2048], *newPath, buffnew[2048];
1001 if (!oldpath || !newpath) {errno = EFAULT;
return -1;}
1005 if (!(oldPath =
XrootPath.
URL(oldpath, buffold,
sizeof(buffold)))
1006 || !(newPath =
XrootPath.
URL(newpath, buffnew,
sizeof(buffnew))))
1039 char *myPath, buff[2048];
1043 if (!path) {errno = EFAULT;
return -1;}
1047 if (!(myPath =
XrootPath.
URL(path, buff,
sizeof(buff))))
1084 if (res < 0)
return res;
1087 if (
char *myPath =
XrootPath.
URL(unref, buff,
sizeof(buff))) {
1093 return syscall(SYS_stat, path, buf);
1107 if (path && *path) {
1111 if (!(flags & AT_SYMLINK_NOFOLLOW)) {
1114 if (res < 0)
return res;
1116 strncpy(unref, path, 2048);
1118 if (
char *myPath =
XrootPath.
URL(unref, buff,
sizeof(buff))) {
1122 XrdSysStatxHelpers::Stat2Statx(st, *stx);
1126 int ret = syscall(SYS_statx,
dirfd, path, flags, mask, stx);
1148 char *myPath, buff[2048];
1153 if (res < 0)
return res;
1157 return ((myPath =
XrootPath.
URL(unref, buff,
sizeof(buff)))
1171 char *myPath, buff[2048];
1175 if (res < 0)
return res;
1179 return ((myPath =
XrootPath.
URL(unref, buff,
sizeof(buff)))
1209 char *myPath, buff[2048];
1213 if (res < 0)
return res;
1217 if (!(myPath =
XrootPath.
URL(unref, buff,
sizeof(buff))))
1234 char *myPath, buff[2048];
1238 if (res < 0)
return res;
1242 if (!(myPath =
XrootPath.
URL(unref, buff,
sizeof(buff))))
int statvfs64(const char *path, struct statvfs64 *buf)
int statfs64(const char *path, struct statfs64 *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)
int XrdPosix_Openat(int dirfd, const char *path, int flag,...)
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)
static ssize_t XrdResolveLink(const char *path, char *resolved, size_t rsize)
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)
int XrdPosix_FstatV(int ver, int fildes, struct stat *buf)
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_Fstatat(int dirfd, const char *path, struct stat *buf, int flags)
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)
Retv_Write(*) Write(Args_Write)
Retv_Close(*) Close(Args_Close)
Retv_Statfs64(*) Statfs64(Args_Statfs64)
Retv_Readv(*) Readv(Args_Readv)
Retv_Read(*) Read(Args_Read)
Retv_Getxattr(*) Getxattr(Args_Getxattr)
Retv_Fclose(*) Fclose(Args_Fclose)
Retv_Writev(*) Writev(Args_Writev)
Retv_Rmdir(*) Rmdir(Args_Rmdir)
Retv_Unlink(*) Unlink(Args_Unlink)
Retv_Readdir(*) Readdir(Args_Readdir)
Retv_Ftell(*) Ftell(Args_Ftell)
Retv_Fseeko64(*) Fseeko64(Args_Fseeko64)
Retv_Seekdir(*) Seekdir(Args_Seekdir)
Retv_Telldir(*) Telldir(Args_Telldir)
Retv_Truncate64(*) Truncate64(Args_Truncate64)
Retv_Lseek64(*) Lseek64(Args_Lseek64)
Retv_Pathconf(*) Pathconf(Args_Pathconf)
Retv_Rename(*) Rename(Args_Rename)
Retv_Open64(*) Open64(Args_Open64)
Retv_Mkdir(*) Mkdir(Args_Mkdir)
Retv_Opendir(*) Opendir(Args_Opendir)
Retv_Ftruncate64(*) Ftruncate64(Args_Ftruncate64)
Retv_Fseek(*) Fseek(Args_Fseek)
Retv_Readdir_r(*) Readdir_r(Args_Readdir_r)
Retv_Fgetxattr(*) Fgetxattr(Args_Fgetxattr)
Retv_Lgetxattr(*) Lgetxattr(Args_Lgetxattr)
Retv_Ftello64(*) Ftello64(Args_Ftello64)
Retv_Fcntl64(*) Fcntl64(Args_Fcntl64)
Retv_Pwrite64(*) Pwrite64(Args_Pwrite64)
Retv_Fopen64(*) Fopen64(Args_Fopen64)
Retv_Pread64(*) Pread64(Args_Pread64)
Retv_Readdir64(*) Readdir64(Args_Readdir64)
Retv_Closedir(*) Closedir(Args_Closedir)
Retv_Fwrite(*) Fwrite(Args_Fwrite)
Retv_Readdir64_r(*) Readdir64_r(Args_Readdir64_r)
Retv_Statvfs64(*) Statvfs64(Args_Statvfs64)
Retv_Fread(*) Fread(Args_Fread)
Retv_Fflush(*) Fflush(Args_Fflush)
Retv_Rewinddir(*) Rewinddir(Args_Rewinddir)
Retv_Chdir(*) Chdir(Args_Chdir)
Retv_Fsync(*) Fsync(Args_Fsync)
Retv_Acl(*) Acl(Args_Acl)
Retv_Access(*) Access(Args_Access)
char * URL(const char *path, char *buff, int blen)
void CWD(const char *path)
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 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 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 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 struct dirent64 * Readdir64(DIR *dirp)
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 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().