[Libguestfs] [PATCH 1/2] fish: small refactor of config reading code

Pino Toscano ptoscano at redhat.com
Mon Feb 17 16:23:10 UTC 2014


Even though so far there is just one possible setting to read, isolate
in an own function the code to parse a configuration file and read the
settings out of it.

Now there's a new config_t handle used every time, but since config_read
would reset an handle completely, there is no behaviour change.
---
 fish/config.c | 88 +++++++++++++++++++++--------------------------------------
 1 file changed, 31 insertions(+), 57 deletions(-)

diff --git a/fish/config.c b/fish/config.c
index e9f437a..02d850b 100644
--- a/fish/config.c
+++ b/fish/config.c
@@ -42,87 +42,61 @@ static const char *etc_filename = "/etc/libguestfs-tools.conf";
  * global handle 'g' is opened.
  */
 
-void
-parse_config (void)
+static void
+read_config_from_file (const char *filename)
 {
-  const char *home;
   FILE *fp;
-  config_t conf;
-
-  config_init (&conf);
-
-  /* Try $HOME first. */
-  home = getenv ("HOME");
-  if (home != NULL) {
-    CLEANUP_FREE char *path = NULL;
 
-    if (asprintf (&path, "%s/%s", home, home_filename) == -1) {
-      perror ("asprintf");
-      exit (EXIT_FAILURE);
-    }
+  fp = fopen (filename, "r");
+  if (fp != NULL) {
+    config_t conf;
 
-    fp = fopen (path, "r");
-    if (fp != NULL) {
-      /*
-      if (verbose)
-        fprintf (stderr, "%s: reading configuration from %s\n",
-                 program_name, path);
-      */
-
-      if (config_read (&conf, fp) == CONFIG_FALSE) {
-        fprintf (stderr,
-                 _("%s: %s: line %d: error parsing configuration file: %s\n"),
-                 program_name, path, config_error_line (&conf),
-                 config_error_text (&conf));
-        exit (EXIT_FAILURE);
-      }
-
-      if (fclose (fp) == -1) {
-        perror (path);
-        exit (EXIT_FAILURE);
-      }
-
-      /* Notes:
-       *
-       * (1) It's not obvious from the documentation, that config_read
-       * completely resets the 'conf' structure.  This means we cannot
-       * call config_read twice on the two possible configuration
-       * files, but instead have to copy out settings into our
-       * variables between calls.
-       *
-       * (2) If the next call fails then 'read_only' variable is not
-       * updated.  Failure could happen just because the setting is
-       * missing from the configuration file, so we ignore it here.
-       */
-      config_lookup_bool (&conf, "read_only", &read_only);
-    }
-  }
+    config_init (&conf);
 
-  fp = fopen (etc_filename, "r");
-  if (fp != NULL) {
     /*
     if (verbose)
       fprintf (stderr, "%s: reading configuration from %s\n",
-               program_name, etc_filename);
+               program_name, filename);
     */
 
     if (config_read (&conf, fp) == CONFIG_FALSE) {
       fprintf (stderr,
                _("%s: %s: line %d: error parsing configuration file: %s\n"),
-               program_name, etc_filename, config_error_line (&conf),
+               program_name, filename, config_error_line (&conf),
                config_error_text (&conf));
       exit (EXIT_FAILURE);
     }
 
     if (fclose (fp) == -1) {
-      perror (etc_filename);
+      perror (filename);
       exit (EXIT_FAILURE);
     }
 
     config_lookup_bool (&conf, "read_only", &read_only);
+
+    config_destroy (&conf);
+  }
+}
+
+void
+parse_config (void)
+{
+  const char *home;
+
+  /* Try $HOME first. */
+  home = getenv ("HOME");
+  if (home != NULL) {
+    CLEANUP_FREE char *path = NULL;
+
+    if (asprintf (&path, "%s/%s", home, home_filename) == -1) {
+      perror ("asprintf");
+      exit (EXIT_FAILURE);
+    }
+
+    read_config_from_file (path);
   }
 
-  config_destroy (&conf);
+  read_config_from_file (etc_filename);
 }
 
 #else /* !HAVE_LIBCONFIG */
-- 
1.8.3.1




More information about the Libguestfs mailing list