#include <h/mh.h>
+
/*
-** Standard yes/no switches structure
+** nmh globals
*/
-struct swit anoyes[] = {
- { "no", 0 },
- { "yes", 0 },
- { NULL, 0 }
-};
+
+char *mhlibdir = NMHLIBDIR;
+char *mhetcdir = NMHETCDIR;
+
+char *invo_name; /* command invocation name */
+char *mypath; /* user's $HOME */
+char *mmhpath; /* pathname of user's mmh dir */
+char *defpath; /* pathname of user's profile */
+char *ctxpath; /* pathname of user's context */
+char ctxflags; /* status of user's context */
+struct node *m_defs; /* profile/context structure */
/*
** nmh constants
+**
+** Important: Adjust uip/mmh.sh if you make changes here!
*/
-/* initial profile for new users */
-char *mh_defaults = NMHETCDIR"/mh.profile";
+/* default name of the mail storage */
+char *mailstore = "Mail";
+
+/* default name of user profile */
+char *mmhdir = ".mmh";
/* default name of user profile */
-char *mh_profile = ".mh_profile";
+char *profile = "profile";
+
+/* default name for the nmh context file */
+char *context = "context";
+
+/*
+** Default name of file for public sequences. If NULL,
+** then nmh will use private sequences by default, unless the
+** user defines a value using the "mh-sequences" profile entry.
+*/
+#ifdef NOPUBLICSEQ
+ char *mh_seq = NULL;
+#else
+ char *mh_seq = ".mh_sequences";
+#endif
+
/* name of current message "sequence" */
char *current = "cur";
+
/* standard component files */
char *components = "components"; /* comp */
char *replcomps = "replcomps"; /* repl */
char *mhlreply = "mhl.reply"; /* repl -filter */
char *mhlforward = "mhl.forward"; /* forw -filter */
-char *draftfolder = "+drafts";
-
char *inbox = "Inbox";
char *defaultfolder = "+inbox";
+char *draftfolder = "+drafts";
+
char *curfolder = "Current-Folder";
char *usequence = "Unseen-Sequence";
char *psequence = "Previous-Sequence";
/* profile entry for external ftp access command */
char *nmhaccessftp = "nmh-access-ftp";
-char *mhlibdir = NMHLIBDIR;
-char *mhetcdir = NMHETCDIR;
-
-
-/*
-** nmh not-so constants
-*/
-
-/*
-** Default name for the nmh context file.
-*/
-char *context = "context";
-
-/*
-** Default name of file for public sequences. If NULL,
-** then nmh will use private sequences by default, unless the
-** user defines a value using the "mh-sequences" profile entry.
-*/
-#ifdef NOPUBLICSEQ
-char *mh_seq = NULL;
-#else
-char *mh_seq = ".mh_sequences";
-#endif
-
-
-/*
-** nmh globals
-*/
-
-char ctxflags; /* status of user's context */
-char *invo_name; /* command invocation name */
-char *mypath; /* user's $HOME */
-char *defpath; /* pathname of user's profile */
-char *ctxpath; /* pathname of user's context */
-struct node *m_defs; /* profile/context structure */
-
/*
** nmh processes
** to messages coming in through inc.
*/
char *msgprot = "600";
+
+
+
+/*
+** Standard yes/no switches structure
+*/
+struct swit anoyes[] = {
+ { "no", 0 },
+ { "yes", 0 },
+ { NULL, 0 }
+};
+
** This function must be called early on in any nmh utility, and
** may only be called once. It does the following:
**
-** o Sets the global variable "mypath" to the home directory path.
-**
-** o Sets the global variable "defpath" to the absolute path of
-** the profile file.
+** o Sets the global variables to absolute paths:
+** - "mypath": home directory (HOME)
+** - "mmhpath": mmh directory (MMH)
+** - "defpath": profile file (MMHP)
+** - "ctxpath": context file (MMHC)
**
** o Reads in the profile file. Bails out if it can't.
**
** o Makes sure that the mail directory exists, prompting for
** creation if it doesn't.
**
-** o Reads the context file either as set by the MHCONTEXT
-** environment variable or by the profile.
+** o Reads the context file.
+**
+** You might need to adjust uip/mmh.sh if you make changes here.
*/
#include <h/mh.h> /* mh internals */
** If this routine _is_ called again (despite the wanings in the
** comments above), return immediately.
*/
- if ( m_defs != 0 )
+ if (m_defs) {
return;
+ }
/*
** Find user's home directory. Try the HOME environment variable first,
** the home directory field in the password file if that's not found.
*/
- if ((mypath = getenv("HOME")) == NULL) {
- if ((pw = getpwuid(getuid())) == (struct passwd *)0 ||
- *pw->pw_dir == '\0')
+ if (!(mypath = getenv("HOME"))) {
+ if (!(pw = getpwuid(getuid())) || !*pw->pw_dir) {
adios(NULL, "cannot determine your home directory");
- else
- mypath = pw->pw_dir;
+ }
+ mypath = pw->pw_dir;
}
/*
- ** Find and read user's profile. Check for the existence of
- ** an MH environment variable first with non-empty contents.
- ** Convert any relative path name found there to an absolute one.
- ** Look for the profile in the user's home directory if the MH
- ** environment variable isn't set.
+ ** set mmhpath
*/
-
- if ((cp = getenv("MH")) && *cp != '\0') {
- defpath = getcpy(expanddir(cp));
-
- if (stat(defpath, &st) != -1 && (st.st_mode & S_IFREG) == 0)
- adios(NULL, "`%s' specified by your MH environment variable is not a normal file", cp);
-
- if ((ib = fopen(defpath, "r")) == (FILE *)0)
- adios(NULL, "unable to read the `%s' profile specified by your MH environment variable", defpath);
+ if ((cp = getenv("MMH")) && *cp) {
+ mmhpath = getcpy(expanddir(cp)); /* rel to cwd */
+ if (stat(mmhpath, &st) != -1 && (st.st_mode & S_IFDIR) == 0) {
+ adios(NULL, "`%s' specified by your MMH environment variable is not a directory", cp);
+ }
} else {
- defpath = concat(mypath, "/", mh_profile, NULL);
-
- if ((ib = fopen(defpath, "r")) == (FILE *)0)
- adios(NULL, "Doesn't look like nmh is installed. Run install-mh to do so.");
-
- cp = mh_profile;
+ mmhpath = concat(mypath, "/", mmhdir, NULL);
+ if (stat(mmhpath, &st) == -1 || (st.st_mode & S_IFDIR) == 0) {
+ adios(NULL, "Doesn't look like mmh is set up for your account. Run `install-mh' to do so.");
+ }
}
+ /*
+ ** Find and read user's profile. Check for the existence of
+ ** a non-empty MMHP environment variable first. Look for the
+ ** profile in the mmh directory otherwise.
+ */
+ if ((cp = getenv("MMHP")) && *cp) {
+ if (*cp == '/') {
+ defpath = getcpy(cp);
+ } else {
+ defpath = concat(mmhpath, "/", cp, NULL);
+ }
+ if (stat(defpath, &st) != -1 && (st.st_mode & S_IFREG) == 0) {
+ adios(NULL, "Your profile `%s', specified by the MMHP environment variable, is not a normal file", cp);
+ }
+ if ((ib = fopen(defpath, "r")) == (FILE *)0) {
+ adios(NULL, "Unable to read your profile `%s', specified by the MMHP environment variable", defpath);
+ }
+ } else {
+ defpath = concat(mmhpath, "/", profile, NULL);
+ if ((ib = fopen(defpath, "r")) == (FILE *)0) {
+ adios(NULL, "No profile found. Please create `%s' first.", defpath);
+ }
+ cp = profile;
+ }
readconfig(&m_defs, ib, cp, 0);
fclose(ib);
/*
- ** Find the user's nmh directory, which is specified by the "path"
- ** profile component. Convert a relative path name to an absolute
- ** one rooted in the home directory.
+ ** Find the user's mail storage directory, which is specified by
+ ** the `Path' profile component. Convert a relative path name
+ ** to an absolute one rooted in the home directory.
*/
-
- if ((cp = context_find("path")) == NULL)
- adios(NULL, "Your %s file does not contain a path entry.",
- defpath);
-
- if (*cp == '\0')
- adios(NULL, "Your `%s' profile file does not contain a valid path entry.", defpath);
-
- if (*cp != '/')
- snprintf(nd = buf, sizeof(buf), "%s/%s", mypath, cp);
- else
+ if ((cp = context_find("path")) == NULL) {
+ adios(NULL, "Your profile `%s' does not contain the required path entry.", defpath);
+ }
+ if (!*cp) {
+ adios(NULL, "The Path entry of your profile `%s' must be non-empty.", defpath);
+ }
+ if (*cp == '/') {
nd = cp;
-
+ } else {
+ snprintf(nd = buf, sizeof buf, "%s/%s", mypath, cp);
+ }
if (stat(nd, &st) == -1) {
- if (errno != ENOENT)
+ if (errno != ENOENT) {
adios(nd, "error opening");
- cp = concat("Your MH-directory \"", nd, "\" doesn't exist; Create it? ", NULL);
- if (!getanswer(cp))
- adios(NULL, "unable to access MH-directory \"%s\"",
- nd);
+ }
+ cp = concat("Your mail storage directory `", nd, "' doesn't exist; Create it? ", NULL);
+ if (!getanswer(cp)) {
+ adios(NULL, "Unable to access the mail storage directory `%s'", nd);
+ }
free(cp);
- if (!makedir(nd))
- adios(NULL, "unable to create %s", nd);
- } else if ((st.st_mode & S_IFDIR) == 0)
- adios(NULL, "`%s' is not a directory", nd);
+ if (!makedir(nd)) {
+ adios(nd, "unable to create");
+ }
+ } else if ((st.st_mode & S_IFDIR) == 0) {
+ adios(NULL, "Your mail storage `%s' is not a directory", nd);
+ }
+ /*
+ ** Create the default folder (inbox)
+ */
+ cp = toabsdir(defaultfolder);
+ if (stat(cp, &st) == -1) {
+ if (!makedir(cp)) {
+ adios(cp, "Unable to create the default folder");
+ }
+ } else if ((st.st_mode & S_IFDIR) == 0) {
+ adios(NULL, "The default folder `%s' is not a directory", cp);
+ }
/*
** Open and read user's context file. The name of the context
- ** file comes from the profile unless overridden by the MHCONTEXT
+ ** file comes from the profile unless overridden by the MMHC
** environment variable.
*/
-
- if ((cp = getenv("MHCONTEXT")) == NULL || *cp == '\0')
- cp = context;
+ if (!(cp = getenv("MMHC")) || !*cp) {
+ if (!(cp = context_find("context")) || !*cp) {
+ cp = context;
+ }
+ }
/*
** context is NULL if context_foil() was called to disable use
- ** of context We also support users setting explicitly setting
- ** MHCONTEXT to /dev/null. (if this wasn't specialcased then the
- ** locking would be liable to fail)
+ ** of context. We also support users setting explicitly setting
+ ** MMHC to /dev/null. (If this wasn't special-cased then the
+ ** locking would be liable to fail.)
*/
- if (!cp || (strcmp(cp,"/dev/null") == 0)) {
+ if (!context || (strcmp(cp, "/dev/null") == 0)) {
ctxpath = NULL;
return;
}
- ctxpath = getcpy(toabsdir(cp));
-
+ if (*cp == '/') {
+ ctxpath = getcpy(cp);
+ } else {
+ ctxpath = concat(mmhpath, "/", cp, NULL);
+ }
if ((ib = lkfopen(ctxpath, "r"))) {
readconfig((struct node **) 0, ib, cp, 1);
lkfclose(ib, ctxpath);
}
-
- return;
}