]> diplodocus.org Git - nmh/blob - sbr/m_maildir.c
Fix a segfault that happens when using the -file option.
[nmh] / sbr / m_maildir.c
1
2 /*
3 * m_maildir.c -- get the path for the mail directory
4 *
5 * This code is Copyright (c) 2002, by the authors of nmh. See the
6 * COPYRIGHT file in the root directory of the nmh distribution for
7 * complete copyright information.
8 */
9
10 #include <h/mh.h>
11
12 #define CWD "./"
13 #define NCWD (sizeof(CWD) - 1)
14 #define DOT "."
15 #define DOTDOT ".."
16 #define PWD "../"
17 #define NPWD (sizeof(PWD) - 1)
18
19 static char mailfold[BUFSIZ];
20
21 /*
22 * static prototypes
23 */
24 static char *exmaildir (char *);
25
26
27 char *
28 m_maildir (char *folder)
29 {
30 register 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 char *
42 m_mailpath (char *folder)
43 {
44 register char *cp;
45 char maildir[BUFSIZ];
46
47 if (*folder != '/'
48 && strncmp (folder, CWD, NCWD)
49 && strcmp (folder, DOT)
50 && strcmp (folder, DOTDOT)
51 && strncmp (folder, PWD, NPWD)) {
52 strncpy (maildir, mailfold, sizeof(maildir)); /* preserve... */
53 cp = getcpy (m_maildir (folder));
54 strncpy (mailfold, maildir, sizeof(mailfold));
55 } else {
56 cp = path (folder, TFOLDER);
57 }
58
59 return cp;
60 }
61
62
63 static char *
64 exmaildir (char *folder)
65 {
66 register char *cp, *pp;
67
68 /* use current folder if none is specified */
69 if (folder == NULL)
70 folder = getfolder(1);
71
72 if (!(*folder != '/'
73 && strncmp (folder, CWD, NCWD)
74 && strcmp (folder, DOT)
75 && strcmp (folder, DOTDOT)
76 && strncmp (folder, PWD, NPWD))) {
77 strncpy (mailfold, folder, sizeof(mailfold));
78 return mailfold;
79 }
80
81 cp = mailfold;
82 if ((pp = context_find ("path")) && *pp) {
83 if (*pp != '/') {
84 sprintf (cp, "%s/", mypath);
85 cp += strlen (cp);
86 }
87 cp = copy (pp, cp);
88 } else {
89 cp = copy (path ("./", TFOLDER), cp);
90 }
91 if (cp[-1] != '/')
92 *cp++ = '/';
93 strcpy (cp, folder);
94
95 return mailfold;
96 }