1/*++ 2/* NAME 3/* cleanup_state 3 4/* SUMMARY 5/* per-message state variables 6/* SYNOPSIS 7/* #include "cleanup.h" 8/* 9/* CLEANUP_STATE *cleanup_state_alloc(src) 10/* VSTREAM *src; 11/* 12/* void cleanup_state_free(state) 13/* CLEANUP_STATE *state; 14/* DESCRIPTION 15/* This module maintains about two dozen state variables 16/* that are used by many routines in the course of processing one 17/* message. 18/* 19/* cleanup_state_alloc() initializes the per-message state variables. 20/* 21/* cleanup_state_free() cleans up. 22/* LICENSE 23/* .ad 24/* .fi 25/* The Secure Mailer license must be distributed with this software. 26/* AUTHOR(S) 27/* Wietse Venema 28/* IBM T.J. Watson Research 29/* P.O. Box 704 30/* Yorktown Heights, NY 10598, USA 31/*--*/ 32 33/* System library. */ 34 35#include <sys_defs.h> 36 37/* Utility library. */ 38 39#include <mymalloc.h> 40#include <vstring.h> 41#include <htable.h> 42 43/* Global library. */ 44 45#include <been_here.h> 46#include <mail_params.h> 47#include <mime_state.h> 48#include <mail_proto.h> 49 50/* Milter library. */ 51 52#include <milter.h> 53 54/* Application-specific. */ 55 56#include "cleanup.h" 57 58/* cleanup_state_alloc - initialize global state */ 59 60CLEANUP_STATE *cleanup_state_alloc(VSTREAM *src) 61{ 62 CLEANUP_STATE *state = (CLEANUP_STATE *) mymalloc(sizeof(*state)); 63 64 state->attr_buf = vstring_alloc(10); 65 state->temp1 = vstring_alloc(10); 66 state->temp2 = vstring_alloc(10); 67 if (cleanup_strip_chars) 68 state->stripped_buf = vstring_alloc(10); 69 state->src = src; 70 state->dst = 0; 71 state->handle = 0; 72 state->queue_name = 0; 73 state->queue_id = 0; 74 state->arrival_time.tv_sec = state->arrival_time.tv_usec = 0; 75 state->fullname = 0; 76 state->sender = 0; 77 state->recip = 0; 78 state->orig_rcpt = 0; 79 state->return_receipt = 0; 80 state->errors_to = 0; 81 state->flags = 0; 82 state->qmgr_opts = 0; 83 state->errs = 0; 84 state->err_mask = 0; 85 state->headers_seen = 0; 86 state->hop_count = 0; 87 state->resent = ""; 88 state->dups = been_here_init(var_dup_filter_limit, BH_FLAG_FOLD); 89 state->action = cleanup_envelope; 90 state->data_offset = -1; 91 state->body_offset = -1; 92 state->xtra_offset = -1; 93 state->cont_length = 0; 94 state->sender_pt_offset = -1; 95 state->sender_pt_target = -1; 96 state->append_rcpt_pt_offset = -1; 97 state->append_rcpt_pt_target = -1; 98 state->append_hdr_pt_offset = -1; 99 state->append_hdr_pt_target = -1; 100 state->append_meta_pt_offset = -1; 101 state->append_meta_pt_target = -1; 102 state->milter_hbc_checks = 0; 103 state->milter_hbc_reply = 0; 104 state->milter_orcpt_buf = 0; 105 state->rcpt_count = 0; 106 state->reason = 0; 107 state->smtp_reply = 0; 108 state->attr = nvtable_create(10); 109 nvtable_update(state->attr, MAIL_ATTR_LOG_ORIGIN, MAIL_ATTR_ORG_LOCAL); 110 state->mime_state = 0; 111 state->mime_errs = 0; 112 state->hdr_rewrite_context = MAIL_ATTR_RWR_LOCAL; 113 state->filter = 0; 114 state->redirect = 0; 115 state->dsn_envid = 0; 116 state->dsn_ret = 0; 117 state->dsn_notify = 0; 118 state->dsn_orcpt = 0; 119 state->verp_delims = 0; 120 state->milters = 0; 121 state->client_name = 0; 122 state->reverse_name = 0; 123 state->client_addr = 0; 124 state->client_af = 0; 125 state->client_port = 0; 126 state->milter_ext_from = 0; 127 state->milter_ext_rcpt = 0; 128 state->milter_err_text = 0; 129 state->free_regions = state->body_regions = state->curr_body_region = 0; 130 return (state); 131} 132 133/* cleanup_state_free - destroy global state */ 134 135void cleanup_state_free(CLEANUP_STATE *state) 136{ 137 vstring_free(state->attr_buf); 138 vstring_free(state->temp1); 139 vstring_free(state->temp2); 140 if (cleanup_strip_chars) 141 vstring_free(state->stripped_buf); 142 if (state->fullname) 143 myfree(state->fullname); 144 if (state->sender) 145 myfree(state->sender); 146 if (state->recip) 147 myfree(state->recip); 148 if (state->orig_rcpt) 149 myfree(state->orig_rcpt); 150 if (state->return_receipt) 151 myfree(state->return_receipt); 152 if (state->errors_to) 153 myfree(state->errors_to); 154 if (state->queue_name) 155 myfree(state->queue_name); 156 if (state->queue_id) 157 myfree(state->queue_id); 158 been_here_free(state->dups); 159 if (state->reason) 160 myfree(state->reason); 161 if (state->smtp_reply) 162 myfree(state->smtp_reply); 163 if (state->milter_orcpt_buf) 164 vstring_free(state->milter_orcpt_buf); 165 nvtable_free(state->attr); 166 if (state->mime_state) 167 mime_state_free(state->mime_state); 168 if (state->filter) 169 myfree(state->filter); 170 if (state->redirect) 171 myfree(state->redirect); 172 if (state->dsn_envid) 173 myfree(state->dsn_envid); 174 if (state->dsn_orcpt) 175 myfree(state->dsn_orcpt); 176 if (state->verp_delims) 177 myfree(state->verp_delims); 178 if (state->milters) 179 milter_free(state->milters); 180 if (state->milter_ext_from) 181 vstring_free(state->milter_ext_from); 182 if (state->milter_ext_rcpt) 183 vstring_free(state->milter_ext_rcpt); 184 if (state->milter_err_text) 185 vstring_free(state->milter_err_text); 186 cleanup_region_done(state); 187 myfree((char *) state); 188} 189