rev |
line source |
yuuji@0
|
1 /* ========================================================================
|
yuuji@0
|
2 * Copyright 1988-2006 University of Washington
|
yuuji@0
|
3 *
|
yuuji@0
|
4 * Licensed under the Apache License, Version 2.0 (the "License");
|
yuuji@0
|
5 * you may not use this file except in compliance with the License.
|
yuuji@0
|
6 * You may obtain a copy of the License at
|
yuuji@0
|
7 *
|
yuuji@0
|
8 * http://www.apache.org/licenses/LICENSE-2.0
|
yuuji@0
|
9 *
|
yuuji@0
|
10 *
|
yuuji@0
|
11 * ========================================================================
|
yuuji@0
|
12 */
|
yuuji@0
|
13
|
yuuji@0
|
14 /*
|
yuuji@0
|
15 * Program: Dummy routines for WCE
|
yuuji@0
|
16 *
|
yuuji@0
|
17 * Author: Mark Crispin
|
yuuji@0
|
18 * Networks and Distributed Computing
|
yuuji@0
|
19 * Computing & Communications
|
yuuji@0
|
20 * University of Washington
|
yuuji@0
|
21 * Administration Building, AG-44
|
yuuji@0
|
22 * Seattle, WA 98195
|
yuuji@0
|
23 * Internet: MRC@CAC.Washington.EDU
|
yuuji@0
|
24 *
|
yuuji@0
|
25 * Date: 24 May 1993
|
yuuji@0
|
26 * Last Edited: 30 August 2006
|
yuuji@0
|
27 */
|
yuuji@0
|
28
|
yuuji@0
|
29
|
yuuji@0
|
30 #include <ctype.h>
|
yuuji@0
|
31 #include <stdio.h>
|
yuuji@0
|
32 #include <errno.h>
|
yuuji@0
|
33 #include <fcntl.h>
|
yuuji@0
|
34 #include <direct.h>
|
yuuji@0
|
35 #include "mail.h"
|
yuuji@0
|
36 #include "osdep.h"
|
yuuji@0
|
37 #include <sys\stat.h>
|
yuuji@0
|
38 #include <dos.h>
|
yuuji@0
|
39 #include "dummy.h"
|
yuuji@0
|
40 #include "misc.h"
|
yuuji@0
|
41
|
yuuji@0
|
42 /* Function prototypes */
|
yuuji@0
|
43
|
yuuji@0
|
44 DRIVER *dummy_valid (char *name);
|
yuuji@0
|
45 void *dummy_parameters (long function,void *value);
|
yuuji@0
|
46 MAILSTREAM *dummy_open (MAILSTREAM *stream);
|
yuuji@0
|
47 void dummy_close (MAILSTREAM *stream,long options);
|
yuuji@0
|
48 long dummy_ping (MAILSTREAM *stream);
|
yuuji@0
|
49 void dummy_check (MAILSTREAM *stream);
|
yuuji@0
|
50 long dummy_expunge (MAILSTREAM *stream,char *sequence,long options);
|
yuuji@0
|
51 long dummy_copy (MAILSTREAM *stream,char *sequence,char *mailbox,long options);
|
yuuji@0
|
52 long dummy_append (MAILSTREAM *stream,char *mailbox,append_t af,void *data);
|
yuuji@0
|
53
|
yuuji@0
|
54 /* Dummy routines */
|
yuuji@0
|
55
|
yuuji@0
|
56
|
yuuji@0
|
57 /* Driver dispatch used by MAIL */
|
yuuji@0
|
58
|
yuuji@0
|
59 DRIVER dummydriver = {
|
yuuji@0
|
60 "dummy", /* driver name */
|
yuuji@0
|
61 DR_LOCAL|DR_MAIL, /* driver flags */
|
yuuji@0
|
62 (DRIVER *) NIL, /* next driver */
|
yuuji@0
|
63 dummy_valid, /* mailbox is valid for us */
|
yuuji@0
|
64 dummy_parameters, /* manipulate parameters */
|
yuuji@0
|
65 dummy_scan, /* scan mailboxes */
|
yuuji@0
|
66 dummy_list, /* list mailboxes */
|
yuuji@0
|
67 dummy_lsub, /* list subscribed mailboxes */
|
yuuji@0
|
68 NIL, /* subscribe to mailbox */
|
yuuji@0
|
69 NIL, /* unsubscribe from mailbox */
|
yuuji@0
|
70 dummy_create, /* create mailbox */
|
yuuji@0
|
71 dummy_delete, /* delete mailbox */
|
yuuji@0
|
72 dummy_rename, /* rename mailbox */
|
yuuji@0
|
73 mail_status_default, /* status of mailbox */
|
yuuji@0
|
74 dummy_open, /* open mailbox */
|
yuuji@0
|
75 dummy_close, /* close mailbox */
|
yuuji@0
|
76 NIL, /* fetch message "fast" attributes */
|
yuuji@0
|
77 NIL, /* fetch message flags */
|
yuuji@0
|
78 NIL, /* fetch overview */
|
yuuji@0
|
79 NIL, /* fetch message structure */
|
yuuji@0
|
80 NIL, /* fetch header */
|
yuuji@0
|
81 NIL, /* fetch text */
|
yuuji@0
|
82 NIL, /* fetch message data */
|
yuuji@0
|
83 NIL, /* unique identifier */
|
yuuji@0
|
84 NIL, /* message number from UID */
|
yuuji@0
|
85 NIL, /* modify flags */
|
yuuji@0
|
86 NIL, /* per-message modify flags */
|
yuuji@0
|
87 NIL, /* search for message based on criteria */
|
yuuji@0
|
88 NIL, /* sort messages */
|
yuuji@0
|
89 NIL, /* thread messages */
|
yuuji@0
|
90 dummy_ping, /* ping mailbox to see if still alive */
|
yuuji@0
|
91 dummy_check, /* check for new messages */
|
yuuji@0
|
92 dummy_expunge, /* expunge deleted messages */
|
yuuji@0
|
93 dummy_copy, /* copy messages to another mailbox */
|
yuuji@0
|
94 dummy_append, /* append string message to mailbox */
|
yuuji@0
|
95 NIL /* garbage collect stream */
|
yuuji@0
|
96 };
|
yuuji@0
|
97
|
yuuji@0
|
98
|
yuuji@0
|
99 /* prototype stream */
|
yuuji@0
|
100 MAILSTREAM dummyproto = {&dummydriver};
|
yuuji@0
|
101
|
yuuji@0
|
102 /* driver parameters */
|
yuuji@0
|
103 static char *file_extension = NIL;
|
yuuji@0
|
104
|
yuuji@0
|
105 /* Dummy validate mailbox
|
yuuji@0
|
106 * Accepts: mailbox name
|
yuuji@0
|
107 * Returns: our driver if name is valid, NIL otherwise
|
yuuji@0
|
108 */
|
yuuji@0
|
109
|
yuuji@0
|
110 DRIVER *dummy_valid (char *name)
|
yuuji@0
|
111 {
|
yuuji@0
|
112 char *s,tmp[MAILTMPLEN];
|
yuuji@0
|
113 struct stat sbuf;
|
yuuji@0
|
114 /* must be valid local mailbox */
|
yuuji@0
|
115 return (name && *name && (*name != '{') &&
|
yuuji@0
|
116 (s = mailboxfile (tmp,name)) && (!*s || !stat (s,&sbuf))) ?
|
yuuji@0
|
117 &dummydriver : NIL;
|
yuuji@0
|
118 }
|
yuuji@0
|
119
|
yuuji@0
|
120
|
yuuji@0
|
121 /* Dummy manipulate driver parameters
|
yuuji@0
|
122 * Accepts: function code
|
yuuji@0
|
123 * function-dependent value
|
yuuji@0
|
124 * Returns: function-dependent return value
|
yuuji@0
|
125 */
|
yuuji@0
|
126
|
yuuji@0
|
127 void *dummy_parameters (long function,void *value)
|
yuuji@0
|
128 {
|
yuuji@0
|
129 return value;
|
yuuji@0
|
130 }
|
yuuji@0
|
131
|
yuuji@0
|
132 /* Dummy scan mailboxes
|
yuuji@0
|
133 * Accepts: mail stream
|
yuuji@0
|
134 * reference
|
yuuji@0
|
135 * pattern to search
|
yuuji@0
|
136 * string to scan
|
yuuji@0
|
137 */
|
yuuji@0
|
138
|
yuuji@0
|
139 void dummy_scan (MAILSTREAM *stream,char *ref,char *pat,char *contents)
|
yuuji@0
|
140 {
|
yuuji@0
|
141 /* return silently */
|
yuuji@0
|
142 }
|
yuuji@0
|
143
|
yuuji@0
|
144 /* Dummy list mailboxes
|
yuuji@0
|
145 * Accepts: mail stream
|
yuuji@0
|
146 * reference
|
yuuji@0
|
147 * pattern to search
|
yuuji@0
|
148 */
|
yuuji@0
|
149
|
yuuji@0
|
150 void dummy_list (MAILSTREAM *stream,char *ref,char *pat)
|
yuuji@0
|
151 {
|
yuuji@0
|
152 /* return silently */
|
yuuji@0
|
153 }
|
yuuji@0
|
154
|
yuuji@0
|
155
|
yuuji@0
|
156 /* Dummy list subscribed mailboxes
|
yuuji@0
|
157 * Accepts: mail stream
|
yuuji@0
|
158 * pattern to search
|
yuuji@0
|
159 */
|
yuuji@0
|
160
|
yuuji@0
|
161 void dummy_lsub (MAILSTREAM *stream,char *ref,char *pat)
|
yuuji@0
|
162 {
|
yuuji@0
|
163 /* return silently */
|
yuuji@0
|
164 }
|
yuuji@0
|
165
|
yuuji@0
|
166 /* Dummy create mailbox
|
yuuji@0
|
167 * Accepts: mail stream
|
yuuji@0
|
168 * mailbox name to create
|
yuuji@0
|
169 * Returns: T on success, NIL on failure
|
yuuji@0
|
170 */
|
yuuji@0
|
171
|
yuuji@0
|
172 long dummy_create (MAILSTREAM *stream,char *mailbox)
|
yuuji@0
|
173 {
|
yuuji@0
|
174 return NIL; /* always fails */
|
yuuji@0
|
175 }
|
yuuji@0
|
176
|
yuuji@0
|
177
|
yuuji@0
|
178 /* Dummy delete mailbox
|
yuuji@0
|
179 * Accepts: mail stream
|
yuuji@0
|
180 * mailbox name to delete
|
yuuji@0
|
181 * Returns: T on success, NIL on failure
|
yuuji@0
|
182 */
|
yuuji@0
|
183
|
yuuji@0
|
184 long dummy_delete (MAILSTREAM *stream,char *mailbox)
|
yuuji@0
|
185 {
|
yuuji@0
|
186 return NIL; /* always fails */
|
yuuji@0
|
187 }
|
yuuji@0
|
188
|
yuuji@0
|
189
|
yuuji@0
|
190 /* Mail rename mailbox
|
yuuji@0
|
191 * Accepts: mail stream
|
yuuji@0
|
192 * old mailbox name
|
yuuji@0
|
193 * new mailbox name
|
yuuji@0
|
194 * Returns: T on success, NIL on failure
|
yuuji@0
|
195 */
|
yuuji@0
|
196
|
yuuji@0
|
197 long dummy_rename (MAILSTREAM *stream,char *old,char *newname)
|
yuuji@0
|
198 {
|
yuuji@0
|
199 return NIL; /* always fails */
|
yuuji@0
|
200 }
|
yuuji@0
|
201
|
yuuji@0
|
202 /* Dummy open
|
yuuji@0
|
203 * Accepts: stream to open
|
yuuji@0
|
204 * Returns: stream on success, NIL on failure
|
yuuji@0
|
205 */
|
yuuji@0
|
206
|
yuuji@0
|
207 MAILSTREAM *dummy_open (MAILSTREAM *stream)
|
yuuji@0
|
208 {
|
yuuji@0
|
209 char tmp[MAILTMPLEN];
|
yuuji@0
|
210 /* OP_PROTOTYPE call or silence */
|
yuuji@0
|
211 if (!stream || stream->silent) return NIL;
|
yuuji@0
|
212 if (compare_cstring (stream->mailbox,"INBOX")) {
|
yuuji@0
|
213 sprintf (tmp,"Not a mailbox: %s",stream->mailbox);
|
yuuji@0
|
214 mm_log (tmp,ERROR);
|
yuuji@0
|
215 return NIL; /* always fails */
|
yuuji@0
|
216 }
|
yuuji@0
|
217 if (!stream->silent) { /* only if silence not requested */
|
yuuji@0
|
218 mail_exists (stream,0); /* say there are 0 messages */
|
yuuji@0
|
219 mail_recent (stream,0);
|
yuuji@0
|
220 stream->uid_validity = time (0);
|
yuuji@0
|
221 }
|
yuuji@0
|
222 stream->inbox = T; /* note that it's an INBOX */
|
yuuji@0
|
223 return stream; /* return success */
|
yuuji@0
|
224 }
|
yuuji@0
|
225
|
yuuji@0
|
226
|
yuuji@0
|
227 /* Dummy close
|
yuuji@0
|
228 * Accepts: MAIL stream
|
yuuji@0
|
229 * options
|
yuuji@0
|
230 */
|
yuuji@0
|
231
|
yuuji@0
|
232 void dummy_close (MAILSTREAM *stream,long options)
|
yuuji@0
|
233 {
|
yuuji@0
|
234 /* return silently */
|
yuuji@0
|
235 }
|
yuuji@0
|
236
|
yuuji@0
|
237 /* Dummy ping mailbox
|
yuuji@0
|
238 * Accepts: MAIL stream
|
yuuji@0
|
239 * Returns: T if stream alive, else NIL
|
yuuji@0
|
240 * No-op for readonly files, since read/writer can expunge it from under us!
|
yuuji@0
|
241 */
|
yuuji@0
|
242
|
yuuji@0
|
243 long dummy_ping (MAILSTREAM *stream)
|
yuuji@0
|
244 {
|
yuuji@0
|
245 return T;
|
yuuji@0
|
246 }
|
yuuji@0
|
247
|
yuuji@0
|
248
|
yuuji@0
|
249 /* Dummy check mailbox
|
yuuji@0
|
250 * Accepts: MAIL stream
|
yuuji@0
|
251 * No-op for readonly files, since read/writer can expunge it from under us!
|
yuuji@0
|
252 */
|
yuuji@0
|
253
|
yuuji@0
|
254 void dummy_check (MAILSTREAM *stream)
|
yuuji@0
|
255 {
|
yuuji@0
|
256 dummy_ping (stream); /* invoke ping */
|
yuuji@0
|
257 }
|
yuuji@0
|
258
|
yuuji@0
|
259
|
yuuji@0
|
260 /* Dummy expunge mailbox
|
yuuji@0
|
261 * Accepts: MAIL stream
|
yuuji@0
|
262 * sequence to expunge if non-NIL
|
yuuji@0
|
263 * expunge options
|
yuuji@0
|
264 * Returns: T, always
|
yuuji@0
|
265 */
|
yuuji@0
|
266
|
yuuji@0
|
267 long dummy_expunge (MAILSTREAM *stream,char *sequence,long options)
|
yuuji@0
|
268 {
|
yuuji@0
|
269 return LONGT;
|
yuuji@0
|
270 }
|
yuuji@0
|
271
|
yuuji@0
|
272 /* Dummy copy message(s)
|
yuuji@0
|
273 * Accepts: MAIL stream
|
yuuji@0
|
274 * sequence
|
yuuji@0
|
275 * destination mailbox
|
yuuji@0
|
276 * options
|
yuuji@0
|
277 * Returns: T if copy successful, else NIL
|
yuuji@0
|
278 */
|
yuuji@0
|
279
|
yuuji@0
|
280 long dummy_copy (MAILSTREAM *stream,char *sequence,char *mailbox,long options)
|
yuuji@0
|
281 {
|
yuuji@0
|
282 if ((options & CP_UID) ? mail_uid_sequence (stream,sequence) :
|
yuuji@0
|
283 mail_sequence (stream,sequence)) fatal ("Impossible dummy_copy");
|
yuuji@0
|
284 return NIL;
|
yuuji@0
|
285 }
|
yuuji@0
|
286
|
yuuji@0
|
287
|
yuuji@0
|
288 /* Dummy append message string
|
yuuji@0
|
289 * Accepts: mail stream
|
yuuji@0
|
290 * destination mailbox
|
yuuji@0
|
291 * stringstruct of message to append
|
yuuji@0
|
292 * Returns: T on success, NIL on failure
|
yuuji@0
|
293 */
|
yuuji@0
|
294
|
yuuji@0
|
295 long dummy_append (MAILSTREAM *stream,char *mailbox,append_t af,void *data)
|
yuuji@0
|
296 {
|
yuuji@0
|
297 char tmp[MAILTMPLEN];
|
yuuji@0
|
298 sprintf (tmp,"Can't append to %s",mailbox);
|
yuuji@0
|
299 mm_log (tmp,ERROR); /* pass up error */
|
yuuji@0
|
300 return NIL; /* always fails */
|
yuuji@0
|
301 }
|