#include <pwd.h>
#include <errno.h>
#include <sys/types.h>
-#include <sys/time.h>
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+
#include <sys/wait.h>
#include <ctype.h>
#include <string.h>
#include <limits.h>
#include "citadel.h"
#include "server.h"
-#include <time.h>
#include "sysdep_decls.h"
#include "citserver.h"
#include "support.h"
#include "config.h"
-#include "dynloader.h"
+#include "serv_extensions.h"
#include "room_ops.h"
#include "user_ops.h"
#include "policy.h"
void imap_fetch_flags(int seq) {
cprintf("FLAGS (");
if (IMAP->flags[seq] & IMAP_DELETED) cprintf("\\Deleted ");
+ if (IMAP->flags[seq] & IMAP_SEEN) cprintf("\\Seen ");
cprintf(")");
}
msgdate = time(NULL);
}
- datestring(buf, msgdate, DATESTRING_IMAP);
+ datestring(buf, sizeof buf, msgdate, DATESTRING_IMAP);
cprintf("INTERNALDATE \"%s\"", buf);
}
* Load the message into a temp file for translation and measurement
*/
CtdlRedirectOutput(tmp, -1);
- CtdlOutputPreLoadedMsg(msg, msgnum, MT_RFC822, 0, 0, 1);
+ CtdlOutputPreLoadedMsg(msg, msgnum, MT_RFC822, HEADERS_ALL, 0, 1);
CtdlRedirectOutput(NULL, -1);
if (!is_valid_message(msg)) {
lprintf(1, "WARNING: output clobbered the message!\n");
fwrite(content, length, 1, imfp->output_fp);
}
- sprintf(mbuf2, "%s.MIME", partnum);
+ snprintf(mbuf2, sizeof mbuf2, "%s.MIME", partnum);
if (!strcasecmp(imfp->desired_section, mbuf2)) {
fprintf(imfp->output_fp, "Content-type: %s", cbtype);
}
fprintf(imfp->output_fp, "\r\n");
}
- fprintf(imfp->output_fp, "Content-Length: %d\r\n", length);
+ fprintf(imfp->output_fp, "Content-Length: %ld\r\n", (long)length);
fprintf(imfp->output_fp, "\r\n");
}
else {
msgdate = time(NULL);
}
- datestring(datestringbuf, msgdate, DATESTRING_IMAP);
+ datestring(datestringbuf, sizeof datestringbuf, msgdate, DATESTRING_IMAP);
/* Now start spewing data fields. The order is important, as it is
* defined by the protocol specification. Nonexistent fields must
/* Now figure out what the client wants, and get it */
- if (!strcmp(section, "")) { /* the whole thing */
+ if ( (!strcmp(section, "1")) && (msg->cm_format_type != 4) ) {
CtdlRedirectOutput(tmp, -1);
- CtdlOutputPreLoadedMsg(msg, msgnum, MT_RFC822, 0, 0, 1);
+ CtdlOutputPreLoadedMsg(msg, msgnum, MT_RFC822,
+ HEADERS_NONE, 0, 1);
+ CtdlRedirectOutput(NULL, -1);
+ }
+
+ else if (!strcmp(section, "")) {
+ CtdlRedirectOutput(tmp, -1);
+ CtdlOutputPreLoadedMsg(msg, msgnum, MT_RFC822,
+ HEADERS_ALL, 0, 1);
CtdlRedirectOutput(NULL, -1);
}
*/
else if (!strncasecmp(section, "HEADER", 6)) {
CtdlRedirectOutput(tmp, -1);
- CtdlOutputPreLoadedMsg(msg, msgnum, MT_RFC822, 1, 0, 1);
+ CtdlOutputPreLoadedMsg(msg, msgnum, MT_RFC822,
+ HEADERS_ONLY, 0, 1);
CtdlRedirectOutput(NULL, -1);
imap_strip_headers(tmp, section);
}
fclose(tmp);
- if (is_peek) {
- /* FIXME set the last read pointer or something */
+ /* Mark this message as "seen" *unless* this is a "peek" operation */
+ if (is_peek == 0) {
+ CtdlSetSeen(msgnum, 1);
}
}
}
cprintf(" ");
- cprintf("%ld ", length); /* bytes */
+ cprintf("%ld ", (long)length); /* bytes */
cprintf("NIL) "); /* lines */
}
*imap_fetch_bodystructure_pre, /* pre-multi */
*imap_fetch_bodystructure_post, /* post-multi */
NULL,
- 0);
+ 1); /* don't decode -- we want it as-is */
}
extract_token(lostr, setstr, 0, ':');
if (num_tokens(setstr, ':') >= 2) {
extract_token(histr, setstr, 1, ':');
- if (!strcmp(histr, "*")) sprintf(histr, "%d", INT_MAX);
+ if (!strcmp(histr, "*")) snprintf(histr, sizeof histr, "%d", INT_MAX);
}
else {
strcpy(histr, lostr);