X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=sbr%2Fpath.c;h=e5576b89c119298e375ef29af29f8398932af241;hb=39e87a75b5c2d3572ec72e717720b44af291e88a;hp=ca3595a15919fb96e13d09c3857aef7f8f2f8072;hpb=682962d94b21e120c78a52a8bdcb6aa994330a14;p=mmh diff --git a/sbr/path.c b/sbr/path.c index ca3595a..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? */ +} /*