/* * Copyright (c) 2005 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set * forth in the LICENSE file which can be found at the top level of * the sendmail distribution. */ #include "sm/generic.h" SM_RCSID("@(#)$Id: pmilter_hdrmod.c,v 1.15 2006/10/05 04:27:38 ca Exp $") #include "sm/error.h" #include "sm/assert.h" #include "pmilter.h" #include "sm/pmfdef.h" #include "sm/pmfapi.h" #if MTA_USE_PMILTER /* ** SM_PMFI_HDR_MOD -- Create header modification request ** ** Parameters: ** pmse_ctx -- pmilter/SMTP server session context ** type -- type of request ** pos -- position of header ** header -- header (full header line!) ** ** Returns: ** usual sm_error code */ sm_ret_T sm_pmfi_hdr_mod(pmse_ctx_P pmse_ctx, uint type, uint pos, const unsigned char *header) { sm_ret_T ret; size_t len; sm_hdrmod_P sm_hdrmod; sm_cstr_P hdr; SM_IS_PMSE_CTX(pmse_ctx); hdr = NULL; sm_hdrmod = NULL; if (pmse_ctx->pmse_state != PMSE_ST_DOT) return sm_error_perm(SM_EM_PMILTER, SM_E_PR_ERR); if ( type != SM_HDRMOD_T_PREPEND && type != SM_HDRMOD_T_APPEND && type != SM_HDRMOD_T_REMOVE && type != SM_HDRMOD_T_INSERT && type != SM_HDRMOD_T_REPLACE ) return sm_error_perm(SM_EM_PMILTER, EINVAL); if (NULL == header && type != SM_HDRMOD_T_REMOVE) return sm_error_perm(SM_EM_PMILTER, EINVAL); if (header != NULL) { len = strlen((const char *) header); if (len >= SM_MAXHDRLEN) return sm_error_perm(SM_EM_PMILTER, SM_E_OVFLW_NS); if (len < 4) return sm_error_perm(SM_EM_PMILTER, EINVAL); if (header[len - 2] != '\r' || header[len - 1] != '\n') return sm_error_perm(SM_EM_PMILTER, EINVAL); hdr = sm_cstr_scpyn0(header, len); if (NULL == hdr) return sm_error_perm(SM_EM_PMILTER, ENOMEM); } ret = sm_hdrmod_new(&pmse_ctx->pmse_hdrmodhd, false, &sm_hdrmod); if (sm_is_err(ret)) goto error; sm_hdrmod->sm_hm_type = type; sm_hdrmod->sm_hm_pos = pos; sm_hdrmod->sm_hm_hdr = hdr; hdr = NULL; (void) sm_hdrmod_insert(pmse_ctx->pmse_hdrmodhd, sm_hdrmod); return SM_SUCCESS; error: SM_CSTR_FREE(hdr); return ret; } #endif /* MTA_USE_PMILTER */