X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Fcontext_read.c;h=5733d3fa088592ab0b28d9c9110be44e1985521e;hp=e6cdfff03f275abe1f2810fddf4b30ba5b92ccc2;hb=f85f4b7ae62e3d05a945dcd46ead51f0a2a89a9b;hpb=5afa7072e3fe7fc42287e2149e1c23b363700795 diff --git a/sbr/context_read.c b/sbr/context_read.c index e6cdfff..5733d3f 100644 --- a/sbr/context_read.c +++ b/sbr/context_read.c @@ -1,133 +1,198 @@ /* - * context_read.c -- find and read profile and context files - * - * $Id$ - * - * This code is Copyright (c) 2002, by the authors of nmh. See the - * COPYRIGHT file in the root directory of the nmh distribution for - * complete copyright information. - * - * 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 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. - */ - -#include /* mh internals */ -#include /* system call errors */ -#include /* structure for getpwuid() results */ - -extern int errno; /* system call error number */ +** context_read.c -- find and read profile and context files +** +** This code is Copyright (c) 2002, by the authors of nmh. See the +** COPYRIGHT file in the root directory of the nmh distribution for +** complete copyright information. +** +** 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 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. +** +** You might need to adjust uip/mmh.sh if you make changes here. +*/ + +#include /* mh internals */ +#include /* system call errors */ +#include /* structure for getpwuid() results */ void -context_read (void) +context_read(void) { - char buf[BUFSIZ]; /* path name buffer */ - char *cp; /* miscellaneous pointer */ - char *nd; /* nmh directory pointer */ - struct stat st; /* stat() results */ - register struct passwd *pw; /* getpwuid() results */ - register FILE *ib; /* profile and context file pointer */ - - /* - * 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")) == (char *)0) { - if ((pw = getpwuid(getuid())) == (struct passwd *)0 || *pw->pw_dir == '\0') - adios(NULL, "cannot determine your home directory"); - else - 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. - */ - - if ((cp = getenv("MH")) && *cp != '\0') { - defpath = path(cp, TFILE); - - if (stat(defpath, &st) != -1 && (st.st_mode & S_IFREG) == 0) - adios((char *)0, "`%s' specified by your MH environment variable is not a normal file", cp); - - if ((ib = fopen(defpath, "r")) == (FILE *)0) - adios((char *)0, "unable to read the `%s' profile specified by your MH environment variable", defpath); - } - else { - defpath = concat(mypath, "/", mh_profile, NULL); - - if ((ib = fopen(defpath, "r")) == (FILE *)0) - adios((char *)0, "Doesn't look like nmh is installed. Run install-mh to do so."); - - cp = mh_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. - */ - - if ((cp = context_find ("path")) == (char *)0) - 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 != '/') - (void)snprintf (nd = buf, sizeof(buf), "%s/%s", mypath, cp); - else - nd = cp; - - if (stat(nd, &st) == -1) { - 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); - - free (cp); - - if (!makedir (nd)) - adios (NULL, "unable to create", nd); - } - - else if ((st.st_mode & S_IFDIR) == 0) - adios ((char *)0, "`%s' is not a directory", nd); - - /* - * Open and read user's context file. The name of the context file comes from the - * profile unless overridden by the MHCONTEXT environment variable. - */ - - if ((cp = getenv ("MHCONTEXT")) == (char *)0 || *cp == '\0') - cp = context; - - ctxpath = getcpy (m_maildir (cp)); - - if ((ib = fopen (ctxpath, "r"))) { - readconfig ((struct node **) 0, ib, cp, 1); - fclose (ib); - } - - return; + char buf[BUFSIZ]; /* path name buffer */ + char *cp; /* miscellaneous pointer */ + char *nd; /* nmh directory pointer */ + struct stat st; /* stat() results */ + register struct passwd *pw; /* getpwuid() results */ + register FILE *ib; /* profile and context file pointer */ + + /* + ** If this routine _is_ called again (despite the wanings in the + ** comments above), return immediately. + */ + 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"))) { + if (!(pw = getpwuid(getuid())) || !*pw->pw_dir) { + adios(NULL, "cannot determine your home directory"); + } + mypath = pw->pw_dir; + } + + /* + ** set mmhpath + */ + 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 { + 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 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 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) { + adios(nd, "error opening"); + } + 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(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 MMHC + ** environment variable. + */ + 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 + ** MMHC to /dev/null. (If this wasn't special-cased then the + ** locking would be liable to fail.) + */ + if (!context || (strcmp(cp, "/dev/null") == 0)) { + ctxpath = NULL; + return; + } + + 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); + } + + /* Set editor */ + if (!(cp = getenv("MMHEDITOR")) || !*cp) { + if (!(cp = context_find("editor")) || !*cp) { + if (!(cp = getenv("VISUAL")) || !*cp) { + if (!(cp = getenv("EDITOR")) || !*cp) { + cp = defaulteditor; + } + } + } + } + defaulteditor = cp; + + /* Set pager */ + if (!(cp = getenv("MMHPAGER")) || !*cp) { + if (!(cp = context_find("pager")) || !*cp) { + if (!(cp = getenv("PAGER")) || !*cp) { + cp = defaultpager; + } + } + } + defaultpager = cp; }