35 #include <sys/param.h>
55 static const int ptEnts = 8;
65 ProtoTable
protoTab[ptEnts] = {{
"root://", 7}, {
"xroot://", 8},
66 {
"roots://", 8}, {
"xroots://", 9}};
78 char *plist = 0, *colon = 0, *subs = 0, *lp = 0, *tp = 0;
81 cwdPath = 0; cwdPlen = 0;
83 if (!(plist = getenv(
"XROOTD_VMP")) || !*plist)
return;
84 pBase = strdup(plist);
90 if ((colon = rindex(tp, (
int)
':')) && *(colon+1) ==
'/')
91 {
if (!(subs = index(colon, (
int)
'='))) subs = 0;
92 else if (*(subs+1) ==
'/') {*subs =
'\0'; subs++;}
93 else if (*(subs+1)) aOK = 0;
94 else {*subs =
'\0'; subs = (
char*)
"";}
99 while(*(colon+1) ==
'/') colon++;
100 xplist =
new xpath(xplist, tp, colon, subs);
101 }
else DMSG(
"Path",
"Invalid XROOTD_VMP token '" <<tp <<
'"');
113 while((xpnow = xplist))
114 {xplist = xplist->next;
delete xpnow;}
133 if (i >= ptEnts)
return false;
145 if (cwdPath) free(cwdPath);
146 cwdPlen = strlen(path);
147 if (*(path+cwdPlen-1) ==
'/') cwdPath = strdup(path);
148 else if (cwdPlen <= MAXPATHLEN)
149 {
char buff[MAXPATHLEN+8];
151 *(buff+cwdPlen ) =
'/';
152 *(buff+cwdPlen+1) =
'\0';
153 cwdPath = strdup(buff); cwdPlen++;
167 const char *urlP, *slash, *quest;
168 char *outP, *lfnP, lfnBuff[1032];
169 int cgiLen, lfnLen, pfnLen, pfxLen, n;
189 if (notOurs)
return inP;
194 if (!(slash = index(urlP,
'/')))
return inP;
196 pfxLen = slash - inP;
201 if ((quest = index(slash,
'?')))
202 {cgiLen = strlen(quest);
203 pfnLen = quest - slash;
206 pfnLen = strlen(slash);
213 char *pfnBP = (
char *)alloca(pfnLen + 5 + pfxLen + n + 1);
217 strncpy(pfnBP, slash, pfnLen);
222 else {
char *bP = pfnBP+pfnLen;
223 memcpy(bP,
"?src=", 5); bP += 5;
224 strncpy(bP, inP, pfxLen);
227 {
if (*(quest+1) !=
'&') *bP++ =
'&';
244 if (ponly) pfxLen = cgiLen = 0;
248 lfnLen = strlen(lfnP);
249 if (!(relP = (
char *)malloc(pfxLen + lfnLen + cgiLen + 1)))
257 if (pfxLen) {strncpy(outP, inP, pfxLen); outP += pfxLen;}
259 if (cgiLen) strcpy(outP+lfnLen, quest);
263 DEBUG(who <<
' ' <<pfnBP <<
" pfn2lfn " <<lfnBuff);
276 struct xpath *xpnow = xplist;
278 int plen, pathlen = 0;
290 if (path[0] ==
'.' && path[1] ==
'/' && cwdPath)
291 {pathlen = (strlen(path) + cwdPlen - 2);
292 if (pathlen < (
int)
sizeof(tmpbuff))
293 {strcpy(tmpbuff, cwdPath);
294 strcpy(tmpbuff+cwdPlen, path+2);
295 path = (
const char *)tmpbuff;
301 while(*(path+1) ==
'/') path++;
303 if (!strncmp(path, xpnow->path, xpnow->plen))
break;
304 else xpnow = xpnow->next;
308 if (!xpnow)
return 0;
309 if (!buff)
return (
char *)1;
313 if (!pathlen) pathlen = strlen(path);
314 plen = pathlen + xpnow->servln + 2;
315 if (xpnow->nath) plen = plen - xpnow->plen + xpnow->nlen;
316 if (plen >= blen)
return 0;
321 strcat(buff, xpnow->server);
323 if (xpnow->nath) {strcat(buff, xpnow->nath); path += xpnow->plen;}
324 if (*path !=
'/') strcat(buff,
"/");
char * GetToken(char **rest=0, int lowcase=0)
static bool AddProto(const char *proto)
char * URL(const char *path, char *buff, int blen)
static const char * P2L(const char *who, const char *inP, char *&relP, bool ponly=false)
void CWD(const char *path)
ProtoTable protoTab[ptEnts]