40#include <sys/resource.h>
44#include "XrdVersion.hh"
154#define Duplicate(x,y) if (y) free(y); y = strdup(x)
156#define TS_Xeq(x,m) if (!strcmp(x,var)) return m(Config, Eroute);
158#define TS_String(x,m) if (!strcmp(x,var)) {Duplicate(val,m); return 0;}
160#define TS_List(x,m,v) if (!strcmp(x,var)) \
161 {m.Insert(new XrdOucPList(val, v); return 0;}
163#define TS_Char(x,m) if (!strcmp(x,var)) {m = val[0]; return 0;}
165#define TS_Add(x,m,v,s) if (!strcmp(x,var)) {m |= (v|s); return 0;}
166#define TS_Ade(x,m,v,s) if (!strcmp(x,var)) {m |= (v|s); Config.Echo(); return 0;}
167#define TS_Rem(x,m,v,s) if (!strcmp(x,var)) {m = (m & ~v) | s; return 0;}
169#define TS_Set(x,m,v) if (!strcmp(x,var)) {m = v; Config.Echo(); return 0;}
171#define xrdmax(a,b) (a < b ? b : a)
243 prPBits = (
long long)sysconf(_SC_PAGESIZE);
280 static const int maxFD = 1048576;
289 Eroute.
Say(
"++++++ Storage system initialization started.");
296 ConfigFN = (configfn && *configfn ? strdup(configfn) : 0);
300 if (getrlimit(RLIMIT_NOFILE, &rlim))
301 {Eroute.
Emsg(
"Config", errno,
"get fd limit");
302 rlim.rlim_cur = maxFD;
304 else {
if (rlim.rlim_max == RLIM_INFINITY)
305 {rlim.rlim_cur = maxFD;
308 if (rlim.rlim_cur != rlim.rlim_max)
309 {rlim.rlim_cur = rlim.rlim_max;
314 {
if (setrlimit(RLIMIT_NOFILE, &rlim))
315 Eroute.
Emsg(
"Config", errno,
"set fd limit");
333 FDLimit =
static_cast<rlim_t
>(getdtablesize()) < rlim.rlim_cur ? getdtablesize() : rlim.rlim_cur;
338 }
else {
FDFence =
static_cast<int>(rlim.rlim_cur)>>1;
368 Solitary = ((val = getenv(
"XRDREDIRECT")) && !strcmp(val,
"Q"));
369 pfcMode = (envP && (val = envP->
Get(
"oss.runmode")) && !strcmp(val,
"pfc"));
370 {
const char *m1 = (
Solitary ?
"standalone " : 0);
371 const char *m2 = (
pfcMode ?
"pfc " : 0);
372 if (m1 || m2) Eroute.
Say(
"++++++ Configuring ", m1, m2,
"mode . . .");
405 if (NoGo) Eroute.
Emsg(
"Config",
"space initialization failed");
415 if (!(val = getenv(
"XRDOSSCSCAN")) || strcmp(val,
"off"))
417 (
void *)&
cscanint, 0,
"space scan")))
418 Eroute.
Emsg(
"Config", retc,
"create space scan thread");
436 val = (NoGo ? (
char *)
"failed." : (
char *)
"completed.");
437 Eroute.
Say(
"------ Storage system initialization ", val);
445#define XrdOssConfig_Val(base, opt) \
446 (Have ## base ? " oss." #opt " " : ""), \
447 (Have ## base ? base : ""), \
448 (Have ## base ? "\n" : "")
450#define XrdOssConfig_Vop(base, opt, optchk0, opt1, opt2, optchk1, opt3, opt4) \
451 (Have ## base ? " oss." #opt " " : ""), \
452 (Have ## base ? (optchk0 ? opt1 : opt2) : ""), \
453 (Have ## base ? (optchk1 ? opt3 : opt4) : ""), \
454 (Have ## base ? base : ""), \
455 (Have ## base ? "\n" : "")
459 char buff[4096], *cloc;
469 int HaveN2N_Lib = (
N2N_Lib != 0);
474 snprintf(buff,
sizeof(buff),
"Config effective %s oss configuration:\n"
475 " oss.alloc %lld %d %d\n"
476 " oss.spacescan %d\n"
477 " oss.fdlimit %d %d\n"
478 " oss.maxsize %lld\n"
486 " oss.xfr %d deny %d keep %d",
514 {Eroute.
Say(
" oss.space ", fp->
Name(),
530 const unsigned long long conFlags =
537 unsigned long long oflag, pflag;
556 {oflag = pflag = fp->
Flag();
562 if (oflag != pflag) fp->
Set(pflag);
582 unsigned long long flags = 0;
594 {flags |= fp->
Flag();
607#if !defined(_POSIX_MAPPED_FILES)
609 {Eroute.
Say(
"Config warning: memory mapped files not supported; "
610 "feature disabled.");
619#elif !defined(_POSIX_MEMLOCK)
621 {Eroute.
Say(
"Config warning: memory locked files not supported; "
622 "feature disabled.");
673 XrdOucStream Config(&Eroute, getenv(
"XRDINSTANCE"), &myEnv,
"=====> ");
678 {Eroute.
Say(
"Config warning: config file not specified; defaults assumed.");
685 {Eroute.
Emsg(
"Config", errno,
"open config file",
ConfigFN);
688 Config.Attach(cfgFD);
689 static const char *cvec[] = {
"*** oss plugin config:", 0 };
690 Config.Capture(cvec);
694 while((var = Config.GetMyFirstWord()))
695 {
if (!strncmp(var,
"oss.", 4))
696 {
if (
ConfigXeq(var+4, Config, Eroute)) {Config.Echo(); NoGo = 1;}}
697 else if (!strcmp(var,
"all.export")
698 &&
xpath(Config, Eroute)) {Config.Echo(); NoGo = 1;}
703 if ((retc = Config.LastError()))
704 NoGo = Eroute.
Emsg(
"Config", retc,
"read config file",
ConfigFN);
735 if ((fp =
SPList.First()))
738 bool zAssign =
false;
741 else {zAssign =
true; what =
"assign space ";}
742 const char *grp = fp->
Name();
744 while(fsg) {
if (!strcmp(fsg->
group,grp))
break; fsg = fsg->
next;}
745 if (!fsg) Eroute.
Say(
"Config warning: unable to ", what, grp,
746 " to ", fp->
Path(),
"; space not defined.");
749 if (zAssign)
SPList.Default(
static_cast<unsigned long long>(
spAssign));
757 struct stat statbuff;
758 char Pfn[MAXPATHLEN+1+8], *Slash;
766 while(
stat(Pfn, &statbuff))
767 {
if (!(Slash = rindex(Pfn,
'/')) || Slash == Pfn)
return;
781 unsigned long long &flags,
int noMSS)
803 Eroute.
Say(
"Config warning: 'all.export ",
Path,
804 " nocheck mig r/w' allows file inconsistentcy!");
815 unsigned long long flags;
816 int noMSS, needRSS = 0, NoGo = 0;
822 noMSS = ((tp = getenv(
"XRDREDIRECT"))
823 && (!strcmp(tp,
"R") || !strcmp(tp,
"M"))) |
Solitary;
850 if (!noMSS && !
RSSCmd && What)
851 {Eroute.
Emsg(
"Config", fp->
Path(), What,
852 "export attribute but rsscmd not specified.");
854 }
else if (What) needRSS = 1;
858 fp->
Set(flags); fp = fp->
Next();
873 {Eroute.
Say(
"Config warning: 'stagecmd' ignored; no stageable paths present.");
880 {Eroute.
Say(
"Config warning: 'rsscmd' ignored; no path exported with "
881 "check, dread, or rcreate.");
889 Eroute.
Say(
"++++++ Remote Storage System interface initialization started.");
901 {
const int AMode = S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH;
906 getenv(
"XRDADMINPATH"), AMode);
913 if ((tp = getenv(
"XRDOFSEVENTS")))
914 {
char sebuff[MAXPATHLEN+8];
922 tp = (NoGo ? (
char *)
"failed." : (
char *)
"completed.");
923 Eroute.
Say(
"------ Remote Storage System interface initialization ", tp);
935 int numt, retc, NoGo = 0;
940 while(*tp && *tp ==
' ') tp++;
942 do {tp++;}
while(*tp ==
' ');
949 if ((sp = index(
StageCmd,
' '))) *sp =
'\0';
967 Eroute.
Emsg(
"Config", retc,
"create staging thread");
995 const char *stName2 =
"?XrdOssStatInfoInit2";
1034 StatsDev(StatsDev *dP, dev_t dn) : Next(dP), st_dev(dn) {}
1039 StatsDev *dP1st = 0, *dP, *dPp;
1041 char LPath[MAXPATHLEN+1], PPath[MAXPATHLEN+1], *cP;
1050 {strcpy(LPath, fP->
Path());
1052 if (
stat(PPath, &
Stat) && (cP = rindex(LPath,
'/')))
1057 while(dP && dP->st_dev !=
Stat.st_dev) dP = dP->Next;
1062 lenDP += strlen(LPath) + strlen(PPath);
numDP++;
1063 dP1st =
new StatsDev(dP1st,
Stat.st_dev);
1064 }
while ((fP = fP->
Next()));
1076 while(dP) {dPp = dP; dP = dP->Next;
delete dPp;}
1084 char *Slash, pP[MAXPATHLEN+1];
1088 while((Slash = rindex(lP+1,
'/')))
1096 if (Slash) *Slash =
'/';
1105 char myVar[80], buff[2048], *val;
1130 if ((nosubs = !strcmp(var,
"stagemsg"))) myEnv = Config.SetEnv(0);
1135 strlcpy(myVar, var,
sizeof(myVar));
1141 if (!Config.GetRest(buff,
sizeof(buff)))
1142 {Eroute.
Emsg(
"Config",
"arguments too long for", var);
1143 if (nosubs) Config.SetEnv(myEnv);
1150 if (nosubs) Config.SetEnv(myEnv);
1155 {Eroute.
Emsg(
"Config",
"no value for directive", var);
1172 Eroute.
Say(
"Config warning: ignoring unknown directive '",var,
"'.");
1204 if (!(val = Config.GetWord()))
1205 {Eroute.
Emsg(
"Config",
"alloc minfree not specified");
return 1;}
1206 if (strcmp(val,
"*") &&
1209 if ((val = Config.GetWord()))
1210 {
if (strcmp(val,
"*") &&
1211 XrdOuca2x::a2i(Eroute,
"alloc headroom",val,&hdrm,0,100))
return 1;
1213 if ((val = Config.GetWord()))
1214 {
if (strcmp(val,
"*") &&
1215 XrdOuca2x::a2i(Eroute,
"alloc fuzz", val, &fuzz, 0, 100))
return 1;
1247 if (!(rc =
xspace(Config, Eroute, &isXA)))
1248 {
if (isXA) Eroute.
Say(
"Config warning: 'oss.cache' is deprecated; "
1249 "use 'oss.space' instead!");
1250 else {Eroute.
Say(
"Config failure: non-xa spaces are no longer "
1274 if (!(val = Config.GetWord()))
1275 {Eroute.
Emsg(
"Config",
"cachescan not specified");
return 1;}
1321 int fence = 0, FDHalf =
FDLimit>>1;
1323 if (!(val = Config.GetWord()))
1324 {Eroute.
Emsg(
"Config",
"fdlimit fence not specified");
return 1;}
1326 if (!strcmp(val,
"*"))
FDFence = FDHalf;
1327 else {
if (
XrdOuca2x::a2i(Eroute,
"fdlimit fence",val,&fence,0))
return 1;
1328 FDFence = (fence < FDHalf ? fence : FDHalf);
1331 while(Config.GetWord()) {}
1355 if (!(val = Config.GetWord()))
1356 {Eroute.
Emsg(
"Config",
"maxsize value not specified");
return 1;}
1357 if (
XrdOuca2x::a2sz(Eroute,
"maxsize", val, &msz, 1024*1024))
return 1;
1386 int i, j, V_check=-1, V_preld = -1, V_on=-1;
1387 long long V_max = 0;
1389 static struct mmapopts {
const char *opname;
int otyp;
1390 const char *opmsg;} mmopts[] =
1393 {
"preload", 1,
"memfile preload"},
1394 {
"check", 2,
"memfile check"},
1395 {
"max", 3,
"memfile max"}};
1396 int numopts =
sizeof(mmopts)/
sizeof(
struct mmapopts);
1398 if (!(val = Config.GetWord()))
1399 {Eroute.
Emsg(
"Config",
"memfile option not specified");
return 1;}
1402 {
for (i = 0; i < numopts; i++)
1403 if (!strcmp(val, mmopts[i].opname))
break;
1405 Eroute.
Say(
"Config warning: ignoring invalid memfile option '",val,
"'.");
1406 else {
if (mmopts[i].otyp > 1 && !(val = Config.GetWord()))
1407 {Eroute.
Emsg(
"Config",
"memfile",mmopts[i].opname,
1408 "value not specified");
1411 switch(mmopts[i].otyp)
1412 {
case 1: V_preld = 1;
1414 case 2:
if (!strcmp(
"xattr",val)
1415 || !strcmp(
"lock", val)
1416 || !strcmp(
"map", val)
1417 || !strcmp(
"keep", val)) V_check=1;
1418 else {Eroute.
Emsg(
"Config",
1419 "mmap check argument not xattr");
1423 case 3: j = strlen(val);
1424 if (val[j-1] ==
'%')
1427 val, &j, 1, 1000))
return 1;
1430 mmopts[i].opmsg, val, &V_max,
1431 10*1024*1024))
return 1;
1433 default: V_on = 0;
break;
1435 val = Config.GetWord();
1462 char *val, parms[1040];
1466 if (!(val = Config.GetWord()) || !val[0])
1467 {Eroute.
Emsg(
"Config",
"namelib not specified");
return 1;}
1476 if (!Config.GetRest(parms,
sizeof(parms)))
1477 {Eroute.
Emsg(
"Config",
"namelib parameters too long");
return 1;}
1479 N2N_Parms = (*parms ? strdup(parms) : 0);
1508 if (*(pP->
Path()) ==
'/')
return 0;
1512 if (*(pP->
Path()) ==
'*')
1519 Eroute.
Emsg(
"Config",
"Unsupported export -", pP->
Path());
1549 static const long long m16 = 16777216LL;
1551 long long lim = 1048576;
1552 int depth, qeq = 0, qsz = 128;
1554 if (!(val = Config.GetWord()))
1555 {Eroute.
Emsg(
"Config",
"preread depth not specified");
return 1;}
1557 if (!strcmp(val,
"on")) depth = 3;
1558 else if (
XrdOuca2x::a2i(Eroute,
"preread depth",val,&depth,0, 1024))
1561 while((val = Config.GetWord()))
1562 {
if (!strcmp(val,
"limit"))
1563 {
if (!(val = Config.GetWord()))
1564 {Eroute.
Emsg(
"Config",
"preread limit not specified");
1570 else if (!strcmp(val,
"qsize"))
1571 {
if (!(val = Config.GetWord()))
1572 {Eroute.
Emsg(
"Config",
"preread qsize not specified");
1578 {Eroute.
Emsg(
"Config",
"preread qsize must be >= depth");
1582 else {Eroute.
Emsg(
"Config",
"invalid preread option -",val);
return 1;}
1585 if (lim <
prPSize || !qsz) depth = 0;
1587 {qsz = qsz/(depth/2+1);
1588 if (qsz < depth) qsz = depth;
1621 bool isAsgn, isStar;
1625 if (!(val = Config.GetWord()))
1626 {Eroute.
Emsg(
"Config",
"space name not specified");
return 1;}
1628 {Eroute.
Emsg(
"Config",
"excessively long space name - ",val);
return 1;}
1633 if (!(val = Config.GetWord()) || !(*val))
1634 {Eroute.
Emsg(
"Config",
"space path not specified");
return 1;}
1638 if (((isAsgn = !strcmp(
"assign",val)) || ! strcmp(
"default",val)) && !isCD)
1639 return xspace(Config, Eroute, grp.
c_str(), isAsgn);
1644 if ((isStar = val[k] ==
'*')) val[k--] = 0;
1645 else while(k > 0 && val[k] ==
'/') val[k--] = 0;
1647 if (k >= MAXPATHLEN || val[0] !=
'/' || (k < 2 && !isStar))
1648 {Eroute.
Emsg(
"Config",
"invalid space path - ", val);
return 1;}
1653 do {k = fn.
replace(
"/./",
"/");}
while(k);
1654 do {k = fn.
replace(
"//",
"/");}
while(k);
1660 {
if ((val = Config.GetWord()))
1661 {
if (strcmp(
"xa", val))
1662 {Eroute.
Emsg(
"Config",
"invalid cache option - ",val);
return 1;}
1664 }
else {*isCD = 0; sInfo.
isXA =
false;}
1666 if ((val = Config.GetWord()) && !strcmp(
"chkmount", val))
1667 {
if (!(val = Config.GetWord()))
1668 {Eroute.
Emsg(
"Config",
"chkmount ID not specified");
return 1;}
1670 {Eroute.
Emsg(
"Config",
"excessively long mount name - ",val);
1675 if ((val = Config.GetWord()))
1676 {
if (!strcmp(
"nofail", val)) sInfo.
noFail =
true;
1677 else {Eroute.
Emsg(
"Config",
"invalid space option - ",val);
1697 int dFD, rc, snum = 0;
1698 bool chkPfx, failed =
false;
1700 if (basepath.endswith(
'/')) chkPfx =
false;
1701 else {
int pos = basepath.rfind(
'/');
1702 pfx = &basepath[pos+1];
1703 basepath.keep(0, pos+1);
1707 if ((dFD=
open(basepath.c_str(),O_DIRECTORY)) < 0 || !(dirP=fdopendir(dFD)))
1708 {Eroute.
Emsg(
"Config",errno,
"open space directory",fn.
c_str());
return 1;}
1712 {
if (!strcmp(dp->d_name,
".") || !strcmp(dp->d_name,
"..")
1713 || (chkPfx && strncmp(dp->d_name,pfx.c_str(),pfx.length())))
continue;
1715 if (fstatat(dFD, dp->d_name, &
Stat, AT_SYMLINK_NOFOLLOW))
1716 {basepath += dp->d_name;
1720 if ((
Stat.st_mode & S_IFMT) == S_IFDIR)
1721 {fn = basepath; fn += dp->d_name; fn +=
'/';
1731 Eroute.
Emsg(
"Config", errno,
"process space directory", fn.
c_str());
1733 Eroute.
Say(
"Config warning: no space directories found in ",
1737 return rc != 0 || failed;
1743 const char *grp,
bool isAsgn)
1750 path = Config.GetWord();
1751 if (!path || !path[0])
1752 {Eroute.
Emsg(
"Config",
"space path not specified");
return 1;}
1756do{
if ((pl =
SPList.Match(path))) pl->
Set(path, grp);
1761 }
while((path = Config.GetWord()));
1783 mFile += rindex(mPath.
c_str(),
'/')+1;
1784 mPath +=
'/'; mPath += mFile;
1787 snprintf(buff,
sizeof(buff),
"%s@%s; ",
1789 Eroute.
Say((sInfo.
noFail ?
"Config warning:" :
"Config failure:"),
1790 " Unable to verify mount point ", buff,
XrdSysE2T(errno));
1791 return (sInfo.
noFail ? 1 : 0);
1801 snprintf(buff,
sizeof(buff),
"create %s space at", sInfo.
sName.
c_str());
1803 if (fsp)
delete fsp;
1830 char *val, buff[2048], *bp = buff;
1831 int vlen, blen =
sizeof(buff)-1, isAsync = 0, isCreate = 0;
1835 if ((val = Config.GetWord()))
1836 if ((isAsync = !strcmp(val,
"async")) || !strcmp(val,
"sync"))
1837 val = Config.GetWord();
1842 if ((isCreate = !strcmp(val,
"creates"))) val = Config.GetWord();
1846 if (!val) {Eroute.
Emsg(
"Config",
"stagecmd not specified");
return 1;}
1850 do {
if ((vlen = strlen(val)) >= blen)
1851 {Eroute.
Emsg(
"Config",
"stagecmd arguments too long");
break;}
1852 *bp =
' '; bp++; strcpy(bp, val); bp += vlen; blen -= vlen;
1853 }
while((val = Config.GetWord()));
1856 *bp =
'\0'; val = buff+1;
1888 char *val, parms[1040];
1892 if (!(val = Config.GetWord()) || !val[0])
1893 {Eroute.
Emsg(
"Config",
"statlib not specified");
return 1;}
1898do{
if (!strcmp(val,
"-2"))
STT_V2 = 1;
1899 else if (!strcmp(val,
"arevents") || !strcmp(val,
"-arevents"))
STT_DoARE=1;
1900 else if (!strcmp(val,
"non2n") || !strcmp(val,
"-non2n"))
STT_DoN2N=0;
1901 else if (!strcmp(val,
"preopen") || !strcmp(val,
"-preopen"))
STT_PreOp=1;
1903 }
while((val = Config.GetWord()) && val[0]);
1907 if (!val || !(*val))
1908 {Eroute.
Emsg(
"Config",
"statlib not specified");
return 1;}
1917 if (!Config.GetRest(parms,
sizeof(parms)))
1918 {Eroute.
Emsg(
"Config",
"statlib parameters too long");
return 1;}
1920 STT_Parms = (*parms ? strdup(parms) : 0);
1941 static struct traceopts {
const char *opname;
int opval;} tropts[] =
1948 int i, neg, trval = 0, numopts =
sizeof(tropts)/
sizeof(
struct traceopts);
1950 if (!(val = Config.GetWord()))
1951 {Eroute.
Emsg(
"Config",
"trace option not specified");
return 1;}
1953 {
if (!strcmp(val,
"off")) trval = 0;
1954 else {
if ((neg = (val[0] ==
'-' && val[1]))) val++;
1955 for (i = 0; i < numopts; i++)
1956 {
if (!strcmp(val, tropts[i].opname))
1957 {
if (neg) trval &= ~tropts[i].opval;
1958 else trval |= tropts[i].opval;
1963 Eroute.
Say(
"Config warning: ignoring invalid trace option '",val,
"'.");
1965 val = Config.GetWord();
1995 if (!(val = Config.GetWord()))
1996 {Eroute.
Emsg(
"Config",
"usage option not specified");
return 1;}
1999 {
if (!strcmp(
"nolog", val))
2001 else if (!strcmp(
"log" , val))
2003 if (!(val = Config.GetWord()))
2004 {Eroute.
Emsg(
"Config",
"usage log path not specified");
2008 {Eroute.
Emsg(
"Config",
"usage log path not absolute");
2012 if (!(val = Config.GetWord()) || strcmp(
"sync", val))
2014 if (!(val = Config.GetWord()))
2015 {Eroute.
Emsg(
"Config",
"log sync value not specified");
2022 else if (!strcmp(
"noquotafile",val))
2024 else if (!strcmp(
"quotafile",val))
2026 if (!(val = Config.GetWord()))
2027 {Eroute.
Emsg(
"Config",
"quota file not specified");
2030 QFile = strdup(val);
2032 else {Eroute.
Emsg(
"Config",
"invalid usage option -",val);
return 1;}
2034 val = Config.GetWord();
2066 static const int maxfdln = 256;
2067 const char *wantParm = 0;
2070 long long speed = 9*1024*1024;
2072 int htime = 3*60*60;
2076 while((val = Config.GetWord()))
2077 {
if (!strcmp(
"deny", val))
2078 {wantParm =
"xfr deny";
2079 if ((val = Config.GetWord()))
2085 else if (!strcmp(
"fdir", val))
2086 {wantParm =
"xfr fdir";
2087 if ((val = Config.GetWord()))
2091 {Eroute.
Emsg(
"Config",
"xfr fdir path too long");
2098 else if (!strcmp(
"keep", val))
2099 {wantParm =
"xfr keep";
2100 if ((val = Config.GetWord()))
2106 else if (!strcmp(
"up", val)) {upon = 1; wantParm = 0;}
2113 if (!val) {
if (!wantParm)
return 0;
2114 else {Eroute.
Emsg(
"Config", wantParm,
"value not specified");
2119 if (strcmp(val,
"*") &&
XrdOuca2x::a2i(Eroute,
"xfr threads",val,&thrds,1))
2122 if ((val = Config.GetWord()))
2123 {
if (strcmp(val,
"*") &&
2126 if ((val = Config.GetWord()))
2127 {
if (strcmp(val,
"*") &&
2130 if ((val = Config.GetWord()))
2131 if (strcmp(val,
"*") &&
2155 else rwmode =
" r/w";
2165 ss += (flags &
XRDEXP_MIG ?
" mig" :
" nomig");
2170 }
else ss +=
" cache";
2176 ss += (flags &
XRDEXP_MLOK ?
" mlock" :
" nomlock");
2179 Eroute.
Say(pfx, pname, rwmode, ss.c_str());
static XrdVERSIONINFODEF(compiledVer, XrdHttpProtocolTest, XrdVNUMBER, XrdVERSION)
void * XrdOssCacheScan(void *carg)
static const int XrdOssErrnoMap[]
#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