37 #include <sys/types.h>
38 #include <sys/param.h>
50 #define XrdOssTAMP(dst, src) \
51 while(*src) {*dst = (*src == '/' ? xChar : *src); src++; dst++;}; *dst='\0'
57 char XrdOssPath::h2c[16] = {
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
58 '8',
'9',
'A',
'B',
'C',
'D',
'E',
'F'};
60 char XrdOssPath::pfnPfx[60] = {
'\0'};
67 {
".anew",
".fail",
".lock",
".pin",
68 ".mmap",
".mkeep",
".mlock",
".pfn", 0};
81 for (i = 0; oldP[i] && oldP[i] !=
xChar; i++) *dst++ = oldP[i];
85 if ((i +
static_cast<int>(strlen(newP))) >= dln)
return -ENAMETOOLONG;
105 if (!path) lnklen = lbsz;
107 {
if ((lnklen = readlink(path, lbuf, lbsz-1)) < 0) *lbuf = 0;
108 else *(lbuf+lnklen) = 0;
110 else {lnklen = strlen(path);
111 if (lnklen >= lbsz) lnklen = lbsz-1;
112 strncpy(lbuf, path, lnklen); *(lbuf+lnklen) =
'\0';
117 if (lnklen >= 4 && lbuf[lnklen-1] ==
xChar && (pP=posCname(lbuf,lnklen,j)))
119 if (pP != lbuf) *(pP-1) =
'\0';
125 if ((pP = index(lbuf,
xChar))) *pP =
'\0';
126 else *(lbuf+1) =
'\0';
141 strcpy(pbuff, inPath); strcpy(cgbuff, cgrp); strcat(cgbuff,
"/");
142 do {
if ((dirP = index(pP,
'/')) && !strcmp(dirP+1, cgbuff))
break;
149 {dirP = pbuff + strlen(inPath) - 1;
150 strcpy(dirP+1, cgbuff);
157 if ((n = strlen(cgrp)) > 15) sfx[2] =
'f';
158 else sfx[2] = h2c[n];
159 n = (dirP - pbuff + 1) & 0xff;
160 sfx[1] = h2c[(n & 0x0f)]; n = n >> 4; sfx[0] = h2c[(n & 0x0f)];
165 return strdup(pbuff);
175 static int mySeq = 0;
183 {
const char *pap =
Path;
184 if ((
Info.Plen +
static_cast<int>(strlen(
Path))) >= blen)
185 {*buff =
'\0';
return 0;}
208 *bP++ = h2c[((Seq.bin>>4) & 0x0f)];
209 *bP++ = h2c[( Seq.bin & 0x0f)];
213 bP = bin2hex(Seq.chr,
sizeof(Seq.chr), bP+strlen(pfnPfx));
229 if (!(pP = (
char *) index(src,
xChar))|| dln <= (
int)strlen(pP))
return 0;
231 while(*pP) {*dst++ = (*pP ==
xChar ?
'/' : *pP); pP++;}
242 char *lbuf,
int lbsz)
245 char *xP, lnkbuff[MAXPATHLEN+64];
250 if (!lbuf) {lbuf = lnkbuff; lbsz = MAXPATHLEN;}
254 if (!path) lnklen = lbsz;
255 else if (!
lstat(path, &lbuff) && S_ISLNK(lbuff.st_mode))
256 lnklen = readlink(path, lbuf, lbsz);
261 if (lnklen < 4 || lbuf[lnklen-1] !=
xChar)
262 {strcpy(
Cache,
"public");
return (lnklen < 0 ? 0 : lnklen);}
266 if (!(xP = posCname(lbuf, lnklen, j))) strcpy(
Cache,
"public");
267 else {strncpy(
Cache, xP, j); *(
Cache+j)=
'\0';}
288 else if ((chkWhat & chkMM ) == chkMM) {iBeg = 1; iEnd = int(
sfxMemL);}
291 else {iBeg = 0; iEnd = 0;}
295 if ((Dot = (
char *) rindex(
Path,
'.')))
296 for (i = iBeg; i < iEnd; i++)
if (!strcmp(Dot,
Sfx[i]))
return theSfx(i+1);
306 int oneMore = (*eP ==
xChar);
310 do {eP--;}
while(*eP !=
'/');
311 if (oneMore)
do {eP--;}
while(*eP !=
'/');
322 char *XrdOssPath::bin2hex(
char *inbuff,
int dlen,
char *buff)
326 for (i = 0; i < dlen; i++) {
327 *buff++ = h2c[(inbuff[i] >> 4) & 0x0f];
328 *buff++ = h2c[ inbuff[i] & 0x0f];
345 size_t plen =
sizeof(pfnPfx) - 4*
sizeof(xT.binT) - 1;
347 if (plen < 1)
return 1;
351 time_t theTime = time(0);
352 xT.binT =
static_cast<int>(theTime);
353 bp = bin2hex(xT.chrT,
sizeof(xT.binT), bp);
355 pid_t pid = getpid();
356 xT.binT =
static_cast<int> (pid);
357 bp = bin2hex(xT.chrT,
sizeof(xT.binT), bp);
375 char *XrdOssPath::posCname(
char *lbuf,
int lbsz,
int &cnsz)
377 char *eP, *xP = lbuf + lbsz - 4;
383 if ((xCode = strtol(xP, &eP, 16)) && *eP ==
xChar
384 && (cnsz = xCode & 0x0f) && (k = xCode>>4) && k < (lbsz-cnsz))
386 if (cnsz == 15 && *(xP+cnsz) !=
'/' && (eP = index(xP+cnsz,
'/'))
#define XrdOssTAMP(dst, src)
int stat(const char *path, struct stat *buf)
int lstat(const char *path, struct stat *buf)
const XrdNetSockAddr * NetAddr()
static int Encode(const XrdNetSockAddr *sadr, char *buff, int blen, int port=-1)
static int getCname(const char *path, char *Cache, char *lbuf=0, int lbsz=0)
static int Convert(char *dst, int dln, const char *oldP, const char *newP)
static const char * Extract(char *path, char *lbuf, int &lbsz)
static theSfx pathType(const char *Path, int chkWhat=chkAll)
static char * genPFN(fnInfo &Info, char *buff, int blen, const char *Path=0)
static const char * Sfx[sfxNum]
static void Trim2Base(char *eP)
static char * genPath(const char *inPath, const char *cgrp, char *sfx)
static const int minSNbsz
static const int maxSNlen