*/
add_to_list(&MailtoAllow, "body");
add_to_list(&MailtoAllow, "subject");
-
-
-
+
if (!Muttrc)
{
- snprintf (buffer, sizeof(buffer), "%s/.neomuttrc", NONULL(Homedir));
- if (access(buffer, F_OK) == -1)
- snprintf (buffer, sizeof (buffer), "%s/.mutt/neomuttrc", NONULL(Homedir));
- if (access(buffer, F_OK) == -1)
- snprintf (buffer, sizeof(buffer), "%s/.muttrc-%s", NONULL(Homedir), MUTT_VERSION);
- if (access(buffer, F_OK) == -1)
- snprintf (buffer, sizeof(buffer), "%s/.muttrc", NONULL(Homedir));
- if (access(buffer, F_OK) == -1)
- snprintf (buffer, sizeof (buffer), "%s/.mutt/muttrc-%s", NONULL(Homedir), MUTT_VERSION);
- if (access(buffer, F_OK) == -1)
- snprintf (buffer, sizeof (buffer), "%s/.mutt/muttrc", NONULL(Homedir));
- if (access(buffer, F_OK) == -1) /* default to .muttrc for alias_file */
- snprintf (buffer, sizeof(buffer), "%s/.muttrc", NONULL(Homedir));
+ do
+ {
+ if (mutt_set_xdg_path (kXDGConfigHome, buffer, sizeof buffer))
+ break;
+
+ snprintf (buffer, sizeof buffer, "%s/.neomuttrc", NONULL(Homedir));
+ if (access (buffer, F_OK) == 0)
+ break;
+
+ snprintf (buffer, sizeof buffer, "%s/.mutt/neomuttrc", NONULL(Homedir));
+ if (access (buffer, F_OK) == 0)
+ break;
+
+ snprintf (buffer, sizeof buffer, "%s/.muttrc-%s", NONULL(Homedir), MUTT_VERSION);
+ if (access (buffer, F_OK) == 0)
+ break;
+
+ snprintf (buffer, sizeof buffer, "%s/.muttrc", NONULL(Homedir));
+ if (access (buffer, F_OK) == 0)
+ break;
+
+ snprintf (buffer, sizeof buffer, "%s/.mutt/muttrc-%s", NONULL(Homedir), MUTT_VERSION);
+ if (access (buffer, F_OK) == 0)
+ break;
+
+ snprintf (buffer, sizeof buffer, "%s/.mutt/muttrc", NONULL(Homedir));
+ if (access (buffer, F_OK) == 0)
+ break;
+
+ /* default to .muttrc for alias_file */
+ snprintf (buffer, sizeof buffer, "%s/.muttrc", NONULL(Homedir));
+ }
+ while (0);
default_rc = 1;
Muttrc = safe_strdup (buffer);
requested not to via "-n". */
if (!skip_sys_rc)
{
- snprintf (buffer, sizeof(buffer), "%s/NeoMuttrc", SYSCONFDIR);
- if (access (buffer, F_OK) == -1)
- snprintf (buffer, sizeof(buffer), "%s/Muttrc-%s", SYSCONFDIR, MUTT_VERSION);
- if (access (buffer, F_OK) == -1)
- snprintf (buffer, sizeof(buffer), "%s/Muttrc", SYSCONFDIR);
- if (access (buffer, F_OK) == -1)
- snprintf (buffer, sizeof (buffer), "%s/Muttrc-%s", PKGDATADIR, MUTT_VERSION);
- if (access (buffer, F_OK) == -1)
- snprintf (buffer, sizeof (buffer), "%s/Muttrc", PKGDATADIR);
- if (access (buffer, F_OK) != -1)
- {
- if (source_rc (buffer, &err) != 0)
+ do
+ {
+ if (mutt_set_xdg_path (kXDGConfigDirs, buffer, sizeof buffer))
+ break;
+
+ snprintf (buffer, sizeof buffer, "%s/NeoMuttrc", SYSCONFDIR);
+ if (access (buffer, F_OK) == 0)
+ break;
+
+ snprintf (buffer, sizeof buffer, "%s/Muttrc-%s", SYSCONFDIR, MUTT_VERSION);
+ if (access (buffer, F_OK) == 0)
+ break;
+
+ snprintf (buffer, sizeof buffer, "%s/Muttrc", SYSCONFDIR);
+ if (access (buffer, F_OK) == 0)
+ break;
+
+ snprintf (buffer, sizeof buffer, "%s/Muttrc-%s", PKGDATADIR, MUTT_VERSION);
+ if (access (buffer, F_OK) == 0)
+ break;
+
+ snprintf (buffer, sizeof buffer, "%s/Muttrc", PKGDATADIR);
+ if (access (buffer, F_OK) == 0)
{
- fputs (err.data, stderr);
- fputc ('\n', stderr);
- need_pause = 1;
+ if (source_rc (buffer, &err) != 0)
+ {
+ fputs (err.data, stderr);
+ fputc ('\n', stderr);
+ need_pause = 1;
+ }
}
- }
+ } while (0);
}
/* Read the user's initialization file. */
#include <sys/types.h>
#include <utime.h>
+static const char *xdg_env_vars[] =
+{
+ [kXDGConfigHome] = "XDG_CONFIG_HOME",
+ [kXDGConfigDirs] = "XDG_CONFIG_DIRS",
+};
+
+static const char *xdg_defaults[] =
+{
+ [kXDGConfigHome] = "~/.config",
+ [kXDGConfigDirs] = "/etc/xdg",
+};
+
BODY *mutt_new_body (void)
{
BODY *p = (BODY *) safe_calloc (1, sizeof (BODY));
strfcpy (dest, (rc == 0) ? NONULL(p) : NONULL(src), dlen);
FREE (&p);
}
+
+/*
+ * Process an XDG environment variable or its fallback.
+ *
+ * Return 1 if an entry was found that actually exists on disk and 0 otherwise.
+ */
+int mutt_set_xdg_path(const XDGType type, char *buf, size_t bufsize)
+{
+ char *xdg_env = getenv (xdg_env_vars[type]);
+ char *xdg = (xdg_env && *xdg_env) ? safe_strdup (xdg_env) : safe_strdup (xdg_defaults[type]);
+ char *x = xdg; /* strsep() changes xdg, so free x instead later */
+ char *token = NULL;
+
+ while ((token = strsep (&xdg, ":")))
+ {
+ if (snprintf (buf, bufsize, "%s/neomutt/config", token) < 0)
+ continue;
+ mutt_expand_path (buf, bufsize);
+ if (access (buf, F_OK) == 0)
+ {
+ FREE (&x);
+ return 1;
+ }
+ }
+
+ FREE (&x);
+ return 0;
+}