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