]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph_argparse: add _daemon versions of argparse calls
authorDan Mick <dan.mick@inktank.com>
Mon, 8 Apr 2013 20:49:22 +0000 (13:49 -0700)
committerDan Mick <dan.mick@inktank.com>
Tue, 9 Apr 2013 00:49:15 +0000 (17:49 -0700)
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>
src/common/ceph_argparse.cc
src/common/ceph_argparse.h

index 889c713d736f5150769f97b3a36f09aebff6e52b..2ff520e45c92f0ab8018b6234c744b3945533a49 100644 (file)
@@ -252,7 +252,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];
@@ -278,8 +279,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;
@@ -296,11 +301,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, ...)
@@ -309,7 +324,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;
@@ -332,7 +370,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;
@@ -355,7 +393,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;
index 3ef0251abeb8762bf378c7e0599745384d180e71..5249704c0b86d01597a81540ad6899c6b9c07a40 100644 (file)
@@ -57,6 +57,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, ...);
@@ -66,6 +68,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, ...);