Pathnames detection generalized, no longer 'configuration' specific.
authorshort <>
Sun, 26 Jun 2005 04:43:42 +0000 (04:43 +0000)
committershort <>
Sun, 26 Jun 2005 04:43:42 +0000 (04:43 +0000)
src/configuration.c
src/pathname.c [moved from src/configuration-pathname.c with 50% similarity]
src/pathname.h [moved from src/configuration-pathname.h with 77% similarity]

index 9543064..8be581b 100644 (file)
 #include <glib/ghash.h>
 #include <glib/gstring.h>
 #include <glib/gmem.h>
+#include <glib/gstrfuncs.h>
 #include <stdio.h>
 #include <errno.h>
 #include <ctype.h>
-#include <glib/gstrfuncs.h>
 #include <string.h>
+#include <stdlib.h>
 
 #include "configuration.h"     /* self */
-#include "configuration-pathname.h"
+#include "pathname.h"
 #include "network.h"
 #include "main.h"
 
 #define LOCATION_LINK "/proc/self/exe" /* for Linux kernel */
 
 
+static G_CONST_RETURN gchar *configuration_pathname(void)
+{
+static const gchar *static_pathname;
+
+       return pathname_find(&static_pathname,
+                       G_STRINGIFY(SYSCONFDIR) "/sysconfig",PACKAGE,
+                       G_STRINGIFY(SYSCONFDIR) "/default",PACKAGE,
+                       G_STRINGIFY(SYSCONFDIR) "",PACKAGE,
+                       /* 'getenv("HOME")' may return NULL and terminate the list prematurely. */
+                       getenv("HOME"),"." PACKAGE "rc",
+                       NULL);
+}
+
 static GHashTable *configuration_hash_new(void)
 {
        return g_hash_table_new_full(g_str_hash,g_str_equal,
similarity index 50%
rename from src/configuration-pathname.c
rename to src/pathname.c
index cc816b5..fe4fd18 100644 (file)
 #include <glib/gmessages.h>
 #include <glib/gmem.h>
 #include <glib/gstrfuncs.h>
-#include <stdlib.h>
+#include <glib/gutils.h>
 #include <unistd.h>
 #include <errno.h>
+#include <stdarg.h>
 
-#include "configuration-pathname.h"    /* self */
+#include "pathname.h"  /* self */
 
 
 /* OK, GConf would be nice.
  */
 
 
-static const gchar *static_pathname;
 static gboolean verbose=FALSE;
 
 
-static gboolean try_pairname(const gchar *dirname,const gchar *filename)
+static gboolean try_pairname(const gchar **static_pathname_pointer,const gchar *dirname,const gchar *filename)
 {
 gchar *pathname;
 
+       g_return_val_if_fail(static_pathname_pointer!=NULL,FALSE);
+       g_return_val_if_fail(*static_pathname_pointer==NULL,FALSE);
        g_return_val_if_fail(dirname!=NULL,FALSE);
        g_return_val_if_fail(filename!=NULL,FALSE);
 
-       if (static_pathname)
-               return FALSE;
        if (access(dirname,W_OK|X_OK)) {
                if (verbose)
-                       g_warning(_("Configuration directory not accessible(X) and/or writable(W): %s"),dirname);
+                       g_warning(_("Directory not accessible(X) and/or writable(W): %s"),dirname);
                return FALSE;
                }
        pathname=g_strdup_printf("%s/%s",dirname,filename);
        if (access(pathname,R_OK|W_OK) && errno!=ENOENT) {
                if (verbose)
-                       g_warning(_("Configuration pathname not readable(R) and/or writable(W): %s"),pathname);
+                       g_warning(_("Pathname not readable(R) and/or writable(W): %s"),pathname);
                g_free(pathname);
                return FALSE;
                }
-       static_pathname=pathname;
+       *static_pathname_pointer=pathname;
        return TRUE;
 }
 
-G_CONST_RETURN gchar *configuration_pathname(void)
+G_CONST_RETURN gchar *vpathname_find(const gchar **static_pathname_pointer,va_list ap)
 {
-const gchar *home_val;
-static gboolean first=TRUE;
-
-       if (!static_pathname && first) {
-               try_pairname(G_STRINGIFY(SYSCONFDIR) "/sysconfig",PACKAGE);
-               try_pairname(G_STRINGIFY(SYSCONFDIR) "/default",PACKAGE);
-               try_pairname(G_STRINGIFY(SYSCONFDIR) "",PACKAGE);
-               if ((home_val=getenv("HOME")))
-                       try_pairname(home_val,"." PACKAGE "rc");
-               if (!static_pathname && !verbose) {
+       g_return_val_if_fail(static_pathname_pointer!=NULL,NULL);
+
+       if (!*static_pathname_pointer) {
+const char *dirname,*filename;
+va_list ap_copy;
+
+               G_VA_COPY(ap_copy,ap);
+retry:
+               while ((dirname=va_arg(ap,const char *))) {
+                       filename=va_arg(ap,const char *);
+                       g_assert(filename!=NULL);
+                       /* Succeeded? */
+                       if (try_pairname(static_pathname_pointer,dirname,filename))
+                               break;
+                       }
+               if (!*static_pathname_pointer && !verbose) {
                        verbose=TRUE;
-                       configuration_pathname();
-                       g_warning(_("All automatic configuration pathnames failed; configuration persistency disabled."));
+                       G_VA_COPY(ap,ap_copy);
+                       goto retry;
+                       }
+               if (!*static_pathname_pointer) {
+                       g_warning(_("All automatic pathnames failed."));
+                       *static_pathname_pointer="";
                        }
-               first=FALSE;
                }
-       return static_pathname;
+       g_assert(*static_pathname_pointer!=NULL);
+       return *static_pathname_pointer;
+}
+
+G_CONST_RETURN gchar *pathname_find(const gchar **static_pathname_pointer,...)
+{
+const gchar *r;
+va_list ap;
+
+       g_return_val_if_fail(static_pathname_pointer!=NULL,NULL);
+
+       va_start(ap,static_pathname_pointer);
+       r=vpathname_find(static_pathname_pointer,ap);
+       va_end(ap);
+       return r;
 }
similarity index 77%
rename from src/configuration-pathname.h
rename to src/pathname.h
index 102624e..4673dab 100644 (file)
@@ -17,8 +17,8 @@
  */
 
 
-#ifndef _UDPGATE_CONFIGURATION_PATHNAME_H
-#define _UDPGATE_CONFIGURATION_PATHNAME_H 1
+#ifndef _UDPGATE_PATHNAME_H
+#define _UDPGATE_PATHNAME_H 1
 
 
 #include <glib/gtypes.h>
 
 G_BEGIN_DECLS
 
-G_CONST_RETURN gchar *configuration_pathname(void);
+G_CONST_RETURN gchar *vpathname_find(const gchar **static_pathname_pointer,va_list ap);
+G_CONST_RETURN gchar *pathname_find(const gchar **static_pathname_pointer,...);
 
 G_END_DECLS
 
 
-#endif /* _UDPGATE_CONFIGURATION_PATHNAME_H */
+#endif /* _UDPGATE_PATHNAME_H */