X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Fpath.c;h=ca3595a15919fb96e13d09c3857aef7f8f2f8072;hp=3b633d028492758b6275a2e7766d19b4c4f74231;hb=682962d94b21e120c78a52a8bdcb6aa994330a14;hpb=d318de52a08f7a84467a5e349b9b655b84ef6fca diff --git a/sbr/path.c b/sbr/path.c index 3b633d0..ca3595a 100644 --- a/sbr/path.c +++ b/sbr/path.c @@ -1,5 +1,5 @@ /* -** path.c -- return a pathname +** path.c -- return or convert paths ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for @@ -8,110 +8,13 @@ #include -static char *pwds; /* -** static prototypes -*/ -static char *expath(char *, int); -static void packpath(char *); - -char * -pluspath(char *name) -{ - return path(name + 1, *name == '+' ? TFOLDER : TSUBCWF); -} - -char * -path(char *name, int type) -{ - char *cp, *ep; - - if ((cp = expath(name, type)) && - (ep = cp+strlen(cp)-1) > cp && - *ep == '/') { - *ep = '\0'; - } - - return cp; -} - - -static char * -expath(char *name, int type) -{ - char *cp, *ep; - char buffer[BUFSIZ]; - - if (type == TSUBCWF) { - /* @folder to +folder */ - snprintf(buffer, sizeof(buffer), "%s/%s", getfolder(1), name); - name = m_mailpath(buffer); - packpath(name); - snprintf(buffer, sizeof(buffer), "%s/", m_maildir("")); - if (isprefix(buffer, name)) { - cp = name; - name = getcpy(name + strlen(buffer)); - free(cp); - } - type = TFOLDER; - } - - if (*name == '/') { - return getcpy(name); - } - - if (type == TFOLDER && - (strncmp(name, "./", 2) && strcmp(name, ".") && - strcmp(name, "..") && strncmp(name, "../", 3))) { - /* - ** FIXME: Seems as if this check does not catch names like: - ** ``foo/../../..''. - */ - return getcpy(name); - } - - if (pwds == NULL) { - pwds = pwd(); - } - - if (strcmp(name, ".") == 0 || strcmp(name, "./") == 0) { - return getcpy(pwds); - } - - ep = pwds + strlen(pwds); - if ((cp = strrchr(pwds, '/')) == NULL) { - cp = ep; - } else if (cp == pwds) { - cp++; - } - - if (strncmp(name, "./", 2) == 0) { - name += 2; - } - - if (strcmp(name, "..") == 0 || strcmp(name, "../") == 0) { - snprintf(buffer, sizeof(buffer), "%.*s", - (int)(cp - pwds), pwds); - return getcpy(buffer); - } - - if (strncmp(name, "../", 3) == 0) { - name += 3; - } else { - cp = ep; - } - - snprintf(buffer, sizeof(buffer), "%.*s/%s", - (int)(cp - pwds), pwds, name); - return getcpy(buffer); -} - - -/* -** Compactify an absolute path name by removing unneccessary parts. -** Removes trailing slashes, but not if it would empty the string then. -** Modifies f. +** Compactify a path name by removing unneccessary parts. +** Removes trailing slashes. Cares to never remove all characters. +** Modifies f (never enlarges it). +** +** FIXME: Cannot use strcpy() as the areas overlap! */ static void packpath(char *f) @@ -185,3 +88,149 @@ packpath(char *f) strcpy(f, abspath ? "/" : "."); } } + + + + +/* +** Get the default folder +** Return the Inbox profile entry or, as fallback, the compile time default +** Returns a pointer to the abs folpath +*/ +char * +getdeffol(void) +{ + char *folder = context_find(inbox); + + if (!folder || !*folder) { + folder = defaultfolder; /* the compile time default */ + } + if (*folder == '+') { + folder++; + } + return folder; +} + + +/* +** Get the current folder +** Return the Current-Folder context entry or, as fallback, the default folder +** Returns a pointer to the abs folpath +** +** Equivalent to: expandfol("@") +*/ +char * +getcurfol(void) +{ + char *folder = context_find(curfolder); + + if (!folder || !*folder) { + folder = getdeffol(); + } + return folder; +} + + +/* +** Expand folder path +** Convert rel folpaths (@) into abs folpaths +** dir paths are simply passed through +** Returns the abs folpath (without prefix), in static mem +** +** TODO: Always copy into the static buffer, or just return the pointer? +*/ +char * +expandfol(char *f) +{ + static char buf[BUFSIZ]; + + if (*f == '@') { + /* f = concat(getcurfol(), "/", f+1, NULL); */ + snprintf(buf, sizeof buf, "%s/%s", getcurfol(), f+1); + + } else if (*f == '+') { + strcpy(buf, f+1); + + } else { + strcpy(buf, f); + } + packpath(buf); + return buf; +} + + +/* +** Expand directory path +** Convert rel dirpath into abs dirpath +** The argument is assumed to be a dir path relative to the cwd, +** except when beginning with '/' (then it will be passed through). +** Returns the abs dirpath, in static mem +** +** TODO: Always copy into the static buffer, or just return the pointer? +*/ +char * +expanddir(char *d) +{ + static char buf[BUFSIZ]; + + if (*d == '/') { + strcpy(buf, d); + } else { + getcwd(buf, sizeof buf); + int len = strlen(buf); + snprintf(buf+len, sizeof buf - len, "/%s", d); + } + packpath(buf); + return buf; +} + + +/* +** Anypath to absolute directory path +** Convert any kind of path into an abs dirpath +** A path without distinguishing prefix is assumed to be an abs folpath +** Abs dirpaths are passed unchanged +** Rel dirpaths ('.') get prefixed with the (abs) cwd +** Return pointer to static memory +** +** To get the dir path of the mail storage root, call: toabsdir("+") +** +** TODO: check lengths for copies +*/ +char * +toabsdir(char *path) +{ + static char buf[BUFSIZ]; + + if (*path == '/') { + /* nothing to do */ + strncpy(buf, path, sizeof buf); + packpath(buf); + return buf; + + } else if (*path == '.') { + /* rel dir path */ + strncpy(buf, expanddir(path), sizeof buf); + return buf; + + } else { + /* folder path */ + char *cp=buf, *pp; + + if (!(pp = context_find("path")) || !*pp) { + adios(NULL, "Non-empty profile entry `Path' required"); + } + if (*pp != '/') { + /* Path is relative to $HOME */ + snprintf(buf, sizeof buf, "%s/", mypath); + cp += strlen(buf); + } + strcpy(cp, pp); + packpath(buf); + /* append the mail folder */ + cp = buf + strlen(buf); + *cp++ = '/'; + strcpy(cp, expandfol(path)); + return buf; + } +}