#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,
#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;
}