static char rcsid[] = "@(#)$Id: outheaders.c,v 1.4 2006/04/09 07:37:36 hurtta Exp $"; /****************************************************************************** * The Elm (ME+) Mail System - $Revision: 1.4 $ $State: Exp $ * * Author: Kari Hurtta (was hurtta+elm@ozone.FMI.FI) *****************************************************************************/ #include "def_mailer.h" #include "hdr_imp.h" #include "s_me.h" #include #ifndef ANSI_C extern int errno; #endif DEBUG_VAR(Debug,__FILE__,"header"); static unsigned char *s2us P_((char *str)); static unsigned char *s2us(str) char *str; { return (unsigned char *)str; } char * from_addr_literal(mailer_info) struct mailer_info *mailer_info; { char * Q = NULL; /* If on username is strange characters (specially if username is from some other user database backend than from /etc/passwd) then quote it... */ if (NULL != strpbrk(username, ":\"\\!#%&()=?',;.:<>")) { Q = elm_message(FRM("%Q"),username); DPRINT(Debug,6, (&Debug, "from_addr_literal: Quoting username: %s\n",Q)); } else Q = safe_strdup(username); if (mailer_info && query_mailer_info(mailer_info,MI_USE_DOMAIN)) { Q = strmcat(Q,"@"); Q = strmcat(Q, hostfullname); } return Q; } void make_from_addr(expanded,mailer_info) struct expanded_address *expanded; struct mailer_info *mailer_info; { int pos; /* FIXME: Posible wrong charset */ struct string * comment = new_string(display_charset); struct string * name = new_string2(display_charset,s2us(full_username)); char *s = safe_strdup(username); /* Use username as surface addr */ struct string *s1 = NULL; char *x; char * Q = from_addr_literal(mailer_info); free_expanded_address(expanded); pos = add_expanded_addr_(expanded,Q,name,comment); free(Q); Q = NULL; /* No fancy quotation stuff on textual form for editing */ for (x = s; *x; x++) { switch(*x) { case '"': case '\\': case '(': case ')': case ':': case '<': case '>': *x = '_'; break; } } s1 = new_string2(display_charset,s2us(s)); add_textual_addr_(expanded,s1,pos,1); free(s); s = NULL; free_string(&s1); free_string(&name); free_string(&comment); } void zero_mailing_headers (hdrs) struct mailing_headers *hdrs; { /* bzero is defined hdrs/defs.h */ bzero((void *)hdrs,sizeof (*hdrs)); hdrs->magic = MAIL_HDR_magic; hdrs->subject = NULL; zero_expanded_address(&(hdrs->from)); zero_id_phrase(&(hdrs->in_reply_to)); hdrs->expires = NULL; hdrs->action = NULL; hdrs->priority = NULL; hdrs->sender = NULL; zero_expanded_address(&(hdrs->reply_to)); zero_expanded_address(&(hdrs->to)); zero_expanded_address(&(hdrs->cc)); hdrs->user_header = NULL; hdrs->user_header_count = 0; zero_expanded_address(&(hdrs->bcc)); hdrs->precedence = NULL; hdrs->expires_days = NULL; hdrs->env_from = NULL; } void free_mailing_headers (hdrs) struct mailing_headers *hdrs; { if (hdrs->magic != MAIL_HDR_magic) panic("HEADERS PANIC",__FILE__,__LINE__,"free_mailing_headers", "Bad magic number",0); if (hdrs->subject) free_string(&(hdrs->subject)); hdrs->subject = NULL; free_expanded_address(&(hdrs->from)); free_id_phrase(&(hdrs->in_reply_to)); if (hdrs->expires) free(hdrs->expires); hdrs->expires = NULL; if (hdrs->action) free(hdrs->action); hdrs->action = NULL; if (hdrs->priority) free(hdrs->priority); hdrs->priority = NULL; if (hdrs->sender) free(hdrs->sender); hdrs->sender = NULL; free_expanded_address(&(hdrs->reply_to)); free_expanded_address(&(hdrs->to)); free_expanded_address(&(hdrs->cc)); if (hdrs->user_header) { int i; for (i = 0; i < hdrs->user_header_count; i++) { if (hdrs->user_header[i].value) free_string(&(hdrs->user_header[i].value)); hdrs->user_header[i].name = NULL; } free(hdrs->user_header); hdrs->user_header = NULL; } hdrs->user_header_count = 0; free_expanded_address(&(hdrs->bcc)); if (hdrs->precedence) free(hdrs->precedence); hdrs->precedence = NULL; if (hdrs->expires_days) free(hdrs->expires_days); hdrs->expires_days = NULL; if (hdrs->env_from) mailer_free_env_from( &(hdrs->env_from) ); /* Make sure that dangling pointters are catched */ /* bzero is defined hdrs/defs.h */ bzero((void *)hdrs,sizeof (*hdrs)); } /* * Local Variables: * mode:c * c-basic-offset:4 * buffer-file-coding-system: iso-8859-1 * End: */