-fixes
[oweals/gnunet.git] / src / util / program.c
index 5582f30c69228c875c8c29fda87ecad5efc4e856..bfa58dc65c3eeebfbb91d7601b7aa327e537f493 100644 (file)
@@ -125,13 +125,16 @@ cmd_sorter (__const void *a1, __const void *a2)
  * @param options command line options
  * @param task main function to run
  * @param task_cls closure for task
+ * @param run_without_scheduler GNUNET_NO start the scheduler, GNUNET_YES do not
+ *        start the scheduler just run the main task
  * @return GNUNET_SYSERR on error, GNUNET_OK on success
  */
 int
-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)
+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,
+                    int run_without_scheduler)
 {
   struct CommandContext cc;
   char *path;
@@ -159,29 +162,29 @@ GNUNET_PROGRAM_run (int argc, char *const *argv, const char *binaryName,
   logfile = NULL;
   gargs = getenv ("GNUNET_ARGS");
   if (gargs != NULL)
-    {
-      char **gargv;
-      unsigned int gargc;
-      int i;
-      char *tok;
-      char *cargs;
+  {
+    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]));
-      cargs = GNUNET_strdup (gargs);
-      tok = strtok (cargs, " ");
-      while (NULL != tok)
-       {
-         GNUNET_array_append (gargv, gargc, GNUNET_strdup (tok));
-         tok = strtok (NULL, " ");
-       }
-      GNUNET_free (cargs);
-      GNUNET_array_append (gargv, gargc, NULL);
-      argv = (char *const *) gargv;
-      argc = gargc - 1;
+    gargv = NULL;
+    gargc = 0;
+    for (i = 0; i < argc; i++)
+      GNUNET_array_append (gargv, gargc, GNUNET_strdup (argv[i]));
+    cargs = GNUNET_strdup (gargs);
+    tok = strtok (cargs, " ");
+    while (NULL != tok)
+    {
+      GNUNET_array_append (gargv, gargc, GNUNET_strdup (tok));
+      tok = strtok (NULL, " ");
     }
+    GNUNET_free (cargs);
+    GNUNET_array_append (gargv, gargc, NULL);
+    argv = (char *const *) gargv;
+    argc = gargc - 1;
+  }
   memset (&cc, 0, sizeof (cc));
   loglev = NULL;
   cc.task = task;
@@ -193,28 +196,27 @@ GNUNET_PROGRAM_run (int argc, char *const *argv, const char *binaryName,
   setlocale (LC_ALL, "");
   path = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_LOCALEDIR);
   if (path != NULL)
-    {
-      BINDTEXTDOMAIN ("GNUnet", path);
-      GNUNET_free (path);
-    }
+  {
+    BINDTEXTDOMAIN ("GNUnet", path);
+    GNUNET_free (path);
+  }
   textdomain ("GNUnet");
 #endif
   cnt = 0;
   while (options[cnt].name != NULL)
     cnt++;
   allopts =
-    GNUNET_malloc ((cnt +
-                   1) * sizeof (struct GNUNET_GETOPT_CommandLineOption) +
-                  sizeof (defoptions));
+      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));
-  cnt +=
-    sizeof (defoptions) / sizeof (struct GNUNET_GETOPT_CommandLineOption);
+          [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),
-        &cmd_sorter);
+         &cmd_sorter);
   loglev = NULL;
   cc.cfgfile = GNUNET_strdup (GNUNET_DEFAULT_USER_CONFIG_FILE);
   lpfx = GNUNET_strdup (binaryName);
@@ -222,35 +224,41 @@ GNUNET_PROGRAM_run (int argc, char *const *argv, const char *binaryName,
     *spc = '\0';
   if ((-1 ==
        (ret =
-       GNUNET_GETOPT_run (binaryName, allopts, (unsigned int) argc, argv)))
-      || (GNUNET_OK != GNUNET_log_setup (lpfx, loglev, logfile)))
-    {
-      GNUNET_CONFIGURATION_destroy (cfg);
-      GNUNET_free_non_null (cc.cfgfile);
-      GNUNET_free_non_null (loglev);
-      GNUNET_free_non_null (logfile);
-      GNUNET_free (allopts);
-      GNUNET_free (lpfx);
-      return GNUNET_SYSERR;
-    }
+        GNUNET_GETOPT_run (binaryName, allopts, (unsigned int) argc, argv))) ||
+      (GNUNET_OK != GNUNET_log_setup (lpfx, loglev, logfile)))
+  {
+    GNUNET_CONFIGURATION_destroy (cfg);
+    GNUNET_free_non_null (cc.cfgfile);
+    GNUNET_free_non_null (loglev);
+    GNUNET_free_non_null (logfile);
+    GNUNET_free (allopts);
+    GNUNET_free (lpfx);
+    return GNUNET_SYSERR;
+  }
   (void) GNUNET_CONFIGURATION_load (cfg, cc.cfgfile);
   GNUNET_free (allopts);
   GNUNET_free (lpfx);
   if (GNUNET_OK ==
       GNUNET_CONFIGURATION_get_value_number (cc.cfg, "testing", "skew_offset",
-                                            &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);
-    }
+                                              "skew_variance", &skew_variance)))
+  {
+    clock_offset = skew_offset - skew_variance;
+    GNUNET_TIME_set_offset (clock_offset);
+  }
   /* run */
   cc.args = &argv[ret];
-  GNUNET_SCHEDULER_run (&program_main, &cc);
-
+  if (GNUNET_NO == run_without_scheduler)
+  {
+          GNUNET_SCHEDULER_run (&program_main, &cc);
+  }
+  else
+  {
+          GNUNET_RESOLVER_connect (cc.cfg);
+          cc.task (cc.task_cls, cc.args, cc.cfgfile, cc.cfg);
+  }
   /* clean up */
   GNUNET_CONFIGURATION_destroy (cfg);
   GNUNET_free_non_null (cc.cfgfile);
@@ -259,5 +267,28 @@ GNUNET_PROGRAM_run (int argc, char *const *argv, const char *binaryName,
   return GNUNET_OK;
 }
 
+/**
+ * Run a standard GNUnet command startup sequence (initialize loggers
+ * and configuration, parse options).
+ *
+ * @param argc number of command line arguments
+ * @param argv command line arguments
+ * @param binaryName our expected name
+ * @param binaryHelp help text for the program
+ * @param options command line options
+ * @param task main function to run
+ * @param task_cls closure for task
+ * @return GNUNET_SYSERR on error, GNUNET_OK on success
+ */
+int
+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, options, task, task_cls, GNUNET_NO);
+}
+
+
 
 /* end of program.c */