/* * 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: hdrmodh.c,v 1.4 2005/11/14 22:31:52 ca Exp $") #include "sm/assert.h" #include "sm/error.h" #include "sm/hdrmod.h" /* ** SM_HDRMOD_NEW -- create new hdrmod entry and append it to the list ** ** Parameters: ** psm_hdrmodhd -- (pointer to) head of header modification list ** append -- append to list? ** psm_hdrmod -- (pointer to) header modification entry (output) ** ** Returns: ** usual sm_error code */ sm_ret_T sm_hdrmod_new(sm_hdrmodhd_P *psm_hdrmodhd, bool append, sm_hdrmod_P *psm_hdrmod) { sm_ret_T ret; sm_hdrmod_P sm_hdrmod; sm_hdrmodhd_P sm_hdrmodhd; SM_ASSERT(psm_hdrmod != NULL); SM_ASSERT(psm_hdrmodhd != NULL); sm_hdrmod = NULL; sm_hdrmodhd = NULL; if (NULL == *psm_hdrmodhd) { sm_hdrmodhd = sm_zalloc(sizeof(*sm_hdrmodhd)); if (sm_hdrmodhd == NULL) goto enomem; HDRMODL_INIT(sm_hdrmodhd); } else sm_hdrmodhd = *psm_hdrmodhd; sm_hdrmod = sm_zalloc(sizeof(*sm_hdrmod)); if (sm_hdrmod == NULL) goto enomem; if (append) HDRMODL_APP(sm_hdrmodhd, sm_hdrmod); *psm_hdrmod = sm_hdrmod; if (NULL == *psm_hdrmodhd) *psm_hdrmodhd = sm_hdrmodhd; return SM_SUCCESS; enomem: ret = sm_error_temp(SM_EM_SMTPC, ENOMEM); if (sm_hdrmodhd != NULL) sm_free_size(sm_hdrmodhd, sizeof(*sm_hdrmodhd)); if (sm_hdrmod != NULL) sm_free_size(sm_hdrmod, sizeof(*sm_hdrmod)); return ret; } /* ** SM_HDRMOD_RM -- remove first hdrmod entry ** ** Parameters: ** psm_hdrmodhd -- (pointer to) head of header modification list ** ** Returns: ** SM_SUCCESS */ sm_ret_T sm_hdrmod_rm(sm_hdrmodhd_P *psm_hdrmodhd) { sm_hdrmod_P sm_hdrmod; sm_hdrmodhd_P sm_hdrmodhd; if (psm_hdrmodhd == NULL) return SM_SUCCESS; sm_hdrmodhd = *psm_hdrmodhd; if (HDRMODL_EMPTY(sm_hdrmodhd)) return SM_SUCCESS; sm_hdrmod = HDRMODL_FIRST(sm_hdrmodhd); HDRMODL_REMOVE(sm_hdrmodhd); SM_CSTR_FREE(sm_hdrmod->sm_hm_hdr); SM_FREE(sm_hdrmod); if (HDRMODL_EMPTY(sm_hdrmodhd)) { sm_free_size(sm_hdrmodhd, sizeof(*sm_hdrmodhd)); *psm_hdrmodhd = NULL; } return SM_SUCCESS; } /* ** SM_HDRMOD_RM_LAST -- remove last hdrmod entry ** ** Parameters: ** psm_hdrmodhd -- (pointer to) head of header modification list ** ** Returns: ** SM_SUCCESS */ sm_ret_T sm_hdrmod_rm_last(sm_hdrmodhd_P *psm_hdrmodhd) { sm_hdrmod_P sm_hdrmod; sm_hdrmodhd_P sm_hdrmodhd; if (psm_hdrmodhd == NULL) return SM_SUCCESS; sm_hdrmodhd = *psm_hdrmodhd; if (HDRMODL_EMPTY(sm_hdrmodhd)) return SM_SUCCESS; sm_hdrmod = HDRMODL_LAST(sm_hdrmodhd); HDRMODL_RM_LAST(sm_hdrmodhd); SM_CSTR_FREE(sm_hdrmod->sm_hm_hdr); SM_FREE(sm_hdrmod); if (HDRMODL_EMPTY(sm_hdrmodhd)) { sm_free_size(sm_hdrmodhd, sizeof(*sm_hdrmodhd)); *psm_hdrmodhd = NULL; } return SM_SUCCESS; } /* ** SM_HDRMOD_RM_ELEM -- remove specified hdrmod entry ** ** Parameters: ** psm_hdrmodhd -- (pointer to) head of header modification list ** sm_hdrmod -- header modification entry to remove ** ** Returns: ** SM_SUCCESS */ sm_ret_T sm_hdrmod_rm_elem(sm_hdrmodhd_P *psm_hdrmodhd, sm_hdrmod_P sm_hdrmod) { sm_hdrmodhd_P sm_hdrmodhd; if (NULL == sm_hdrmod) return SM_SUCCESS; if (psm_hdrmodhd == NULL) return SM_SUCCESS; sm_hdrmodhd = *psm_hdrmodhd; SM_ASSERT(sm_hdrmodhd != NULL); if (HDRMODL_EMPTY(sm_hdrmodhd)) return SM_SUCCESS; HDRMODL_RM_ELEM(sm_hdrmodhd, sm_hdrmod); SM_CSTR_FREE(sm_hdrmod->sm_hm_hdr); SM_FREE(sm_hdrmod); if (HDRMODL_EMPTY(sm_hdrmodhd)) { sm_free_size(sm_hdrmodhd, sizeof(*sm_hdrmodhd)); *psm_hdrmodhd = NULL; } return SM_SUCCESS; } /* ** SM_HDRMODL_FREE -- free entire header modification list ** ** Parameters: ** psm_hdrmodhd -- (pointer to) head of header modification list ** ** Returns: ** SM_SUCCESS */ sm_ret_T sm_hdrmodl_free(sm_hdrmodhd_P *psm_hdrmodhd) { sm_hdrmod_P sm_hdrmod; sm_hdrmodhd_P sm_hdrmodhd; if (psm_hdrmodhd == NULL) return SM_SUCCESS; sm_hdrmodhd = *psm_hdrmodhd; if (sm_hdrmodhd == NULL) return SM_SUCCESS; while (!HDRMODL_EMPTY(sm_hdrmodhd)) { sm_hdrmod = HDRMODL_FIRST(sm_hdrmodhd); HDRMODL_REMOVE(sm_hdrmodhd); SM_CSTR_FREE(sm_hdrmod->sm_hm_hdr); SM_FREE(sm_hdrmod); } sm_free_size(sm_hdrmodhd, sizeof(*sm_hdrmodhd)); *psm_hdrmodhd = NULL; return SM_SUCCESS; }