1 #ifndef	maildirmisc_h
2 #define	maildirmisc_h
3 
4 /*
5 ** Copyright 2000-2003 Double Precision, Inc.
6 ** See COPYING for distribution information.
7 */
8 
9 #if	HAVE_CONFIG_H
10 #include	"config.h"
11 #endif
12 
13 #if HAVE_SYS_STAT_H
14 #include	<sys/stat.h>
15 #endif
16 
17 #ifdef  __cplusplus
18 extern "C" {
19 #endif
20 
21 
22 /*
23 **
24 ** Miscellaneous maildir-related code
25 **
26 */
27 
28 /* Some special folders */
29 
30 #define	INBOX	"INBOX"
31 #define	DRAFTS	"Drafts"
32 #define	SENT	"Sent"
33 #define	TRASH	"Trash"
34 #define	SHARED	"shared"
35 
36 #define	SHAREDSUBDIR	"shared-folders"
37 
38 #define NEWSHAREDSP "#shared"
39 #define	NEWSHARED "#shared."
40 
41 #define PUBLIC "public" /* SMAP */
42 
43 int maildir_make(const char *maildir, int perm, int subdirperm,
44 		int folder);
45 
46 int maildir_del(const char *maildir);
47 
48 int maildir_del_content(const char *maildir);
49 
50 char *maildir_name2dir(const char *maildir,	/* DIR location */
51 		       const char *foldername); /* INBOX.name */
52 
53 char *maildir_location(const char *homedir,
54 		       const char *maildir);
55 /*
56 ** Homedir is the account's home directory, "maildir" is where the account's
57 ** default Maildir is configured to be (usually "./Maildir").  Combine the
58 ** two to produce an absolute pathname.
59 */
60 
61 
62 char *maildir_folderdir(const char *,		/* maildir */
63 	const char *);				/* folder name */
64 	/* Returns the directory corresponding to foldername (foldername is
65 	** checked to make sure that it's a valid name, else we set errno
66 	** to EINVAL, and return (0).
67 	*/
68 
69 char *maildir_filename(const char *,		/* maildir */
70 	const char *,				/* folder */
71 	const char *);				/* filename */
72 	/*
73 	** Builds the filename to this message, suitable for opening.
74 	** If the file doesn't appear to be there, search the maildir to
75 	** see if someone changed the flags, and return the current filename.
76 	*/
77 
78 int maildir_safeopen(const char *,		/* filename */
79 	int,				/* mode */
80 	int);				/* perm */
81 
82 /*
83 **	Same arguments as open().  When we're accessing a shared maildir,
84 **	prevent someone from playing cute and dumping a bunch of symlinks
85 **	in there.  This function will open the indicate file only if the
86 **	last component is not a symlink.
87 **	This is implemented by opening the file with O_NONBLOCK (to prevent
88 **	a DOS attack of someone pointing the symlink to a pipe, causing
89 **	the open to hang), clearing O_NONBLOCK, then stat-int the file
90 **	descriptor, lstating the filename, and making sure that dev/ino
91 **	match.
92 */
93 
94 int maildir_semisafeopen(const char *,	/* filename */
95 	int,				/* mode */
96 	int);				/* perm */
97 
98 /*
99 ** Same thing, except that we allow ONE level of soft link indirection,
100 ** because we're reading from our own maildir, which points to the
101 ** message in the sharable maildir.
102 */
103 
104 int maildir_safeopen_stat(const char *path, int mode, int perm,
105 			  struct stat *stat1);
106 	/* Sane as maildir_safeopen(), except that we also initialize a
107 	** struct stat, saving an extra syscall to the caller.
108 	*/
109 
110 int maildir_mkdir(const char *);	/* directory */
111 /*
112 ** Create maildir including all subdirectories in the path (like mkdir -p)
113 */
114 
115 void maildir_purgetmp(const char *);		/* maildir */
116 	/* purges old stuff out of tmp */
117 
118 void maildir_purge(const char *,		/* directory */
119 	unsigned);				/* time_t to purge */
120 
121 void maildir_getnew(const char *,		/* maildir */
122 	const char *,				/* folder */
123 	void (*)(const char *, void *),		/* Callback function for
124 						** every moved msg.
125 						*/
126 	void *arg);				/* Passthrough callback arg */
127 
128 	/* move messages from new to cur */
129 
130 int maildir_deletefolder(const char *,		/* maildir */
131 	const char *);				/* folder */
132 	/* deletes a folder */
133 
134 void maildir_list(const char *maildir,
135 		  void (*func)(const char *, void *),
136 		  void *voidp);
137 
138 void maildir_list_sharable(const char *,	/* maildir */
139 	void (*)(const char *, void *),		/* callback function */
140 	void *);				/* 2nd arg to callback func */
141 	/* list sharable folders */
142 
143 int maildir_shared_subscribe(const char *,	/* maildir */
144 		const char *);			/* folder */
145 	/* subscribe to a shared folder */
146 
147 void maildir_list_shared(const char *,		/* maildir */
148 	void (*)(const char *, void *),		/* callback function */
149 	void *);			/* 2nd arg to the callback func */
150 	/* list subscribed folders */
151 
152 int maildir_shared_unsubscribe(const char *,	/* maildir */
153 		const char *);			/* folder */
154 	/* unsubscribe from a shared folder */
155 
156 char *maildir_shareddir(const char *,		/* maildir */
157 	const char *);				/* folder */
158 	/*
159 	** Validate and return a path to a shared folder.  folderdir must be
160 	** a name of a valid shared folder.
161 	*/
162 
163 void maildir_shared_sync(const char *);		/* maildir */
164 	/* "sync" the shared folder */
165 
166 int maildir_sharedisro(const char *);		/* maildir */
167 	/* maildir is a shared read-only folder */
168 
169 int maildir_unlinksharedmsg(const char *);	/* filename */
170 	/* Remove a message from a shared folder */
171 
172 /* Internal function that reads a symlink */
173 
174 char *maildir_getlink(const char *);
175 
176 	/* Determine whether the maildir filename has a certain flag */
177 
178 int maildir_hasflag(const char *filename, char);
179 
180 #define	MAILDIR_DELETED(f)	maildir_hasflag((f), 'T')
181 
182 	/*
183 	** Hierarchical maildir rename.
184 	*/
185 
186 #define MAILDIR_RENAME_FOLDER 1
187 #define MAILDIR_RENAME_SUBFOLDERS 2
188 
189 int maildir_rename(const char *maildir, /* Path to the maildir */
190 		   const char *oldname, /* .foldername */
191 		   const char *newname, /* .foldername */
192 		   int flags, /* See above */
193 		   void (*callback_func)(const char *old_path,
194 					 const char *new_path)
195 		   );
196 
197 #ifdef  __cplusplus
198 }
199 #endif
200 
201 #endif
202