first step to remove plibc
[oweals/gnunet.git] / src / util / program.c
index 2fa8676a2896ef7a51abd06ea3e95414a721af19..77f4ea3ae2e539fe4d81aec364e8e2b243324246 100644 (file)
@@ -14,6 +14,8 @@
 
      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/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
 */
 
 /**
 #include "speedup.h"
 #include <gcrypt.h>
 
-#define LOG(kind,...) GNUNET_log_from (kind, "util-program", __VA_ARGS__)
+#define LOG(kind, ...) GNUNET_log_from (kind, "util-program", __VA_ARGS__)
 
-#define LOG_STRERROR_FILE(kind,syscall,filename) GNUNET_log_from_strerror_file (kind, "util-program", syscall, filename)
+#define LOG_STRERROR_FILE(kind, syscall, filename) \
+  GNUNET_log_from_strerror_file (kind, "util-program", syscall, filename)
 
 /**
  * Context for the command.
@@ -62,7 +65,6 @@ struct CommandContext
    * Configuration to use.
    */
   const struct GNUNET_CONFIGURATION_Handle *cfg;
-
 };
 
 
@@ -86,14 +88,10 @@ program_main (void *cls)
 {
   struct CommandContext *cc = cls;
 
-  GNUNET_SPEEDUP_start_(cc->cfg);
-  GNUNET_SCHEDULER_add_shutdown (&shutdown_task,
-                                NULL);
+  GNUNET_SPEEDUP_start_ (cc->cfg);
+  GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL);
   GNUNET_RESOLVER_connect (cc->cfg);
-  cc->task (cc->task_cls,
-           cc->args,
-           cc->cfgfile,
-           cc->cfg);
+  cc->task (cc->task_cls, cc->args, cc->cfgfile, cc->cfg);
 }
 
 
@@ -105,8 +103,7 @@ program_main (void *cls)
  * @param a2 second command line option
  */
 static int
