36 #include <sys/param.h>
38 #include "XrdVersion.hh"
70 const char *drctv[] = {
"xattrlib",
"authlib",
"ckslib",
"cmslib",
71 "ctllib",
"osslib",
"preplib"};
73 const char *nullParms = 0;
82 #define DO_LOAD(x) loadLib & (x & ~libIXMask)
84 #define PIX(x) x & libIXMask
90 XrdOfsConfigPI::XrdOfsConfigPI(
const char *cfn,
XrdOucStream *cfgP,
93 : autPI(0), cksPI(0), cmsPI(0), ctlPI(0), prpPI(0), ossPI(0),
94 sfsPI(sfsP), urVer(verP),
95 Config(cfgP), Eroute(errP), CksConfig(0), ConfigFN(cfn),
96 CksAlg(0), CksRdsz(0), ossXAttr(false), ossCksio(0),
97 prpAuth(true), Loaded(false), LoadOK(false), cksLcl(false)
103 memset(defLib, 0,
sizeof(defLib));
107 if (!verP) urVer = &XrdVERSIONINFOVAR(
XrdOfs);
111 CksConfig =
new XrdCksConfig(ConfigFN, Eroute, rc, *urVer);
112 if (!rc) {
delete CksConfig; CksConfig = 0;}
116 pushOK[
PIX(theAtrLib)] =
true;
117 pushOK[
PIX(theAutLib)] =
true;
118 pushOK[
PIX(theCksLib)] =
false;
119 pushOK[
PIX(theCmsLib)] =
false;
120 pushOK[
PIX(theCtlLib)] =
true;
121 pushOK[
PIX(theOssLib)] =
true;
122 pushOK[
PIX(thePrpLib)] =
true;
131 if (CksConfig)
delete CksConfig;
132 if (CksAlg) free(CksAlg);
144 int i, xLib =
PIX(what);
148 if (!(val =
Config->GetWord()) || !val[0])
149 {Eroute->
Emsg(
"Config", drctv[
PIX(what)],
"not specified");
return false;}
154 if (!
Config->GetRest(parms,
sizeof(parms)))
155 {Eroute->
Emsg(
"Config", drctv[xLib],
"parameters too long");
162 i = ALP[xLib].size();
163 ALP[xLib].push_back(newALP);
164 ALP[xLib][i].lib = path;
165 if (*parms) ALP[xLib][i].parms = strdup(parms);
175 const char *epName =
"XrdSysAddXAttrObject";
179 for (
int i = 0; i < n; i++)
184 if (!ep)
return false;
185 atrPI = ep(Eroute, ConfigFN, parms,
envP, atrPI);
186 if (!atrPI)
return false;
197 const char *epName =
"XrdAccAuthorizeObjAdd";
200 for (
int i = 0; i < n; i++)
206 if (!addAut)
return false;
207 autPI = addAut(Eroute->
logger(), ConfigFN, parms,
envP, autPI);
208 if (!autPI)
return false;
220 const char *objName =
"XrdOfsFSctl";
224 for (
int i = 0; i < n; i++)
229 if (!ctlObj)
return false;
230 ctlObj->
eDest = Eroute;
231 ctlObj->
prvPI = ctlPI;
233 ctlLP theCTL = {ctlObj, parms};
234 ctlVec.push_back(theCTL);
245 const char *epName =
"XrdOssAddStorageSystem2";
248 for (
int i = 0; i < n; i++)
255 if (!addOss2)
return false;
256 ossPI = addOss2(ossPI, Eroute->
logger(), ConfigFN, parms,
envP);
257 if (!ossPI)
return false;
268 const char *epName =
"XrdOfsAddPrepare";
271 for (
int i = 0; i < n; i++)
277 if (!addPrp)
return false;
278 prpPI = addPrp(Eroute, ConfigFN, parms, sfsPI, ossPI,
envP, prpPI);
279 if (!prpPI)
return false;
303 if (!ctlPI)
return true;
310 int n = ctlVec.size();
312 for (
int i = 0; i < n; i++)
313 {
if (!ctlVec[i].ctlPI->
Configure(ConfigFN,ctlVec[i].parms,
envP,thePI))
328 if (n <
maxXXXLib && !RepLib(what, lpath, (lparm ? lparm : nullParms)))
338 if (CksAlg) free(CksAlg);
339 CksAlg = strdup(alg);
350 char *oP, buff[4096];
358 if (i != aI) lP = &LP[i];
359 else if (ossXAttr) {lP = &LP[oI]; oP = 0;}
363 {theLib = (lP->lib ? lP->lib :
"default");
364 snprintf(buff,
sizeof(buff),
"ofs.%s %s%s %s", drctv[i],
365 (oP ? oP :
""), theLib, (lP->parms ? lP->parms :
""));
366 Eroute->
Say(
" ", buff);
367 for (
int k = 0; k < n; k++)
369 snprintf(buff,
sizeof(buff),
"ofs.%s ++ %s %s", drctv[i],
370 lP->lib, (lP->parms ? lP->parms :
""));
371 Eroute->
Say(
" ", buff);
386 const char *,
XrdOucEnv *, XrdVersionInfo &);
391 if (Loaded)
return LoadOK;
399 if (!ossLib && !ossCksio) ossCksio = 1;
402 if (ossLib &&
envP && (ossLib =
envP->
Get(
"oss.lib")))
406 if (!AddLibOss(
envP))
return false;
417 if (!AddLibAtr(
envP, theObj)) aOK =
false;
423 if (!aOK)
return false;
435 {Eroute->
Emsg(
"Config",
"Unable to load checksum manager; "
436 "incompatible versions.");
439 cksPI = CksConfig->
Configure(CksAlg, CksRdsz,
441 if (!cksPI)
return false;
504 if (libType) cksLcl = libType == 1;
508 Eroute->
Emsg(
"Config",
"Checksum version error!");
519 default: Eroute->
Emsg(
"Config",
"Invalid plugin Parse() call");
526 if (!(val =
Config->GetWord()) || !val[0])
527 {Eroute->
Emsg(
"Config", drctv[
PIX(what)],
"not specified");
return false;}
531 if (!strcmp(
"++", val))
532 {
if (pushOK[
PIX(what)])
return AddLib(what);
533 Eroute->
Emsg(
"Config",
"'++' option not supported for",
534 drctv[
PIX(what)],
"directive.");
540 return RepLib(what, val);
559 bool XrdOfsConfigPI::ParseAtrLib()
565 if (!(val =
Config->GetWord()) || !val[0])
566 {Eroute->
Emsg(
"Config",
"xattrlib not specified");
return false;}
570 if (!strcmp(
"++", val))
return AddLib(
theAtrLib);
574 ossXAttr = !strcmp(
"osslib", val);
575 return RepLib(
theAtrLib, (ossXAttr ? 0 : val));
598 bool XrdOfsConfigPI::ParseOssLib()
600 char *val, oBuff[80];
605 if ((val =
Config->GetWord()) && !strcmp(
"++",val))
return AddLib(
theOssLib);
611 if (LP[oI].
opts) {free(LP[oI].
opts); LP[oI].opts = 0;}
617 {
if (!strcmp(
"+cksio", val))
618 {
if (!ossCksio) strcat(oBuff,
"+cksio "); ossCksio = 1;}
619 else if (!strcmp(
"+mmapio", val))
620 {
if ( ossCksio) strcat(oBuff,
"+mmapio "); ossCksio = -1;}
621 else if (!strcmp(
"+xattr", val))
622 {
if (!ossXAttr) strcat(oBuff,
"+xattr "); ossXAttr =
true;}
630 {Eroute->
Emsg(
"Config",
"osslib not specified");
return false;}
634 if (*oBuff) LP[oI].opts = strdup(oBuff);
655 bool XrdOfsConfigPI::ParsePrpLib()
657 char *val, oBuff[80];
662 if ((val =
Config->GetWord()) && !strcmp(
"++",val))
return AddLib(
thePrpLib);
667 if (LP[oI].
opts) {free(LP[oI].
opts); LP[oI].opts = 0;}
673 {
if (!strcmp(
"+noauth", val))
674 {
if (prpAuth) strcat(oBuff,
"+noauth "); prpAuth =
false;}
682 {Eroute->
Emsg(
"Config",
"preplib not specified");
return false;}
686 if (*oBuff) LP[oI].opts = strdup(oBuff);
695 {
return (piP =
autPI) != 0;}
698 {
return (piP = cksPI) != 0;}
701 {
return (piP =
cmsPI) != 0;}
704 {
return (piP = ctlPI) != 0;}
707 {
return (piP = prpPI) != 0;}
710 {
return (piP =
ossPI) != 0;}
725 int i, xLib =
PIX(what);
729 if (!pushOK[xLib])
return false;
733 i = ALP[xLib].size();
734 ALP[xLib].push_back(newALP);
735 ALP[xLib][i].lib = strdup(plugP);
736 if (parmP && *parmP) ALP[xLib][i].parms = strdup(parmP);
745 const char *newLib,
const char *newParms,
bool parseParms)
749 int xLib =
PIX(what);
753 if (LP[xLib].lib && newLib)
754 {
if (!strcmp(LP[xLib].lib, newLib) && defLib[xLib])
755 {
const char *dfltLib = (newParms ? newLib : LP[xLib].lib);
756 Eroute->
Say(
"Config warning: ",
"specified ", drctv[xLib],
757 " overrides default ", dfltLib);
760 defLib[xLib] =
false;
762 LP[xLib].lib = (newLib ? strdup(newLib) : 0);
766 if (newParms) parmP = (newParms == nullParms ? 0 : newParms);
767 else {*parms = 0; parmP = parms;
768 if (parseParms && !
Config->GetRest(parms,
sizeof(parms)))
769 {Eroute->
Emsg(
"Config", drctv[xLib],
"parameters too long");
776 if (LP[xLib].parms) free(LP[xLib].parms);
777 LP[xLib].parms = (*parmP ? strdup(parmP) : 0);
795 char *AtrLib = LP[
PIX(what)].lib;
796 char *AtrParms = LP[
PIX(what)].parms;
802 if (!ep)
return false;
803 if (strcmp(AtrLib, myLib.Path()))
804 {free(AtrLib); AtrLib = LP[
PIX(what)].lib = strdup(myLib.Path());}
809 if (!(theObj = ep(Eroute, ConfigFN, AtrParms)))
return false;
813 if (!AddLibAtr(
envP, theObj))
return false;
829 const char *parm, XrdVersionInfo &vInfo);
840 (Eroute->
logger(), ConfigFN, AuthParms, *urVer)))
842 return AddLibAut(
envP);
851 if (!ep1)
return false;
852 if (!(autPI = ep1(Eroute->
logger(), ConfigFN, AuthParms)))
return false;
854 if (!(autPI = ep2(Eroute->
logger(), ConfigFN, AuthParms,
envP)))
857 if (strcmp(AuthLib, myLib.Path()))
858 {free(AuthLib); AuthLib = LP[
PIX(
theAutLib)].lib = strdup(myLib.Path());}
863 return AddLibAut(
envP);
870 bool XrdOfsConfigPI::SetupCms()
879 (myLib.Resolve(
"XrdCmsGetClient"));
880 if (!cmsPI)
return false;
881 if (strcmp(CmsLib, myLib.Path()))
903 if (!obj)
return false;
904 if (strcmp(CtlLib, myLib.Path()))
915 return AddLibCtl(
envP);
933 if (!ep)
return false;
934 if (strcmp(PrpLib, myLib.Path()))
942 if (!(prpPI = ep(Eroute, ConfigFN, PrpParms, sfsPI, ossPI,
envP)))
944 return AddLibPrp(
envP);
XrdAccAuthorize * XrdAccDefaultAuthorizeObject(XrdSysLogger *lp, const char *cfn, const char *parm, XrdVersionInfo &urVer)
XrdAccAuthorize *(* XrdAccAuthorizeObject2_t)(XrdSysLogger *lp, const char *cfn, const char *parm, XrdOucEnv *envP)
XrdAccAuthorize *(* XrdAccAuthorizeObjAdd_t)(XrdSysLogger *lp, const char *cfn, const char *parm, XrdOucEnv *envP, XrdAccAuthorize *accP)
XrdAccAuthorize *(* XrdAccAuthorizeObject_t)(XrdSysLogger *lp, const char *cfn, const char *parm)
XrdCmsClient *(* XrdCmsClient_t)(XrdSysLogger *, int, int, XrdOss *)
XrdVERSIONINFOREF(XrdOfs)
XrdOfsPrepare *(* XrdOfsAddPrepare_t)(XrdSysError *eDest, const char *confg, const char *parms, XrdSfsFileSystem *theSfs, XrdOss *theOss, XrdOucEnv *envP, XrdOfsPrepare *prepP)
XrdOfsPrepare *(* XrdOfsgetPrepare_t)(XrdSysError *eDest, const char *confg, const char *parms, XrdSfsFileSystem *theSfs, XrdOss *theOss, XrdOucEnv *envP)
XrdOss * XrdOssGetSS(XrdSysLogger *Logger, const char *config_fn, const char *OssLib, const char *OssParms, XrdOucEnv *envP, XrdVersionInfo &urVer)
XrdOssGetStorageSystem2_t XrdOssAddStorageSystem2_t
XrdOss *(* XrdOssGetStorageSystem2_t)(XrdOss *native_oss, XrdSysLogger *Logger, const char *config_fn, const char *parms, XrdOucEnv *envP)
XrdSysXAttr * XrdSysXAttrActive
XrdSysXAttr *(* XrdSysAddXAttrObject_t)(XrdSysError *errP, const char *config_fn, const char *parms, XrdOucEnv *envP, XrdSysXAttr *attrP)
XrdSysXAttr *(* XrdSysGetXAttrObject_t)(XrdSysError *errP, const char *config_fn, const char *parms)
XrdCks * Configure(const char *dfltCalc=0, int rdsz=0, XrdOss *ossP=0, XrdOucEnv *envP=0)
int ParseLib(XrdOucStream &Config, int &libType)
virtual int Configure(const char *cfn, char *Parms, XrdOucEnv *EnvInfo)=0
bool ConfigCtl(XrdCmsClient *cmscP, XrdOucEnv *envP=0)
void Default(TheLib what, const char *lpath, const char *lparm=0)
void SetCksRdSz(int rdsz)
bool Plugin(XrdAccAuthorize *&piP)
Get Authorization plugin.
static XrdOfsConfigPI * New(const char *cfn, XrdOucStream *cfgP, XrdSysError *errP, XrdVersionInfo *verP=0, XrdSfsFileSystem *sfsP=0)
~XrdOfsConfigPI()
Destructor.
void DefaultCS(const char *alg)
bool Load(int what, XrdOucEnv *envP=0)
bool Push(TheLib what, const char *plugP, const char *parmP=0)
bool Configure(XrdCmsClient *cmscP, XrdOucEnv *envP)
@ maxXXXLib
Maximum different plugins.
@ theCksLib
Checksum manager plugin.
@ thePrpLib
Prp plugin (prepare)
@ theCmsLib
Cms client plugin.
@ theAtrLib
Extended attribute plugin.
@ theAutLib
Authorization plugin.
@ theCtlLib
Ctl plugin (FSCtl)
void Display()
Display configuration settings.
XrdCmsClient * cmsPI
-> Cms client object generator plugin
XrdOss * ossPI
-> Oss plugin
XrdAccAuthorize * autPI
-> Authorization plugin
virtual bool Configure(const char *CfgFN, const char *Parms, XrdOucEnv *envP, const Plugins &plugs)
XrdSfsFileSystem * sfsPI
-> Sfs plugin (a.k.a. ofs)
friend class XrdOfsConfigPI
The Plugins struct is used to pass plugin pointers to configure.
char * Get(const char *varname)
static void toLower(char *str)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
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 void SetPlugin(XrdSysXAttr *xaP, bool push=false)
static bool VerCmp(XrdVersionInfo &vInf1, XrdVersionInfo &vInf2, bool noMsg=false)
virtual XrdSysError * SetMsgRoute(XrdSysError *errP)