diff options
author | Dan Mick <dan.mick@inktank.com> | 2013-04-08 13:49:22 -0700 |
---|---|---|
committer | Dan Mick <dmick@danceorelse.org> | 2013-04-09 01:27:10 -0700 |
commit | 3769250acf42a751ee8dfa95207a4ffafd25574a (patch) | |
tree | 5f71cb371776a4d22106ba22ecb2723f8e2b84dc | |
parent | 1f3b4917cc5c4d796a96637912d2ae5ce2877861 (diff) | |
download | ceph-3769250acf42a751ee8dfa95207a4ffafd25574a.tar.gz |
ceph_argparse: add _daemon versions of argparse calls
mon needs to call argparse for a couple of -- options, and the
argparse_witharg routines were attempting to cerr/exit on missing
arguments. This is appropriate for the CLI usage, but not the daemon
usage. Add a 'cli' flag that can be set false for the daemon usage
(and cause the parsing routine to return false instead of exit).
The daemon's parsing code due for a rewrite soon.
Signed-off-by: Dan Mick <dan.mick@inktank.com>
Reviewed-by: Joao Eduardo Luis <joao.luis@inktank.com>
(cherry picked from commit c76bbc2e6df16d283cac3613628a44937e38bed8)
-rw-r--r-- | src/common/ceph_argparse.cc | 52 | ||||
-rw-r--r-- | src/common/ceph_argparse.h | 5 |
2 files changed, 50 insertions, 7 deletions
diff --git a/src/common/ceph_argparse.cc b/src/common/ceph_argparse.cc index 646931acdc9..d4fa220efcc 100644 --- a/src/common/ceph_argparse.cc +++ b/src/common/ceph_argparse.cc @@ -241,7 +241,8 @@ bool ceph_argparse_binary_flag(std::vector<const char*> &args, } static bool va_ceph_argparse_witharg(std::vector<const char*> &args, - std::vector<const char*>::iterator &i, std::string *ret, va_list ap) + std::vector<const char*>::iterator &i, std::string *ret, bool cli, + va_list ap) { const char *first = *i; char tmp[strlen(first)+1]; @@ -267,8 +268,12 @@ static bool va_ceph_argparse_witharg(std::vector<const char*> &args, else if (first[strlen_a] == '\0') { // find second part (or not) if (i+1 == args.end()) { - cerr << "Option " << *i << " requires an argument." << std::endl; - _exit(1); + if (cli) { + cerr << "Option " << *i << " requires an argument." << std::endl; + _exit(1); + } else { + return false; + } } i = args.erase(i); *ret = *i; @@ -285,11 +290,21 @@ bool ceph_argparse_witharg(std::vector<const char*> &args, bool r; va_list ap; va_start(ap, ret); - r = va_ceph_argparse_witharg(args, i, ret, ap); + r = va_ceph_argparse_witharg(args, i, ret, false, ap); va_end(ap); return r; } +bool ceph_argparse_witharg_daemon(std::vector<const char*> &args, + std::vector<const char*>::iterator &i, std::string *ret, ...) +{ + bool r; + va_list ap; + va_start(ap, ret); + r = va_ceph_argparse_witharg(args, i, ret, false, ap); + va_end(ap); + return r; +} bool ceph_argparse_withint(std::vector<const char*> &args, std::vector<const char*>::iterator &i, int *ret, std::ostream *oss, ...) @@ -298,7 +313,30 @@ bool ceph_argparse_withint(std::vector<const char*> &args, va_list ap; std::string str; va_start(ap, oss); - r = va_ceph_argparse_witharg(args, i, &str, ap); + r = va_ceph_argparse_witharg(args, i, &str, true, ap); + va_end(ap); + if (!r) { + return false; + } + + std::string err; + int myret = strict_strtol(str.c_str(), 10, &err); + *ret = myret; + if (!err.empty()) { + *oss << err; + } + return true; +} + +bool ceph_argparse_withint_daemon(std::vector<const char*> &args, + std::vector<const char*>::iterator &i, int *ret, + std::ostream *oss, ...) +{ + bool r; + va_list ap; + std::string str; + va_start(ap, oss); + r = va_ceph_argparse_witharg(args, i, &str, false, ap); va_end(ap); if (!r) { return false; @@ -321,7 +359,7 @@ bool ceph_argparse_withlonglong(std::vector<const char*> &args, va_list ap; std::string str; va_start(ap, oss); - r = va_ceph_argparse_witharg(args, i, &str, ap); + r = va_ceph_argparse_witharg(args, i, &str, false, ap); va_end(ap); if (!r) { return false; @@ -344,7 +382,7 @@ bool ceph_argparse_withfloat(std::vector<const char*> &args, va_list ap; std::string str; va_start(ap, oss); - r = va_ceph_argparse_witharg(args, i, &str, ap); + r = va_ceph_argparse_witharg(args, i, &str, false, ap); va_end(ap); if (!r) { return false; diff --git a/src/common/ceph_argparse.h b/src/common/ceph_argparse.h index fd9439c5627..5d73b5ed3bb 100644 --- a/src/common/ceph_argparse.h +++ b/src/common/ceph_argparse.h @@ -56,6 +56,8 @@ bool ceph_argparse_flag(std::vector<const char*> &args, std::vector<const char*>::iterator &i, ...); bool ceph_argparse_witharg(std::vector<const char*> &args, std::vector<const char*>::iterator &i, std::string *ret, ...); +bool ceph_argparse_witharg_daemon(std::vector<const char*> &args, + std::vector<const char*>::iterator &i, std::string *ret, ...); bool ceph_argparse_binary_flag(std::vector<const char*> &args, std::vector<const char*>::iterator &i, int *ret, std::ostream *oss, ...); @@ -65,6 +67,9 @@ extern CephInitParameters ceph_argparse_early_args extern bool ceph_argparse_withint(std::vector<const char*> &args, std::vector<const char*>::iterator &i, int *ret, std::ostream *oss, ...); +extern bool ceph_argparse_withint_daemon(std::vector<const char*> &args, + std::vector<const char*>::iterator &i, int *ret, + std::ostream *oss, ...); extern bool ceph_argparse_withfloat(std::vector<const char*> &args, std::vector<const char*>::iterator &i, float *ret, std::ostream *oss, ...); |