-cmd_sorter (const void *a1,
-           const void *a2)
+cmd_sorter (const void *a1, const void *a2)
 {
   const struct GNUNET_GETOPT_CommandLineOption *c1 = a1;
   const struct GNUNET_GETOPT_CommandLineOption *c2 = a2;
@@ -142,12 +139,12 @@ cmd_sorter (const void *a1,
  */
 int
 GNUNET_PROGRAM_run2 (int argc,
-                    char *const *argv,
-                    const char *binaryName,
+                     char *const *argv,
+                     const char *binaryName,
                      const char *binaryHelp,
                      const struct GNUNET_GETOPT_CommandLineOption *options,
                      GNUNET_PROGRAM_Main task,
-                    void *task_cls,
+                     void *task_cls,
                      int run_without_scheduler)
 {
   struct CommandContext cc;
@@ -164,13 +161,13 @@ GNUNET_PROGRAM_run2 (int argc,
   unsigned long long skew_variance;
   long long clock_offset;
   struct GNUNET_CONFIGURATION_Handle *cfg;
-  struct GNUNET_GETOPT_CommandLineOption defoptions[] = {
-    GNUNET_GETOPT_option_cfgfile (&cc.cfgfile),
-    GNUNET_GETOPT_option_help (binaryHelp),
-    GNUNET_GETOPT_option_loglevel (&loglev),
-    GNUNET_GETOPT_option_logfile (&logfile),
-    GNUNET_GETOPT_option_version (PACKAGE_VERSION " " VCS_VERSION)
-  };
+  const struct GNUNET_OS_ProjectData *pd = GNUNET_OS_project_data_get ();
+  struct GNUNET_GETOPT_CommandLineOption defoptions[] =
+    {GNUNET_GETOPT_option_cfgfile (&cc.cfgfile),
+     GNUNET_GETOPT_option_help (binaryHelp),
+     GNUNET_GETOPT_option_loglevel (&loglev),
+     GNUNET_GETOPT_option_logfile (&logfile),
+     GNUNET_GETOPT_option_version (pd->version)};
   struct GNUNET_GETOPT_CommandLineOption *allopts;
   const char *gargs;
   char *lpfx;
@@ -187,60 +184,51 @@ GNUNET_PROGRAM_run2 (int argc,
     gargv = NULL;
     gargc = 0;
     for (int i = 0; i < argc; i++)
-      GNUNET_array_append (gargv,
-                          gargc,
-                          GNUNET_strdup (argv[i]));
+      GNUNET_array_append (gargv, gargc, GNUNET_strdup (argv[i]));
     cargs = GNUNET_strdup (gargs);
-    for (char *tok = strtok (cargs, " ");
-        NULL != tok;
-        tok = strtok (NULL, " "))
-      GNUNET_array_append (gargv,
-                          gargc,
-                          GNUNET_strdup (tok));
+    for (char *tok = strtok (cargs, " "); NULL != tok; tok = strtok (NULL, " "))
+      GNUNET_array_append (gargv, gargc, GNUNET_strdup (tok));
     GNUNET_free (cargs);
-    GNUNET_array_append (gargv,
-                        gargc,
-                        NULL);
+    GNUNET_array_append (gargv, gargc, NULL);
     argv = (char *const *) gargv;
     argc = gargc - 1;
   }
-  memset (&cc,
-         0,
-         sizeof (cc));
+  memset (&cc, 0, sizeof (cc));
   loglev = NULL;
   cc.task = task;
   cc.task_cls = task_cls;
   cc.cfg = cfg = GNUNET_CONFIGURATION_create ();
   /* prepare */
 #if ENABLE_NLS
-  setlocale (LC_ALL, "");
-  path = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_LOCALEDIR);
-  if (NULL != path)
+  if (NULL != pd->gettext_domain)
   {
-    BINDTEXTDOMAIN ("GNUnet",
-                   path);
-    GNUNET_free (path);
+    setlocale (LC_ALL, "");
+    path = (NULL == pd->gettext_path)
+             ? GNUNET_OS_installation_get_path (GNUNET_OS_IPK_LOCALEDIR)
+             : GNUNET_strdup (pd->gettext_path);
+    if (NULL != path)
+    {
+      bindtextdomain (pd->gettext_domain, path);
+      GNUNET_free (path);
+    }
+    textdomain (pd->gettext_domain);
   }
-  textdomain ("GNUnet");
 #endif
   cnt = 0;
   while (NULL != options[cnt].name)
     cnt++;
   allopts =
-      GNUNET_malloc ((cnt +
-                      1) * sizeof (struct GNUNET_GETOPT_CommandLineOption) +
-                     sizeof (defoptions));
-  GNUNET_memcpy (allopts,
-                defoptions,
-                sizeof (defoptions));
-  GNUNET_memcpy (&allopts
-                [sizeof (defoptions) /
-                 sizeof (struct GNUNET_GETOPT_CommandLineOption)], options,
-                (cnt + 1) * sizeof (struct GNUNET_GETOPT_CommandLineOption));
+    GNUNET_malloc ((cnt + 1) * sizeof (struct GNUNET_GETOPT_CommandLineOption) +
+                   sizeof (defoptions));
+  GNUNET_memcpy (allopts, defoptions, sizeof (defoptions));
+  GNUNET_memcpy (&allopts[sizeof (defoptions) /
+                          sizeof (struct GNUNET_GETOPT_CommandLineOption)],
+                 options,
+                 (cnt + 1) * sizeof (struct GNUNET_GETOPT_CommandLineOption));
   cnt += sizeof (defoptions) / sizeof (struct GNUNET_GETOPT_CommandLineOption);
   qsort (allopts,
-        cnt,
-        sizeof (struct GNUNET_GETOPT_CommandLineOption),
+         cnt,
+         sizeof (struct GNUNET_GETOPT_CommandLineOption),
          &cmd_sorter);
   loglev = NULL;
   xdg = getenv ("XDG_CONFIG_HOME");
@@ -249,21 +237,15 @@ GNUNET_PROGRAM_run2 (int argc,
                      "%s%s%s",
                      xdg,
                      DIR_SEPARATOR_STR,
-                     GNUNET_OS_project_data_get ()->config_file);
+                     pd->config_file);
   else
-    cfg_fn = GNUNET_strdup (GNUNET_OS_project_data_get ()->user_config_file);
+    cfg_fn = GNUNET_strdup (pd->user_config_file);
   lpfx = GNUNET_strdup (binaryName);
   if (NULL != (spc = strstr (lpfx, " ")))
     *spc = '\0';
-  ret = GNUNET_GETOPT_run (binaryName,
-                          allopts,
-                          (unsigned int) argc,
-                          argv);
+  ret = GNUNET_GETOPT_run (binaryName, allopts, (unsigned int) argc, argv);
   if ((GNUNET_OK > ret) ||
-      (GNUNET_OK !=
-       GNUNET_log_setup (lpfx,
-                        loglev,
-                        logfile)))
+      (GNUNET_OK != GNUNET_log_setup (lpfx, loglev, logfile)))
   {
     GNUNET_free (allopts);
     GNUNET_free (lpfx);
@@ -271,15 +253,13 @@ GNUNET_PROGRAM_run2 (int argc,
   }
   if (NULL != cc.cfgfile)
   {
-    if ( (GNUNET_YES !=
-         GNUNET_DISK_file_test (cc.cfgfile)) ||
-        (GNUNET_SYSERR ==
-         GNUNET_CONFIGURATION_load (cfg,
-                                    cc.cfgfile)) ) 
+    if ((GNUNET_YES != GNUNET_DISK_file_test (cc.cfgfile)) ||
+        (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, cc.cfgfile)))
     {
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                 _("Unreadable or malformed configuration file `%s', exit ...\n"),
-                 cc.cfgfile);
+                  _ (
+                    "Unreadable or malformed configuration file `%s', exit ...\n"),
+                  cc.cfgfile);
       ret = GNUNET_SYSERR;
       GNUNET_free (allopts);
       GNUNET_free (lpfx);
@@ -288,51 +268,46 @@ GNUNET_PROGRAM_run2 (int argc,
   }
   else
   {
-    if (GNUNET_YES ==
-       GNUNET_DISK_file_test (cfg_fn))
+    if (GNUNET_YES == GNUNET_DISK_file_test (cfg_fn))
     {
-      if (GNUNET_SYSERR ==
-         GNUNET_CONFIGURATION_load (cfg,
-                                    cfg_fn))
+      if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, cfg_fn))
       {
-       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                   _("Unreadable or malformed default configuration file `%s', exit ...\n"),
-                   cfg_fn);
-       ret = GNUNET_SYSERR;
-       GNUNET_free (allopts);
-       GNUNET_free (lpfx);
-       goto cleanup;
+        GNUNET_log (
+          GNUNET_ERROR_TYPE_ERROR,
+          _ (
+            "Unreadable or malformed default configuration file `%s', exit ...\n"),
+          cfg_fn);
+        ret = GNUNET_SYSERR;
+        GNUNET_free (allopts);
+        GNUNET_free (lpfx);
+        goto cleanup;
       }
     }
     else
     {
       GNUNET_free (cfg_fn);
       cfg_fn = NULL;
-      if (GNUNET_OK !=
-         GNUNET_CONFIGURATION_load (cfg,
-                                    NULL))
+      if (GNUNET_OK != GNUNET_CONFIGURATION_load (cfg, NULL))
       {
-       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                   _("Unreadable or malformed configuration, exit ...\n"));
-       ret = GNUNET_SYSERR;
-       GNUNET_free (allopts);
-       GNUNET_free (lpfx);
-       goto cleanup;
+        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                    _ ("Unreadable or malformed configuration, exit ...\n"));
+        ret = GNUNET_SYSERR;
+        GNUNET_free (allopts);
+        GNUNET_free (lpfx);
+        goto cleanup;
       }
     }
   }
   GNUNET_free (allopts);
   GNUNET_free (lpfx);
