From bdda9a3dd899609ee160b90fad881341564c1a07 Mon Sep 17 00:00:00 2001 From: Ethereal Date: Fri, 12 Nov 2010 03:35:49 -0700 Subject: [PATCH] Implemented support for saving module root paths. --- include/monitor/config/Parser.h | 6 ++++++ monitor/src/Coordinator.cpp | 28 +++++++++++++++++++++++----- monitor/src/config/ArgumentParser.cpp | 17 +++++++---------- monitor/src/config/ConcreteVault.cpp | 1 + monitor/src/config/Parser.cpp | 28 ++++++++++++++++++++++------ monitor/src/program/Launcher.cpp | 4 ++++ 6 files changed, 63 insertions(+), 21 deletions(-) diff --git a/include/monitor/config/Parser.h b/include/monitor/config/Parser.h index cfd7839..38d2172 100644 --- a/include/monitor/config/Parser.h +++ b/include/monitor/config/Parser.h @@ -32,7 +32,13 @@ private: END_OF_FILE }; public: + /** Parses a single configuration file. + @note Assumes @a configFile is an absolute path. + */ void parse(ConcreteVault *vault, const std::string &configFile); + /** Parses a directory's worth of module configuration files. + @note Assumes @a directory is absolute. + */ void parseDirectory(ConcreteVault *vault, const std::string &directory); private: void openFile(const std::string &configFile); diff --git a/monitor/src/Coordinator.cpp b/monitor/src/Coordinator.cpp index d950901..d61915d 100644 --- a/monitor/src/Coordinator.cpp +++ b/monitor/src/Coordinator.cpp @@ -10,6 +10,8 @@ */ #include +#include +#include #include "Coordinator.h" #include "config/ArgumentParser.h" @@ -35,7 +37,14 @@ Coordinator::~Coordinator() { void Coordinator::run() { parseConfigs(); - if(m_argv[m_argcOffset] == NULL || m_vault->get("help") == "true") { + if(m_vault->get("list-attributes") == "true") { + std::vector list; + m_vault->match("*", list); + for(std::vector::iterator i = list.begin(); i != list.end(); ++i) { + std::cout << "\"" << i->first << "\" ==> \"" << i->second << "\"\n"; + } + } + else if(m_argv[m_argcOffset] == NULL || m_vault->get("help") == "true") { usage(true); return; } @@ -49,10 +58,19 @@ void Coordinator::parseConfigs() { Config::Parser parser; Config::ConcreteVault *vault = new Config::ConcreteVault(); - vault->set("PATH", "."); - parser.parse(vault, AesalonGlobalConfig); - parser.parse(vault, AesalonUserConfig); - parser.parse(vault, AesalonLocalConfig); + + char *path = realpath(AesalonGlobalConfig, NULL); + if(path) parser.parse(vault, path); + free(path); + + path = realpath(AesalonUserConfig, NULL); + if(path) parser.parse(vault, path); + free(path); + + path = realpath(AesalonLocalConfig, NULL); + if(path) parser.parse(vault, path); + free(path); + Config::ArgumentParser argParser; m_argcOffset = argParser.parse(vault, m_argv); diff --git a/monitor/src/config/ArgumentParser.cpp b/monitor/src/config/ArgumentParser.cpp index b9a7d52..d32059e 100644 --- a/monitor/src/config/ArgumentParser.cpp +++ b/monitor/src/config/ArgumentParser.cpp @@ -38,16 +38,6 @@ int ArgumentParser::parse(ConcreteVault *vault, char **argv) { vault->set(key, data); arg ++; } - else if(std::strcmp(argv[arg], "--append") == 0) { - /*std::cout << argv[arg+1] << std::endl;*/ - std::string line = argv[arg+1]; - std::string::size_type divider = line.find('='); - if(line[divider-1] != '+') {} // TODO: implement error - std::string key = line.substr(0, divider-1); - std::string data = line.substr(divider+1); - vault->set(key, data); - arg ++; - } else if(std::strcmp(argv[arg], "--use-module") == 0) { std::cout << "ArgumentParser: Using module " << argv[++arg] << std::endl; } @@ -57,6 +47,13 @@ int ArgumentParser::parse(ConcreteVault *vault, char **argv) { else if(std::strcmp(argv[arg], "--help") == 0) { vault->set("help", "true"); } + else if(std::strcmp(argv[arg], "--list-attributes") == 0) { + vault->set("list-attributes", "true"); + } + else if(std::strncmp(argv[arg], "--", 2) == 0) { + std::cout << "Unknown argument \"" << argv[arg] << "\".\n"; + // TODO: do something about the error. + } else break; } diff --git a/monitor/src/config/ConcreteVault.cpp b/monitor/src/config/ConcreteVault.cpp index 1e5f45e..31d0571 100644 --- a/monitor/src/config/ConcreteVault.cpp +++ b/monitor/src/config/ConcreteVault.cpp @@ -48,6 +48,7 @@ void ConcreteVault::match(const std::string &pattern, std::vector &item bool ConcreteVault::matches(const std::string &string, const std::string &pattern) { if(string == pattern) return true; + else if(pattern == "*") return true; return false; } diff --git a/monitor/src/config/Parser.cpp b/monitor/src/config/Parser.cpp index eac4c90..234eaf7 100644 --- a/monitor/src/config/Parser.cpp +++ b/monitor/src/config/Parser.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include "config/Parser.h" #include "common/ParsingException.h" @@ -32,10 +33,7 @@ namespace Config { void Parser::parse(ConcreteVault *vault, const std::string &configFile) { std::string currentModule; - std::vector paths; - vault->get("PATH", paths); - - openFile(Common::PathSanitizer::sanitize(configFile, paths)); + openFile(configFile); if(!m_stream->is_open()) return; @@ -55,8 +53,19 @@ void Parser::parse(ConcreteVault *vault, const std::string &configFile) { expectNextSymbol("{"); } else if(tokenType == WORD && token == "search") { - Parser().parseDirectory(vault, expectNextToken(QUOTED_WORD)); + char *dirpath = strdup(configFile.c_str()); + dirpath = dirname(dirpath); + + std::string dirname = expectNextToken(QUOTED_WORD); + + if(dirname[0] != '/' && dirname[0] != '~') { + dirname = dirpath + dirname; + } + + Parser().parseDirectory(vault, dirname); + expectNextSymbol(";"); + free(dirpath); } else if(tokenType == SYMBOL && token == "}") { if(currentModule != "") { @@ -68,7 +77,7 @@ void Parser::parse(ConcreteVault *vault, const std::string &configFile) { /*std::cout << "Parser: Using module \"" << expectNextToken(WORD) << "\"\n";*/ std::string moduleName = expectNextToken(WORD); - Parser().parse(vault, Common::PathSanitizer::sanitize(moduleName + "/module.conf", paths)); + vault->set("modules", moduleName); expectNextSymbol(";"); } @@ -117,6 +126,9 @@ void Parser::parseDirectory(ConcreteVault *vault, const std::string &directory) DIR *dir = opendir(directory.c_str()); if(dir == NULL) return; + vault->clear("::directory"); + vault->set("::directory", directory); + struct dirent *dent; while((dent = readdir(dir)) != NULL) { @@ -134,6 +146,10 @@ void Parser::parseDirectory(ConcreteVault *vault, const std::string &directory) if(S_ISDIR(s.st_mode)) { parse(vault, possible + AesalonModuleConfigFileName); + std::string path = dent->d_name; + path += ":root"; + vault->clear(path); + vault->set(path, possible); } } diff --git a/monitor/src/program/Launcher.cpp b/monitor/src/program/Launcher.cpp index 6289528..2688482 100644 --- a/monitor/src/program/Launcher.cpp +++ b/monitor/src/program/Launcher.cpp @@ -13,6 +13,9 @@ #include +#include +#include + #include "program/Launcher.h" #include "common/AssertionException.h" @@ -54,6 +57,7 @@ void Launcher::startProcess() { else if(childPid == 0) { setenv("LD_PRELOAD", preload.c_str(), 1); execv(m_argv[0], m_argv); + std::cout << m_argv[0] << ": " << strerror(errno) << std::endl; exit(0); } else { -- 2.11.4.GIT