40#include <sys/resource.h>
44#include "XrdVersion.hh"
119#define Duplicate(x,y) if (y) free(y); y = strdup(x)
121#define TS_Xeq(x,m) if (!strcmp(x,var)) return m(Config, Eroute);
123#define TS_String(x,m) if (!strcmp(x,var)) {Duplicate(val,m); return 0;}
125#define TS_List(x,m,v) if (!strcmp(x,var)) \
126 {m.Insert(new XrdOucPList(val, v); return 0;}
128#define TS_Char(x,m) if (!strcmp(x,var)) {m = val[0]; return 0;}
130#define TS_Add(x,m,v,s) if (!strcmp(x,var)) {m |= (v|s); return 0;}
131#define TS_Ade(x,m,v,s) if (!strcmp(x,var)) {m |= (v|s); Config.Echo(); return 0;}
132#define TS_Rem(x,m,v,s) if (!strcmp(x,var)) {m = (m & ~v) | s; return 0;}
134#define TS_Set(x,m,v) if (!strcmp(x,var)) {m = v; Config.Echo(); return 0;}
136#define xrdmax(a,b) (a < b ? b : a)
208 prPBits = (
long long)sysconf(_SC_PAGESIZE);
242 static const int maxFD = 1048576;
251 Eroute.
Say(
"++++++ Storage system initialization started.");
257 ConfigFN = (configfn && *configfn ? strdup(configfn) : 0);
261 if (getrlimit(RLIMIT_NOFILE, &rlim))
262 {Eroute.
Emsg(
"Config", errno,
"get fd limit");
263 rlim.rlim_cur = maxFD;
265 else {
if (rlim.rlim_max == RLIM_INFINITY)
266 {rlim.rlim_cur = maxFD;
269 if (rlim.rlim_cur != rlim.rlim_max)
270 {rlim.rlim_cur = rlim.rlim_max;
275 {
if (setrlimit(RLIMIT_NOFILE, &rlim))
276 Eroute.
Emsg(
"Config", errno,
"set fd limit");
294 FDLimit =
static_cast<rlim_t
>(getdtablesize()) < rlim.rlim_cur ? getdtablesize() : rlim.rlim_cur;
299 }
else {
FDFence =
static_cast<int>(rlim.rlim_cur)>>1;
329 Solitary = ((val = getenv(
"XRDREDIRECT")) && !strcmp(val,
"Q"));
330 pfcMode = (envP && (val = envP->
Get(
"oss.runmode")) && !strcmp(val,
"pfc"));
331 {
const char *m1 = (
Solitary ?
"standalone " : 0);
332 const char *m2 = (
pfcMode ?
"pfc " : 0);
333 if (m1 || m2) Eroute.
Say(
"++++++ Configuring ", m1, m2,
"mode . . .");
366 if (NoGo) Eroute.
Emsg(
"Config",
"space initialization failed");
376 if (!(val = getenv(
"XRDOSSCSCAN")) || strcmp(val,
"off"))
378 (
void *)&
cscanint, 0,
"space scan")))
379 Eroute.
Emsg(
"Config", retc,
"create space scan thread");
397 val = (NoGo ? (
char *)
"failed." : (
char *)
"completed.");
398 Eroute.
Say(
"------ Storage system initialization ", val);
406#define XrdOssConfig_Val(base, opt) \
407 (Have ## base ? " oss." #opt " " : ""), \
408 (Have ## base ? base : ""), \
409 (Have ## base ? "\n" : "")
411#define XrdOssConfig_Vop(base, opt, optchk0, opt1, opt2, optchk1, opt3, opt4) \
412 (Have ## base ? " oss." #opt " " : ""), \
413 (Have ## base ? (optchk0 ? opt1 : opt2) : ""), \
414 (Have ## base ? (optchk1 ? opt3 : opt4) : ""), \
415 (Have ## base ? base : ""), \
416 (Have ## base ? "\n" : "")
420 char buff[4096], *cloc;
430 int HaveN2N_Lib = (
N2N_Lib != 0);
435 snprintf(buff,
sizeof(buff),
"Config effective %s oss configuration:\n"
436 " oss.alloc %lld %d %d\n"
437 " oss.spacescan %d\n"
438 " oss.fdlimit %d %d\n"
439 " oss.maxsize %lld\n"
447 " oss.xfr %d deny %d keep %d",
475 {Eroute.
Say(
" oss.space ", fp->
Name(),
491 const unsigned long long conFlags =
498 unsigned long long oflag, pflag;
517 {oflag = pflag = fp->
Flag();
523 if (oflag != pflag) fp->
Set(pflag);
543 unsigned long long flags = 0;
555 {flags |= fp->
Flag();
568#if !defined(_POSIX_MAPPED_FILES)
570 {Eroute.
Say(
"Config warning: memory mapped files not supported; "
571 "feature disabled.");
580#elif !defined(_POSIX_MEMLOCK)
582 {Eroute.
Say(
"Config warning: memory locked files not supported; "
583 "feature disabled.");
634 XrdOucStream Config(&Eroute, getenv(
"XRDINSTANCE"), &myEnv,
"=====> ");
639 {Eroute.
Say(
"Config warning: config file not specified; defaults assumed.");
646 {Eroute.
Emsg(
"Config", errno,
"open config file",
ConfigFN);
649 Config.Attach(cfgFD);
650 static const char *cvec[] = {
"*** oss plugin config:", 0 };
651 Config.Capture(cvec);
655 while((var = Config.GetMyFirstWord()))
656 {
if (!strncmp(var,
"oss.", 4))
657 {
if (
ConfigXeq(var+4, Config, Eroute)) {Config.Echo(); NoGo = 1;}}
658 else if (!strcmp(var,
"all.export")
659 &&
xpath(Config, Eroute)) {Config.Echo(); NoGo = 1;}
664 if ((retc = Config.LastError()))
665 NoGo = Eroute.
Emsg(
"Config", retc,
"read config file",
ConfigFN);
696 if ((fp =
SPList.First()))
699 bool zAssign =
false;
702 else {zAssign =
true; what =
"assign space ";}
703 const char *grp = fp->
Name();
705 while(fsg) {
if (!strcmp(fsg->
group,grp))
break; fsg = fsg->
next;}
706 if (!fsg) Eroute.
Say(
"Config warning: unable to ", what, grp,
707 " to ", fp->
Path(),
"; space not defined.");
710 if (zAssign)
SPList.Default(
static_cast<unsigned long long>(
spAssign));
718 struct stat statbuff;
719 char Pfn[MAXPATHLEN+1+8], *Slash;
727 while(
stat(Pfn, &statbuff))
728 {
if (!(Slash = rindex(Pfn,
'/')) || Slash == Pfn)
return;
742 unsigned long long &flags,
int noMSS)
764 Eroute.
Say(
"Config warning: 'all.export ",
Path,
765 " nocheck mig r/w' allows file inconsistentcy!");
776 unsigned long long flags;
777 int noMSS, needRSS = 0, NoGo = 0;
783 noMSS = ((tp = getenv(
"XRDREDIRECT"))
784 && (!strcmp(tp,
"R") || !strcmp(tp,
"M"))) |
Solitary;
811 if (!noMSS && !
RSSCmd && What)
812 {Eroute.
Emsg(
"Config", fp->
Path(), What,
813 "export attribute but rsscmd not specified.");
815 }
else if (What) needRSS = 1;
819 fp->
Set(flags); fp = fp->
Next();
834 {Eroute.
Say(
"Config warning: 'stagecmd' ignored; no stageable paths present.");
841 {Eroute.
Say(
"Config warning: 'rsscmd' ignored; no path exported with "
842 "check, dread, or rcreate.");
850 Eroute.
Say(
"++++++ Remote Storage System interface initialization started.");
862 {
const int AMode = S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH;
867 getenv(
"XRDADMINPATH"), AMode);
874 if ((tp = getenv(
"XRDOFSEVENTS")))
875 {
char sebuff[MAXPATHLEN+8];
883 tp = (NoGo ? (
char *)
"failed." : (
char *)
"completed.");
884 Eroute.
Say(
"------ Remote Storage System interface initialization ", tp);
896 int numt, retc, NoGo = 0;
901 while(*tp && *tp ==
' ') tp++;
903 do {tp++;}
while(*tp ==
' ');
910 if ((sp = index(
StageCmd,
' '))) *sp =
'\0';
928 Eroute.
Emsg(
"Config", retc,
"create staging thread");
956 const char *stName2 =
"?XrdOssStatInfoInit2";
995 StatsDev(StatsDev *dP, dev_t dn) : Next(dP), st_dev(dn) {}
1000 StatsDev *dP1st = 0, *dP, *dPp;
1002 char LPath[MAXPATHLEN+1], PPath[MAXPATHLEN+1], *cP;
1011 {strcpy(LPath, fP->
Path());
1013 if (
stat(PPath, &
Stat) && (cP = rindex(LPath,
'/')))
1018 while(dP && dP->st_dev !=
Stat.st_dev) dP = dP->Next;
1023 lenDP += strlen(LPath) + strlen(PPath);
numDP++;
1024 dP1st =
new StatsDev(dP1st,
Stat.st_dev);
1025 }
while ((fP = fP->
Next()));
1037 while(dP) {dPp = dP; dP = dP->Next;
delete dPp;}
1045 char *Slash, pP[MAXPATHLEN+1];
1049 while((Slash = rindex(lP+1,
'/')))
1057 if (Slash) *Slash =
'/';
1066 char myVar[80], buff[2048], *val;
1091 if ((nosubs = !strcmp(var,
"stagemsg"))) myEnv = Config.SetEnv(0);
1096 strlcpy(myVar, var,
sizeof(myVar));
1102 if (!Config.GetRest(buff,
sizeof(buff)))
1103 {Eroute.
Emsg(
"Config",
"arguments too long for", var);
1104 if (nosubs) Config.SetEnv(myEnv);
1111 if (nosubs) Config.SetEnv(myEnv);
1116 {Eroute.
Emsg(
"Config",
"no value for directive", var);
1133 Eroute.
Say(
"Config warning: ignoring unknown directive '",var,
"'.");
1165 if (!(val = Config.GetWord()))
1166 {Eroute.
Emsg(
"Config",
"alloc minfree not specified");
return 1;}
1167 if (strcmp(val,
"*") &&
1170 if ((val = Config.GetWord()))
1171 {
if (strcmp(val,
"*") &&
1172 XrdOuca2x::a2i(Eroute,
"alloc headroom",val,&hdrm,0,100))
return 1;
1174 if ((val = Config.GetWord()))
1175 {
if (strcmp(val,
"*") &&
1176 XrdOuca2x::a2i(Eroute,
"alloc fuzz", val, &fuzz, 0, 100))
return 1;
1208 if (!(rc =
xspace(Config, Eroute, &isXA)))
1209 {
if (isXA) Eroute.
Say(
"Config warning: 'oss.cache' is deprecated; "
1210 "use 'oss.space' instead!");
1211 else {Eroute.
Say(
"Config failure: non-xa spaces are no longer "
1235 if (!(val = Config.GetWord()))
1236 {Eroute.
Emsg(
"Config",
"cachescan not specified");
return 1;}
1282 int fence = 0, FDHalf =
FDLimit>>1;
1284 if (!(val = Config.GetWord()))
1285 {Eroute.
Emsg(
"Config",
"fdlimit fence not specified");
return 1;}
1287 if (!strcmp(val,
"*"))
FDFence = FDHalf;
1288 else {
if (
XrdOuca2x::a2i(Eroute,
"fdlimit fence",val,&fence,0))
return 1;
1289 FDFence = (fence < FDHalf ? fence : FDHalf);
1292 while(Config.GetWord()) {}
1316 if (!(val = Config.GetWord()))
1317 {Eroute.
Emsg(
"Config",
"maxsize value not specified");
return 1;}
1318 if (
XrdOuca2x::a2sz(Eroute,
"maxsize", val, &msz, 1024*1024))
return 1;
1347 int i, j, V_check=-1, V_preld = -1, V_on=-1;
1348 long long V_max = 0;
1350 static struct mmapopts {
const char *opname;
int otyp;
1351 const char *opmsg;} mmopts[] =
1354 {
"preload", 1,
"memfile preload"},
1355 {
"check", 2,
"memfile check"},
1356 {
"max", 3,
"memfile max"}};
1357 int numopts =
sizeof(mmopts)/
sizeof(
struct mmapopts);
1359 if (!(val = Config.GetWord()))
1360 {Eroute.
Emsg(
"Config",
"memfile option not specified");
return 1;}
1363 {
for (i = 0; i < numopts; i++)
1364 if (!strcmp(val, mmopts[i].opname))
break;
1366 Eroute.
Say(
"Config warning: ignoring invalid memfile option '",val,
"'.");
1367 else {
if (mmopts[i].otyp > 1 && !(val = Config.GetWord()))
1368 {Eroute.
Emsg(
"Config",
"memfile",mmopts[i].opname,
1369 "value not specified");
1372 switch(mmopts[i].otyp)
1373 {
case 1: V_preld = 1;
1375 case 2:
if (!strcmp(
"xattr",val)
1376 || !strcmp(
"lock", val)
1377 || !strcmp(
"map", val)
1378 || !strcmp(
"keep", val)) V_check=1;
1379 else {Eroute.
Emsg(
"Config",
1380 "mmap check argument not xattr");
1384 case 3: j = strlen(val);
1385 if (val[j-1] ==
'%')
1388 val, &j, 1, 1000))
return 1;
1391 mmopts[i].opmsg, val, &V_max,
1392 10*1024*1024))
return 1;
1394 default: V_on = 0;
break;
1396 val = Config.GetWord();
1423 char *val, parms[1040];
1427 if (!(val = Config.GetWord()) || !val[0])
1428 {Eroute.
Emsg(
"Config",
"namelib not specified");
return 1;}
1437 if (!Config.GetRest(parms,
sizeof(parms)))
1438 {Eroute.
Emsg(
"Config",
"namelib parameters too long");
return 1;}
1440 N2N_Parms = (*parms ? strdup(parms) : 0);
1469 if (*(pP->
Path()) ==
'/')
return 0;
1473 if (*(pP->
Path()) ==
'*')
1480 Eroute.
Emsg(
"Config",
"Unsupported export -", pP->
Path());
1510 static const long long m16 = 16777216LL;
1512 long long lim = 1048576;
1513 int depth, qeq = 0, qsz = 128;
1515 if (!(val = Config.GetWord()))
1516 {Eroute.
Emsg(
"Config",
"preread depth not specified");
return 1;}
1518 if (!strcmp(val,
"on")) depth = 3;
1519 else if (
XrdOuca2x::a2i(Eroute,
"preread depth",val,&depth,0, 1024))
1522 while((val = Config.GetWord()))
1523 {
if (!strcmp(val,
"limit"))
1524 {
if (!(val = Config.GetWord()))
1525 {Eroute.
Emsg(
"Config",
"preread limit not specified");
1531 else if (!strcmp(val,
"qsize"))
1532 {
if (!(val = Config.GetWord()))
1533 {Eroute.
Emsg(
"Config",
"preread qsize not specified");
1539 {Eroute.
Emsg(
"Config",
"preread qsize must be >= depth");
1543 else {Eroute.
Emsg(
"Config",
"invalid preread option -",val);
return 1;}
1546 if (lim <
prPSize || !qsz) depth = 0;
1548 {qsz = qsz/(depth/2+1);
1549 if (qsz < depth) qsz = depth;
1582 bool isAsgn, isStar;
1586 if (!(val = Config.GetWord()))
1587 {Eroute.
Emsg(
"Config",
"space name not specified");
return 1;}
1589 {Eroute.
Emsg(
"Config",
"excessively long space name - ",val);
return 1;}
1594 if (!(val = Config.GetWord()) || !(*val))
1595 {Eroute.
Emsg(
"Config",
"space path not specified");
return 1;}
1599 if (((isAsgn = !strcmp(
"assign",val)) || ! strcmp(
"default",val)) && !isCD)
1600 return xspace(Config, Eroute, grp.
c_str(), isAsgn);
1605 if ((isStar = val[k] ==
'*')) val[k--] = 0;
1606 else while(k > 0 && val[k] ==
'/') val[k--] = 0;
1608 if (k >= MAXPATHLEN || val[0] !=
'/' || (k < 2 && !isStar))
1609 {Eroute.
Emsg(
"Config",
"invalid space path - ", val);
return 1;}
1614 do {k = fn.
replace(
"/./",
"/");}
while(k);
1615 do {k = fn.
replace(
"//",
"/");}
while(k);
1621 {
if ((val = Config.GetWord()))
1622 {
if (strcmp(
"xa", val))
1623 {Eroute.
Emsg(
"Config",
"invalid cache option - ",val);
return 1;}
1625 }
else {*isCD = 0; sInfo.
isXA =
false;}
1627 if ((val = Config.GetWord()) && !strcmp(
"chkmount", val))
1628 {
if (!(val = Config.GetWord()))
1629 {Eroute.
Emsg(
"Config",
"chkmount ID not specified");
return 1;}
1631 {Eroute.
Emsg(
"Config",
"excessively long mount name - ",val);
1636 if ((val = Config.GetWord()))
1637 {
if (!strcmp(
"nofail", val)) sInfo.
noFail =
true;
1638 else {Eroute.
Emsg(
"Config",
"invalid space option - ",val);
1658 int dFD, rc, snum = 0;
1659 bool chkPfx, failed =
false;
1661 if (basepath.endswith(
'/')) chkPfx =
false;
1662 else {
int pos = basepath.rfind(
'/');
1663 pfx = &basepath[pos+1];
1664 basepath.keep(0, pos+1);
1668 if ((dFD=
open(basepath.c_str(),O_DIRECTORY)) < 0 || !(dirP=fdopendir(dFD)))
1669 {Eroute.
Emsg(
"Config",errno,
"open space directory",fn.
c_str());
return 1;}
1673 {
if (!strcmp(dp->d_name,
".") || !strcmp(dp->d_name,
"..")
1674 || (chkPfx && strncmp(dp->d_name,pfx.c_str(),pfx.length())))
continue;
1676 if (fstatat(dFD, dp->d_name, &
Stat, AT_SYMLINK_NOFOLLOW))
1677 {basepath += dp->d_name;
1681 if ((
Stat.st_mode & S_IFMT) == S_IFDIR)
1682 {fn = basepath; fn += dp->d_name; fn +=
'/';
1692 Eroute.
Emsg(
"Config", errno,
"process space directory", fn.
c_str());
1694 Eroute.
Say(
"Config warning: no space directories found in ",
1698 return rc != 0 || failed;
1704 const char *grp,
bool isAsgn)
1711 path = Config.GetWord();
1712 if (!path || !path[0])
1713 {Eroute.
Emsg(
"Config",
"space path not specified");
return 1;}
1717do{
if ((pl =
SPList.Match(path))) pl->
Set(path, grp);
1722 }
while((path = Config.GetWord()));
1744 mFile += rindex(mPath.
c_str(),
'/')+1;
1745 mPath +=
'/'; mPath += mFile;
1748 snprintf(buff,
sizeof(buff),
"%s@%s; ",
1750 Eroute.
Say((sInfo.
noFail ?
"Config warning:" :
"Config failure:"),
1751 " Unable to verify mount point ", buff,
XrdSysE2T(errno));
1752 return (sInfo.
noFail ? 1 : 0);
1762 snprintf(buff,
sizeof(buff),
"create %s space at", sInfo.
sName.
c_str());
1764 if (fsp)
delete fsp;
1791 char *val, buff[2048], *bp = buff;
1792 int vlen, blen =
sizeof(buff)-1, isAsync = 0, isCreate = 0;
1796 if ((val = Config.GetWord()))
1797 if ((isAsync = !strcmp(val,
"async")) || !strcmp(val,
"sync"))
1798 val = Config.GetWord();
1803 if ((isCreate = !strcmp(val,
"creates"))) val = Config.GetWord();
1807 if (!val) {Eroute.
Emsg(
"Config",
"stagecmd not specified");
return 1;}
1811 do {
if ((vlen = strlen(val)) >= blen)
1812 {Eroute.
Emsg(
"Config",
"stagecmd arguments too long");
break;}
1813 *bp =
' '; bp++; strcpy(bp, val); bp += vlen; blen -= vlen;
1814 }
while((val = Config.GetWord()));
1817 *bp =
'\0'; val = buff+1;
1849 char *val, parms[1040];
1853 if (!(val = Config.GetWord()) || !val[0])
1854 {Eroute.
Emsg(
"Config",
"statlib not specified");
return 1;}
1859do{
if (!strcmp(val,
"-2"))
STT_V2 = 1;
1860 else if (!strcmp(val,
"arevents") || !strcmp(val,
"-arevents"))
STT_DoARE=1;
1861 else if (!strcmp(val,
"non2n") || !strcmp(val,
"-non2n"))
STT_DoN2N=0;
1862 else if (!strcmp(val,
"preopen") || !strcmp(val,
"-preopen"))
STT_PreOp=1;
1864 }
while((val = Config.GetWord()) && val[0]);
1868 if (!val || !(*val))
1869 {Eroute.
Emsg(
"Config",
"statlib not specified");
return 1;}
1878 if (!Config.GetRest(parms,
sizeof(parms)))
1879 {Eroute.
Emsg(
"Config",
"statlib parameters too long");
return 1;}
1881 STT_Parms = (*parms ? strdup(parms) : 0);
1902 static struct traceopts {
const char *opname;
int opval;} tropts[] =
1909 int i, neg, trval = 0, numopts =
sizeof(tropts)/
sizeof(
struct traceopts);
1911 if (!(val = Config.GetWord()))
1912 {Eroute.
Emsg(
"Config",
"trace option not specified");
return 1;}
1914 {
if (!strcmp(val,
"off")) trval = 0;
1915 else {
if ((neg = (val[0] ==
'-' && val[1]))) val++;
1916 for (i = 0; i < numopts; i++)
1917 {
if (!strcmp(val, tropts[i].opname))
1918 {
if (neg) trval &= ~tropts[i].opval;
1919 else trval |= tropts[i].opval;
1924 Eroute.
Say(
"Config warning: ignoring invalid trace option '",val,
"'.");
1926 val = Config.GetWord();
1956 if (!(val = Config.GetWord()))
1957 {Eroute.
Emsg(
"Config",
"usage option not specified");
return 1;}
1960 {
if (!strcmp(
"nolog", val))
1962 else if (!strcmp(
"log" , val))
1964 if (!(val = Config.GetWord()))
1965 {Eroute.
Emsg(
"Config",
"usage log path not specified");
1969 {Eroute.
Emsg(
"Config",
"usage log path not absolute");
1973 if (!(val = Config.GetWord()) || strcmp(
"sync", val))
1975 if (!(val = Config.GetWord()))
1976 {Eroute.
Emsg(
"Config",
"log sync value not specified");
1983 else if (!strcmp(
"noquotafile",val))
1985 else if (!strcmp(
"quotafile",val))
1987 if (!(val = Config.GetWord()))
1988 {Eroute.
Emsg(
"Config",
"quota file not specified");
1991 QFile = strdup(val);
1993 else {Eroute.
Emsg(
"Config",
"invalid usage option -",val);
return 1;}
1995 val = Config.GetWord();
2027 static const int maxfdln = 256;
2028 const char *wantParm = 0;
2031 long long speed = 9*1024*1024;
2033 int htime = 3*60*60;
2037 while((val = Config.GetWord()))
2038 {
if (!strcmp(
"deny", val))
2039 {wantParm =
"xfr deny";
2040 if ((val = Config.GetWord()))
2046 else if (!strcmp(
"fdir", val))
2047 {wantParm =
"xfr fdir";
2048 if ((val = Config.GetWord()))
2052 {Eroute.
Emsg(
"Config",
"xfr fdir path too long");
2059 else if (!strcmp(
"keep", val))
2060 {wantParm =
"xfr keep";
2061 if ((val = Config.GetWord()))
2067 else if (!strcmp(
"up", val)) {upon = 1; wantParm = 0;}
2074 if (!val) {
if (!wantParm)
return 0;
2075 else {Eroute.
Emsg(
"Config", wantParm,
"value not specified");
2080 if (strcmp(val,
"*") &&
XrdOuca2x::a2i(Eroute,
"xfr threads",val,&thrds,1))
2083 if ((val = Config.GetWord()))
2084 {
if (strcmp(val,
"*") &&
2087 if ((val = Config.GetWord()))
2088 {
if (strcmp(val,
"*") &&
2091 if ((val = Config.GetWord()))
2092 if (strcmp(val,
"*") &&
2116 else rwmode =
" r/w";
2126 ss += (flags &
XRDEXP_MIG ?
" mig" :
" nomig");
2130 }
else ss +=
" cache";
2136 ss += (flags &
XRDEXP_MLOK ?
" mlock" :
" nomlock");
2139 Eroute.
Say(pfx, pname, rwmode, ss.c_str());
static XrdVERSIONINFODEF(compiledVer, XrdHttpProtocolTest, XrdVNUMBER, XrdVERSION)
void * XrdOssCacheScan(void *carg)
#define XrdOssConfig_Vop(base, opt, optchk0, opt1, opt2, optchk1, opt3, opt4)
void * XrdOssxfr(void *carg)
const char * XrdOssErrorText[]
#define XrdOssConfig_Val(base, opt)
XrdOucPListAnchor * XrdOssRPList
XrdOssStatInfo_t(* XrdOssStatInfoInit_t)(XrdOss *native_oss, XrdSysLogger *Logger, const char *config_fn, const char *parms)
The typedef that describes the XRdOssStatInfoInit external.
XrdOssStatInfo2_t(* XrdOssStatInfoInit2_t)(XrdOss *native_oss, XrdSysLogger *Logger, const char *config_fn, const char *parms, XrdOucEnv *envP)
const char * XrdSysE2T(int errcode)
static int Add(const char *Path)
static XrdOssCache_Group * fsgroups
static int Init(const char *UDir, const char *Qfile, int isSOL, int usync=0)
static void * Scan(int cscanint)
static void List(const char *lname, XrdSysError &Eroute)
static void MapDevs(bool dBug=false)
static void Set(int V_off, int V_preld, int V_check)
static void Display(XrdSysError &Eroute)
static const int maxSNlen
void Config_Display(XrdSysError &)
int xstg(XrdOucStream &Config, XrdSysError &Eroute)
int ConfigXeq(char *, XrdOucStream &, XrdSysError &)
int Configure(const char *, XrdSysError &, XrdOucEnv *envP)
int xtrace(XrdOucStream &Config, XrdSysError &Eroute)
int xstl(XrdOucStream &Config, XrdSysError &Eroute)
void ConfigSpace(XrdSysError &Eroute)
int ConfigStage(XrdSysError &Eroute)
int xusage(XrdOucStream &Config, XrdSysError &Eroute)
int xspace(XrdOucStream &Config, XrdSysError &Eroute, int *isCD=0)
void List_Path(const char *, const char *, unsigned long long, XrdSysError &)
int xmemf(XrdOucStream &Config, XrdSysError &Eroute)
void ConfigMio(XrdSysError &Eroute)
void ConfigStats(XrdSysError &Eroute)
int xcachescan(XrdOucStream &Config, XrdSysError &Eroute)
int xfdlimit(XrdOucStream &Config, XrdSysError &Eroute)
int ConfigN2N(XrdSysError &Eroute, XrdOucEnv *envP)
XrdOucName2Name * the_N2N
int GenLocalPath(const char *, char *)
XrdOucName2Name * lcl_N2N
int xspaceBuild(OssSpaceConfig &sInfo, XrdSysError &Eroute)
int xprerd(XrdOucStream &Config, XrdSysError &Eroute)
int ConfigStatLib(XrdSysError &Eroute, XrdOucEnv *envP)
int xpath(XrdOucStream &Config, XrdSysError &Eroute)
XrdVersionInfo * myVersion
int xcache(XrdOucStream &Config, XrdSysError &Eroute)
void ConfigSpath(XrdSysError &Eroute, const char *Pn, unsigned long long &Fv, int noMSS)
int Stat(const char *, struct stat *, int opts=0, XrdOucEnv *Env=0)
int ConfigStageC(XrdSysError &Eroute)
int xxfr(XrdOucStream &Config, XrdSysError &Eroute)
unsigned long long DirFlags
int ConfigProc(XrdSysError &Eroute)
void ConfigCache(XrdSysError &Eroute, bool pass2=false)
int xmaxsz(XrdOucStream &Config, XrdSysError &Eroute)
int xdefault(XrdOucStream &Config, XrdSysError &Eroute)
int xnml(XrdOucStream &Config, XrdSysError &Eroute)
XrdOucName2Name * rmt_N2N
int xalloc(XrdOucStream &Config, XrdSysError &Eroute)
XrdOss()
Constructor and Destructor.
char * Get(const char *varname)
void PutPtr(const char *varname, void *value)
static unsigned long long ParseDefs(XrdOucStream &Config, XrdSysError &Eroute, unsigned long long Flags)
static XrdOucPList * ParsePath(XrdOucStream &Config, XrdSysError &Eroute, XrdOucPListAnchor &Export, unsigned long long Defopts)
int Parse(const char *oname, char *msg)
XrdOucName2Name * Load(const char *libName, XrdVersionInfo &urVer, XrdOucEnv *envP=0)
unsigned long long Flag()
void * Resolve(const char *symbl, int mcnt=1)
int erasefromend(int sz=0)
int replace(const char *s1, const char *s2, int from=0, int to=-1)
const char * c_str() const
static const char * InstName(int TranOpt=0)
static int a2i(XrdSysError &, const char *emsg, const char *item, int *val, int minv=-1, int maxv=-1)
static int a2sz(XrdSysError &, const char *emsg, const char *item, long long *val, long long minv=-1, long long maxv=-1)
static int a2tm(XrdSysError &, const char *emsg, const char *item, int *val, int minv=-1, int maxv=-1)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
static void addTable(XrdSysError_Table *etp)
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)
XrdSysLogger * logger(XrdSysLogger *lp=0)
static int Run(pthread_t *, void *(*proc)(void *), void *arg, int opts=0, const char *desc=0)
const XrdOucString & sPath
const XrdOucString & mName
const XrdOucString & sName