10 |
|
|
11 |
buffer_t obuf; /* Output buffer. */ |
buffer_t obuf; /* Output buffer. */ |
12 |
|
|
13 |
static unsigned int tag = 0; /* Every IMAP command is prefixed with a |
static unsigned int tag = 0x1000; /* Every IMAP command is prefixed with |
14 |
* unique [:alnum:] string. */ |
* a unique [:alnum:] string. */ |
15 |
|
|
16 |
|
|
17 |
unsigned int send_command(conn_t * conn, char *cmd); |
unsigned int send_command(conn_t * conn, char *cmd); |
32 |
|
|
33 |
socket_write(conn, cmd); |
socket_write(conn, cmd); |
34 |
|
|
35 |
|
if (tag == 0xFFFF) |
36 |
|
tag = 0x0FFF; |
37 |
|
|
38 |
return tag++; |
return tag++; |
39 |
} |
} |
40 |
|
|
67 |
reset_buffer(&obuf); |
reset_buffer(&obuf); |
68 |
check_buffer(&obuf, strlen("NOOP") + 12); |
check_buffer(&obuf, strlen("NOOP") + 12); |
69 |
|
|
70 |
snprintf(obuf.data, obuf.size, "%08X NOOP\r\n", tag); |
snprintf(obuf.data, obuf.size, "%04X NOOP\r\n", tag); |
71 |
|
|
72 |
return send_command(conn, obuf.data); |
return send_command(conn, obuf.data); |
73 |
} |
} |
83 |
reset_buffer(&obuf); |
reset_buffer(&obuf); |
84 |
check_buffer(&obuf, strlen("CAPABILITY") + 12); |
check_buffer(&obuf, strlen("CAPABILITY") + 12); |
85 |
|
|
86 |
snprintf(obuf.data, obuf.size, "%08X CAPABILITY\r\n", tag); |
snprintf(obuf.data, obuf.size, "%04X CAPABILITY\r\n", tag); |
87 |
|
|
88 |
return send_command(conn, obuf.data); |
return send_command(conn, obuf.data); |
89 |
} |
} |
99 |
reset_buffer(&obuf); |
reset_buffer(&obuf); |
100 |
check_buffer(&obuf, strlen("NAMESPACE") + 12); |
check_buffer(&obuf, strlen("NAMESPACE") + 12); |
101 |
|
|
102 |
snprintf(obuf.data, obuf.size, "%08X NAMESPACE\r\n", tag); |
snprintf(obuf.data, obuf.size, "%04X NAMESPACE\r\n", tag); |
103 |
|
|
104 |
return send_command(conn, obuf.data); |
return send_command(conn, obuf.data); |
105 |
} |
} |
114 |
reset_buffer(&obuf); |
reset_buffer(&obuf); |
115 |
check_buffer(&obuf, strlen("LOGOUT") + 12); |
check_buffer(&obuf, strlen("LOGOUT") + 12); |
116 |
|
|
117 |
snprintf(obuf.data, obuf.size, "%08X LOGOUT\r\n", tag); |
snprintf(obuf.data, obuf.size, "%04X LOGOUT\r\n", tag); |
118 |
|
|
119 |
return send_command(conn, obuf.data); |
return send_command(conn, obuf.data); |
120 |
} |
} |
129 |
reset_buffer(&obuf); |
reset_buffer(&obuf); |
130 |
check_buffer(&obuf, strlen("STARTTLS") + 12); |
check_buffer(&obuf, strlen("STARTTLS") + 12); |
131 |
|
|
132 |
snprintf(obuf.data, obuf.size, "%08X STARTTLS\r\n", tag); |
snprintf(obuf.data, obuf.size, "%04X STARTTLS\r\n", tag); |
133 |
|
|
134 |
return send_command(conn, obuf.data); |
return send_command(conn, obuf.data); |
135 |
} |
} |
147 |
check_buffer(&obuf, strlen("AUTHENTICATE") + 12); |
check_buffer(&obuf, strlen("AUTHENTICATE") + 12); |
148 |
|
|
149 |
if (!cont) { |
if (!cont) { |
150 |
snprintf(obuf.data, obuf.size, "%08X AUTHENTICATE %s\r\n", |
snprintf(obuf.data, obuf.size, "%04X AUTHENTICATE %s\r\n", |
151 |
tag, auth); |
tag, auth); |
152 |
return send_command(conn, obuf.data); |
return send_command(conn, obuf.data); |
153 |
} else { |
} else { |
170 |
n = strlen("LOGIN") + strlen(user) + strlen(pass) + 18; |
n = strlen("LOGIN") + strlen(user) + strlen(pass) + 18; |
171 |
sbuf = (char *)smalloc(n); |
sbuf = (char *)smalloc(n); |
172 |
|
|
173 |
snprintf(sbuf, n, "%08X LOGIN \"%s\" \"%s\"\r\n", tag, user, pass); |
snprintf(sbuf, n, "%04X LOGIN \"%s\" \"%s\"\r\n", tag, user, pass); |
174 |
|
|
175 |
r = send_command(conn, sbuf); |
r = send_command(conn, sbuf); |
176 |
|
|
191 |
reset_buffer(&obuf); |
reset_buffer(&obuf); |
192 |
check_buffer(&obuf, strlen("LIST") + strlen(refer) + strlen(mbox) + 18); |
check_buffer(&obuf, strlen("LIST") + strlen(refer) + strlen(mbox) + 18); |
193 |
|
|
194 |
snprintf(obuf.data, obuf.size, "%08X LIST \"%s\" \"%s\"\r\n", tag, |
snprintf(obuf.data, obuf.size, "%04X LIST \"%s\" \"%s\"\r\n", tag, |
195 |
refer, mbox); |
refer, mbox); |
196 |
|
|
197 |
r = send_command(conn, obuf.data); |
r = send_command(conn, obuf.data); |
210 |
reset_buffer(&obuf); |
reset_buffer(&obuf); |
211 |
check_buffer(&obuf, strlen("SUBSCRIBE") + strlen(mbox) + 15); |
check_buffer(&obuf, strlen("SUBSCRIBE") + strlen(mbox) + 15); |
212 |
|
|
213 |
snprintf(obuf.data, obuf.size, "%08X SUBSCRIBE \"%s\"\r\n", tag, mbox); |
snprintf(obuf.data, obuf.size, "%04X SUBSCRIBE \"%s\"\r\n", tag, mbox); |
214 |
|
|
215 |
return send_command(conn, obuf.data); |
return send_command(conn, obuf.data); |
216 |
} |
} |
225 |
reset_buffer(&obuf); |
reset_buffer(&obuf); |
226 |
check_buffer(&obuf, strlen("EXAMINE") + strlen(mbox) + 15); |
check_buffer(&obuf, strlen("EXAMINE") + strlen(mbox) + 15); |
227 |
|
|
228 |
snprintf(obuf.data, MEDIUM_CMD, "%08X EXAMINE \"%s\"\r\n", tag, mbox); |
snprintf(obuf.data, MEDIUM_CMD, "%04X EXAMINE \"%s\"\r\n", tag, mbox); |
229 |
|
|
230 |
return send_command(conn, obuf.data); |
return send_command(conn, obuf.data); |
231 |
}*/ |
}*/ |
240 |
reset_buffer(&obuf); |
reset_buffer(&obuf); |
241 |
check_buffer(&obuf, strlen("SELECT") + strlen(mbox) + 15); |
check_buffer(&obuf, strlen("SELECT") + strlen(mbox) + 15); |
242 |
|
|
243 |
snprintf(obuf.data, obuf.size, "%08X SELECT \"%s\"\r\n", tag, mbox); |
snprintf(obuf.data, obuf.size, "%04X SELECT \"%s\"\r\n", tag, mbox); |
244 |
|
|
245 |
return send_command(conn, obuf.data); |
return send_command(conn, obuf.data); |
246 |
} |
} |
256 |
check_buffer(&obuf, strlen("STATUS") + strlen(mbox) + |
check_buffer(&obuf, strlen("STATUS") + strlen(mbox) + |
257 |
strlen(items) + 18); |
strlen(items) + 18); |
258 |
|
|
259 |
snprintf(obuf.data, obuf.size, "%08X STATUS \"%s\" (%s)\r\n", tag, mbox, items); |
snprintf(obuf.data, obuf.size, "%04X STATUS \"%s\" (%s)\r\n", tag, mbox, items); |
260 |
|
|
261 |
return send_command(conn, obuf.data); |
return send_command(conn, obuf.data); |
262 |
} |
} |
271 |
reset_buffer(&obuf); |
reset_buffer(&obuf); |
272 |
check_buffer(&obuf, strlen("CREATE") + strlen(mbox) + 14); |
check_buffer(&obuf, strlen("CREATE") + strlen(mbox) + 14); |
273 |
|
|
274 |
snprintf(obuf.data, obuf.size, "%08X CREATE \"%s\"\r\n", tag, mbox); |
snprintf(obuf.data, obuf.size, "%04X CREATE \"%s\"\r\n", tag, mbox); |
275 |
|
|
276 |
return send_command(conn, obuf.data); |
return send_command(conn, obuf.data); |
277 |
} |
} |
288 |
strlen(search) + 15); |
strlen(search) + 15); |
289 |
|
|
290 |
if (*charset) |
if (*charset) |
291 |
snprintf(obuf.data, obuf.size, "%08X SEARCH CHARSET \"%s\" %s\r\n", |
snprintf(obuf.data, obuf.size, "%04X SEARCH CHARSET \"%s\" %s\r\n", |
292 |
tag, charset, search); |
tag, charset, search); |
293 |
else |
else |
294 |
snprintf(obuf.data, obuf.size, "%08X SEARCH %s\r\n", tag, search); |
snprintf(obuf.data, obuf.size, "%04X SEARCH %s\r\n", tag, search); |
295 |
|
|
296 |
return send_command(conn, obuf.data); |
return send_command(conn, obuf.data); |
297 |
} |
} |
306 |
reset_buffer(&obuf); |
reset_buffer(&obuf); |
307 |
check_buffer(&obuf, strlen("FETCH") + strlen(mesg) + strlen(items) + 14); |
check_buffer(&obuf, strlen("FETCH") + strlen(mesg) + strlen(items) + 14); |
308 |
|
|
309 |
snprintf(obuf.data, obuf.size, "%08X FETCH %s %s\r\n", tag, mesg, items); |
snprintf(obuf.data, obuf.size, "%04X FETCH %s %s\r\n", tag, mesg, items); |
310 |
|
|
311 |
return send_command(conn, obuf.data); |
return send_command(conn, obuf.data); |
312 |
} |
} |
322 |
check_buffer(&obuf, strlen("STORE") + strlen(mesg) + |
check_buffer(&obuf, strlen("STORE") + strlen(mesg) + |
323 |
strlen("FLAGS.SILENT") + strlen(flags) + 18); |
strlen("FLAGS.SILENT") + strlen(flags) + 18); |
324 |
|
|
325 |
snprintf(obuf.data, obuf.size, "%08X STORE %s %sFLAGS.SILENT (%s)\r\n", |
snprintf(obuf.data, obuf.size, "%04X STORE %s %sFLAGS.SILENT (%s)\r\n", |
326 |
tag, mesg, (mode == STORE_FLAG_REPLACE ? "" : |
tag, mesg, (mode == STORE_FLAG_REPLACE ? "" : |
327 |
mode == STORE_FLAG_ADD ? "+" : "-"), flags); |
mode == STORE_FLAG_ADD ? "+" : "-"), flags); |
328 |
|
|
339 |
reset_buffer(&obuf); |
reset_buffer(&obuf); |
340 |
check_buffer(&obuf, strlen("COPY") + strlen(mesg) + strlen(mbox) + 16); |
check_buffer(&obuf, strlen("COPY") + strlen(mesg) + strlen(mbox) + 16); |
341 |
|
|
342 |
snprintf(obuf.data, obuf.size, "%08X COPY %s \"%s\"\r\n", tag, mesg, mbox); |
snprintf(obuf.data, obuf.size, "%04X COPY %s \"%s\"\r\n", tag, mesg, mbox); |
343 |
|
|
344 |
return send_command(conn, obuf.data); |
return send_command(conn, obuf.data); |
345 |
} |
} |
349 |
* IMAP APPEND: append message to the end of a mailbox. |
* IMAP APPEND: append message to the end of a mailbox. |
350 |
*/ |
*/ |
351 |
int |
int |
352 |
imap_append(conn_t * conn, char *mbox, unsigned int size) |
imap_append(conn_t * conn, char *mbox, char *flags, char *date, unsigned int size) |
353 |
{ |
{ |
354 |
reset_buffer(&obuf); |
reset_buffer(&obuf); |
355 |
check_buffer(&obuf, strlen("APPEND") + strlen(mbox) + |
check_buffer(&obuf, strlen("APPEND") + strlen(mbox) + strlen(flags) + |
356 |
strlen(ultostr(size, 10)) + 18); |
strlen(date) + strlen(ultostr(size, 10)) + 24); |
357 |
|
|
358 |
snprintf(obuf.data, obuf.size, "%08X APPEND \"%s\" {%d}\r\n", tag, mbox, |
snprintf(obuf.data, obuf.size, "%04X APPEND \"%s\" (%s) \"%s\" {%d}\r\n", |
359 |
size); |
tag, mbox, flags, date, size); |
360 |
|
|
361 |
return send_command(conn, obuf.data); |
return send_command(conn, obuf.data); |
362 |
} |
} |
372 |
reset_buffer(&obuf); |
reset_buffer(&obuf); |
373 |
check_buffer(&obuf, strlen("CLOSE") + 12); |
check_buffer(&obuf, strlen("CLOSE") + 12); |
374 |
|
|
375 |
snprintf(obuf.data, obuf.size, "%08X CLOSE\r\n", tag); |
snprintf(obuf.data, obuf.size, "%04X CLOSE\r\n", tag); |
376 |
|
|
377 |
return send_command(conn, obuf.data); |
return send_command(conn, obuf.data); |
378 |
} |
} |
387 |
reset_buffer(&obuf); |
reset_buffer(&obuf); |
388 |
check_buffer(&obuf, strlen("EXPUNGE") + 12); |
check_buffer(&obuf, strlen("EXPUNGE") + 12); |
389 |
|
|
390 |
snprintf(obuf.data, obuf.size, "%08X EXPUNGE\r\n", tag); |
snprintf(obuf.data, obuf.size, "%04X EXPUNGE\r\n", tag); |
391 |
|
|
392 |
return send_command(conn, obuf.data); |
return send_command(conn, obuf.data); |
393 |
} |
} |