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