38 #include <sys/param.h>
39 #include <sys/types.h>
56 char XrdFrmAdmin::ckAttr(
int What,
const char *Lfn,
char *Pfn,
int Pfnsz)
59 const char *Msg = (What & mkLF ?
"mark " : (What & mkMF ?
"mmap " :
"pin "));
69 {Emsg(errno,
"ckAttr ", Msg, Lfn);
return 0;}
73 if ((
Stat.st_mode & S_IFMT) != S_IFDIR)
74 {
if (!Opt.All)
return 'f';
75 Emsg(ENOTDIR,
"ckAttr ", Msg,
"files in ", Lfn);
81 if (Opt.All || Opt.Recurse)
return 'd';
85 sprintf(Buff,
"%s ALL files in directory ", Msg);
86 Buff[0] = toupper(*Buff);
88 return (Resp ==
'a' ?
'a' : 0);
95 int XrdFrmAdmin::mkMark(
const char *Lfn)
99 char Pfn[MAXPATHLEN+8], Resp;
101 int ec = 0, Adj = (Opt.MPType ==
'p' ? 0 : -113);
105 if (!(Resp = ckAttr(mkLF, Lfn, Pfn,
sizeof(Pfn)-8)))
return 1;
106 if (Resp ==
'a')
return 0;
118 while((sP = fP->
Get(
ec,1)))
135 int XrdFrmAdmin::mkMmap(
const char *Lfn)
141 char Pfn[MAXPATHLEN+8], Resp;
147 if (!(Resp = ckAttr(mkMF, Lfn, Pfn,
sizeof(Pfn)-8)))
return 1;
148 if (Resp ==
'a')
return 0;
161 {
if ((doSet ? !memInfo.
Set(Pfn) : !memInfo.
Del(Pfn))) numFiles++;
168 while((sP = fP->
Get(
ec,1)))
170 && (doSet ? !memInfo.
Set(bFn) : !memInfo.
Del(bFn))) numFiles++;
186 int XrdFrmAdmin::mkPin(
const char *Lfn)
192 char Pfn[MAXPATHLEN+8], Resp;
198 if (!(Resp = ckAttr(mkPF, Lfn, Pfn,
sizeof(Pfn)-8)))
return 1;
199 if (Resp ==
'a')
return 0;
204 else if (Opt.KeepTime)
205 {pinInfo.
Attr.
pinTime =
static_cast<long long>(Opt.KeepTime);
209 doSet = (Opt.ktAlways || Opt.KeepTime ? 1 : 0);
214 {
if ((doSet ? !pinInfo.
Set(Pfn) : !pinInfo.
Del(Pfn))) numFiles++;
221 while((sP = fP->
Get(
ec,1)))
223 && (doSet ? !pinInfo.
Set(bFn) : !pinInfo.
Del(bFn))) numFiles++;
241 int XrdFrmAdmin::mkFile(
int What,
const char *
Path,
const char *Data,
int DLen)
243 static const mode_t
Mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH;
248 char *pfn, baseFN[1038], tempFN[1038];
254 else {*baseFN =
'.'; pfn = baseFN+1;}
258 if (What & isPFN) strcpy(pfn,
Path);
263 if (
stat(pfn, &
Stat)) {Emsg(errno,
"stat pfn ",pfn);
return 0;}
267 strcat(baseFN, (What & mkLF ?
".lock" :
".pin"));
268 strcpy(tempFN, baseFN);
269 strcat(tempFN,
".TEMP");
273 if ((What & mkPF) && !Opt.ktAlways && !Opt.KeepTime)
274 {
if (
unlink(baseFN)) {Emsg(errno,
"remove pfn ", tempFN);
return 0;}
280 if ((theFD =
open(tempFN, O_RDWR | O_CREAT | O_TRUNC,
Mode)) < 0)
281 {Emsg(errno,
"open pfn ", tempFN);
return 0;}
286 {
do {rc =
write(theFD, Data, DLen);
287 if (rc < 0) {
if (errno != EINTR)
break;}
288 else {Data += rc; DLen -= rc;}
290 if (rc< 0) {Emsg(errno,
"write pfn ", tempFN);
297 Uid = (int(Opt.Uid) < 0 ?
Stat.st_uid : Opt.Uid);
298 Gid = (int(Opt.Gid) < 0 ?
Stat.st_gid : Opt.Gid);
299 if (
Stat.st_uid != Uid ||
Stat.st_gid != Gid)
300 {
do {rc = fchown(theFD, Uid, Gid);}
while(rc && errno == EINTR);
301 if (rc) {Emsg(errno,
"set uid/gid for pfn ", tempFN);
308 if (What & mkLF) {Tid =
Stat.st_mtime + (Opt.MPType ==
'p' ? +113 : -113);}
309 else {Tid = (DLen || Opt.ktAlways ? time(0) : Opt.KeepTime);
311 {
do {rc = fchmod(theFD,
Mode);}
while(rc && errno == EINTR);
312 if (rc) {Emsg(errno,
"set mode for pfn ", tempFN);
322 if (
rename(tempFN, baseFN))
323 {Emsg(errno,
"rename pfn ", tempFN);
334 int XrdFrmAdmin::mkLock(
const char *Lfn)
338 char Pfn[MAXPATHLEN+8], Resp;
344 if (!(Resp = mkStat(mkLF, Lfn, Pfn,
sizeof(Pfn)-8)))
return 1;
345 if (Resp ==
'a')
return 0;
350 {
if (mkFile(mkLF|isPFN, Pfn)) numFiles++;
357 while((sP = fP->
Get(
ec,1)))
373 char XrdFrmAdmin::mkStat(
int What,
const char *Lfn,
char *Pfn,
int Pfnsz)
376 const char *Msg = (What & mkLF ?
"create lock file for "
377 :
"create pin file for ");
378 const char *Msh = (What & mkLF ?
"create lock files in "
379 :
"create pin files in ");
389 {Emsg(errno,
"create ", Msg, Lfn);
return 0;}
393 if ((
Stat.st_mode & S_IFMT) != S_IFDIR)
394 {
if (!Opt.All)
return 'f';
395 Emsg(ENOTDIR,
"create ", Msh, Lfn);
401 if (Opt.All || Opt.Recurse)
return 'd';
405 Msg = (What & mkLF ?
"Apply makelf to ALL files in directory "
406 :
"Apply pin to ALL files in directory ");
408 return (Resp ==
'a' ?
'a' : 0);
int stat(const char *path, struct stat *buf)
int open(const char *path, int oflag,...)
int unlink(const char *path)
int rename(const char *oldpath, const char *newpath)
ssize_t write(int fildes, const void *buf, size_t nbyte)
static char Ask(char dflt, const char *Msg1, const char *Msg2="", const char *Msg3="")
static int Utime(const char *Path, time_t tVal)
static int updtCpy(const char *Pfn, int Adj)
static const char memKeep
static const char memLock
static const char pinKeep
static const char pinPerm
static const char pinIdle
int LocalPath(const char *oldp, char *newp, int newpsz)
static const int NoAutoDel
XrdFrmFileset * Get(int &rc, int noBase=0)
static const int Recursive
XrdOucNSWalk::NSEnt * baseFile()
int Del(const char *Path, int fd=-1)
int Set(const char *Path, int fd=-1)