- dont resend useless channel_destroy messages
[oweals/gnunet.git] / src / util / program.c
index 4985995b49def5946f2833322929a4a2369ec0f5..8b1d7773ed249cf4b9a802679647493a7664215e 100644 (file)
@@ -4,7 +4,7 @@
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
 
      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 2, or (at your
+     by the Free Software Foundation; either version 3, or (at your
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
  */
 
 #include "platform.h"
  */
 
 #include "platform.h"
-#include "gnunet_common.h"
-#include "gnunet_configuration_lib.h"
-#include "gnunet_crypto_lib.h"
-#include "gnunet_directories.h"
-#include "gnunet_getopt_lib.h"
-#include "gnunet_os_lib.h"
-#include "gnunet_program_lib.h"
+#include "gnunet_util_lib.h"
 #include "gnunet_resolver_service.h"
 #include "gnunet_resolver_service.h"
-#include "gnunet_scheduler_lib.h"
+#include "gnunet_directories.h"
 #include <gcrypt.h>
 
 #define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__)
 #include <gcrypt.h>
 
 #define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__)
@@ -78,6 +72,7 @@ GNUNET_SPEEDUP_start_ (const struct GNUNET_CONFIGURATION_Handle *cfg);
 int
 GNUNET_SPEEDUP_stop_ (void);
 
 int
 GNUNET_SPEEDUP_stop_ (void);
 
+
 /**
  * Initial task called by the scheduler for each
  * program.  Runs the program-specific main task.
 /**
  * Initial task called by the scheduler for each
  * program.  Runs the program-specific main task.
@@ -86,8 +81,10 @@ static void
 program_main (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   struct CommandContext *cc = cls;
 program_main (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   struct CommandContext *cc = cls;
-  GNUNET_SPEEDUP_start_(cc->cfg);
 
 
+  if (0 != (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
+    return;
+  GNUNET_SPEEDUP_start_(cc->cfg);
   GNUNET_RESOLVER_connect (cc->cfg);
   cc->task (cc->task_cls, cc->args, cc->cfgfile, cc->cfg);
 }
   GNUNET_RESOLVER_connect (cc->cfg);
   cc->task (cc->task_cls, cc->args, cc->cfgfile, cc->cfg);
 }
@@ -143,9 +140,13 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
                     int run_without_scheduler)
 {
   struct CommandContext cc;
                     int run_without_scheduler)
 {
   struct CommandContext cc;
+#if ENABLE_NLS
   char *path;
   char *path;
+#endif
   char *loglev;
   char *logfile;
   char *loglev;
   char *logfile;
+  char *cfg_fn;
+  const char *xdg;
   int ret;
   unsigned int cnt;
   unsigned long long skew_offset;
   int ret;
   unsigned int cnt;
   unsigned long long skew_offset;
@@ -158,7 +159,7 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
     GNUNET_GETOPT_OPTION_HELP (binaryHelp),
     GNUNET_GETOPT_OPTION_LOGLEVEL (&loglev),
     GNUNET_GETOPT_OPTION_LOGFILE (&logfile),
     GNUNET_GETOPT_OPTION_HELP (binaryHelp),
     GNUNET_GETOPT_OPTION_LOGLEVEL (&loglev),
     GNUNET_GETOPT_OPTION_LOGFILE (&logfile),
-    GNUNET_GETOPT_OPTION_VERSION (PACKAGE_VERSION)
+    GNUNET_GETOPT_OPTION_VERSION (PACKAGE_VERSION " " VCS_VERSION)
   };
   struct GNUNET_GETOPT_CommandLineOption *allopts;
   const char *gargs;
   };
   struct GNUNET_GETOPT_CommandLineOption *allopts;
   const char *gargs;
@@ -196,7 +197,6 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
   cc.task = task;
   cc.task_cls = task_cls;
   cc.cfg = cfg = GNUNET_CONFIGURATION_create ();
   cc.task = task;
   cc.task_cls = task_cls;
   cc.cfg = cfg = GNUNET_CONFIGURATION_create ();
-
   /* prepare */
 #if ENABLE_NLS
   setlocale (LC_ALL, "");
   /* prepare */
 #if ENABLE_NLS
   setlocale (LC_ALL, "");
@@ -224,7 +224,15 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
   qsort (allopts, cnt, sizeof (struct GNUNET_GETOPT_CommandLineOption),
          &cmd_sorter);
   loglev = NULL;
   qsort (allopts, cnt, sizeof (struct GNUNET_GETOPT_CommandLineOption),
          &cmd_sorter);
   loglev = NULL;
-  cc.cfgfile = GNUNET_strdup (GNUNET_DEFAULT_USER_CONFIG_FILE);
+  xdg = getenv ("XDG_CONFIG_HOME");
+  if (NULL != xdg)
+    GNUNET_asprintf (&cfg_fn,
+                     "%s%s%s",
+                     xdg,
+                     DIR_SEPARATOR_STR,
+                     "gnunet.conf");
+  else
+    cfg_fn = GNUNET_strdup (GNUNET_DEFAULT_USER_CONFIG_FILE);
   lpfx = GNUNET_strdup (binaryName);
   if (NULL != (spc = strstr (lpfx, " ")))
     *spc = '\0';
   lpfx = GNUNET_strdup (binaryName);
   if (NULL != (spc = strstr (lpfx, " ")))
     *spc = '\0';
@@ -236,17 +244,20 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
     GNUNET_free_non_null (cc.cfgfile);
     GNUNET_free_non_null (loglev);
     GNUNET_free_non_null (logfile);
     GNUNET_free_non_null (cc.cfgfile);
     GNUNET_free_non_null (loglev);
     GNUNET_free_non_null (logfile);
+    GNUNET_free (cfg_fn);
     GNUNET_free (allopts);
     GNUNET_free (lpfx);
     return (ret == GNUNET_SYSERR) ? GNUNET_SYSERR : GNUNET_OK;
   }
     GNUNET_free (allopts);
     GNUNET_free (lpfx);
     return (ret == GNUNET_SYSERR) ? GNUNET_SYSERR : GNUNET_OK;
   }
