/[imapfilter]/imapfilter/imap.c
ViewVC logotype

Annotation of /imapfilter/imap.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.38 - (hide annotations)
Thu Jul 31 15:53:19 2003 UTC (20 years, 8 months ago) by lefcha
Branch: MAIN
CVS Tags: release-0_9
Branch point for: release-0_9-patches
Changes since 1.37: +6 -7 lines
File MIME type: text/plain
Broke up program files and created some new header files.

1 lefcha 1.1 #include <stdio.h>
2     #include <string.h>
3    
4     #include "config.h"
5     #include "imapfilter.h"
6 lefcha 1.38 #include "buffer.h"
7 lefcha 1.1
8    
9 lefcha 1.37 extern conn_t connpri, connaux;
10 lefcha 1.24
11 lefcha 1.36 buffer_t obuf; /* Output buffer. */
12    
13     static unsigned int tag = 0; /* Every IMAP command is prefixed with a
14     * unique [:alnum:] string. */
15 lefcha 1.1
16 lefcha 1.38
17     unsigned int send_command(conn_t * conn, char *cmd);
18     void send_command_cont(conn_t * conn, char *cmd);
19    
20    
21 lefcha 1.1 /*
22 lefcha 1.13 * Send to server data; a command.
23 lefcha 1.1 */
24 lefcha 1.30 unsigned int
25 lefcha 1.37 send_command(conn_t * conn, char *cmd)
26 lefcha 1.1 {
27     #ifdef DEBUG
28 lefcha 1.32 fprintf(stderr, "debug: sending command (%s):\n\n%s\n",
29 lefcha 1.37 (conn == &connpri ? "primary" : "auxiliary"), cmd);
30 lefcha 1.1 #endif
31 lefcha 1.37 verbose("%s: %s", (conn == &connpri ? "C" : "c"), cmd);
32 lefcha 1.18
33 lefcha 1.37 socket_write(conn, cmd);
34 lefcha 1.25
35 lefcha 1.30 return tag++;
36 lefcha 1.1 }
37    
38    
39 lefcha 1.34 #ifdef CRAM_MD5
40     /*
41     * Send to server data: a continuation command.
42     */
43     void
44 lefcha 1.37 send_command_cont(conn_t * conn, char *cmd)
45 lefcha 1.34 {
46     #ifdef DEBUG
47     fprintf(stderr, "debug: sending command (%s):\n\n%s\r\n\n",
48 lefcha 1.37 (conn == &connpri ? "primary" : "auxiliary"), cmd);
49 lefcha 1.34 #endif
50    
51 lefcha 1.37 socket_write(conn, cmd);
52     socket_write(conn, "\r\n");
53 lefcha 1.34 }
54     #endif
55    
56    
57 lefcha 1.1 #ifdef DEBUG
58     /*
59     * IMAP NOOP: does nothing always succeeds.
60     */
61 lefcha 1.30 int
62 lefcha 1.37 imap_noop(conn_t * conn)
63 lefcha 1.1 {
64 lefcha 1.36 reset_buffer(&obuf);
65     check_buffer(&obuf, strlen("NOOP") + 12);
66 lefcha 1.1
67 lefcha 1.36 snprintf(obuf.data, obuf.size, "%08X NOOP\r\n", tag);
68 lefcha 1.1
69 lefcha 1.37 return send_command(conn, obuf.data);
70 lefcha 1.1 }
71     #endif
72    
73    
74     /*
75 lefcha 1.21 * IMAP CAPABILITY: requests listing of capabilities that the server supports.
76 lefcha 1.16 */
77 lefcha 1.30 int
78 lefcha 1.37 imap_capability(conn_t * conn)
79 lefcha 1.16 {
80 lefcha 1.36 reset_buffer(&obuf);
81     check_buffer(&obuf, strlen("CAPABILITY") + 12);
82 lefcha 1.16
83 lefcha 1.36 snprintf(obuf.data, obuf.size, "%08X CAPABILITY\r\n", tag);
84 lefcha 1.21
85 lefcha 1.37 return send_command(conn, obuf.data);
86 lefcha 1.21 }
87    
88    
89     /*
90     * IMAP NAMESPACE: discovers the prefix and delimeter of namespaces used by
91     * the server for mailboxes (RFC 2342).
92     */
93 lefcha 1.30 int
94 lefcha 1.37 imap_namespace(conn_t * conn)
95 lefcha 1.21 {
96 lefcha 1.36 reset_buffer(&obuf);
97     check_buffer(&obuf, strlen("NAMESPACE") + 12);
98 lefcha 1.21
99 lefcha 1.36 snprintf(obuf.data, obuf.size, "%08X NAMESPACE\r\n", tag);
100 lefcha 1.16
101 lefcha 1.37 return send_command(conn, obuf.data);
102 lefcha 1.16 }
103    
104    
105     /*
106 lefcha 1.1 * IMAP LOGOUT: informs server that client is done.
107     */
108 lefcha 1.30 int
109 lefcha 1.37 imap_logout(conn_t * conn)
110 lefcha 1.1 {
111 lefcha 1.36 reset_buffer(&obuf);
112     check_buffer(&obuf, strlen("LOGOUT") + 12);
113 lefcha 1.1
114 lefcha 1.36 snprintf(obuf.data, obuf.size, "%08X LOGOUT\r\n", tag);
115 lefcha 1.1
116 lefcha 1.37 return send_command(conn, obuf.data);
117 lefcha 1.28 }
118    
119    
120 lefcha 1.35 /*
121     * IMAP STARTTLS: begin TLS negotiation.
122     */
123     int
124 lefcha 1.37 imap_starttls(conn_t * conn)
125 lefcha 1.35 {
126 lefcha 1.36 reset_buffer(&obuf);
127     check_buffer(&obuf, strlen("STARTTLS") + 12);
128 lefcha 1.35
129 lefcha 1.36 snprintf(obuf.data, obuf.size, "%08X STARTTLS\r\n", tag);
130 lefcha 1.35
131 lefcha 1.37 return send_command(conn, obuf.data);
132 lefcha 1.35 }
133    
134    
135 lefcha 1.34 #ifdef CRAM_MD5
136 lefcha 1.28 /*
137     * IMAP AUTHENTICATE: indicates authentication mechanism and performs an
138     * authentication protocol exchange.
139     */
140 lefcha 1.30 int
141 lefcha 1.37 imap_authenticate(conn_t * conn, char *auth, int cont)
142 lefcha 1.28 {
143 lefcha 1.36 reset_buffer(&obuf);
144     check_buffer(&obuf, strlen("AUTHENTICATE") + 12);
145 lefcha 1.30
146 lefcha 1.34 if (!cont) {
147 lefcha 1.36 snprintf(obuf.data, obuf.size, "%08X AUTHENTICATE %s\r\n",
148     tag, auth);
149 lefcha 1.37 return send_command(conn, obuf.data);
150 lefcha 1.34 } else {
151 lefcha 1.37 send_command_cont(conn, auth);
152 lefcha 1.34 return 0;
153     }
154     }
155     #endif
156 lefcha 1.1
157    
158     /*
159     * IMAP LOGIN: identifies client to server.
160     */
161 lefcha 1.30 int
162 lefcha 1.37 imap_login(conn_t * conn, char *user, char *pass)
163 lefcha 1.1 {
164 lefcha 1.36 int r, n;
165     char *sbuf;
166 lefcha 1.25
167 lefcha 1.36 n = strlen("LOGIN") + strlen(user) + strlen(pass) + 18;
168     sbuf = (char *)smalloc(n);
169 lefcha 1.1
170 lefcha 1.36 snprintf(sbuf, n, "%08X LOGIN \"%s\" \"%s\"\r\n", tag, user, pass);
171 lefcha 1.1
172 lefcha 1.37 r = send_command(conn, sbuf);
173 lefcha 1.25
174 lefcha 1.36 sfree(sbuf);
175 lefcha 1.23
176 lefcha 1.30 return r;
177 lefcha 1.1 }
178    
179    
180     /*
181 lefcha 1.24 * IMAP LIST: returns a subset of names from the complete set of names
182     * available to the client.
183     *
184 lefcha 1.37 int imap_list(conn_t *conn, char *refer, char *mbox)
185 lefcha 1.24 {
186 lefcha 1.36 int r;
187    
188     reset_buffer(&obuf);
189     check_buffer(&obuf, strlen("LIST") + strlen(refer) + strlen(mbox) + 18);
190    
191     snprintf(obuf.data, obuf.size, "%08X LIST \"%s\" \"%s\"\r\n", tag,
192     refer, mbox);
193 lefcha 1.25
194 lefcha 1.37 r = send_command(conn, obuf.data);
195 lefcha 1.25
196 lefcha 1.36 return r;
197 lefcha 1.24 }*/
198    
199    
200     /*
201     * IMAP SUBSCRIBE: adds the specified mailbox name to the server's
202     * set of "active" or "subscribed" mailboxes.
203     */
204 lefcha 1.30 int
205 lefcha 1.37 imap_subscribe(conn_t * conn, char *mbox)
206 lefcha 1.24 {
207 lefcha 1.36 reset_buffer(&obuf);
208     check_buffer(&obuf, strlen("SUBSCRIBE") + strlen(mbox) + 15);
209 lefcha 1.24
210 lefcha 1.36 snprintf(obuf.data, obuf.size, "%08X SUBSCRIBE \"%s\"\r\n", tag, mbox);
211 lefcha 1.24
212 lefcha 1.37 return send_command(conn, obuf.data);
213 lefcha 1.24 }
214    
215    
216     /*
217 lefcha 1.13 * IMAP EXAMINE: access a mailbox in READ-ONLY mode.
218 lefcha 1.31 *
219 lefcha 1.30 int
220 lefcha 1.37 imap_examine(conn_t *conn, char *mbox)
221 lefcha 1.1 {
222 lefcha 1.36 reset_buffer(&obuf);
223     check_buffer(&obuf, strlen("EXAMINE") + strlen(mbox) + 15);
224 lefcha 1.1
225 lefcha 1.36 snprintf(obuf.data, MEDIUM_CMD, "%08X EXAMINE \"%s\"\r\n", tag, mbox);
226 lefcha 1.1
227 lefcha 1.37 return send_command(conn, obuf.data);
228 lefcha 1.31 }*/
229 lefcha 1.10
230 lefcha 1.13
231 lefcha 1.10 /*
232 lefcha 1.13 * IMAP SELECT: access a mailbox in READ-WRITE mode.
233 lefcha 1.10 */
234 lefcha 1.30 int
235 lefcha 1.37 imap_select(conn_t * conn, char *mbox)
236 lefcha 1.10 {
237 lefcha 1.36 reset_buffer(&obuf);
238     check_buffer(&obuf, strlen("SELECT") + strlen(mbox) + 15);
239 lefcha 1.10
240 lefcha 1.36 snprintf(obuf.data, obuf.size, "%08X SELECT \"%s\"\r\n", tag, mbox);
241 lefcha 1.10
242 lefcha 1.37 return send_command(conn, obuf.data);
243 lefcha 1.1 }
244 lefcha 1.10
245 lefcha 1.1
246     /*
247 lefcha 1.13 * IMAP STATUS: requests status of the indicated mailbox.
248 lefcha 1.1 */
249 lefcha 1.30 int
250 lefcha 1.37 imap_status(conn_t * conn, char *mbox, char *items)
251 lefcha 1.1 {
252 lefcha 1.36 reset_buffer(&obuf);
253     check_buffer(&obuf, strlen("STATUS") + strlen(mbox) +
254     strlen(items) + 18);
255 lefcha 1.1
256 lefcha 1.36 snprintf(obuf.data, obuf.size, "%08X STATUS \"%s\" (%s)\r\n", tag, mbox, items);
257 lefcha 1.5
258 lefcha 1.37 return send_command(conn, obuf.data);
259 lefcha 1.1 }
260    
261    
262     /*
263 lefcha 1.13 * IMAP CREATE: create mailbox.
264 lefcha 1.1 */
265 lefcha 1.30 int
266 lefcha 1.37 imap_create(conn_t * conn, char *mbox)
267 lefcha 1.1 {
268 lefcha 1.36 reset_buffer(&obuf);
269     check_buffer(&obuf, strlen("CREATE") + strlen(mbox) + 14);
270 lefcha 1.1
271 lefcha 1.36 snprintf(obuf.data, obuf.size, "%08X CREATE \"%s\"\r\n", tag, mbox);
272 lefcha 1.1
273 lefcha 1.37 return send_command(conn, obuf.data);
274 lefcha 1.1 }
275    
276    
277     /*
278 lefcha 1.13 * IMAP SEARCH: searches the mailbox for messages that match certain criteria.
279 lefcha 1.1 */
280 lefcha 1.30 int
281 lefcha 1.37 imap_search(conn_t * conn, char *charset, char *search)
282 lefcha 1.1 {
283 lefcha 1.36 reset_buffer(&obuf);
284     check_buffer(&obuf, strlen("SEARCH CHARSET") + strlen(charset) +
285     strlen(search) + 15);
286 lefcha 1.1
287 lefcha 1.30 if (*charset)
288 lefcha 1.36 snprintf(obuf.data, obuf.size, "%08X SEARCH CHARSET \"%s\" %s\r\n",
289     tag, charset, search);
290 lefcha 1.30 else
291 lefcha 1.36 snprintf(obuf.data, obuf.size, "%08X SEARCH %s\r\n", tag, search);
292 lefcha 1.1
293 lefcha 1.37 return send_command(conn, obuf.data);
294 lefcha 1.1 }
295    
296    
297     /*
298 lefcha 1.13 * IMAP FETCH: retrieves data associated with a message.
299 lefcha 1.1 */
300 lefcha 1.30 int
301 lefcha 1.37 imap_fetch(conn_t * conn, char *mesg, char *items)
302 lefcha 1.1 {
303 lefcha 1.36 reset_buffer(&obuf);
304     check_buffer(&obuf, strlen("FETCH") + strlen(mesg) + strlen(items) + 14);
305 lefcha 1.1
306 lefcha 1.36 snprintf(obuf.data, obuf.size, "%08X FETCH %s %s\r\n", tag, mesg, items);
307 lefcha 1.1
308 lefcha 1.37 return send_command(conn, obuf.data);
309 lefcha 1.1 }
310    
311    
312     /*
313 lefcha 1.13 * IMAP STORE: alters data associated with a message.
314 lefcha 1.1 */
315 lefcha 1.30 int
316 lefcha 1.37 imap_store(conn_t * conn, char *mesg, unsigned int mode, char *flags)
317 lefcha 1.1 {
318 lefcha 1.36 reset_buffer(&obuf);
319     check_buffer(&obuf, strlen("STORE") + strlen(mesg) +
320     strlen("FLAGS.SILENT") + strlen(flags) + 18);
321 lefcha 1.1
322 lefcha 1.36 snprintf(obuf.data, obuf.size, "%08X STORE %s %sFLAGS.SILENT (%s)\r\n",
323     tag, mesg, (mode == STORE_FLAG_REPLACE ? "" :
324 lefcha 1.30 mode == STORE_FLAG_ADD ? "+" : "-"), flags);
325 lefcha 1.5
326 lefcha 1.37 return send_command(conn, obuf.data);
327 lefcha 1.5 }
328    
329    
330     /*
331 lefcha 1.13 * IMAP COPY: copy messages to mailbox.
332 lefcha 1.5 */
333 lefcha 1.30 int
334 lefcha 1.37 imap_copy(conn_t * conn, char *mesg, char *mbox)
335 lefcha 1.5 {
336 lefcha 1.36 reset_buffer(&obuf);
337     check_buffer(&obuf, strlen("COPY") + strlen(mesg) + strlen(mbox) + 16);
338 lefcha 1.5
339 lefcha 1.36 snprintf(obuf.data, obuf.size, "%08X COPY %s \"%s\"\r\n", tag, mesg, mbox);
340 lefcha 1.5
341 lefcha 1.37 return send_command(conn, obuf.data);
342 lefcha 1.5 }
343 lefcha 1.2
344    
345 lefcha 1.5 /*
346 lefcha 1.24 * IMAP APPEND: append message to the end of a mailbox.
347     */
348 lefcha 1.30 int
349 lefcha 1.37 imap_append(conn_t * conn, char *mbox, unsigned int size)
350 lefcha 1.24 {
351 lefcha 1.36 reset_buffer(&obuf);
352     check_buffer(&obuf, strlen("APPEND") + strlen(mbox) +
353     strlen(ultostr(size, 10)) + 18);
354 lefcha 1.25
355 lefcha 1.36 snprintf(obuf.data, obuf.size, "%08X APPEND \"%s\" {%d}\r\n", tag, mbox,
356     size);
357 lefcha 1.25
358 lefcha 1.37 return send_command(conn, obuf.data);
359 lefcha 1.24 }
360    
361    
362    
363     /*
364 lefcha 1.13 * IMAP CLOSE: delete messages and return to authenticated state.
365 lefcha 1.5 */
366 lefcha 1.30 int
367 lefcha 1.37 imap_close(conn_t * conn)
368 lefcha 1.5 {
369 lefcha 1.36 reset_buffer(&obuf);
370     check_buffer(&obuf, strlen("CLOSE") + 12);
371 lefcha 1.4
372 lefcha 1.36 snprintf(obuf.data, obuf.size, "%08X CLOSE\r\n", tag);
373 lefcha 1.13
374 lefcha 1.37 return send_command(conn, obuf.data);
375 lefcha 1.5 }
376 lefcha 1.4
377 lefcha 1.1
378     /*
379 lefcha 1.13 * IMAP EXPUNGE: permanently removes any messages with the \Deleted flag set.
380 lefcha 1.25 */
381 lefcha 1.30 int
382 lefcha 1.37 imap_expunge(conn_t * conn)
383 lefcha 1.1 {
384 lefcha 1.36 reset_buffer(&obuf);
385     check_buffer(&obuf, strlen("EXPUNGE") + 12);
386 lefcha 1.1
387 lefcha 1.36 snprintf(obuf.data, obuf.size, "%08X EXPUNGE\r\n", tag);
388 lefcha 1.4
389 lefcha 1.37 return send_command(conn, obuf.data);
390 lefcha 1.25 }

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26