X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=sbr%2Fpath.c;h=21796a7aec9ba46f0b84eaccc2187feabb6dca97;hb=5f08476e3bc5c134ce57d924b01d1c1fcacd53db;hp=41328964660c8e3504803d710351b33f8688640c;hpb=d39e2c447b0d163a5a63f480b23d06edb7a73aa0;p=mmh diff --git a/sbr/path.c b/sbr/path.c index 4132896..21796a7 100644 --- a/sbr/path.c +++ b/sbr/path.c @@ -7,6 +7,71 @@ */ #include +#include + + +/* +** 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; +} /* @@ -122,7 +187,7 @@ getdeffol(void) char * getcurfol(void) { - char *folder = context_find(pfolder); + char *folder = context_find(curfolder); if (!folder || !*folder) { folder = getdeffol(); @@ -172,12 +237,13 @@ char * 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);