* Callback function for mime parser that simply lists the part
*/
void list_this_part(char *name, char *filename, char *partnum, char *disp,
- void *content, char *cbtype, size_t length)
+ void *content, char *cbtype, size_t length, char *encoding,
+ void *cbuserdata)
{
cprintf("part=%s|%s|%s|%s|%s|%d\n",
* Callback function for mime parser that opens a section for downloading
*/
void mime_download(char *name, char *filename, char *partnum, char *disp,
- void *content, char *cbtype, size_t length)
+ void *content, char *cbtype, size_t length, char *encoding,
+ void *cbuserdata)
{
/* Silently go away if there's already a download open... */
* Callback function for mime parser that wants to display text
*/
void fixed_output(char *name, char *filename, char *partnum, char *disp,
- void *content, char *cbtype, size_t length)
+ void *content, char *cbtype, size_t length, char *encoding,
+ void *cbuserdata)
{
char *ptr;
char *wptr;
int do_proto, /* do Citadel protocol responses? */
int crlf /* Use CRLF newlines instead of LF? */
) {
- int i, k;
- char buf[1024];
- CIT_UBYTE ch;
- char allkeys[256];
- char display_name[256];
struct CtdlMessage *TheMessage;
- char *mptr;
- char *nl; /* newline string */
-
- /* buffers needed for RFC822 translation */
- char suser[256];
- char luser[256];
- char fuser[256];
- char snode[256];
- char lnode[256];
- char mid[256];
- char datestamp[256];
- /* */
+ int retcode;
lprintf(7, "CtdlOutputMsg() msgnum=%ld, mode=%d\n",
msg_num, mode);
TheMessage = NULL;
- sprintf(mid, "%ld", msg_num);
- nl = (crlf ? "\r\n" : "\n");
if ((!(CC->logged_in)) && (!(CC->internal_pgm))) {
if (do_proto) cprintf("%d Not logged in.\n",
ERROR, msg_num);
return(om_no_such_msg);
}
+
+ retcode = CtdlOutputPreLoadedMsg(
+ TheMessage, msg_num, mode,
+ headers_only, do_proto, crlf);
+
+ CtdlFreeMessage(TheMessage);
+ return(retcode);
+}
+
+
+/*
+ * Get a message off disk. (returns om_* values found in msgbase.h)
+ *
+ */
+int CtdlOutputPreLoadedMsg(struct CtdlMessage *TheMessage,
+ long msg_num,
+ int mode, /* how would you like that message? */
+ int headers_only, /* eschew the message body? */
+ int do_proto, /* do Citadel protocol responses? */
+ int crlf /* Use CRLF newlines instead of LF? */
+) {
+ int i, k;
+ char buf[1024];
+ CIT_UBYTE ch;
+ char allkeys[256];
+ char display_name[256];
+ char *mptr;
+ char *nl; /* newline string */
+
+ /* buffers needed for RFC822 translation */
+ char suser[256];
+ char luser[256];
+ char fuser[256];
+ char snode[256];
+ char lnode[256];
+ char mid[256];
+ char datestamp[256];
+ /* */
+
+ sprintf(mid, "%ld", msg_num);
+ nl = (crlf ? "\r\n" : "\n");
+
+ if (!is_valid_message(TheMessage)) {
+ lprintf(1, "ERROR: invalid preloaded message for output\n");
+ return(om_no_such_msg);
+ }
/* Are we downloading a MIME component? */
if (mode == MT_DOWNLOAD) {
} else {
/* Parse the message text component */
mptr = TheMessage->cm_fields['M'];
- mime_parser(mptr, NULL, *mime_download);
+ mime_parser(mptr, NULL, *mime_download, NULL, 0);
/* If there's no file open by this time, the requested
* section wasn't found, so print an error
*/
desired_section);
}
}
- CtdlFreeMessage(TheMessage);
return((CC->download_fp != NULL) ? om_ok : om_mime_error);
}
/* Tell the client about the MIME parts in this message */
if (TheMessage->cm_format_type == FMT_RFC822) {
if (mode == MT_CITADEL) {
- mime_parser(mptr, NULL, *list_this_part);
+ mime_parser(mptr, NULL, *list_this_part, NULL, 0);
}
else if (mode == MT_MIME) { /* list parts only */
- mime_parser(mptr, NULL, *list_this_part);
+ mime_parser(mptr, NULL, *list_this_part, NULL, 0);
if (do_proto) cprintf("000\n");
- CtdlFreeMessage(TheMessage);
return(om_ok);
}
else if (mode == MT_RFC822) { /* unparsed RFC822 dump */
else cprintf("%c", ch);
}
if (do_proto) cprintf("000\n");
- CtdlFreeMessage(TheMessage);
return(om_ok);
}
}
if (headers_only) {
if (do_proto) cprintf("000\n");
- CtdlFreeMessage(TheMessage);
return(om_ok);
}
if (TheMessage->cm_format_type == FMT_RFC822) {
CtdlAllocUserData(SYM_MA_INFO, sizeof(struct ma_info));
memset(ma, 0, sizeof(struct ma_info));
- mime_parser(mptr, NULL, *fixed_output);
+ mime_parser(mptr, NULL, *fixed_output, NULL, 0);
}
/* now we're done */
if (do_proto) cprintf("000\n");
- CtdlFreeMessage(TheMessage);
return(om_ok);
}
/* advance past header fields */
mptr = msg->cm_fields['M'];
a = strlen(mptr);
- while (--a) {
+ while ((--a) > 0) {
if (!strncasecmp(mptr, "Content-type: ", 14)) {
safestrncpy(content_type, mptr,
sizeof(content_type));
exist is ALWAYS freed */
) {
char buf[256];
+ int linelen;
size_t message_len = 0;
size_t buffer_len = 0;
- char *ptr, *append;
+ char *ptr;
char *m;
if (exist == NULL) {
message_len = 0;
}
/* read in the lines of message text one by one */
- append = NULL;
while ( (client_gets(buf)>0) && strcmp(buf, terminator) ) {
+ /* strip trailing newline type stuff */
+ if (buf[strlen(buf)-1]==10) buf[strlen(buf)-1]=0;
+ if (buf[strlen(buf)-1]==13) buf[strlen(buf)-1]=0;
+
+ linelen = strlen(buf);
+
/* augment the buffer if we have to */
- if ((message_len + strlen(buf) + 2) > buffer_len) {
+ if ((message_len + linelen + 2) > buffer_len) {
lprintf(9, "realloking\n");
ptr = reallok(m, (buffer_len * 2) );
if (ptr == NULL) { /* flush if can't allocate */
} else {
buffer_len = (buffer_len * 2);
m = ptr;
- append = NULL;
lprintf(9, "buffer_len is %d\n", buffer_len);
}
}
- if (append == NULL) append = m;
- while (strlen(append) > 0) ++append;
- strcpy(append, buf);
- strcat(append, "\n");
- message_len = message_len + strlen(buf) + 1;
+ /* Add the new line to the buffer. We avoid using strcat()
+ * because that would involve traversing the entire message
+ * after each line, and this function needs to run fast.
+ */
+ strcpy(&m[message_len], buf);
+ m[message_len + linelen] = '\n';
+ m[message_len + linelen + 1] = 0;
+ message_len = message_len + linelen + 1;
/* if we've hit the max msg length, flush the rest */
if (message_len >= maxlen) {
- while ( (client_gets(buf)>0) && strcmp(buf, terminator)) ;;
+ while ( (client_gets(buf)>0)
+ && strcmp(buf, terminator)) ;;
return(m);
}
}