bool ParseFlags(const int argc, const char **argv) { Trace("Parsing " << argc << " flags from the cli"); for (int i = 0; i < argc; ++i) { Log(LL::Info) << "argv[" << i << "] = " << argv[i] << std::endl; } for (int i = 1; i < argc; ++i) { const char *arg = argv[i]; if ((arg[0] != '-') || (argv[0] != '\0' && arg[1] != '-')) { Log(LL::Error) << "Unknown commandline input #" << i << ": " << arg << std::endl; return false; } std::vector<std::string> argstr = core::util::Splitter() .on('=') .trimWhitespace() .split(std::string(arg + 2), 2); RET_M(!argstr.empty(), "Unknown flag: " << arg); tFlagIter itr = GetGlobalFlags().find(argstr[0]); RET_M(itr != GetGlobalFlags().end(), "Unknown flag: " << arg); iFlagBase *pFlag = itr->second; if (argstr.size() == 2) { // Parse case where we have [flag][=][value] RET_M(pFlag->fromString(argstr.at(1)), "Invalid flag value for " << argstr[0] << " can't parse " << argstr[1]); } else if (i + 1 < argc) { // Parse case where we have [flag][space][value] ++i; RET_M(pFlag->fromString(std::string(argv[i])), "Invalid flag value for " << argstr[0] << " can't parse " << argv[i]); } else { // Error on case where we have [flag] alone. Booleans must be specified as [flag][=][true] Log(LL::Error) << "Found flag with no value: " << argstr[0] << std::endl; return false; } } Trace("Finished parsing cli flags"); return ParseConfigFile(g_configFile.get()); }
/** * Parses a config file with lines of the form * * flag = value * * and sets flags as appropriate. */ bool ParseConfigFile(const std::string &filename) { Trace("Begining parse of config file: " << filename); std::ifstream ifile(filename.c_str()); if (!ifile.is_open()) { Log(LL::Info) << "Config file " << filename << " not found." << std::endl; return true; } std::string line; int lineno = 0; while (std::getline(ifile, line)) { if (line.empty()) { lineno++; continue; } std::vector<std::string> argstr = core::util::Splitter() .on('=') .trimWhitespace() .split(line, 2); RET_M(argstr.size() == 2, "Error in config file \"" << filename << "\" " << "on line " << lineno << " is not a valid flag=value pair"); tFlagIter itr = GetGlobalFlags().find(argstr[0]); RET_M(itr != GetGlobalFlags().end(), "Unknown flag: " << argstr[0]); iFlagBase *pFlag = itr->second; RET_M(pFlag->fromString(core::util::trimQuotes(argstr[1])), "Invalid flag value for " << argstr[0] << " can't parse " << argstr[1]); lineno++; } Trace("Finished parsing config file of length: " << lineno); return true; }
bool StdioFileSystem::unmount(const tMountId mountId) { RET_M(m_mounts.find(mountId) != m_mounts.end(), "Can't unmount non-existant mount!"); m_mounts.erase(mountId); return true; }