45 bool XrdPssUrlInfo::MapID =
false;
53 int copyCGI(
const char *cgi,
char *Buff,
int Blen)
57 if (!cgi) {*Buff = 0;
return 0;}
61 while(*cgi ==
'&' && *cgi) cgi++;
65 if (*cgi == 0) {*Buff = 0;
return 0;}
70 const char *beg = cgi;
71 do {
if (!strncmp(cgi,
"xrd.", 4) || !strncmp(cgi,
"xrdcl.", 6))
72 {
int n = cgi - beg - 1;
74 {
if (n >= Blen) {*bP = 0;
return bP - Buff;}
76 bP += n; Blen -= n; *bP = 0;
78 if ((beg = index(cgi,
'&')))
80 if (bP == Buff) beg++;
83 if ((cgi = index(cgi,
'&'))) cgi++;
92 {strncpy(bP, beg, Blen);
110 const char *xtra,
bool addusrcgi,
bool addident)
111 :
Path(path), CgiUsr(
""), CgiUsz(0), CgiSsz(0),
sidP(0),
114 const char *amp1=
"", *amp2 =
"";
124 {
if (addusrcgi && !(CgiUsr =
envP->
Env(CgiUsz))) CgiUsr =
"";
127 {entityID = secP->
ueid;
135 if (!tident) tident =
"unk.0:0@host";
139 if (*xtra && *xtra !=
'&') amp2 =
"&";
140 if (CgiUsz) amp1 =
"&";
143 {CgiSsz = snprintf(CgiSfx,
sizeof(CgiSfx),
144 "%spss.tid=%s%s%s", amp1, tident, amp2, xtra);
146 if (*xtra) CgiSsz = snprintf(CgiSfx,
sizeof(CgiSfx),
"%s%s", amp1, xtra);
161 if (!CgiUsz && (!CgiSsz || forXrd))
169 int n = CgiUsz + (forXrd ? CgiSsz : 0) + 1;
170 if (n >= blen)
return false;
171 *buff++ =
'?'; blen--;
178 {
if (forXrd) n = copyCGI(CgiUsr, buff, blen);
180 strcpy(buff, CgiUsr);
182 buff += n; blen -= n;
187 if (forXrd && CgiSsz)
188 {
if (CgiSsz >= blen)
return false;
189 strcpy(buff, CgiSfx);
204 const char *amp = (*cgi ==
'&' ?
"" :
"&");
205 int blen =
sizeof(CgiSfx) - CgiSsz;
207 if (blen <= cgiln)
return false;
208 int n = snprintf(&CgiSfx[CgiSsz], blen,
"%s%s", amp, cgi);
209 if (n >= blen)
return false;
220 const char *atP, *colon;
224 if (MapID && eIDvalid)
225 {
const char *fmt = (entityID & 0xf0000000 ?
"%x@" :
"U%x@");
226 snprintf(theID,
sizeof(theID), fmt, entityID);
232 if (tid == 0) tid = tident;
233 if ((colon = index(tid,
':')) && (atP = index(colon+1,
'@')))
234 {
int n = atP - colon;
235 if (n <= (
int)
sizeof(theID))
237 strncpy(theID+1, colon+1, n);
const XrdSecEntity * secEnv() const
XrdPssUrlInfo(XrdOucEnv *envP, const char *path, const char *xtra="", bool addusrcgi=true, bool addident=true)
bool Extend(const char *cgi, int cgiln)
void setID(const char *tid=0)
bool addCGI(const char *prot, char *buff, int blen)
static bool is4Xrootd(const char *pname)
const char * tident
Trace identifier always preset.
unsigned int ueid
Unique ID of entity instance.