00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 #include "XrdProofdPlatform.h"
00023 
00024 #ifdef OLDXRDOUC
00025 #  include "XrdOuc/XrdOucError.hh"
00026 #  include "XrdOuc/XrdOucLogger.hh"
00027 #else
00028 #  include "XrdSys/XrdSysError.hh"
00029 #  include "XrdSys/XrdSysLogger.hh"
00030 #endif
00031 #include "XrdNet/XrdNetDNS.hh"
00032 #include "XrdOuc/XrdOucEnv.hh"
00033 #include "XrdOuc/XrdOucStream.hh"
00034 #include "XrdOuc/XrdOucString.hh"
00035 
00036 #include "XrdProofdConfig.h"
00037 
00038 
00039 #include "XrdProofdTrace.h"
00040 
00041 XrdOucString XrdProofdConfig::fgHost;
00042 
00043 
00044 XrdProofdConfig::XrdProofdConfig(const char *fn, XrdSysError *edest)
00045                 : fCfgFile(fn), fEDest(edest)
00046 {
00047    
00048 
00049    SetCfgEDest(fn, edest);
00050 }
00051 
00052 
00053 void XrdProofdConfig::SetCfgEDest(const char *fn, XrdSysError *edest)
00054 {
00055    
00056 
00057    fEDest = edest;
00058    if (fn && fCfgFile.fName != fn) {
00059       fCfgFile.fName = fn;
00060       XrdProofdAux::Expand(fCfgFile.fName);
00061    }
00062    fCfgFile.fMtime = 0;
00063 }
00064 
00065 
00066 bool XrdProofdConfig::ReadFile(bool update)
00067 {
00068    
00069    
00070    
00071    
00072    XPDLOC(ALL, "Config::ReadFile")
00073 
00074    
00075    if (fCfgFile.fName.length() > 0) {
00076 
00077       
00078       struct stat st;
00079       if (stat(fCfgFile.fName.c_str(), &st) != 0)
00080          return -1;
00081       TRACE(DBG, "file: " << fCfgFile.fName);
00082       TRACE(DBG, "time of last modification: " << st.st_mtime);
00083 
00084       
00085       if (st.st_mtime <= fCfgFile.fMtime)
00086          return 0;
00087 
00088       
00089       if (update) fCfgFile.fMtime = st.st_mtime;
00090 
00091       
00092       return 1;
00093    } else {
00094 
00095       
00096       return 0;
00097    }
00098 }
00099 
00100 
00101 int XrdProofdConfig::ParseFile(bool rcf)
00102 {
00103    
00104    
00105    
00106    XPDLOC(ALL, "Config::ParseFile")
00107 
00108    XrdOucString mp;
00109 
00110    
00111    if (!ReadFile()) {
00112       TRACE(DBG, "config file already parsed ");
00113       return 0;
00114    }
00115 
00116    
00117    if (fgHost.length() <= 0) {
00118       char *host = XrdNetDNS::getHostName();
00119       fgHost = host ? host : "";
00120       SafeFree(host);
00121    }
00122 
00123    
00124    
00125    fDirectives.Apply(SetHostInDirectives, (void *)fgHost.c_str());
00126 
00127    
00128    int cfgFD;
00129    const char *cfn = fCfgFile.fName.c_str();
00130    if ((cfgFD = open(cfn, O_RDONLY, 0)) < 0) {
00131       TRACE(XERR, "unable to open : " << cfn);
00132       return -1;
00133    }
00134 
00135    
00136    XrdOucEnv myEnv;
00137    XrdOucStream cfg(fEDest, getenv("XRDINSTANCE"),  &myEnv);
00138    cfg.Attach(cfgFD);
00139 
00140    
00141    char *var = 0, *val = 0;
00142    while ((var = cfg.GetMyFirstWord())) {
00143       if (!(strncmp("xpd.", var, 4)) && var[4]) {
00144          
00145          var += 4;
00146          
00147          XrdProofdDirective *d = fDirectives.Find(var);
00148          if (d) {
00149             
00150             val = cfg.GetWord();
00151             d->DoDirective(val, &cfg, rcf);
00152          }
00153       } else if (var[0]) {
00154          
00155          XrdProofdDirective *d = fDirectives.Find(var);
00156          if (d) {
00157             
00158             val = cfg.GetWord();
00159             d->DoDirective(val, &cfg, rcf);
00160          }
00161       }
00162    }
00163 
00164    
00165    return 0;
00166 }