Returns now GNUNET_SYSERR
[oweals/gnunet.git] / src / util / program.c
index c8ebfc4eb7c25ad596826bc0cff4581b1f2174ea..6f8467837d3a0e5ecaa7fb720b6aa31ca471bc75 100644 (file)
@@ -63,7 +63,7 @@ struct CommandContext
   /**
    * Configuration to use.
    */
-  struct GNUNET_CONFIGURATION_Handle *cfg;
+  const struct GNUNET_CONFIGURATION_Handle *cfg;
 
 };
 
@@ -77,22 +77,25 @@ program_main (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   struct CommandContext *cc = cls;
 
-  cc->task (cc->task_cls, tc->sched, cc->args, cc->cfgfile, cc->cfg);
+  cc->task (cc->task_cls, cc->args, cc->cfgfile, cc->cfg);
 }
 
 
 /**
  * Compare function for 'qsort' to sort command-line arguments by the
  * short option.
+ *
+ * @param a1 first command line option
+ * @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;
-  if (toupper (c1->shortName) > toupper (c2->shortName))
+  __const struct GNUNET_GETOPT_CommandLineOption *c1 = a1;
+  __const struct GNUNET_GETOPT_CommandLineOption *c2 = a2;
+  if (toupper ( (unsigned char) c1->shortName) > toupper ( (unsigned char) c2->shortName))
     return 1;
-  if (toupper (c1->shortName) < toupper (c2->shortName))
+  if (toupper ( (unsigned char) c1->shortName) < toupper ( (unsigned char) c2->shortName))
     return -1;
   if (c1->shortName > c2->shortName)
     return 1;
@@ -109,6 +112,7 @@ cmd_sorter (const void *a1, const void *a2)
  * @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
@@ -125,21 +129,51 @@ GNUNET_PROGRAM_run (int argc,
   struct CommandContext cc;
   char *path;
   char *loglev;
+  char *logfile;
   int ret;
   unsigned int cnt;
+  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)
   };
   struct GNUNET_GETOPT_CommandLineOption *allopts;
+  const char *gargs;
 
+  logfile = NULL;
+  gargs = getenv ("GNUNET_ARGS");
+  if (gargs != NULL)
+    {
+      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;
+    }
   memset (&cc, 0, sizeof (cc));
   loglev = NULL;
   cc.task = task;
   cc.task_cls = task_cls;
-  cc.cfg = GNUNET_CONFIGURATION_create ();
+  cc.cfg = cfg = GNUNET_CONFIGURATION_create ();
 
   /* prepare */
 #if ENABLE_NLS
@@ -169,17 +203,18 @@ GNUNET_PROGRAM_run (int argc,
   qsort (allopts, cnt, sizeof (struct GNUNET_GETOPT_CommandLineOption),
          &cmd_sorter);
   loglev = GNUNET_strdup ("WARNING");
+  cc.cfgfile = GNUNET_strdup (GNUNET_DEFAULT_USER_CONFIG_FILE);
   if ((-1 == (ret = GNUNET_GETOPT_run (binaryName,
-                                       cc.cfg,
                                        allopts,
                                        (unsigned int) argc, argv))) ||
       ((GNUNET_OK !=
         GNUNET_log_setup (binaryName,
                           loglev,
-                          NULL)) ||
-       (GNUNET_OK != GNUNET_CONFIGURATION_load (cc.cfg, cc.cfgfile))))
+                          logfile)) ||
+       (GNUNET_OK != GNUNET_CONFIGURATION_load (cfg, cc.cfgfile))))
 
     {
+      GNUNET_CONFIGURATION_destroy (cfg);
       GNUNET_free_non_null (cc.cfgfile);
       GNUNET_free (loglev);
       GNUNET_free (allopts);
@@ -192,7 +227,7 @@ GNUNET_PROGRAM_run (int argc,
   GNUNET_SCHEDULER_run (&program_main, &cc);
 
   /* clean up */
-  GNUNET_CONFIGURATION_destroy (cc.cfg);
+  GNUNET_CONFIGURATION_destroy (cfg);
   GNUNET_free_non_null (cc.cfgfile);
   GNUNET_free (loglev);
   return GNUNET_OK;