-Merge branch 'master' of ssh://gnunet.org/gnunet into gsoc2018/rest_api
[oweals/gnunet.git] / src / util / program.c
index a313ce87e61eedf385c3998b8b3a4c3e3361633a..2a9b4fac9c935153778d17386473e984050afa60 100644 (file)
@@ -2,20 +2,18 @@
      This file is part of GNUnet.
      Copyright (C) 2009-2013 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 PURPROSE.  See the GNU
-     General Public License for more details.
-
-     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.
+     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/>.
 */
 
 /**
@@ -31,9 +29,9 @@
 #include "speedup.h"
 #include <gcrypt.h>
 
-#define LOG(kind,...) GNUNET_log_from (kind, "util", __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", syscall, filename)
+#define LOG_STRERROR_FILE(kind,syscall,filename) GNUNET_log_from_strerror_file (kind, "util-program", syscall, filename)
 
 /**
  * Context for the command.
@@ -68,6 +66,17 @@ struct CommandContext
 };
 
 
+/**
+ * task run when the scheduler shuts down
+ */
+static void
+shutdown_task (void *cls)
+{
+  (void) cls;
+  GNUNET_SPEEDUP_stop_ ();
+}
+
+
 /**
  * Initial task called by the scheduler for each
  * program.  Runs the program-specific main task.
@@ -76,12 +85,9 @@ static void
 program_main (void *cls)
 {
   struct CommandContext *cc = cls;
-  const struct GNUNET_SCHEDULER_TaskContext *tc;
 
-  tc = GNUNET_SCHEDULER_get_task_context ();
-  if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
-    return;
   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);
 }
@@ -130,10 +136,13 @@ cmd_sorter (const void *a1, const void *a2)
  * @return #GNUNET_SYSERR on error, #GNUNET_OK on success
  */
 int
-GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
+GNUNET_PROGRAM_run2 (int argc,
+                    char *const *argv,
+                    const char *binaryName,
                      const char *binaryHelp,
                      const struct GNUNET_GETOPT_CommandLineOption *options,
-                     GNUNET_PROGRAM_Main task, void *task_cls,
+                     GNUNET_PROGRAM_Main task,
+                    void *task_cls,
                      int run_without_scheduler)
 {
   struct CommandContext cc;
@@ -150,13 +159,12 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
   unsigned long long skew_variance;
   long long clock_offset;
   struct GNUNET_CONFIGURATION_Handle *cfg;
-
   struct GNUNET_GETOPT_CommandLineOption defoptions[] = {
-    GNUNET_GETOPT_OPTION_CFG_FILE (&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)
+    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)
   };
   struct GNUNET_GETOPT_CommandLineOption *allopts;
   const char *gargs;
@@ -169,23 +177,31 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
   {
     char **gargv;
     unsigned int gargc;
-    int i;
-    char *tok;
     char *cargs;
 
     gargv = NULL;
     gargc = 0;
-    for (i = 0; i < argc; i++)
-      GNUNET_array_append (gargv, gargc, GNUNET_strdup (argv[i]));
+    for (int i = 0; i < argc; i++)
+      GNUNET_array_append (gargv,
+                          gargc,
+                          GNUNET_strdup (argv[i]));
     cargs = GNUNET_strdup (gargs);
-    for (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;
@@ -196,7 +212,8 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
   path = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_LOCALEDIR);
   if (NULL != path)
   {
-    BINDTEXTDOMAIN ("GNUnet", path);
+    BINDTEXTDOMAIN ("GNUnet",
+                   path);
     GNUNET_free (path);
   }
   textdomain ("GNUnet");
@@ -208,13 +225,17 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
       GNUNET_malloc ((cnt +
                       1) * sizeof (struct GNUNET_GETOPT_CommandLineOption) +
                      sizeof (defoptions));
-  memcpy (allopts, defoptions, sizeof (defoptions));
-  memcpy (&allopts
-          [sizeof (defoptions) /
-           sizeof (struct GNUNET_GETOPT_CommandLineOption)], options,
-          (cnt + 1) * sizeof (struct GNUNET_GETOPT_CommandLineOption));
+  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),
+  qsort (allopts,
+        cnt,
+        sizeof (struct GNUNET_GETOPT_CommandLineOption),
          &cmd_sorter);
   loglev = NULL;
   xdg = getenv ("XDG_CONFIG_HOME");
@@ -225,13 +246,19 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
                      DIR_SEPARATOR_STR,
                      GNUNET_OS_project_data_get ()->config_file);
   else
-    cfg_fn = GNUNET_strdup (GNUNET_DEFAULT_USER_CONFIG_FILE);
+    cfg_fn = GNUNET_strdup (GNUNET_OS_project_data_get ()->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);
@@ -242,7 +269,9 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
   if (GNUNET_YES ==
       GNUNET_DISK_file_test (cc.cfgfile))
   {
-    if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, cc.cfgfile))
+    if (GNUNET_SYSERR ==
+       GNUNET_CONFIGURATION_load (cfg,
+                                  cc.cfgfile))
     {
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                   _("Malformed configuration file `%s', exit ...\n"),
@@ -255,11 +284,14 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
   }
   else
   {
-    if (0 != strcmp (cc.cfgfile, cfg_fn))
+    if (0 != strcmp (cc.cfgfile,
+                    cfg_fn))
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                  _("Could not access configuration file `%s'\n"),
                  cc.cfgfile);
-    if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, NULL))
+    if (GNUNET_SYSERR ==
+       GNUNET_CONFIGURATION_load (cfg,
+                                  NULL))
     {
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                   _("Malformed configuration, exit ...\n"));
@@ -272,11 +304,15 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
   GNUNET_free (allopts);
   GNUNET_free (lpfx);
   if (GNUNET_OK ==
-      GNUNET_CONFIGURATION_get_value_number (cc.cfg, "testing", "skew_offset",
+      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)))
+       GNUNET_CONFIGURATION_get_value_number (cc.cfg,
+                                             "testing",
+                                              "skew_variance",
+                                             &skew_variance)))
   {
     clock_offset = skew_offset - skew_variance;
     GNUNET_TIME_set_offset (clock_offset);
@@ -293,7 +329,8 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
                                        "CONFIG"))
   {
     GNUNET_CONFIGURATION_set_value_string (cfg,
-                                           "arm", "CONFIG",
+                                           "arm",
+                                          "CONFIG",
                                            cc.cfgfile);
   }
 
@@ -306,11 +343,13 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
   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:
-  GNUNET_SPEEDUP_stop_ ();
   GNUNET_CONFIGURATION_destroy (cfg);
   GNUNET_free_non_null (cc.cfgfile);
   GNUNET_free (cfg_fn);
@@ -319,6 +358,7 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
   return ret;
 }
 
+
 /**
  * Run a standard GNUnet command startup sequence (initialize loggers
  * and configuration, parse options).