time_t msgdate;
if (!msg) return;
- if (msg->cm_fields['T'] != NULL) {
- msgdate = atol(msg->cm_fields['T']);
+ if (!CM_IsEmpty(msg, eTimestamp)) {
+ msgdate = atol(msg->cm_fields[eTimestamp]);
}
else {
msgdate = time(NULL);
* "RFC822.TEXT" body only (without leading blank line)
*/
void imap_fetch_rfc822(long msgnum, const char *whichfmt) {
- citimap *Imap = IMAP;
+ CitContext *CCC = CC;
+ citimap *Imap = CCCIMAP;
const char *ptr = NULL;
size_t headers_size, text_size, total_size;
size_t bytes_to_send = 0;
struct MetaData smi;
int need_to_rewrite_metadata = 0;
int need_body = 0;
- CitContext *CCC = CC;
/* Determine whether this particular fetch operation requires
* us to fetch the message body from disk. If not, we can save
CCC->redirect_buffer = NewStrBufPlain(NULL, SIZ);
CtdlOutputMsg(msgnum, MT_RFC822,
(need_body ? HEADERS_ALL : HEADERS_FAST),
- 0, 1, NULL, SUPPRESS_ENV_TO
+ 0, 1, NULL, SUPPRESS_ENV_TO, NULL, NULL
);
if (!need_body) IAPuts("\r\n"); /* extra trailing newline */
Imap->cached_rfc822 = CCC->redirect_buffer;
* intervening blank line to be part of the headers, not the text.
*/
headers_size = 0;
- text_size = 0;
- total_size = 0;
if (need_body) {
StrBuf *Line = NewStrBuf();
text_size = 0;
}
- syslog(LOG_DEBUG,
- "RFC822: headers=" SIZE_T_FMT
- ", text=" SIZE_T_FMT
- ", total=" SIZE_T_FMT,
- headers_size, text_size, total_size);
+ IMAP_syslog(LOG_DEBUG,
+ "RFC822: headers=" SIZE_T_FMT
+ ", text=" SIZE_T_FMT
+ ", total=" SIZE_T_FMT,
+ headers_size, text_size, total_size);
if (!strcasecmp(whichfmt, "RFC822.SIZE")) {
IAPrintf("RFC822.SIZE " SIZE_T_FMT, total_size);
void *content, char *cbtype, char *cbcharset, size_t length, char *encoding,
char *cbid, void *cbuserdata)
{
+ struct CitContext *CCC = CC;
char mimebuf2[SIZ];
StrBuf *desired_section;
desired_section = (StrBuf *)cbuserdata;
- syslog(LOG_DEBUG, "imap_load_part() looking for %s, found %s",
- ChrPtr(desired_section),
- partnum
- );
+ IMAP_syslog(LOG_DEBUG, "imap_load_part() looking for %s, found %s",
+ ChrPtr(desired_section),
+ partnum
+ );
if (!strcasecmp(partnum, ChrPtr(desired_section))) {
client_write(content, length);
/* For everything else, we do stuff. */
IAPuts("(("); /* open double-parens */
- plain_imap_strout(msg->cm_fields['A']); /* personal name */
+ IPutMsgField(eAuthor); /* personal name */
IAPuts(" NIL "); /* source route (not used) */
- if (msg->cm_fields['F'] != NULL) {
- process_rfc822_addr(msg->cm_fields['F'], user, node, name);
- plain_imap_strout(user); /* mailbox name (user id) */
+ if (!CM_IsEmpty(msg, erFc822Addr)) {
+ process_rfc822_addr(msg->cm_fields[erFc822Addr], user, node, name);
+ IPutStr(user, strlen(user)); /* mailbox name (user id) */
IAPuts(" ");
if (!strcasecmp(node, config.c_nodename)) {
- plain_imap_strout(config.c_fqdn);
+ IPutStr(config.c_fqdn, strlen(config.c_fqdn));
}
else {
- plain_imap_strout(node); /* host name */
+ IPutStr(node, strlen(node)); /* host name */
}
}
else {
- plain_imap_strout(msg->cm_fields['A']); /* mailbox name (user id) */
+ IPutMsgField(eAuthor); /* mailbox name (user id) */
IAPuts(" ");
- plain_imap_strout(msg->cm_fields['N']); /* host name */
+ IPutMsgField(eNodeName); /* host name */
}
IAPuts(")) "); /* close double-parens */
striplt(individual_addr);
process_rfc822_addr(individual_addr, user, node, name);
IAPuts("(");
- plain_imap_strout(name);
+ IPutStr(name, strlen(name));
IAPuts(" NIL ");
- plain_imap_strout(user);
+ IPutStr(user, strlen(user));
IAPuts(" ");
- plain_imap_strout(node);
+ IPutStr(node, strlen(node));
IAPuts(")");
if (i < (num_addrs-1))
IAPuts(" ");
if (!msg) return;
/* Parse the message date into an IMAP-format date string */
- if (msg->cm_fields['T'] != NULL) {
- msgdate = atol(msg->cm_fields['T']);
+ if (!CM_IsEmpty(msg, eTimestamp)) {
+ msgdate = atol(msg->cm_fields[eTimestamp]);
}
else {
msgdate = time(NULL);
}
- datestring(datestringbuf, sizeof datestringbuf,
- msgdate, DATESTRING_IMAP);
+ len = 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
IAPuts("ENVELOPE (");
/* Date */
- plain_imap_strout(datestringbuf);
+ IPutStr(datestringbuf, len);
IAPuts(" ");
/* Subject */
- plain_imap_strout(msg->cm_fields['U']);
+ IPutMsgField(eMsgSubject);
IAPuts(" ");
/* From */
imap_output_envelope_from(msg);
/* Sender (default to same as 'From' if not present) */
- fieldptr = rfc822_fetch_field(msg->cm_fields['M'], "Sender");
+ fieldptr = rfc822_fetch_field(msg->cm_fields[eMesageText], "Sender");
if (fieldptr != NULL) {
imap_output_envelope_addr(fieldptr);
free(fieldptr);
}
/* Reply-to */
- fieldptr = rfc822_fetch_field(msg->cm_fields['M'], "Reply-to");
+ fieldptr = rfc822_fetch_field(msg->cm_fields[eMesageText], "Reply-to");
if (fieldptr != NULL) {
imap_output_envelope_addr(fieldptr);
free(fieldptr);
}
/* To */
- imap_output_envelope_addr(msg->cm_fields['R']);
+ imap_output_envelope_addr(msg->cm_fields[eRecipient]);
/* Cc (we do it this way because there might be a legacy non-Citadel Cc: field present) */
- fieldptr = msg->cm_fields['Y'];
+ fieldptr = msg->cm_fields[eCarbonCopY];
if (fieldptr != NULL) {
imap_output_envelope_addr(fieldptr);
}
else {
- fieldptr = rfc822_fetch_field(msg->cm_fields['M'], "Cc");
+ fieldptr = rfc822_fetch_field(msg->cm_fields[eMesageText], "Cc");
imap_output_envelope_addr(fieldptr);
if (fieldptr != NULL) free(fieldptr);
}
/* Bcc */
- fieldptr = rfc822_fetch_field(msg->cm_fields['M'], "Bcc");
+ fieldptr = rfc822_fetch_field(msg->cm_fields[eMesageText], "Bcc");
imap_output_envelope_addr(fieldptr);
if (fieldptr != NULL) free(fieldptr);
/* In-reply-to */
- fieldptr = rfc822_fetch_field(msg->cm_fields['M'], "In-reply-to");
- plain_imap_strout(fieldptr);
+ fieldptr = rfc822_fetch_field(msg->cm_fields[eMesageText], "In-reply-to");
+ IPutStr(fieldptr, (fieldptr)?strlen(fieldptr):0);
IAPuts(" ");
if (fieldptr != NULL) free(fieldptr);
/* message ID */
- len = strlen(msg->cm_fields['I']);
+ len = strlen(msg->cm_fields[emessageId]);
if ((len == 0) || (
- (msg->cm_fields['I'][0] == '<') &&
- (msg->cm_fields['I'][len - 1] == '>'))
+ (msg->cm_fields[emessageId][0] == '<') &&
+ (msg->cm_fields[emessageId][len - 1] == '>'))
)
{
- plain_imap_strout(msg->cm_fields['I']);
+ IPutMsgField(emessageId);
}
else
{
char *Buf = malloc(len + 3);
long pos = 0;
- if (msg->cm_fields['I'][0] != '<')
+ if (msg->cm_fields[emessageId][0] != '<')
{
Buf[pos] = '<';
pos ++;
}
- memcpy(&Buf[pos], msg->cm_fields['I'], len);
+ memcpy(&Buf[pos], msg->cm_fields[emessageId], len);
pos += len;
- if (msg->cm_fields['I'][len] != '>')
+ if (msg->cm_fields[emessageId][len] != '>')
{
Buf[pos] = '>';
pos++;
StrBufSipLine(Line, CCC->redirect_buffer, &Ptr);
if (!isspace(ChrPtr(Line)[0])) {
- ok = 0;
+
if (doing_headers == 0) ok = 1;
else {
/* we're supposed to print all headers that are not matching the filter list */
int need_body = 1;
int burn_the_cache = 0;
CitContext *CCC = CC;
- citimap *Imap = IMAP;
+ citimap *Imap = CCCIMAP;
/* extract section */
section = NewStrBufPlain(CKEY(item));
if (strchr(ChrPtr(section), '[') != NULL) {
StrBufStripAllBut(section, '[', ']');
}
- syslog(LOG_DEBUG, "Section is: [%s]",
- (StrLength(section) == 0) ? "(empty)" : ChrPtr(section)
+ IMAP_syslog(LOG_DEBUG, "Section is: [%s]",
+ (StrLength(section) == 0) ? "(empty)" : ChrPtr(section)
);
/* Burn the cache if we don't have the same section of the
is_partial = 1;
}
if ( (is_partial == 1) && (StrLength(partial) > 0) ) {
- syslog(LOG_DEBUG, "Partial is <%s>", ChrPtr(partial));
+ IMAP_syslog(LOG_DEBUG, "Partial is <%s>", ChrPtr(partial));
}
if (Imap->cached_body == NULL) {
* (Note value of 1 passed as 'dont_decode' so client gets it encoded)
*/
else {
- mime_parser(msg->cm_fields['M'], NULL,
+ mime_parser(msg->cm_fields[eMesageText], NULL,
*imap_load_part, NULL, NULL,
section,
1
iaputs(&Imap->cached_body[pstart], pbytes);
if (msg != NULL) {
- CtdlFreeMessage(msg);
+ CM_Free(msg);
}
/* Mark this message as "seen" *unless* this is a "peek" operation */
void *content, char *cbtype, char *cbcharset, size_t length, char *encoding,
char *cbid, void *cbuserdata
) {
-
+ long len;
char subtype[128];
IAPuts(" ");
/* disposition */
- extract_token(subtype, cbtype, 1, '/', sizeof subtype);
- plain_imap_strout(subtype);
+ len = extract_token(subtype, cbtype, 1, '/', sizeof subtype);
+ IPutStr(subtype, len);
/* body language */
/* IAPuts(" NIL"); We thought we needed this at one point, but maybe we don't... */
size_t i;
char cbmaintype[128];
char cbsubtype[128];
+ long cbmaintype_len;
+ long cbsubtype_len;
if (cbtype != NULL) if (!IsEmptyStr(cbtype)) have_cbtype = 1;
if (have_cbtype) {
- extract_token(cbmaintype, cbtype, 0, '/', sizeof cbmaintype);
- extract_token(cbsubtype, cbtype, 1, '/', sizeof cbsubtype);
+ cbmaintype_len = extract_token(cbmaintype, cbtype, 0, '/', sizeof cbmaintype);
+ cbsubtype_len = extract_token(cbsubtype, cbtype, 1, '/', sizeof cbsubtype);
}
else {
strcpy(cbmaintype, "TEXT");
+ cbmaintype_len = 4;
strcpy(cbsubtype, "PLAIN");
+ cbsubtype_len = 5;
}
IAPuts("(");
- plain_imap_strout(cbmaintype); /* body type */
+ IPutStr(cbmaintype, cbmaintype_len); /* body type */
IAPuts(" ");
- plain_imap_strout(cbsubtype); /* body subtype */
+ IPutStr(cbsubtype, cbsubtype_len); /* body subtype */
IAPuts(" ");
- IAPuts("("); /* begin body parameter list */
+ IAPuts("("); /* begin body parameter list */
/* "NAME" must appear as the first parameter. This is not required by IMAP,
* but the Asterisk voicemail application blindly assumes that NAME will be in
* the first position. If it isn't, it rejects the message.
*/
- if (name != NULL) if (!IsEmptyStr(name)) {
+ if ((name != NULL) && (!IsEmptyStr(name))) {
IAPuts("\"NAME\" ");
- plain_imap_strout(name);
+ IPutStr(name, strlen(name));
IAPuts(" ");
}
IAPuts("\"CHARSET\" ");
- if (cbcharset == NULL) {
- plain_imap_strout("US-ASCII");
- }
- else if (cbcharset[0] == 0) {
- plain_imap_strout("US-ASCII");
+ if ((cbcharset == NULL) || (cbcharset[0] == 0)){
+ IPutStr(HKEY("US-ASCII"));
}
else {
- plain_imap_strout(cbcharset);
+ IPutStr(cbcharset, strlen(cbcharset));
}
- IAPuts(") "); /* end body parameter list */
+ IAPuts(") "); /* end body parameter list */
IAPuts("NIL "); /* Body ID */
IAPuts("NIL "); /* Body description */
- if (encoding != NULL) if (encoding[0] != 0) have_encoding = 1;
+ if ((encoding != NULL) && (encoding[0] != 0)) have_encoding = 1;
if (have_encoding) {
- plain_imap_strout(encoding);
+ IPutStr(encoding, strlen(encoding));
}
else {
- plain_imap_strout("7BIT");
+ IPutStr(HKEY("7BIT"));
}
IAPuts(" ");
IAPuts("NIL ");
/* Disposition */
- if (disp == NULL) {
- IAPuts("NIL");
- }
- else if (IsEmptyStr(disp)) {
+ if ((disp == NULL) || IsEmptyStr(disp)) {
IAPuts("NIL");
}
else {
IAPuts("(");
- plain_imap_strout(disp);
- if (filename != NULL) if (!IsEmptyStr(filename)) {
+ IPutStr(disp, strlen(disp));
+ if ((filename != NULL) && (!IsEmptyStr(filename))) {
IAPuts(" (\"FILENAME\" ");
- plain_imap_strout(filename);
+ IPutStr(filename, strlen(filename));
IAPuts(")");
}
IAPuts(")");
/* For messages already stored in RFC822 format, we have to parse. */
IAPuts("BODYSTRUCTURE ");
- mime_parser(msg->cm_fields['M'],
+ mime_parser(msg->cm_fields[eMesageText],
NULL,
*imap_fetch_bodystructure_part, /* part */
*imap_fetch_bodystructure_pre, /* pre-multi */
*/
else if (!strcasecmp(Cmd->Params[i].Key, "BODYSTRUCTURE")) {
if ((msg != NULL) && (!body_loaded)) {
- CtdlFreeMessage(msg); /* need the whole thing */
+ CM_Free(msg); /* need the whole thing */
msg = NULL;
}
if (msg == NULL) {
IAPuts(")\r\n");
unbuffer_output();
if (msg != NULL) {
- CtdlFreeMessage(msg);
+ CM_Free(msg);
}
}
/* debug output the parsed vector */
{
int i;
- syslog(LOG_DEBUG, "----- %ld params", Cmd->num_parms);
+ IMAP_syslog(LOG_DEBUG, "----- %ld params", Cmd->num_parms);
for (i=0; i < Cmd->num_parms; i++) {
if (Cmd->Params[i].len != strlen(Cmd->Params[i].Key))
- syslog(LOG_DEBUG, "*********** %ld != %ld : %s",
- Cmd->Params[i].len,
- strlen(Cmd->Params[i].Key),
- Cmd->Params[i].Key);
+ IMAP_syslog(LOG_DEBUG, "*********** %ld != %ld : %s",
+ Cmd->Params[i].len,
+ strlen(Cmd->Params[i].Key),
+ Cmd->Params[i].Key);
else
- syslog(LOG_DEBUG, "%ld : %s",
- Cmd->Params[i].len,
- Cmd->Params[i].Key);
+ IMAP_syslog(LOG_DEBUG, "%ld : %s",
+ Cmd->Params[i].len,
+ Cmd->Params[i].Key);
}}
#endif
MakeStringOf(Cmd.CmdBuf, 4);
#if 0
- syslog(LOG_DEBUG, "-------%s--------", ChrPtr(Cmd.CmdBuf));
+ IMAP_syslog(LOG_DEBUG, "-------%s--------", ChrPtr(Cmd.CmdBuf));
#endif
num_items = imap_extract_data_items(&Cmd);
if (num_items < 1) {