summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Mick <dan.mick@inktank.com>2013-04-08 13:49:22 -0700
committerDan Mick <dmick@danceorelse.org>2013-04-09 01:27:10 -0700
commit3769250acf42a751ee8dfa95207a4ffafd25574a (patch)
tree5f71cb371776a4d22106ba22ecb2723f8e2b84dc
parent1f3b4917cc5c4d796a96637912d2ae5ce2877861 (diff)
downloadceph-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.cc52
-rw-r--r--src/common/ceph_argparse.h5
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, ...);