tolerate additional IPv4 address now available for gnunet.org
[oweals/gnunet.git] / src / util / getopt_helpers.c
index 31fe093a90b519cea420615c561f438d7a2861f4..77032e5015ffac6b08a2a61a808fda510d1461c4 100644 (file)
@@ -2,20 +2,20 @@
      This file is part of GNUnet
      Copyright (C) 2006, 2011 GNUnet e.V.
 
-     GNUnet is free software; you can redistribute it and/or modify
-     it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 3, or (at your
-     option) any later version.
+     GNUnet is free software: you can redistribute it and/or modify it
+     under the terms of the GNU Affero General Public License as published
+     by the Free Software Foundation, either version 3 of the License,
+     or (at your option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
      WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-     General Public License for more details.
+     Affero General Public License for more details.
+    
+     You should have received a copy of the GNU Affero General Public License
+     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-     You should have received a copy of the GNU General Public License
-     along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-     Boston, MA 02110-1301, USA.
+     SPDX-License-Identifier: AGPL3.0-or-later
 */
 
 /**
@@ -46,6 +46,8 @@ print_version (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
 {
   const char *version = scls;
 
+  (void) option;
+  (void) value;
   printf ("%s v%s\n",
          ctx->binaryName,
          version);
@@ -60,7 +62,7 @@ print_version (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
  * @param version string with the version number
  */
 struct GNUNET_GETOPT_CommandLineOption
-GNUNET_GETOPT_OPTION_VERSION (const char *version)
+GNUNET_GETOPT_option_version (const char *version)
 {
   struct GNUNET_GETOPT_CommandLineOption clo = {
     .shortName =  'v',
@@ -104,15 +106,18 @@ format_help (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
   const struct GNUNET_GETOPT_CommandLineOption *opt;
   const struct GNUNET_OS_ProjectData *pd;
 
+  (void) option;
+  (void) value;
   if (NULL != about)
   {
-    printf ("%s\n%s\n", ctx->binaryOptions, gettext (about));
-    printf (_
-           ("Arguments mandatory for long options are also mandatory for short options.\n"));
+    printf ("%s\n%s\n",
+           ctx->binaryOptions,
+           gettext (about));
+    printf (_("Arguments mandatory for long options are also mandatory for short options.\n"));
   }
   i = 0;
   opt = ctx->allOptions;
-  while (opt[i].description != NULL)
+  while (NULL != opt[i].description)
   {
     if (opt[i].shortName == '\0')
       printf ("      ");
@@ -120,7 +125,7 @@ format_help (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
       printf ("  -%c, ", opt[i].shortName);
     printf ("--%s", opt[i].name);
     slen = 8 + strlen (opt[i].name);
-    if (opt[i].argumentHelp != NULL)
+    if (NULL != opt[i].argumentHelp)
     {
       printf ("=%s", opt[i].argumentHelp);
       slen += 1 + strlen (opt[i].argumentHelp);
@@ -144,7 +149,7 @@ format_help (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
 OUTER:
     while (ml - p > 78 - slen)
     {
-      for (j = p + 78 - slen; j > p; j--)
+      for (j = p + 78 - slen; j > (int) p; j--)
       {
         if (isspace ((unsigned char) trans[j]))
         {
@@ -191,7 +196,7 @@ OUTER:
  * @param about string with brief description of the application
  */
 struct GNUNET_GETOPT_CommandLineOption
-GNUNET_GETOPT_OPTION_HELP (const char *about)
+GNUNET_GETOPT_option_help (const char *about)
 {
   struct GNUNET_GETOPT_CommandLineOption clo = {
     .shortName = 'h',
@@ -227,6 +232,9 @@ increment_value (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
 {
   unsigned int *val = scls;
 
+  (void) ctx;
+  (void) option;
+  (void) value;
   (*val)++;
   return GNUNET_OK;
 }
@@ -242,10 +250,10 @@ increment_value (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
  * @param[out] val increment by 1 each time the option is present
  */
 struct GNUNET_GETOPT_CommandLineOption
-GNUNET_GETOPT_OPTION_INCREMENT_VALUE (char shortName,
-                                      const char *name,
-                                      const char *description,
-                                      unsigned int *val)
+GNUNET_GETOPT_option_increment_uint (char shortName,
+                                    const char *name,
+                                    const char *description,
+                                    unsigned int *val)
 {
   struct GNUNET_GETOPT_CommandLineOption clo = {
     .shortName =  shortName,
@@ -266,7 +274,7 @@ GNUNET_GETOPT_OPTION_INCREMENT_VALUE (char shortName,
  * @param[out] level set to the verbosity level
  */
 struct GNUNET_GETOPT_CommandLineOption
-GNUNET_GETOPT_OPTION_VERBOSE (unsigned int *level)
+GNUNET_GETOPT_option_verbose (unsigned int *level)
 {
   struct GNUNET_GETOPT_CommandLineOption clo = {
     .shortName = 'V',
@@ -302,6 +310,9 @@ set_one (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
 {
   int *val = scls;
 
+  (void) ctx;
+  (void) option;
+  (void) value;
   *val = 1;
   return GNUNET_OK;
 }
@@ -318,10 +329,10 @@ set_one (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
  * @param[out] val set to 1 if the option is present
  */
 struct GNUNET_GETOPT_CommandLineOption
-GNUNET_GETOPT_OPTION_SET_ONE (char shortName,
-                              const char *name,
-                              const char *description,
-                              int *val)
+GNUNET_GETOPT_option_flag (char shortName,
+                          const char *name,
+                          const char *description,
+                          int *val)
 {
   struct GNUNET_GETOPT_CommandLineOption clo = {
     .shortName =  shortName,
@@ -357,7 +368,9 @@ set_string (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
 {
   char **val = scls;
 
-  GNUNET_assert (value != NULL);
+  (void) ctx;
+  (void) option;
+  GNUNET_assert (NULL != value);
   GNUNET_free_non_null (*val);
   *val = GNUNET_strdup (value);
   return GNUNET_OK;
@@ -374,7 +387,7 @@ set_string (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
  * @param[out] str set to the string
  */
 struct GNUNET_GETOPT_CommandLineOption
-GNUNET_GETOPT_OPTION_STRING (char shortName,
+GNUNET_GETOPT_option_string (char shortName,
                              const char *name,
                              const char *argumentHelp,
                              const char *description,
@@ -401,7 +414,7 @@ GNUNET_GETOPT_OPTION_STRING (char shortName,
  * @param[out] level set to the log level
  */
 struct GNUNET_GETOPT_CommandLineOption
-GNUNET_GETOPT_OPTION_LOGLEVEL (char **level)
+GNUNET_GETOPT_option_loglevel (char **level)
 {
   struct GNUNET_GETOPT_CommandLineOption clo = {
     .shortName = 'L',
@@ -436,6 +449,8 @@ set_filename (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
 {
   char **val = scls;
 
+  (void) ctx;
+  (void) option;
   GNUNET_assert (NULL != value);
   GNUNET_free_non_null (*val);
   *val = GNUNET_STRINGS_filename_expand (value);
@@ -453,11 +468,11 @@ set_filename (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
  * @param[out] str set to the string
  */
 struct GNUNET_GETOPT_CommandLineOption
-GNUNET_GETOPT_OPTION_FILENAME (char shortName,
-                             const char *name,
-                             const char *argumentHelp,
-                             const char *description,
-                             char **str)
+GNUNET_GETOPT_option_filename (char shortName,
+                              const char *name,
+                              const char *argumentHelp,
+                              const char *description,
+                              char **str)
 {
   struct GNUNET_GETOPT_CommandLineOption clo = {
     .shortName =  shortName,
@@ -479,7 +494,7 @@ GNUNET_GETOPT_OPTION_FILENAME (char shortName,
  * @param[out] logfn set to the name of the logfile
  */
 struct GNUNET_GETOPT_CommandLineOption
-GNUNET_GETOPT_OPTION_LOGFILE (char **logfn)
+GNUNET_GETOPT_option_logfile (char **logfn)
 {
   struct GNUNET_GETOPT_CommandLineOption clo = {
     .shortName =  'l',
@@ -501,7 +516,7 @@ GNUNET_GETOPT_OPTION_LOGFILE (char **logfn)
  * @param[out] fn set to the name of the configuration file
  */
 struct GNUNET_GETOPT_CommandLineOption
-GNUNET_GETOPT_OPTION_CFG_FILE (char **fn)
+GNUNET_GETOPT_option_cfgfile (char **fn)
 {
   struct GNUNET_GETOPT_CommandLineOption clo = {
     .shortName =  'c',
@@ -537,10 +552,13 @@ set_ulong (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
            const char *value)
 {
   unsigned long long *val = scls;
+  char dummy[2];
 
+  (void) ctx;
   if (1 != SSCANF (value,
-                   "%llu",
-                   val))
+                   "%llu%1s",
+                   val,
+                  dummy))
   {
     FPRINTF (stderr,
              _("You must pass a number to the `%s' option.\n"),
@@ -561,11 +579,11 @@ set_ulong (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
  * @param[out] val set to the value specified at the command line
  */
 struct GNUNET_GETOPT_CommandLineOption
-GNUNET_GETOPT_OPTION_SET_ULONG (char shortName,
-                                const char *name,
-                                const char *argumentHelp,
-                                const char *description,
-                                unsigned long long *val)
+GNUNET_GETOPT_option_ulong (char shortName,
+                           const char *name,
+                           const char *argumentHelp,
+                           const char *description,
+                           unsigned long long *val)
 {
   struct GNUNET_GETOPT_CommandLineOption clo = {
     .shortName =  shortName,
@@ -601,7 +619,8 @@ set_relative_time (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
                    const char *value)
 {
   struct GNUNET_TIME_Relative *val = scls;
-
+  
+  (void) ctx;  
   if (GNUNET_OK !=
       GNUNET_STRINGS_fancy_time_to_relative (value,
                                             val))
@@ -626,11 +645,11 @@ set_relative_time (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
  * @param[out] val set to the time specified at the command line
  */
 struct GNUNET_GETOPT_CommandLineOption
-GNUNET_GETOPT_OPTION_SET_RELATIVE_TIME (char shortName,
-                                        const char *name,
-                                        const char *argumentHelp,
-                                        const char *description,
-                                        struct GNUNET_TIME_Relative *val)
+GNUNET_GETOPT_option_relative_time (char shortName,
+                                   const char *name,
+                                   const char *argumentHelp,
+                                   const char *description,
+                                   struct GNUNET_TIME_Relative *val)
 {
   struct GNUNET_GETOPT_CommandLineOption clo = {
     .shortName =  shortName,
@@ -654,7 +673,7 @@ GNUNET_GETOPT_OPTION_SET_RELATIVE_TIME (char shortName,
  * type 'struct GNUNET_TIME_Absolute'.
  *
  * @param ctx command line processing context
- * @param scls additional closure (will point to the 'struct GNUNET_TIME_Relative')
+ * @param scls additional closure (will point to the `struct GNUNET_TIME_Absolute`)
  * @param option name of the option
  * @param value actual value of the option as a string.
  * @return #GNUNET_OK if parsing the value worked
@@ -667,6 +686,7 @@ set_absolute_time (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
 {
   struct GNUNET_TIME_Absolute *val = scls;
 
+  (void) ctx;
   if (GNUNET_OK !=
       GNUNET_STRINGS_fancy_time_to_absolute (value,
                                             val))
@@ -691,11 +711,11 @@ set_absolute_time (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
  * @param[out] val set to the time specified at the command line
  */
 struct GNUNET_GETOPT_CommandLineOption
-GNUNET_GETOPT_OPTION_SET_ABSOLUTE_TIME (char shortName,
-                                        const char *name,
-                                        const char *argumentHelp,
-                                        const char *description,
-                                        struct GNUNET_TIME_Absolute *val)
+GNUNET_GETOPT_option_absolute_time (char shortName,
+                                   const char *name,
+                                   const char *argumentHelp,
+                                   const char *description,
+                                   struct GNUNET_TIME_Absolute *val)
 {
   struct GNUNET_GETOPT_CommandLineOption clo = {
     .shortName =  shortName,
@@ -731,10 +751,20 @@ set_uint (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
           const char *value)
 {
   unsigned int *val = scls;
+  char dummy[2];
 
+  (void) ctx;
+  if('-' == *value)
+  {
+       FPRINTF (stderr,
+               _("Your input for the '%s' option has to be a non negative number \n"),
+               option);
+       return GNUNET_SYSERR;
+  }
   if (1 != SSCANF (value,
-                   "%u",
-                   val))
+                   "%u%1s",
+                   val,
+                  dummy))
   {
     FPRINTF (stderr,
              _("You must pass a number to the `%s' option.\n"),
@@ -755,11 +785,11 @@ set_uint (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
  * @param[out] val set to the value specified at the command line
  */
 struct GNUNET_GETOPT_CommandLineOption
-GNUNET_GETOPT_OPTION_SET_UINT (char shortName,
-                               const char *name,
-                               const char *argumentHelp,
-                               const char *description,
-                               unsigned int *val)
+GNUNET_GETOPT_option_uint (char shortName,
+                          const char *name,
+                          const char *argumentHelp,
+                          const char *description,
+                          unsigned int *val)
 {
   struct GNUNET_GETOPT_CommandLineOption clo = {
     .shortName =  shortName,
@@ -775,6 +805,84 @@ GNUNET_GETOPT_OPTION_SET_UINT (char shortName,
 }
 
 
+
+/**
+ * Set an option of type 'uint16_t' from the command line.
+ * A pointer to this function should be passed as part of the
+ * 'struct GNUNET_GETOPT_CommandLineOption' array to initialize options
+ * of this type.  It should be followed by a pointer to a value of
+ * type 'uint16_t'.
+ *
+ * @param ctx command line processing context
+ * @param scls additional closure (will point to the 'unsigned int')
+ * @param option name of the option
+ * @param value actual value of the option as a string.
+ * @return #GNUNET_OK if parsing the value worked
+ */
+static int
+set_uint16 (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
+           void *scls,
+           const char *option,
+           const char *value)
+{
+  uint16_t *val = scls;
+  unsigned int v;
+  char dummy[2];
+  
+  (void) ctx;
+  if (1 != SSCANF (value,
+                   "%u%1s",
+                   &v,
+                  dummy))
+  {
+    FPRINTF (stderr,
+             _("You must pass a number to the `%s' option.\n"),
+             option);
+    return GNUNET_SYSERR;
+  }
+  if (v > UINT16_MAX)
+  {
+    FPRINTF (stderr,
+             _("You must pass a number below %u to the `%s' option.\n"),
+            (unsigned int) UINT16_MAX,
+             option);
+    return GNUNET_SYSERR;
+  }
+  *val = (uint16_t) v;
+  return GNUNET_OK;
+}
+
+
+/**
+ * Allow user to specify an uint16_t.
+ *
+ * @param shortName short name of the option
+ * @param name long name of the option
+ * @param argumentHelp help text for the option argument
+ * @param description long help text for the option
+ * @param[out] val set to the value specified at the command line
+ */
+struct GNUNET_GETOPT_CommandLineOption
+GNUNET_GETOPT_option_uint16 (char shortName,
+                            const char *name,
+                            const char *argumentHelp,
+                            const char *description,
+                            uint16_t *val)
+{
+  struct GNUNET_GETOPT_CommandLineOption clo = {
+    .shortName =  shortName,
+    .name = name,
+    .argumentHelp = argumentHelp,
+    .description = description,
+    .require_argument = 1,
+    .processor = &set_uint16,
+    .scls = (void *) val
+  };
+
+  return clo;
+}
+
+
 /**
  * Closure for #set_base32().
  */
@@ -813,6 +921,7 @@ set_base32 (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
 {
   struct Base32Context *bc = scls;
 
+  (void) ctx;
   if (GNUNET_OK !=
       GNUNET_STRINGS_string_to_data (value,
                                      strlen (value),
@@ -830,7 +939,7 @@ set_base32 (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
 
 /**
  * Helper function to clean up after
- * #GNUNET_GETOPT_OPTION_SET_BASE32_FIXED_SIZE.
+ * #GNUNET_GETOPT_option_base32_fixed_size.
  *
  * @param cls value to GNUNET_free()
  */
@@ -853,7 +962,7 @@ free_bc (void *cls)
  * @param val_size size of @a val in bytes
  */
 struct GNUNET_GETOPT_CommandLineOption
-GNUNET_GETOPT_OPTION_SET_BASE32_FIXED_SIZE (char shortName,
+GNUNET_GETOPT_option_base32_fixed_size (char shortName,
                                             const char *name,
                                             const char *argumentHelp,
                                             const char *description,
@@ -878,4 +987,18 @@ GNUNET_GETOPT_OPTION_SET_BASE32_FIXED_SIZE (char shortName,
 }
 
 
+/**
+ * Make the given option mandatory.
+ *
+ * @param opt option to modify
+ * @return @a opt with the mandatory flag set.
+ */
+struct GNUNET_GETOPT_CommandLineOption
+GNUNET_GETOPT_option_mandatory (struct GNUNET_GETOPT_CommandLineOption opt)
+{
+  opt.option_mandatory = 1;
+  return opt;
+}
+
+
 /* end of getopt_helpers.c */