83{
84class openHelper
85 {public:
86 int FD;
87 openHelper() : FD(-1) {}
88 ~openHelper() {
if (FD >= 0)
close(FD);}
89 };
90}
91
92
93
94
95
98{
99 openHelper hOpen;
100 DIR *dirP;
101 int dirFD;
102
103
104
106
107
108
109 OPEN_AT(hOpen.FD, dirFD, path, O_RDONLY);
110
111
112
113 dirP = fdopendir(hOpen.FD);
114 if (!dirP) return (errno ? -errno : -ENOMSG);
115
116
117
119 hOpen.FD = -1;
120 return 0;
121}
122
123
124
125
126
129{
130 openHelper hOpen;
131 int dirFD;
132
133
134
136
137
138
139 OPEN_AT(hOpen.FD, dirFD, path, O_RDONLY);
140
141
142
144 hOpen.FD = -1;
145 return 0;
146}
147
148
149
150
151
153{
154 int dirFD;
155
156
157
159
160
161
162 if (unlinkat(dirFD, path, AT_REMOVEDIR)) return -errno;
163
164
165
166 return 0;
167}
168
169
170
171
172
175{
176 int dirFD;
177
178
179
181
182
183
184 if (fstatat(dirFD, path, &buf, 0)) return -errno;
185
186
187
189
190
191
192 return 0;
193}
194
195
196
197
198
200{
202 int dirFD;
203
204
205
207
208
209
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;
213
214
215
216 if ((
Stat.st_mode & S_IFMT) != S_IFLNK)
217 {if (unlinkat(dirFD, path, 0)) return -errno;
220 return 0;
221 }
222
223
224
225 char lnkbuff[MAXPATHLEN+64];
226 int lnklen, retc;
227 if ((lnklen = readlinkat(dirFD, path, lnkbuff, sizeof(lnkbuff)-1)) < 0)
228 return -errno;
229
230
231
232 lnkbuff[lnklen] = '\0';
234 else if (
unlink(lnkbuff) && errno != ENOENT)
235 {retc = -errno;
236 OssEroute.
Emsg(
"Unlink",retc,
"unlink symlink target",lnkbuff);
237 return -retc;
238 }
239
240
241
243 {char *lP = lnkbuff+lnklen-1;
247 }
249 }
250
251
252
253 if (unlinkat(dirFD, path, 0)) return -errno;
254
255
256
257 return 0;
258}
#define BOILER_PLATE(dfObj, fd)
#define OPEN_AT(dst, dfd, p, f)
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)