*/
#include <h/mh.h>
+#include <pwd.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;
+}
/*
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);