1 /*
2 ** Copyright 2000 Double Precision, Inc.
3 ** See COPYING for distribution information.
4 */
5
6 #if HAVE_CONFIG_H
7 #include "config.h"
8 #endif
9
10 #include <sys/types.h>
11 #include <sys/stat.h>
12 #include <string.h>
13 #include <stdlib.h>
14 #include <time.h>
15 #if HAVE_UNISTD_H
16 #include <unistd.h>
17 #endif
18 #include <stdio.h>
19 #include <ctype.h>
20 #include <errno.h>
21
22 #include "maildirmisc.h"
23
24
maildir_name2dir(const char * maildir,const char * foldername)25 char *maildir_name2dir(const char *maildir, /* DIR location */
26 const char *foldername) /* INBOX.name */
27 {
28 const char *inbox=INBOX;
29 int l=strlen(inbox);
30 char *p;
31
32 if (!maildir) maildir=".";
33
34 if (foldername && strncasecmp(foldername, INBOX, l) == 0 &&
35 strchr(foldername, '/') == NULL)
36 {
37 if (foldername[l] == 0)
38 return strdup(maildir); /* INBOX: main maildir inbox */
39
40 if (foldername[l] == '.')
41 {
42 const char *r;
43
44 for (r=foldername; *r; r++)
45 {
46 if (*r != '.') continue;
47
48 if (r[1] == 0 || r[1] == '.')
49 {
50 errno=EINVAL;
51 return (0);
52 }
53 }
54
55 r=strchr(foldername, '.');
56
57 p=malloc(strlen(maildir)+strlen(r) + 2);
58
59 if (!p)
60 return NULL;
61
62 return (strcat(strcat(strcpy(p, maildir), "/"),
63 r));
64 }
65 }
66
67 errno=EINVAL;
68 return NULL;
69 }
70
maildir_location(const char * homedir,const char * maildir)71 char *maildir_location(const char *homedir,
72 const char *maildir)
73 {
74 char *p;
75
76 if (*maildir == '/')
77 return strdup(maildir);
78
79 p=malloc(strlen(homedir)+strlen(maildir)+2);
80
81 if (!p)
82 return NULL;
83 strcat(strcat(strcpy(p, homedir), "/"), maildir);
84 return p;
85 }
86
maildir_folderdir(const char * maildir,const char * foldername)87 char *maildir_folderdir(const char *maildir, const char *foldername)
88 {
89 char *p;
90 const char *r;
91 size_t l;
92
93 if (!maildir) maildir=".";
94 l=strlen(maildir);
95
96 if (foldername == 0 ||
97 strcasecmp(foldername, INBOX) == 0)
98 {
99 if ((p=malloc(l+1)) == 0) return (0);
100 strcpy(p, maildir);
101 return(p);
102 }
103
104 /* Rules: no leading/trailing periods, no /s */
105 if (*foldername == '.' || strchr(foldername, '/'))
106 {
107 errno=EINVAL;
108 return (0);
109 }
110
111 for (r=foldername; *r; r++)
112 {
113 if (*r != '.') continue;
114 if (r[1] == 0 || r[1] == '.')
115 {
116 errno=EINVAL;
117 return (0);
118 }
119 }
120
121 if ((p=malloc(l+strlen(foldername)+3)) == 0) return (0);
122 *p=0;
123 if (strcmp(maildir, "."))
124 strcat(strcpy(p, maildir), "/");
125
126 return (strcat(strcat(p, "."), foldername));
127 }
128