]> diplodocus.org Git - nmh/blob - sbr/m_maildir.c
75c6baf2445f1ab4e14f10471fd1a50a58d7ff9c
[nmh] / sbr / m_maildir.c
1 /* m_maildir.c -- get the path for the mail directory
2 *
3 * This code is Copyright (c) 2002, by the authors of nmh. See the
4 * COPYRIGHT file in the root directory of the nmh distribution for
5 * complete copyright information.
6 */
7
8 #include "h/mh.h"
9 #include "path.h"
10 #include "h/utils.h"
11 #include "m_maildir.h"
12
13 #define CWD "./"
14 #define DOT "."
15 #define DOTDOT ".."
16 #define PWD "../"
17
18 static char mailfold[BUFSIZ];
19
20 /*
21 * static prototypes
22 */
23 static char *exmaildir (char *);
24
25
26 /* Returns static char[], never NULL. */
27 char *
28 m_maildir (char *folder)
29 {
30 char *cp, *ep;
31
32 if ((cp = exmaildir (folder))
33 && (ep = cp + strlen (cp) - 1) > cp
34 && *ep == '/')
35 *ep = '\0';
36
37 return cp;
38 }
39
40
41 /* Return value must be free(3)'d. */
42 char *
43 m_mailpath (char *folder)
44 {
45 char *cp;
46 char maildir[BUFSIZ];
47
48 if (*folder != '/'
49 && !has_prefix(folder, CWD)
50 && strcmp (folder, DOT)
51 && strcmp (folder, DOTDOT)
52 && !has_prefix(folder, PWD)) {
53 strncpy (maildir, mailfold, sizeof(maildir)); /* preserve... */
54 cp = mh_xstrdup(m_maildir(folder));
55 strncpy (mailfold, maildir, sizeof(mailfold));
56 } else {
57 cp = path (folder, TFOLDER);
58 }
59
60 return cp;
61 }
62
63
64 /* Returns static char[], never NULL. */
65 static char *
66 exmaildir (char *folder)
67 {
68 char *cp, *pp;
69
70 /* use current folder if none is specified */
71 if (folder == NULL)
72 folder = getfolder(1);
73
74 if (!(*folder != '/'
75 && !has_prefix(folder, CWD)
76 && strcmp (folder, DOT)
77 && strcmp (folder, DOTDOT)
78 && !has_prefix(folder, PWD))) {
79 strncpy (mailfold, folder, sizeof(mailfold));
80 return mailfold;
81 }
82
83 cp = mailfold;
84 if ((pp = context_find ("path")) && *pp) {
85 if (*pp != '/') {
86 snprintf(cp, sizeof mailfold, "%s/", mypath);
87 cp += strlen (cp);
88 }
89 cp = stpcpy(cp, pp);
90 } else {
91 char *p = path("./", TFOLDER);
92 cp = stpcpy(cp, p);
93 free(p);
94 }
95 if (cp[-1] != '/')
96 *cp++ = '/';
97 strcpy (cp, folder);
98
99 return mailfold;
100 }