- register char *cp, *ep;
- char buffer[BUFSIZ];
-
- if (flag == TSUBCWF) {
- snprintf (buffer, sizeof(buffer), "%s/%s", getfolder (1), name);
- name = m_mailpath (buffer);
- compath (name);
- snprintf (buffer, sizeof(buffer), "%s/", m_maildir (""));
- if (ssequal (buffer, name)) {
- cp = name;
- name = getcpy (name + strlen (buffer));
- free (cp);
+ char *cp, *ep;
+ char buffer[BUFSIZ];
+
+ if (type == TSUBCWF) {
+ /* convert TSUBCWF to TFOLDER */
+ snprintf(buffer, sizeof(buffer), "%s/%s",
+ getfolder(FCUR), 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;