From: Bert Hubert Date: Sat, 15 Nov 2008 19:33:26 +0000 (+0000) Subject: Add various argument parsing options (asGuid, asUid etc) - thanks to Aki Tuomi X-Git-Tag: rec-3.2~253 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cc2978dc852a41ac6a8d0674f9d5d4044b056313;p=pdns Add various argument parsing options (asGuid, asUid etc) - thanks to Aki Tuomi git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1269 d19b8d6e-7fed-0310-83ef-9ca221ded41b --- diff --git a/pdns/arguments.cc b/pdns/arguments.cc index f5ec3a691..30e4b9496 100644 --- a/pdns/arguments.cc +++ b/pdns/arguments.cc @@ -163,20 +163,113 @@ const string & ArgvMap::operator[](const string &arg) return params[arg]; } +#ifndef WIN32 +mode_t ArgvMap::asMode(const string &arg) +{ + mode_t mode; + const char *cptr_orig; + char *cptr_ret = NULL; + + if(!parmIsset(arg)) + throw ArgException(string("Undefined but needed argument: '")+arg+"'"); + + cptr_orig = params[arg].c_str(); + mode = static_cast(strtol(cptr_orig, &cptr_ret, 8)); + if (mode == 0 && cptr_ret == cptr_orig) + throw ArgException("'" + arg + string("' contains invalid octal mode")); + return mode; +} + +gid_t ArgvMap::asGid(const string &arg) +{ + gid_t gid; + const char *cptr_orig; + char *cptr_ret = NULL; + + if(!parmIsset(arg)) + throw ArgException(string("Undefined but needed argument: '")+arg+"'"); + + cptr_orig = params[arg].c_str(); + gid = static_cast(strtol(cptr_orig, &cptr_ret, 0)); + if (gid == 0 && cptr_ret == cptr_orig) { + // try to resolve + struct group *group = getgrnam(params[arg].c_str()); + if (group == NULL) + throw ArgException("'" + arg + string("' contains invalid group")); + gid = group->gr_gid; + } + return gid; +} + +uid_t ArgvMap::asUid(const string &arg) +{ + uid_t uid; + const char *cptr_orig; + char *cptr_ret = NULL; + + if(!parmIsset(arg)) + throw ArgException(string("Undefined but needed argument: '")+arg+"'"); + + cptr_orig = params[arg].c_str(); + uid = static_cast(strtol(cptr_orig, &cptr_ret, 0)); + if (uid == 0 && cptr_ret == cptr_orig) { + // try to resolve + struct passwd *pwent = getpwnam(params[arg].c_str()); + if (pwent == NULL) + throw ArgException("'" + arg + string("' contains invalid group")); + uid = pwent->pw_uid; + } + return uid; +} +#endif + int ArgvMap::asNum(const string &arg) { + int retval; + const char *cptr_orig; + char *cptr_ret = NULL; + if(!parmIsset(arg)) throw ArgException(string("Undefined but needed argument: '")+arg+"'"); - return atoi(params[arg].c_str()); + // treat empty values as zeros + if (params[arg].empty()) + return 0; + + cptr_orig = params[arg].c_str(); + retval = static_cast(strtol(cptr_orig, &cptr_ret, 0)); + if (!retval && cptr_ret == cptr_orig) + throw ArgException("'"+arg+string("' is not valid number")); + + return retval; +} + +bool ArgvMap::isEmpty(const string &arg) +{ + if(!parmIsset(arg)) + return true; + return params[arg].empty(); } double ArgvMap::asDouble(const string &arg) { + double retval; + const char *cptr_orig; + char *cptr_ret = NULL; + if(!parmIsset(arg)) throw ArgException(string("Undefined but needed argument: '")+arg+"'"); - return atof(params[arg].c_str()); + if (params[arg].empty()) + return 0.0; + + cptr_orig = params[arg].c_str(); + retval = strtod(cptr_orig, &cptr_ret); + + if (retval == 0 && cptr_ret == cptr_orig) + throw ArgException("'"+arg+string("' is not valid double")); + + return retval; } ArgvMap::ArgvMap() diff --git a/pdns/arguments.hh b/pdns/arguments.hh index 31153b585..4dd81fc6a 100644 --- a/pdns/arguments.hh +++ b/pdns/arguments.hh @@ -26,6 +26,11 @@ #include #include "misc.hh" #include "ahuexception.hh" +#ifndef WIN32 +# include +# include +# include +#endif using namespace std; @@ -88,6 +93,11 @@ public: bool parmIsset(const string &var); //!< Checks if a parameter is set to *a* value bool mustDo(const string &var); //!< if a switch is given, if we must do something (--help) int asNum(const string &var); //!< return a variable value as a number +#ifndef WIN32 + mode_t asMode(const string &var); //list(); string getHelp(const string &item);