util/service.c: Fix clang warning.
[oweals/gnunet.git] / src / util / gnunet-config.c
index 2beb772a9a9fc19673f09765b1e06afbc89263f3..f700428a246f4a1867505d16dc48270bed22eee8 100644 (file)
@@ -2,20 +2,20 @@
      This file is part of GNUnet.
      Copyright (C) 2012 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 PURPOSE.  See the GNU
-     General Public License for more details.
+     Affero 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.
+     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/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
 */
 
 /**
@@ -72,12 +72,42 @@ static int rewrite;
  * @param value value of the option
  */
 static void
-print_option (void *cls, const char *section,
-             const char *option,
-             const char *value)
+print_option (void *cls,
+              const char *section,
+              const char *option,
+              const char *value)
 {
-  fprintf (stdout,
-          "%s = %s\n", option, value);
+  const struct GNUNET_CONFIGURATION_Handle *cfg = cls;
+
+  (void) section;
+  if (is_filename)
+  {
+    char *value_fn;
+    char *fn;
+
+    GNUNET_assert (GNUNET_OK ==
+                   GNUNET_CONFIGURATION_get_value_filename (cfg,
+                                                            section,
+                                                            option,
+                                                            &value_fn));
+    fn = GNUNET_STRINGS_filename_expand (value_fn);
+    if (NULL == fn)
+      fn = value_fn;
+    else
+      GNUNET_free (value_fn);
+    fprintf (stdout,
+             "%s = %s\n",
+             option,
+             fn);
+    GNUNET_free (fn);
+  }
+  else
+  {
+    fprintf (stdout,
+             "%s = %s\n",
+             option,
+             value);
+  }
 }
 
 
@@ -91,7 +121,10 @@ static void
 print_section_name (void *cls,
                     const char *section)
 {
-  fprintf (stdout, "%s\n", section);
+  (void) cls;
+  fprintf (stdout,
+           "%s\n",
+           section);
 }
 
 
@@ -100,7 +133,8 @@ print_section_name (void *cls,
  *
  * @param cls closure
  * @param args remaining command-line arguments
- * @param cfgfile name of the configuration file used (for saving, can be NULL!)
+ * @param cfgfile name of the configuration file used (for saving,
+ *                                                     can be NULL!)
  * @param cfg configuration
  */
 static void
@@ -111,7 +145,10 @@ run (void *cls,
 {
   struct GNUNET_CONFIGURATION_Handle *out = NULL;
   struct GNUNET_CONFIGURATION_Handle *diff = NULL;
+  char *cfg_fn;
 
+  (void) cls;
+  (void) args;
   if (rewrite)
   {
     struct GNUNET_CONFIGURATION_Handle *def;
@@ -134,14 +171,19 @@ run (void *cls,
     if (! list_sections)
     {
       fprintf (stderr,
-               _("--section argument is required\n"));
+               _("%s or %s argument is required\n"),
+               "--section",
+               "--list-sections");
+      ret = 1;
+    }
+    else
+    {
+      fprintf (stderr,
+               _("The following sections are available:\n"));
+      GNUNET_CONFIGURATION_iterate_sections (cfg,
+                                             &print_section_name,
+                                             NULL);
     }
-    fprintf (stderr,
-             _("The following sections are available:\n"));
-    GNUNET_CONFIGURATION_iterate_sections (cfg,
-                                           &print_section_name,
-                                           NULL);
-    ret = 1;
     goto cleanup;
   }
 
@@ -151,35 +193,36 @@ run (void *cls,
     {
       GNUNET_CONFIGURATION_iterate_section_values (cfg,
                                                    section,
-                                                  &print_option,
-                                                   NULL);
+                                                   &print_option,
+                                                   (void *) cfg);
     }
     else
     {
       if (is_filename)
       {
-       if (GNUNET_OK !=
-           GNUNET_CONFIGURATION_get_value_filename (cfg,
+        if (GNUNET_OK !=
+            GNUNET_CONFIGURATION_get_value_filename (cfg,
                                                      section,
                                                      option,
                                                      &value))
-       {
-         GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
-                                    section, option);
-         ret = 3;
+        {
+          GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+                                     section, option);
+          ret = 3;
           goto cleanup;
-       }
+        }
       }
       else
       {
-       if (GNUNET_OK !=
-           GNUNET_CONFIGURATION_get_value_string (cfg, section, option, &value))
-       {
-         GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
-                                    section, option);
-         ret = 3;
+        if (GNUNET_OK !=
+            GNUNET_CONFIGURATION_get_value_string (cfg, section,
+                                                   option, &value))
+        {
+          GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+                                     section, option);
+          ret = 3;
           goto cleanup;
-       }
+        }
       }
       fprintf (stdout, "%s\n", value);
     }
@@ -198,16 +241,31 @@ run (void *cls,
                                            option,
                                            value);
   }
