- dont resend useless channel_destroy messages
[oweals/gnunet.git] / src / util / program.c
index 9d2e0a40d8bd93ccb651aadda83e7cd6b6327035..8b1d7773ed249cf4b9a802679647493a7664215e 100644 (file)
  */
 
 #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_scheduler_lib.h"
+#include "gnunet_directories.h"
 #include <gcrypt.h>
 
 #define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__)
@@ -146,9 +140,13 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
                     int run_without_scheduler)
 {
   struct CommandContext cc;
+#if ENABLE_NLS
   char *path;
+#endif
   char *loglev;
   char *logfile;
+  char *cfg_fn;
+  const char *xdg;
   int ret;
   unsigned int cnt;
   unsigned long long skew_offset;
@@ -199,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 ();
-
   /* prepare */
 #if ENABLE_NLS
   setlocale (LC_ALL, "");
@@ -227,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;
-  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';
@@ -239,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 (cfg_fn);
     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 (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);
@@ -280,7 +288,8 @@ GNUNET_PROGRAM_run2 (int argc, char *const *argv, const char *binaryName,
   /* 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;
@@ -296,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 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,