61extern XrdOfsTPCConfig
Cfg;
95char pEnv[MAXPATHLEN+65];
97 credFile(XrdOfsTPCJob *jP)
100 csMutex.Lock(); n = cSeq++; csMutex.UnLock();
101 snprintf(pEnv,
sizeof(pEnv),
"%s=%s%s#%d.creds",
103 Path = index(pEnv,
'=')+1;
107 ~credFile() {
if (Path)
unlink(Path);}
110static XrdSysMutex csMutex;
115int credFile::cSeq = 0;
126 {snprintf(Pname,
sizeof(Pname),
"TPC job %d: ", num);
127 Pname[
sizeof(Pname)-1] = 0;
134int XrdOfsTPCProg::ExportCreds(
const char *path)
136static const int oOpts = (O_CREAT | O_TRUNC | O_WRONLY);
137static const mode_t oMode = (S_IRUSR | S_IWUSR);
143 fd = XrdSysFD_Open(path, oOpts, oMode);
152 if (
write(fd, Job->Info.Crd, Job->Info.Csz) < 0)
173 for (n = 0; n <
Cfg.xfrMax; n++)
175 if (pgmIdle->Prog.Setup(
Cfg.XfrProg, &
OfsEroute))
return 0;
192 const char *clID, *at;
193 char *questSrc, *questLfn, *questDst;
195 bool isIPv4 =
false, doMon =
Cfg.tpcMon != 0;
203 gettimeofday(&monInfo.
begT, 0);
209 {gettimeofday(&monInfo.
endT, 0);
210 if ((questSrc = index(Job->Info.Key,
'?'))) *questSrc = 0;
211 monInfo.
srcURL = Job->Info.Key;
212 if ((questLfn = index(Job->Info.Lfn,
'?'))) *questLfn = 0;
213 monInfo.
dstURL = Job->Info.Lfn;
215 if (Job->Info.Str) monInfo.
strm = Job->Info.Str;
218 clID = Job->Info.Org;
219 if (clID && (at = index(clID,
'@')) && !index(at+1,
'.'))
222 {snprintf(clBuff,
sizeof(clBuff),
"%s%s", clID, dName);
228 if ((questDst = index(Job->Info.Dst,
'?'))) *questDst = 0;
230 if (questDst) *questDst =
'?';
231 Cfg.tpcMon->Report(monInfo);
232 if (questLfn) *questLfn =
'?';
233 if (questSrc) *questSrc =
'?';
236 Job = Job->Done(
this, eRec, rc);
261 if (!(pgmP = pgmIdle)) {rc = 0;
return 0;}
272 pgmIdle = pgmP->Next;
284 const char *Args[6], *eVec[6], **envArg;
285 char *lP, *Colon, *cksVal, sBuff[8], *
tident = Job->Info.Org;
286 char *Quest = index(Job->Info.Key,
'?');
291 if (cFile.Path && (rc = ExportCreds(cFile.Path)))
292 {strcpy(eRec,
"Copy failed; unable to pass credentials.");
299 {
if (Quest) *Quest = 0;
301 if (Quest) *Quest =
'?';
306 cksVal = (Job->Info.Cks ? Job->Info.Cks :
Cfg.cksType);
308 {Args[aNum++] =
"-C";
309 Args[aNum++] = cksVal;
315 {sprintf(sBuff,
"%d",
static_cast<int>(Job->Info.Str));
317 Args[aNum++] = sBuff;
322 Args[aNum++] = Job->Info.Key;
323 Args[aNum++] = Job->Info.Dst;
328 snprintf(tidBuff,
sizeof(tidBuff),
"XRD_TIDENT=%s",
tident);
337 {snprintf(sprBuff,
sizeof(sprBuff),
"XRDTPC_SPROT=%s", Job->Info.Spr);
345 {snprintf(tprBuff,
sizeof(tprBuff),
"XRDTPC_TPROT=%s", Job->Info.Tpr);
353 {snprintf(rpxBuff,
sizeof(rpxBuff),
"XRD_CPTARGET=%s", Job->Info.Rpx);
359 if (cFile.Path) eVec[i++] = cFile.pEnv;
364 if ((rc = Prog.Run(&JobStream, Args, aNum, envArg)))
365 {strcpy(eRec,
"Copy failed; unable to start job.");
375 while((lP = JobStream.GetLine()))
376 {
if (!strcmp(lP,
"!-!IPv4")) isIPv4 =
true;
377 if ((Colon = index(lP,
':')) && *(Colon+1) ==
' ')
378 {strncpy(eRec, Colon+2,
sizeof(eRec)-1);
379 eRec[
sizeof(eRec)-1] = 0;
386 if ((rc = Prog.RunDone(JobStream)) < 0) rc = -rc;
387 DEBUG(Pname <<
"ended with rc=" <<rc);
391 if (rc && !(*eRec)) sprintf(eRec,
"Copy failed with return code %d", rc);
399 }
else Job->Info.Success();
void * XrdOfsTPCProgRun(void *pp)
XrdSysTrace OfsTrace("ofs")
static const char * Domain(const char **eText=0)
static XrdOfsTPCProg * Start(XrdOfsTPCJob *jP, int &rc)
XrdOfsTPCProg(XrdOfsTPCProg *Prev, int num, int errMon)
static const char * credPath()
virtual int Stat(const char *path, struct stat *buff, int opts=0, XrdOucEnv *envP=0)=0
virtual int Unlink(const char *path, int Opts=0, XrdOucEnv *envP=0)=0
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
void Say(const char *text1, const char *text2=0, const char *txt3=0, const char *text4=0, const char *text5=0, const char *txt6=0)
static int Run(pthread_t *, void *(*proc)(void *), void *arg, int opts=0, const char *desc=0)