X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Fpath.c;h=66bb8f1f5c83ec471b85a15a99f416f9f333e4e4;hp=ca3595a15919fb96e13d09c3857aef7f8f2f8072;hb=fc9279e818dfc96c63a5d75a89080cc68cfe1170;hpb=682962d94b21e120c78a52a8bdcb6aa994330a14 diff --git a/sbr/path.c b/sbr/path.c index ca3595a..66bb8f1 100644 --- a/sbr/path.c +++ b/sbr/path.c @@ -6,11 +6,78 @@ ** complete copyright information. */ +#include #include +#include +#include /* -** Compactify a path name by removing unneccessary parts. +** 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; +} + + +/* +** Compactify a path name by removing unnecessary parts. ** Removes trailing slashes. Cares to never remove all characters. ** Modifies f (never enlarges it). ** @@ -172,12 +239,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); @@ -218,7 +286,7 @@ toabsdir(char *path) 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 */