+  cfg_fn = NULL;
+  if (NULL == cfgfile)
+  {
+    const char *xdg = getenv ("XDG_CONFIG_HOME");
+    if (NULL != xdg)
+      GNUNET_asprintf (&cfg_fn,
+                       "%s%s%s",
+                       xdg,
+                       DIR_SEPARATOR_STR,
+                       GNUNET_OS_project_data_get ()->config_file);
+    else
+      cfg_fn = GNUNET_strdup (GNUNET_OS_project_data_get ()->user_config_file);
+    cfgfile = cfg_fn;
+  }
   if ( (NULL != diff) || (NULL != out) )
   {
     if (GNUNET_OK !=
-       GNUNET_CONFIGURATION_write ((NULL == out) ? diff : out,
+        GNUNET_CONFIGURATION_write ((NULL == out) ? diff : out,
                                     cfgfile))
       ret = 2;
   }
+  GNUNET_free_non_null (cfg_fn);
   if (NULL != out)
     GNUNET_CONFIGURATION_destroy (out);
- cleanup:
+cleanup:
   if (NULL != diff)
     GNUNET_CONFIGURATION_destroy (diff);
 }
@@ -221,36 +279,37 @@ run (void *cls,
  * @return 0 ok, 1 on error
  */
 int
-main (int argc, char *const *argv)
+main (int argc,
+      char *const *argv)
 {
   struct GNUNET_GETOPT_CommandLineOption options[] = {
-    GNUNET_GETOPT_OPTION_SET_ONE ('f',
-                                  "filename",
-                                  gettext_noop ("obtain option of value as a filename (with $-expansion)"),
-                                  &is_filename),
-    GNUNET_GETOPT_OPTION_STRING ('s',
-                                     "section",
-                                     "SECTION",
-                                     gettext_noop ("name of the section to access"),
-                                     &section),
-    GNUNET_GETOPT_OPTION_STRING ('o',
-                                     "option",
-                                     "OPTION",
-                                     gettext_noop ("name of the option to access"),
-                                     &option),
-    GNUNET_GETOPT_OPTION_STRING ('V',
-                                     "value",
-                                     "VALUE",
-                                     gettext_noop ("value to set"),
-                                     &value),
-    GNUNET_GETOPT_OPTION_SET_ONE ('S',
-                                  "list-sections",
-                                  gettext_noop ("print available configuration sections"),
-                                  &list_sections),
-    GNUNET_GETOPT_OPTION_SET_ONE ('w',
-                                  "rewrite",
-                                  gettext_noop ("write configuration file that only contains delta to defaults"),
-                                  &rewrite),
+    GNUNET_GETOPT_option_flag ('f',
+      "filename",
+      gettext_noop ("interpret option value as a filename (with $-expansion)"),
+      &is_filename),
+    GNUNET_GETOPT_option_string ('s',
+                                "section",
+                                "SECTION",
+                                gettext_noop ("name of the section to access"),
+                                &section),
+    GNUNET_GETOPT_option_string ('o',
+                                 "option",
+                                 "OPTION",
+                                 gettext_noop ("name of the option to access"),
+                                 &option),
+    GNUNET_GETOPT_option_string ('V',
+                                 "value",
+                                 "VALUE",
+                                 gettext_noop ("value to set"),
+                                 &value),
+    GNUNET_GETOPT_option_flag ('S',
+                       "list-sections",
+                       gettext_noop ("print available configuration sections"),
+                       &list_sections),
+    GNUNET_GETOPT_option_flag ('w',
+                               "rewrite",
+                               gettext_noop ("write configuration file that only contains delta to defaults"),
+                               &rewrite),
     GNUNET_GETOPT_OPTION_END
   };
   if (GNUNET_OK !=
@@ -259,12 +318,12 @@ main (int argc, char *const *argv)
     return 2;
 
   ret = (GNUNET_OK ==
-        GNUNET_PROGRAM_run (argc,
-                             argv,
-                             "gnunet-config [OPTIONS]",
-                            gettext_noop ("Manipulate GNUnet configuration files"),
-                            options,
-                             &run, NULL)) ? 0 : ret;
+         GNUNET_PROGRAM_run (argc,
+                        argv,
+                        "gnunet-config [OPTIONS]",
+                        gettext_noop ("Manipulate GNUnet configuration files"),
+                        options,
+                        &run, NULL)) ? 0 : ret;
   GNUNET_free ((void*) argv);
   return ret;
 }