static char rcsid[] = "@(#)$Id: headers.c,v 1.5 2006/05/30 16:33:21 hurtta Exp $";
/******************************************************************************
* The Elm (ME+) Mail System - $Revision: 1.5 $ $State: Exp $
*
* Author: Kari Hurtta <hurtta+elm@posti.FMI.FI> (was hurtta+elm@ozone.FMI.FI)
*****************************************************************************/
#include "def_mbox.h"
#include "hdr_imp.h"
#include "s_me.h"
DEBUG_VAR(Debug,__FILE__,"header");
void read_folder_headers_helper(entry,result)
struct header_rec *entry;
header_list_ptr result;
{
header_list_ptr tmphdr;
if (NULL != (tmphdr = locate_header_by_name(result,"Return-Path"))) {
/* Required for POP or
* when env_from_source == 2
*/
if (!entry->env_from[0]) {
return_path_to_env_from(entry,tmphdr->body);
}
}
if (NULL != (tmphdr = locate_header_by_name(result,"Message-Id"))) {
strfcpy(entry->messageid, tmphdr->body,
sizeof entry->messageid);
}
if (NULL != (tmphdr = locate_header_by_name(result,"Content-Length"))) {
entry->content_length = atol(tmphdr->body);
}
if (NULL != (tmphdr = locate_header_by_name(result,"Expires"))) {
process_expiration_date(tmphdr->body, &(entry->status));
}
if (NULL != (tmphdr = locate_header_by_name(result,"Date"))) {
parse_arpa_date(tmphdr->body, entry);
}
/* We need accept headers like:
* MIME-Version: (MetaSend v1.7) 1.0
* and
* Mime-Version: 1.0 (NeXT Mail 4.2mach_patches v148.2)
* And if version number is something other accept it but give
* warning when message is viewed or replied.
*/
if (NULL != (tmphdr = locate_header_by_name(result,"MIME-Version"))) {
char ** tokens = rfc822_tokenize(tmphdr->body);
remove_space_tokenized(tokens);
if (!tokens[0] || 0 != strcmp(tokens[0],"1") ||
!tokens[1] || 0 != strcmp(tokens[1],".") ||
!tokens[2] || 0 != strcmp(tokens[2],"0") ||
tokens[3]) {
int i;
entry->status |= MIME_MESSAGE|MIME_UNSUPPORTED;
DPRINT(Debug,9,(&Debug,
"read_folder_headers_helper: Unsupported mime version '%s'\n",
tmphdr->body));
DPRINT(Debug,10,(&Debug,
" tokens:"));
for (i = 0; tokens[i]; i++) {
DPRINT(Debug,10,(&Debug,
" [%d]=%s",i,tokens[i]));
}
DPRINT(Debug,10,(&Debug,
"\n"));
} else {
entry->status |= MIME_MESSAGE;
DPRINT(Debug,9,(&Debug,
"read_folder_headers_helper: MIME message\n"));
}
if (tmphdr->next_this_header &&
0 != istrcmp(tmphdr->body,tmphdr->next_this_header->body))
process_header_error(&(entry->header_error),
CATGETS(elm_msg_cat, MeSet,
MeParseErrorMIMEVersion,
"PARSE ERROR: Several MIME-Version headers!"));
free_rfc822tokenized(tokens);
}
if (NULL != (tmphdr = locate_header_by_name(result,
"X-ELM-OSV"))) {
char value [20];
if (mime_get_param("no-hdr-encoding",value,tmphdr->body,
sizeof value)) {
int i = atoi(value);
DPRINT(Debug,9,(&Debug,"-- no-hdr-encoding=%d\n",i));
if (i)
entry->status |= NOHDRENCODING;
}
if (mime_get_param("hdr-charset",value,tmphdr->body,
sizeof value)) {
entry->header_charset = MIME_name_to_charset(value,CHARSET_create);
DPRINT(Debug,9,(&Debug,"-- header-charset=%s\n",
entry->header_charset->MIME_name));
}
}
}
header_list_ptr read_folder_headers(read_state_ptr,folder,entry)
READ_STATE read_state_ptr;
struct folder_info *folder;
struct header_rec *entry;
{
char *buffer;
int len;
header_list_ptr result = NULL, last = NULL;
while (copy_header_folder(folder,read_state_ptr, &buffer,&len)) {
char * val;
unfold_header(buffer,&len,entry);
val = strchr(buffer,':');
if (!val) {
panic("HEADERS PANIC",__FILE__,__LINE__,"read_folder_headers",
"bad return from copy_header_folder -- ':' not found",0);
}
*val = '\0';
val++;
while (whitespace(*val))
val++;
no_ret(val);
update_header_list(&result,&last,buffer,val);
free(buffer); buffer = NULL;
}
read_folder_headers_helper(entry,result);
return result;
}
/*
* Local Variables:
* mode:c
* c-basic-offset:4
* buffer-file-coding-system: iso-8859-1
* End:
*/
syntax highlighted by Code2HTML, v. 0.9.1