95 char pEnv[MAXPATHLEN+65];
100 csMutex.Lock(); n = cSeq++; csMutex.UnLock();
101 snprintf(pEnv,
sizeof(pEnv),
"%s=%s%s#%d.creds",
103 Path = index(pEnv,
'=')+1;
115 int credFile::cSeq = 0;
126 {snprintf(Pname,
sizeof(Pname),
"TPC job %d: ", num);
127 Pname[
sizeof(Pname)-1] = 0;
134 int XrdOfsTPCProg::ExportCreds(
const char *path)
136 static const int oOpts = (O_CREAT | O_TRUNC | O_WRONLY);
137 static const mode_t oMode = (S_IRUSR | S_IWUSR);
143 fd = XrdSysFD_Open(path, oOpts, oMode);
173 for (n = 0; n <
Cfg.xfrMax; n++)
192 const char *clID, *at;
193 char *questSrc, *questLfn, *questDst;
195 bool isIPv4, doMon =
Cfg.tpcMon != 0;
203 gettimeofday(&monInfo.
begT, 0);
209 {gettimeofday(&monInfo.
endT, 0);
210 if ((questSrc = index(Job->
Info.
Key,
'?'))) *questSrc = 0;
212 if ((questLfn = index(Job->
Info.
Lfn,
'?'))) *questLfn = 0;
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 =
'?';
308 {Args[aNum++] =
"-C";
309 Args[aNum++] = cksVal;
315 {sprintf(sBuff,
"%d",
static_cast<int>(Job->
Info.
Str));
317 Args[aNum++] = sBuff;
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);
void * XrdOfsTPCProgRun(void *pp)
int stat(const char *path, struct stat *buf)
int unlink(const char *path)
ssize_t write(int fildes, const void *buf, size_t nbyte)
static const char * Domain(const char **eText=0)
XrdOfsTPCJob * Done(XrdOfsTPCProg *pgmP, const char *eTxt, int rc)
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 RunDone(XrdOucStream &cmd) const
int Run(XrdOucStream *Sp, const char *argV[], int argc=0, const char *envV[]=0) const
int Setup(const char *prog, XrdSysError *errP=0, int(*Proc)(XrdOucStream *, char **, int)=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)