X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=sbr%2Fpath.c;h=e5576b89c119298e375ef29af29f8398932af241;hb=cde17f8d38bf9306df4706ac2acb528a2a686a29;hp=41328964660c8e3504803d710351b33f8688640c;hpb=d39e2c447b0d163a5a63f480b23d06edb7a73aa0;p=mmh diff --git a/sbr/path.c b/sbr/path.c index 4132896..e5576b8 100644 --- a/sbr/path.c +++ b/sbr/path.c @@ -7,6 +7,68 @@ */ #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. +*/ +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); + return (access(epath, R_OK) != NOTOK ? epath : file); + + /* TODO: What is the ultimate fallback? NULL or file? */ +} /* @@ -122,7 +184,7 @@ getdeffol(void) char * getcurfol(void) { - char *folder = context_find(pfolder); + char *folder = context_find(curfolder); if (!folder || !*folder) { folder = getdeffol();