-  if (GNUNET_OK ==
-      GNUNET_CONFIGURATION_get_value_number (cc.cfg,
-                                            "testing",
-                                            "skew_offset",
-                                             &skew_offset) &&
-      (GNUNET_OK ==
-       GNUNET_CONFIGURATION_get_value_number (cc.cfg,
-                                             "testing",
-                                              "skew_variance",
-                                             &skew_variance)))
+  if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number (cc.cfg,
+                                                          "testing",
+                                                          "skew_offset",
+                                                          &skew_offset) &&
+      (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number (cc.cfg,
+                                                           "testing",
+                                                           "skew_variance",
+                                                           &skew_variance)))
   {
     clock_offset = skew_offset - skew_variance;
     GNUNET_TIME_set_offset (clock_offset);
@@ -343,43 +318,29 @@ GNUNET_PROGRAM_run2 (int argc,
      in "cfg".  This is typically really only having an effect if we
      are running code in src/arm/, as obviously the rest of the code
      has little business with ARM-specific options. */
-  if (GNUNET_YES !=
-      GNUNET_CONFIGURATION_have_value (cfg,
-                                      "arm",
-                                      "CONFIG"))
+  if (GNUNET_YES != GNUNET_CONFIGURATION_have_value (cfg, "arm", "CONFIG"))
   {
     if (NULL != cc.cfgfile)
-      GNUNET_CONFIGURATION_set_value_string (cfg,
-                                            "arm",
-                                            "CONFIG",
-                                            cc.cfgfile);
+      GNUNET_CONFIGURATION_set_value_string (cfg, "arm", "CONFIG", cc.cfgfile);
     else if (NULL != cfg_fn)
-      GNUNET_CONFIGURATION_set_value_string (cfg,
-                                            "arm",
-                                            "CONFIG",
-                                            cfg_fn);
+      GNUNET_CONFIGURATION_set_value_string (cfg, "arm", "CONFIG", cfg_fn);
   }
 
   /* run */
   cc.args = &argv[ret];
-  if ( (NULL == cc.cfgfile) &&
-       (NULL != cfg_fn) )
+  if ((NULL == cc.cfgfile) && (NULL != cfg_fn))
     cc.cfgfile = GNUNET_strdup (cfg_fn);
   if (GNUNET_NO == run_without_scheduler)
   {
-    GNUNET_SCHEDULER_run (&program_main,
-                         &cc);
+    GNUNET_SCHEDULER_run (&program_main, &cc);
   }
   else
   {
     GNUNET_RESOLVER_connect (cc.cfg);
-    cc.task (cc.task_cls,
-            cc.args,
-            cc.cfgfile,
-            cc.cfg);
+    cc.task (cc.task_cls, cc.args, cc.cfgfile, cc.cfg);
   }
   ret = GNUNET_OK;
- cleanup:
+cleanup:
   GNUNET_CONFIGURATION_destroy (cfg);
   GNUNET_free_non_null (cc.cfgfile);
   GNUNET_free_non_null (cfg_fn);
@@ -403,17 +364,21 @@ GNUNET_PROGRAM_run2 (int argc,
  * @return #GNUNET_SYSERR on error, #GNUNET_OK on success
  */
 int
-GNUNET_PROGRAM_run (int argc, char *const *argv,
+GNUNET_PROGRAM_run (int argc,
+                    char *const *argv,
                     const char *binaryName,
                     const char *binaryHelp,
                     const struct GNUNET_GETOPT_CommandLineOption *options,
                     GNUNET_PROGRAM_Main task,
                     void *task_cls)
 {
-  return GNUNET_PROGRAM_run2 (argc, argv,
-                              binaryName, binaryHelp,
+  return GNUNET_PROGRAM_run2 (argc,
+                              argv,
+                              binaryName,
+                              binaryHelp,
                               options,
-                              task, task_cls,
+                              task,
+                              task_cls,
                               GNUNET_NO);
 }