34 #include <sys/param.h>
60 #define BOILER_PLATE(fd, dfObj) \
61 {if (!(dfObj.DFType() & XrdOssDF::DF_isDir)) return -ENOTDIR;\
62 if (!path || *path == '/') return -XRDOSS_E8027;\
63 if ((fd = dfObj.getFD()) < 0) return -XRDOSS_E8002;\
66 #define BOILER_PLATE(dfObj,fd) return -ENOTSUP;
72 #define OPEN_AT(dst, dfd, p, f)\
73 dst = openat(dfd, p, f|O_CLOEXEC);\
74 if (dst < 0) return -errno;
76 #define OPEN_AT(dst, dfd, p, f)\
77 dst = openat(dfd, p, f); \
78 if (dst >= 0) fcntl(dst, F_SETFD, FD_CLOEXEC);\
87 openHelper() : FD(-1) {}
88 ~openHelper() {
if (FD >= 0)
close(FD);}
109 OPEN_AT(hOpen.FD, dirFD, path, O_RDONLY);
113 dirP = fdopendir(hOpen.FD);
114 if (!dirP)
return (errno ? -errno : -ENOMSG);
139 OPEN_AT(hOpen.FD, dirFD, path, O_RDONLY);
162 if (unlinkat(dirFD, path, AT_REMOVEDIR))
return -errno;
184 if (fstatat(dirFD, path, &buf, 0))
return -errno;
210 if (fstatat(dirFD, path, &
Stat, AT_SYMLINK_NOFOLLOW))
211 return (errno == ENOENT ? 0 : -errno);
212 if ((
Stat.st_mode & S_IFMT) == S_IFDIR)
return -EISDIR;
216 if ((
Stat.st_mode & S_IFMT) != S_IFLNK)
217 {
if (unlinkat(dirFD, path, 0))
return -errno;
225 char lnkbuff[MAXPATHLEN+64];
227 if ((lnklen = readlinkat(dirFD, path, lnkbuff,
sizeof(lnkbuff)-1)) < 0)
232 lnkbuff[lnklen] =
'\0';
234 else if (
unlink(lnkbuff) && errno != ENOENT)
236 OssEroute.
Emsg(
"Unlink",retc,
"unlink symlink target",lnkbuff);
243 {
char *lP = lnkbuff+lnklen-1;
253 if (unlinkat(dirFD, path, 0))
return -errno;
#define BOILER_PLATE(dfObj, fd)
#define OPEN_AT(dst, dfd, p, f)
int stat(const char *path, struct stat *buf)
int unlink(const char *path)
int OpenRO(XrdOssDF &atDir, const char *path, XrdOucEnv &env, XrdOssDF *&ossDF)
int Opendir(XrdOssDF &atDir, const char *path, XrdOucEnv &env, XrdOssDF *&ossDF)
static const int At_dInfo
int Unlink(XrdOssDF &atDir, const char *path)
int Stat(XrdOssDF &atDir, const char *path, struct stat &buf, int opts=0)
int Remdir(XrdOssDF &atDir, const char *path)
static void DevInfo(struct stat &buf, bool limits=false)
static void Adjust(dev_t devid, off_t size)
virtual const char * getTID()
static void Trim2Base(char *eP)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)