37 #include <sys/param.h>
39 #include <sys/types.h>
71 #include "XrdVersion.hh"
138 myHost = getenv(
"XRDHOST");
139 myProg = getenv(
"XRDPROG");
142 myPort = (bp = getenv(
"XRDPORT")) ? strtol(bp, (
char **)NULL, 10) : 0;
151 if (ConfigFN) free(ConfigFN);
152 if (CmsLib) free(CmsLib);
153 if (CmsParms) free(CmsParms);
154 if (SvcLib) free(SvcLib);
155 if (SvcParms) free(SvcParms);
166 int cfgFD, retc, NoGo = 0;
172 Log.
Say(
"++++++ ssi initialization started.");
176 if (getenv(
"XRDDEBUG") || getenv(
"XRDSSIDEBUG"))
182 {
Log.
Emsg(
"Config",
"Configuration file not specified.");
188 ConfigFN = strdup(cFN);
189 if ( (cfgFD =
open(cFN, O_RDONLY, 0)) < 0)
190 {
Log.
Emsg(
"Config", errno,
"open config file", cFN);
194 static const char *cvec[] = {
"*** ssi (sfs) plugin config:", 0 };
200 while((var = cFile->GetMyFirstWord()))
201 {
if (!strncmp(var,
"ssi.", 4)
202 || !strcmp(var,
"all.role"))
203 {
if (ConfigXeq(var+4)) {cFile->
Echo(); NoGo=1;}}
209 NoGo =
Log.
Emsg(
"Config", -retc,
"read config file", cFN);
215 {
Log.
Emsg(
"Config",
"ssi only supports server roles but role is not "
216 "defined as 'server'.");
223 {
if (!
theFS && !isCms)
224 {
Log.
Emsg(
"Config",
"Specifying an fspath requires SSI to be stacked "
225 "with a file system!");
228 if (isServer && !
theFS && !isCms)
fsChk =
false;
233 if (!NoGo) NoGo = !Configure(
envP);
237 tmp = (NoGo ?
" failed." :
" completed.");
238 Log.
Say(
"------ ssi initialization", tmp);
246 static char theSSI[] = {
's',
's',
'i', 0};
247 static char **myArgv = 0, *dfltArgv[] = {0, 0};
249 int myArgc = 0, NoGo;
254 {
Log.
Emsg(
"Config",
"Scheduler pointer is undefined!");
261 && (myArgv = (
char **)xrdEnvP->
GetPtr(
"xrdssi.argv**")))
262 myArgc = xrdEnvP->
GetInt(
"xrdssi.argc");
266 if (!myArgv || myArgc < 1)
267 {
if (!(dfltArgv[0] = (
char *)xrdEnvP->
GetPtr(
"argv[0]")))
268 dfltArgv[0] = theSSI;
276 {
Log.
Emsg(
"Finder",
"Network i/f undefined; unable to self-locate.");
282 if (!NoGo && !isCms &&
envP)
283 {
if (ConfigObj() || ConfigCms(
envP)) NoGo = 1;}
287 if (!NoGo && ConfigSvc(myArgv, myArgc)) NoGo = 1;
311 {myRole = strdup(
"standalone");
312 Log.
Say(
"Config Configuring standalone server.");
320 {
if (CmsLib)
Log.
Say(
"Config warning: ignoring cmslib directive; "
321 "using existing cms instance!");
323 DEBUG(
"Config: Using cms clientT from environment!");
326 DEBUG(
"Config: Allocating new cms clientT!");
335 (myLib.getPlugin(
"XrdCmsGetClient"));
336 if (!CmsGC)
return 1;
338 cmsP = CmsGC(
myLogger, cmsOpt, myPort, 0);
347 Log.
Emsg(
"Config",
"Unable to create cluster object.");
361 int XrdSsiSfsConfig::ConfigObj()
375 int XrdSsiSfsConfig::ConfigSvc(
char **myArgv,
int myArgc)
380 const char *pName = (isCms ?
"XrdSsiProviderLookup"
381 :
"XrdSsiProviderServer");
386 {
Log.
Emsg(
"Config",
"svclib not specified; provider cannot be loaded.");
398 if (!theProvider)
return 1;
403 myLib->
Persist();
delete myLib;
408 std::string(ConfigFN),
409 std::string(SvcParms ? SvcParms :
""),
411 {
Log.
Emsg(
"Config",
"Provider initialization failed.");
422 {
const char *eText = eInfo.
Get().c_str();
423 Log.
Emsg(
"Config",
"Unable to obtain server-side service object;",
424 (eText ? eText :
"reason unknown."));
433 int XrdSsiSfsConfig::ConfigXeq(
char *var)
438 if (!strcmp(
"cmslib", var))
return Xlib(
"cmslib", &CmsLib, &CmsParms);
439 if (!strcmp(
"svclib", var))
return Xlib(
"svclib", &SvcLib, &SvcParms);
440 if (!strcmp(
"fspath", var))
return Xfsp();
441 if (!strcmp(
"loglib", var)){
char *theLib=0, *theParms=0;
442 int rc=Xlib(
"loglib", &theLib, &theParms);
443 if (theLib) free(theLib);
444 if (theParms) free(theParms);
447 if (!strcmp(
"opts", var))
return Xopts();
448 if (!strcmp(
"role", var))
return Xrole();
449 if (!strcmp(
"trace", var))
return Xtrace();
453 Log.
Say(
"Config warning: ignoring unknown directive '",var,
"'.");
472 int XrdSsiSfsConfig::Xlib(
const char *lName,
char **lPath,
char **lParm)
474 char *val, parms[2048];
478 if (!(val = cFile->GetWord()) || !val[0])
479 {
Log.
Emsg(
"Config", lName,
"not specified");
return 1;}
483 if (*lPath) free(*lPath);
484 *lPath = strdup(val);
489 if (!cFile->GetRest(parms,
sizeof(parms)))
490 {
Log.
Emsg(
"Config", lName,
"parameters too long");
return 1;}
494 if (*lParm) free(*lParm);
495 *lParm = (*parms ? strdup(parms) : 0);
512 int XrdSsiSfsConfig::Xfsp()
515 char *val, pbuff[1024];
519 val = cFile->GetWord();
521 {
Log.
Emsg(
"Config",
"fspath path not specified");
return 1;}
522 strlcpy(pbuff, val,
sizeof(pbuff));
553 int XrdSsiSfsConfig::Xopts()
555 static const int noArg = 1;
556 static const int isNum = 2;
557 static const int isSz = 3;
558 static const int isTM = 4;
559 char *val, oBuff[256];
560 long long ppp, rMax = -1, rObj = -1, fAut = -1, fDet = -1, fRwt = -1;
563 struct optsopts {
const char *opname;
long long *oploc;
int maxv;
int aOpt;}
566 {
"authinfo", &fAut, 2, noArg},
567 {
"detreqok", &fDet, 2, noArg},
568 {
"maxrsz", &rMax, 16*1024*1024, isSz},
569 {
"requests", &rObj, 64*1024, isNum},
570 {
"respwt", &fRwt, 0x7fffffffLL, isTM}
572 int numopts =
sizeof(opopts)/
sizeof(
struct optsopts);
574 if (!(val = cFile->GetWord()))
575 {
Log.
Emsg(
"Config",
"opts option not specified");
return 1;}
578 {
for (i = 0; i < numopts; i++)
579 if (!strcmp(val, opopts[i].opname))
580 {
if (opopts[i].aOpt == noArg)
581 {*opopts[i].oploc = 1;
584 if (!(val = cFile->GetWord()))
585 {
Log.
Emsg(
"Config",
"opts ", opopts[i].opname,
586 "argument not specified.");
589 snprintf(oBuff,
sizeof(oBuff),
"%s opts value",opopts[i].opname);
590 if (opopts[i].aOpt == isSz)
592 0, opopts[i].maxv))
return 1;
594 else if (opopts[i].aOpt == isTM)
596 0, opopts[i].maxv))
return 1;
600 0, opopts[i].maxv))
return 1;
601 *opopts[i].oploc = ppp;
605 Log.
Say(
"Config warning: ignoring invalid opts option '",val,
"'.");
606 val = cFile->GetWord();
613 if (rMax >= 0)
maxRSZ =
static_cast<int>(rMax);
615 if (fRwt >= 0)
respWT = fRwt;
660 int XrdSsiSfsConfig::Xrole()
663 char *val, *Tok1, *Tok2;
668 if (!(val = cFile->GetWord()) || !strcmp(val,
"if"))
669 {
Log.
Emsg(
"Config",
"role not specified");
return 1;}
674 if ((val = cFile->GetWord()) && strcmp(val,
"if"))
676 val = cFile->GetWord();
681 if (val && !strcmp(
"if", val))
683 myHost,myInsName,myProg)) <= 0)
684 {free(Tok1);
if (Tok2) free(Tok2);
685 if (!rc) cFile->noEcho();
697 {
Log.
Emsg(
"Config",
"invalid role -", Tok1, Tok2); rc = 1;}
702 if (Tok2) free(Tok2);
707 if (myRole) free(myRole);
727 int XrdSsiSfsConfig::Xtrace()
729 static struct traceopts {
const char *opname;
int opval;} tropts[] =
734 int i, neg, trval = 0, numopts =
sizeof(tropts)/
sizeof(
struct traceopts);
737 if (!(val = cFile->GetWord()))
738 {
Log.
Emsg(
"Config",
"trace option not specified");
return 1;}
740 {
if (!strcmp(val,
"off")) trval = 0;
741 else {
if ((neg = (val[0] ==
'-' && val[1]))) val++;
742 for (i = 0; i < numopts; i++)
743 {
if (!strcmp(val, tropts[i].opname))
744 {
if (neg) trval &= ~tropts[i].opval;
745 else trval |= tropts[i].opval;
750 Log.
Say(
"Config warning: ignoring invalid trace option '",val,
"'.");
752 val = cFile->GetWord();
int open(const char *path, int oflag,...)
virtual int Configure(const char *cfn, char *Parms, XrdOucEnv *EnvInfo)=0
static const char * Name(RoleID rid)
static RoleID Convert(const char *Tok1, const char *Tok2)
long GetInt(const char *varname)
void * GetPtr(const char *varname)
void Insert(XrdOucPList *newitem)
XrdOucPList * Match(const char *pathname)
int Attach(int FileDescriptor, int bsz=2047)
static void Capture(const char **cVec=0, bool linefeed=true)
static const char * InstName(int TranOpt=0)
static int doIf(XrdSysError *eDest, XrdOucStream &Config, const char *what, const char *hname, const char *nname, const char *pname)
static int a2sz(XrdSysError &, const char *emsg, const char *item, long long *val, long long minv=-1, long long maxv=-1)
static int a2ll(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)
const std::string & Get(int &eNum) const
static void SetMax(int mVal)
virtual XrdSsiService * GetService(XrdSsiErrInfo &eInfo, const std::string &contact, int oHold=256)
virtual bool Init(XrdSsiLogger *logP, XrdSsiCluster *clsP, std::string cfgFn, std::string parms, int argc, char **argv)=0
XrdSsiSfsConfig(bool iscms=false)
bool Configure(const char *cFN, XrdOucEnv *envP)
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)
void * getPlugin(const char *pname, int optional=0)
XrdCmsClient * GetDefaultClient(XrdSysLogger *Logger, int opMode, int myPort)
XrdVERSIONINFODEF(myVersion, cmsclient, XrdVNUMBER, XrdVERSION)
@ IsTarget
The role is server and will be a redirection target.
XrdSsiProvider * Provider
XrdOucBuffPool * BuffPool