util/service.c: Fix clang warning.
[oweals/gnunet.git] / src / util / gnunet-config.c
index 81e09fdbf83fc62b0cc667dd93d24f092049bf44..f700428a246f4a1867505d16dc48270bed22eee8 100644 (file)
      WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      Affero General Public License for more details.
+
+     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
 */
 
 /**
@@ -68,16 +73,41 @@ static int rewrite;
  */
 static void
 print_option (void *cls,
-             const char *section,
-             const char *option,
-             const char *value)
+              const char *section,
+              const char *option,
+              const char *value)
 {
-  (void) cls;
+  const struct GNUNET_CONFIGURATION_Handle *cfg = cls;
+
   (void) section;
-  fprintf (stdout,
-          "%s = %s\n",
-          option,
-          value);
+  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);
+  }
 }
 
 
@@ -93,8 +123,8 @@ print_section_name (void *cls,
 {
   (void) cls;
   fprintf (stdout,
-          "%s\n",
-          section);
+           "%s\n",
+           section);
 }
 
 
@@ -103,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
@@ -114,6 +145,7 @@ run (void *cls,
 {
   struct GNUNET_CONFIGURATION_Handle *out = NULL;
   struct GNUNET_CONFIGURATION_Handle *diff = NULL;
+  char *cfg_fn;
 
   (void) cls;
   (void) args;
@@ -139,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;
   }
 
@@ -156,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);
     }
@@ -203,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);
 }
@@ -231,32 +284,32 @@ main (int argc,
 {
   struct GNUNET_GETOPT_CommandLineOption options[] = {
     GNUNET_GETOPT_option_flag ('f',
-                              "filename",
-                              gettext_noop ("obtain option of value as a filename (with $-expansion)"),
-                              &is_filename),
+      "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),
+                                "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),
+                                 "option",
+                                 "OPTION",
+                                 gettext_noop ("name of the option to access"),
+                                 &option),
     GNUNET_GETOPT_option_string ('V',
-                                "value",
-                                "VALUE",
-                                gettext_noop ("value to set"),
-                                &value),
+                                 "value",
+                                 "VALUE",
+                                 gettext_noop ("value to set"),
+                                 &value),
     GNUNET_GETOPT_option_flag ('S',
-                              "list-sections",
-                              gettext_noop ("print available configuration sections"),
-                              &list_sections),
+                       "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),
+                               "rewrite",
+                               gettext_noop ("write configuration file that only contains delta to defaults"),
+                               &rewrite),
     GNUNET_GETOPT_OPTION_END
   };
   if (GNUNET_OK !=
@@ -265,12 +318,12 @@ main (int argc,
     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;
 }