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 TOPS-20
|
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: 13 June 1995
|
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 /* must be valid local mailbox */
|
yuuji@0
|
105 return (name && *name && (*name != '{') && !compare_cstring (name,"INBOX")) ?
|
yuuji@0
|
106 &dummydriver : NIL;
|
yuuji@0
|
107 }
|
yuuji@0
|
108
|
yuuji@0
|
109
|
yuuji@0
|
110 /* Dummy manipulate driver parameters
|
yuuji@0
|
111 * Accepts: function code
|
yuuji@0
|
112 * function-dependent value
|
yuuji@0
|
113 * Returns: function-dependent return value
|
yuuji@0
|
114 */
|
yuuji@0
|
115
|
yuuji@0
|
116 void *dummy_parameters (long function,void *value)
|
yuuji@0
|
117 {
|
yuuji@0
|
118 return NIL;
|
yuuji@0
|
119 }
|
yuuji@0
|
120
|
yuuji@0
|
121 /* Dummy scan mailboxes
|
yuuji@0
|
122 * Accepts: mail stream
|
yuuji@0
|
123 * reference
|
yuuji@0
|
124 * pattern to search
|
yuuji@0
|
125 * string to scan
|
yuuji@0
|
126 */
|
yuuji@0
|
127
|
yuuji@0
|
128 void dummy_scan (MAILSTREAM *stream,char *ref,char *pat,char *contents)
|
yuuji@0
|
129 {
|
yuuji@0
|
130 /* return silently */
|
yuuji@0
|
131 }
|
yuuji@0
|
132
|
yuuji@0
|
133
|
yuuji@0
|
134 /* Dummy list mailboxes
|
yuuji@0
|
135 * Accepts: mail stream
|
yuuji@0
|
136 * reference
|
yuuji@0
|
137 * pattern to search
|
yuuji@0
|
138 */
|
yuuji@0
|
139
|
yuuji@0
|
140 void dummy_list (MAILSTREAM *stream,char *ref,char *pat)
|
yuuji@0
|
141 {
|
yuuji@0
|
142 /* return silently */
|
yuuji@0
|
143 }
|
yuuji@0
|
144
|
yuuji@0
|
145
|
yuuji@0
|
146 /* Dummy list subscribed mailboxes
|
yuuji@0
|
147 * Accepts: mail stream
|
yuuji@0
|
148 * reference
|
yuuji@0
|
149 * pattern to search
|
yuuji@0
|
150 */
|
yuuji@0
|
151
|
yuuji@0
|
152 void dummy_lsub (MAILSTREAM *stream,char *ref,char *pat)
|
yuuji@0
|
153 {
|
yuuji@0
|
154 /* return silently */
|
yuuji@0
|
155 }
|
yuuji@0
|
156
|
yuuji@0
|
157 /* Dummy create mailbox
|
yuuji@0
|
158 * Accepts: mail stream
|
yuuji@0
|
159 * mailbox name to create
|
yuuji@0
|
160 * driver type to use
|
yuuji@0
|
161 * Returns: T on success, NIL on failure
|
yuuji@0
|
162 */
|
yuuji@0
|
163
|
yuuji@0
|
164 long dummy_create (MAILSTREAM *stream,char *mailbox)
|
yuuji@0
|
165 {
|
yuuji@0
|
166 return NIL; /* always fails */
|
yuuji@0
|
167 }
|
yuuji@0
|
168
|
yuuji@0
|
169
|
yuuji@0
|
170 /* Dummy delete mailbox
|
yuuji@0
|
171 * Accepts: mail stream
|
yuuji@0
|
172 * mailbox name to delete
|
yuuji@0
|
173 * Returns: T on success, NIL on failure
|
yuuji@0
|
174 */
|
yuuji@0
|
175
|
yuuji@0
|
176 long dummy_delete (MAILSTREAM *stream,char *mailbox)
|
yuuji@0
|
177 {
|
yuuji@0
|
178 return NIL; /* always fails */
|
yuuji@0
|
179 }
|
yuuji@0
|
180
|
yuuji@0
|
181
|
yuuji@0
|
182 /* Mail rename mailbox
|
yuuji@0
|
183 * Accepts: mail stream
|
yuuji@0
|
184 * old mailbox name
|
yuuji@0
|
185 * new mailbox name
|
yuuji@0
|
186 * Returns: T on success, NIL on failure
|
yuuji@0
|
187 */
|
yuuji@0
|
188
|
yuuji@0
|
189 long dummy_rename (MAILSTREAM *stream,char *old,char *newname)
|
yuuji@0
|
190 {
|
yuuji@0
|
191 return NIL; /* always fails */
|
yuuji@0
|
192 }
|
yuuji@0
|
193
|
yuuji@0
|
194 /* Dummy open
|
yuuji@0
|
195 * Accepts: stream to open
|
yuuji@0
|
196 * Returns: stream on success, NIL on failure
|
yuuji@0
|
197 */
|
yuuji@0
|
198
|
yuuji@0
|
199 MAILSTREAM *dummy_open (MAILSTREAM *stream)
|
yuuji@0
|
200 {
|
yuuji@0
|
201 char tmp[MAILTMPLEN];
|
yuuji@0
|
202 /* OP_PROTOTYPE call or silence */
|
yuuji@0
|
203 if (!stream || stream->silent) return NIL;
|
yuuji@0
|
204 if (compare_cstring (stream->mailbox,"INBOX")) {
|
yuuji@0
|
205 sprintf (tmp,"Not a mailbox: %s",stream->mailbox);
|
yuuji@0
|
206 mm_log (tmp,ERROR);
|
yuuji@0
|
207 return NIL; /* always fails */
|
yuuji@0
|
208 }
|
yuuji@0
|
209 if (!stream->silent) { /* only if silence not requested */
|
yuuji@0
|
210 mail_exists (stream,0); /* say there are 0 messages */
|
yuuji@0
|
211 mail_recent (stream,0);
|
yuuji@0
|
212 stream->uid_validity = time (0);
|
yuuji@0
|
213 }
|
yuuji@0
|
214 stream->inbox = T; /* note that it's an INBOX */
|
yuuji@0
|
215 return stream; /* return success */
|
yuuji@0
|
216 }
|
yuuji@0
|
217
|
yuuji@0
|
218
|
yuuji@0
|
219 /* Dummy close
|
yuuji@0
|
220 * Accepts: MAIL stream
|
yuuji@0
|
221 * options
|
yuuji@0
|
222 */
|
yuuji@0
|
223
|
yuuji@0
|
224 void dummy_close (MAILSTREAM *stream,long options)
|
yuuji@0
|
225 {
|
yuuji@0
|
226 /* return silently */
|
yuuji@0
|
227 }
|
yuuji@0
|
228
|
yuuji@0
|
229 /* Dummy ping mailbox
|
yuuji@0
|
230 * Accepts: MAIL stream
|
yuuji@0
|
231 * Returns: T if stream alive, else NIL
|
yuuji@0
|
232 * No-op for readonly files, since read/writer can expunge it from under us!
|
yuuji@0
|
233 */
|
yuuji@0
|
234
|
yuuji@0
|
235 long dummy_ping (MAILSTREAM *stream)
|
yuuji@0
|
236 {
|
yuuji@0
|
237 return T;
|
yuuji@0
|
238 }
|
yuuji@0
|
239
|
yuuji@0
|
240
|
yuuji@0
|
241 /* Dummy check mailbox
|
yuuji@0
|
242 * Accepts: MAIL stream
|
yuuji@0
|
243 * No-op for readonly files, since read/writer can expunge it from under us!
|
yuuji@0
|
244 */
|
yuuji@0
|
245
|
yuuji@0
|
246 void dummy_check (MAILSTREAM *stream)
|
yuuji@0
|
247 {
|
yuuji@0
|
248 dummy_ping (stream); /* invoke ping */
|
yuuji@0
|
249 }
|
yuuji@0
|
250
|
yuuji@0
|
251
|
yuuji@0
|
252 /* Dummy expunge mailbox
|
yuuji@0
|
253 * Accepts: MAIL stream
|
yuuji@0
|
254 * sequence to expunge if non-NIL
|
yuuji@0
|
255 * expunge options
|
yuuji@0
|
256 * Returns: T, always
|
yuuji@0
|
257 */
|
yuuji@0
|
258
|
yuuji@0
|
259 long dummy_expunge (MAILSTREAM *stream,char *sequence,long options)
|
yuuji@0
|
260 {
|
yuuji@0
|
261 return LONGT;
|
yuuji@0
|
262 }
|
yuuji@0
|
263
|
yuuji@0
|
264 /* Dummy copy message(s)
|
yuuji@0
|
265 * Accepts: MAIL stream
|
yuuji@0
|
266 * sequence
|
yuuji@0
|
267 * destination mailbox
|
yuuji@0
|
268 * options
|
yuuji@0
|
269 * Returns: T if copy successful, else NIL
|
yuuji@0
|
270 */
|
yuuji@0
|
271
|
yuuji@0
|
272 long dummy_copy (MAILSTREAM *stream,char *sequence,char *mailbox,long options)
|
yuuji@0
|
273 {
|
yuuji@0
|
274 if ((options & CP_UID) ? mail_uid_sequence (stream,sequence) :
|
yuuji@0
|
275 mail_sequence (stream,sequence)) fatal ("Impossible dummy_copy");
|
yuuji@0
|
276 return NIL;
|
yuuji@0
|
277 }
|
yuuji@0
|
278
|
yuuji@0
|
279
|
yuuji@0
|
280 /* Dummy append message string
|
yuuji@0
|
281 * Accepts: mail stream
|
yuuji@0
|
282 * destination mailbox
|
yuuji@0
|
283 * append callback function
|
yuuji@0
|
284 * data for callback
|
yuuji@0
|
285 * Returns: T on success, NIL on failure
|
yuuji@0
|
286 */
|
yuuji@0
|
287
|
yuuji@0
|
288 long dummy_append (MAILSTREAM *stream,char *mailbox,append_t af,void *data)
|
yuuji@0
|
289 {
|
yuuji@0
|
290 char tmp[MAILTMPLEN];
|
yuuji@0
|
291 sprintf (tmp,"Can't append to %s",mailbox);
|
yuuji@0
|
292 mm_log (tmp,ERROR); /* pass up error */
|
yuuji@0
|
293 return NIL; /* always fails */
|
yuuji@0
|
294 }
|