From: markus schnalke Date: Fri, 23 Dec 2011 07:00:58 +0000 (+0100) Subject: Split nmh dir into mmh dir (~/.mmh) and mail storage (~/Mail). X-Git-Tag: mmh-thesis-end~451 X-Git-Url: http://git.marmaro.de/?p=mmh;a=commitdiff_plain;h=7030d7edb099bff36ded7548bb5380f7acab4f9b Split nmh dir into mmh dir (~/.mmh) and mail storage (~/Mail). The profile (~/.mh_profile) became (~/.mmh/profile). The idea was to separate the configuration files and the data (= messages). The environment variables changed accordingly: MH -> MMHP (profile) MHCONTEXT -> MMHC (context) new: MMH (mmh dir) mh-install is not adjusted, yet. --- diff --git a/config/config.c b/config/config.c index 2bcc435..3f9d106 100644 --- a/config/config.c +++ b/config/config.c @@ -9,29 +9,57 @@ #include + /* -** 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 */ @@ -46,11 +74,11 @@ char *mhlformat = "mhl.format"; /* show */ 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"; @@ -64,42 +92,6 @@ char *nmhprivcache = "nmh-private-cache"; /* 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 @@ -256,3 +248,15 @@ char *foldprot = "700"; ** to messages coming in through inc. */ char *msgprot = "600"; + + + +/* +** Standard yes/no switches structure +*/ +struct swit anoyes[] = { + { "no", 0 }, + { "yes", 0 }, + { NULL, 0 } +}; + diff --git a/h/mh.h b/h/mh.h index 8ca6c44..0c0d81f 100644 --- a/h/mh.h +++ b/h/mh.h @@ -282,9 +282,12 @@ extern char ctxflags; extern char *invo_name; /* command invocation name */ extern char *mypath; /* user's $HOME */ +extern char *mmhdir; +extern char *mmhpath; extern char *defpath; /* pathname of user's profile */ extern char *ctxpath; /* pathname of user's context */ extern struct node *m_defs; /* list of profile/context entries */ +extern char *mailstore; /* name of mail storage directory */ /* ** These standard strings are defined in config.c. They are the @@ -298,6 +301,7 @@ extern char *altmsglink; extern char *catproc; extern char *components; extern char *context; +extern char *curfolder; extern char *current; extern char *defaulteditor; extern char *defaultfolder; @@ -312,9 +316,8 @@ extern char *inbox; extern char *incproc; extern char *installproc; extern char *lproc; +extern char *mhetcdir; extern char *mailproc; -extern char *mh_defaults; -extern char *mh_profile; extern char *mh_seq; extern char *mhlformat; extern char *mhlforward; @@ -329,7 +332,7 @@ extern char *nmhprivcache; extern char *nsequence; extern char *packproc; extern char *postproc; -extern char *curfolder; +extern char *profile; extern char *psequence; extern char *rcvdistcomps; extern char *rcvstoreproc; diff --git a/sbr/context_read.c b/sbr/context_read.c index 6ca9a3d..1e795b0 100644 --- a/sbr/context_read.c +++ b/sbr/context_read.c @@ -8,18 +8,20 @@ ** 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 /* mh internals */ @@ -40,106 +42,135 @@ context_read(void) ** 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; } diff --git a/sbr/path.c b/sbr/path.c index fd05f34..e5576b8 100644 --- a/sbr/path.c +++ b/sbr/path.c @@ -9,8 +9,6 @@ #include #include -extern char *mhetcdir; - /* ** Find the location of a format or configuration @@ -18,8 +16,8 @@ extern char *mhetcdir; ** ** 1) If it begins with ~user, then expand it. ** 2) Next, if already absolute pathname, then leave unchanged. -** 3) Next, check in nmh Mail directory. -** 4) Next, check in nmh `etc' directory. +** 3) Next, check in mmh directory. +** 4) Next, check in mmh `etc' directory. */ char * etcpath(char *file) @@ -29,7 +27,7 @@ etcpath(char *file) char *pp; struct passwd *pw; - context_read(); + /* XXX: here was: ``context_read();'' -- why? */ if (*file == '~') { /* Expand `~user' */ if ((cp = strchr(pp = file + 1, '/'))) @@ -60,14 +58,16 @@ try_it: return file; } - /* Check nmh Mail directory */ - strncpy(epath, toabsdir(file), sizeof epath); + /* Check mmh directory */ + snprintf(epath, sizeof epath, "%s/%s", mmhpath, file); if (access(epath, R_OK) != NOTOK) return epath; /* Check nmh `etc' directory */ snprintf(epath, sizeof epath, "%s/%s", mhetcdir, file); return (access(epath, R_OK) != NOTOK ? epath : file); + + /* TODO: What is the ultimate fallback? NULL or file? */ } diff --git a/uip/mhparam.c b/uip/mhparam.c index 5bbd9fc..dc122ad 100644 --- a/uip/mhparam.c +++ b/uip/mhparam.c @@ -12,7 +12,6 @@ #include extern char *mhlibdir; -extern char *mhetcdir; static struct swit switches[] = { #define COMPSW 0