+  if (NULL == cc.cfgfile)
+    cc.cfgfile = GNUNET_strdup (cfg_fn);
   if (GNUNET_YES ==
       GNUNET_DISK_file_test (cc.cfgfile))
     (void) GNUNET_CONFIGURATION_load (cfg, cc.cfgfile);
   else
   {
     (void) GNUNET_CONFIGURATION_load (cfg, NULL);
   if (GNUNET_YES ==
       GNUNET_DISK_file_test (cc.cfgfile))
     (void) GNUNET_CONFIGURATION_load (cfg, cc.cfgfile);
   else
   {
     (void) GNUNET_CONFIGURATION_load (cfg, NULL);
-    if (0 != strcmp (cc.cfgfile, GNUNET_DEFAULT_USER_CONFIG_FILE))
+    if (0 != strcmp (cc.cfgfile, cfg_fn))
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                  _("Could not access configuration file `%s'\n"),
                  cc.cfgfile);
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                  _("Could not access configuration file `%s'\n"),
                  cc.cfgfile);
@@ -277,7 +288,8 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
   /* clean up */
   GNUNET_SPEEDUP_stop_ ();
   GNUNET_CONFIGURATION_destroy (cfg);
   /* clean up */
   GNUNET_SPEEDUP_stop_ ();
   GNUNET_CONFIGURATION_destroy (cfg);
-  GNUNET_free_non_null (cc.cfgfile);
+  GNUNET_free (cc.cfgfile);
+  GNUNET_free (cfg_fn);
   GNUNET_free_non_null (loglev);
   GNUNET_free_non_null (logfile);
   return GNUNET_OK;
   GNUNET_free_non_null (loglev);
   GNUNET_free_non_null (logfile);
   return GNUNET_OK;
@@ -293,8 +305,8 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
  * @param binaryHelp help text for the program
  * @param options command line options
  * @param task main function to run
  * @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
+ * @param task_cls closure for @a task
+ * @return #GNUNET_SYSERR on error, #GNUNET_OK on success
  */
 int
 GNUNET_PROGRAM_run (int argc, char *const *argv, const char *binaryName,
  */
 int
 GNUNET_PROGRAM_run (int argc, char *const *argv, const char *binaryName,