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 }