63 const char *xLfn,
const char *xCks,
64 char *Buff,
int Blen,
int strms,
66 const char *sprt,
const char *tprt,
76 if (!cKey || !xSrc || Blen <= 0)
return "!Invalid cgi parameters.";
80 if (!cgiHost(
Info, xSrc))
return "!Invalid source specification.";
84 n = snprintf(bP, Blen,
"%s=%s&%s=%s%s%s",
tpcKey, cKey,
tpcSrc,
88 if (Blen > 1) n = snprintf(bP, Blen,
"&%s=%s",
tpcLfn, xLfn);
92 if (Blen > 1) n = snprintf(bP, Blen,
"&%s=%s",
tpcCks, xCks);
97 if (Blen > 1) n = snprintf(bP, Blen,
"&%s=%d",
tpcStr, strms);
102 if (Blen > 1) n = snprintf(bP, Blen,
"&%s=%s",
tpcDlg, iHst);
107 if (Blen > 1) n = snprintf(bP, Blen,
"&%s=%s",
tpcSpr, sprt);
112 if (Blen > 1) n = snprintf(bP, Blen,
"&%s=%s",
tpcTpr, tprt);
117 if (Blen > 1) n = snprintf(bP, Blen,
"&%s=1",
tpcPsh);
122 const char* cgistr = dlgon ?
"&%s=1" :
"&%s=0";
123 if (Blen > 1) n = snprintf(bP, Blen, cgistr,
tpcDlgOn);
129 return (n > Blen ?
"!Unable to generate full cgi." : Buff);
137 char *Buff,
int Blen)
145 if (!cKey || !xDst || Blen <= 0)
return "!Invalid cgi parameters.";
149 if (!cgiHost(
Info, xDst))
return "!Invalid destination specification.";
156 if (Blen > 1) n = snprintf(bP, Blen,
"&%s=%d",
tpcTtl, xTTL);
161 return (n > Blen ?
"!Unable to generate full cgi." : Buff);
169 char *Buff,
int Blen)
175 if (!cKey || !cOrg || Blen <= 0)
return "!Invalid cgi parameters.";
179 n = snprintf(Buff, Blen,
"%s=%s&%s=%s",
tpcKey, cKey,
tpcOrg, cOrg);
183 return (n > Blen ?
"!Unable to generate full cgi." : Buff);
190 bool XrdOucTPC::cgiHost(tpcInfo &
Info,
const char *hSpec)
192 const char *Colon, *hName;
199 if (!(hName = index(hSpec,
'@'))) hName = hSpec;
202 if (n >=
int(
sizeof(
Info.User)))
return false;
204 strncpy(
Info.User, hSpec, n);
Info.User[n] = 0;
209 if (*hName !=
'[') Colon = hName;
210 else if (!(Colon = index(hName,
']')))
return 0;
215 if ((Colon = index(Colon,
':')))
217 if (n >=
int(
sizeof(hBuff)))
return false;
219 strncpy(hBuff, hName, n); hBuff[n] = 0; hName = hBuff;
225 if ((hName = hAddr.
Name()))
Info.hName = strdup(hName);
240 if (!cgi) {*Buff = 0;
return 0;}
244 while(*cgi ==
'&' && *cgi) cgi++;
248 if (!*cgi) {*Buff = 0;
return 0;}
254 do{bgi = cgi; eqs =
false;
255 while(*cgi !=
'\t' && *cgi)
256 {
if (*cgi ==
'=') eqs =
true;
259 if (*bgi && eqs && strncmp(bgi,
"tpc.", 4) && strncmp(bgi,
"xrd.", 4)
260 && strncmp(bgi,
"xrdcl.", 4))
262 if (bP != Buff && Blen > 0) {*bP++ =
'&'; Blen--;}
263 if (xlen > Blen) xlen = Blen;
264 strncpy(bP, bgi, xlen);
268 while(*cgi && *cgi ==
'\t') cgi++;
269 }
while(*cgi && Blen > 2);
const char * Name(const char *eName=0, const char **eText=0)
const char * Set(const char *hSpec, int pNum=PortInSpec)
static const char * tpcSpr
static const char * tpcDst
static const char * tpcDlgOn
static const char * cgiC2Dst(const char *cKey, const char *xSrc, const char *xLfn, const char *xCks, char *Buff, int Blen, int strms=0, const char *iHst=0, const char *sprt=0, const char *tprt=0, bool dlgon=false, bool push=false)
static const char * cgiC2Src(const char *cKey, const char *xDst, int xTTL, char *Buff, int Blen)
static const char * tpcTpr
static const char * tpcLfn
static int copyCGI(const char *cgi, char *Buff, int Blen)
static const char * tpcKey
static const char * tpcDlg
static const char * tpcSrc
static const char * tpcOrg
static const char * cgiD2Src(const char *cKey, const char *cOrg, char *Buff, int Blen)
static const char * tpcSgi
static const char * tpcTtl
static const char * tpcCks
static const char * tpcPsh
static const char * tpcStr