** complete copyright information.
*/
+#include <sysexits.h>
#include <h/mh.h>
+#include <pwd.h>
+#include <unistd.h>
+
+
+/*
+** Find the location of a format or configuration
+** file, and return its absolute pathname.
+**
+** 1) If it begins with ~user, then expand it.
+** 2) Next, if already absolute pathname, then leave unchanged.
+** 3) Next, check in mmh directory.
+** 4) Next, check in mmh `etc' directory.
+** 5) As fall-back, return `file' unchanged.
+*/
+char *
+etcpath(char *file)
+{
+ static char epath[PATH_MAX];
+ char *cp;
+ char *pp;
+ struct passwd *pw;
+
+ /* XXX: here was: ``context_read();'' -- why? */
+ if (*file == '~') {
+ /* Expand `~user' */
+ if ((cp = strchr(pp = file + 1, '/')))
+ *cp++ = '\0';
+ if (*pp == '\0') {
+ pp = mypath;
+ } else {
+ if ((pw = getpwnam(pp)))
+ pp = pw->pw_dir;
+ else {
+ if (cp)
+ *--cp = '/';
+ goto try_it;
+ }
+ }
+
+ snprintf(epath, sizeof epath, "%s/%s", pp, cp ? cp : "");
+ if (cp)
+ *--cp = '/';
+
+ if (access(epath, R_OK) != NOTOK)
+ return epath; /* else fall */
+ }
+
+try_it:
+ if (*file == '/') {
+ /* absolute pathname, return it */
+ return file;
+ }
+
+ /* 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);
+ if (access(epath, R_OK) != NOTOK)
+ return epath;
+
+ /* The fall-back */
+ return file;
+}
/*
char *
getcurfol(void)
{
- char *folder = context_find(pfolder);
+ char *folder = context_find(curfolder);
if (!folder || !*folder) {
folder = getdeffol();
expanddir(char *d)
{
static char buf[BUFSIZ];
+ int len;
if (*d == '/') {
strcpy(buf, d);
} else {
getcwd(buf, sizeof buf);
- int len = strlen(buf);
+ len = strlen(buf);
snprintf(buf+len, sizeof buf - len, "/%s", d);
}
packpath(buf);
char *cp=buf, *pp;
if (!(pp = context_find("path")) || !*pp) {
- adios(NULL, "Non-empty profile entry `Path' required");
+ adios(EX_CONFIG, NULL, "Non-empty profile entry `Path' required");
}
if (*pp != '/') {
/* Path is relative to $HOME */