/* */ #include "sm/generic.h" SM_RCSID("@(#)$Id: t-pm-rcpts.c,v 1.2 2007/02/06 03:29:19 ca Exp $") #include "sm/error.h" #include "sm/assert.h" #include "sm/types.h" #include "sm/heap.h" #include "t-pmilter.h" #if MTA_USE_PMILTER /* ** PMR_RCPT_NEW -- add a new recipient to the recipient list ** ** Parameters: ** pmt_ctx -- SMTP server context ** rcpt_pa -- recipient (printable address, RFC 2821) ** ppmt_rcpt -- new recipient (output) ** ** Returns: ** usual return code */ sm_ret_T pmt_rcpt_new(pmt_ctx_P pmt_ctx, const char *rcpt_pa, pmt_rcpt_P *ppmt_rcpt) { pmt_rcpt_P pmt_rcpt; SM_REQUIRE(ppmt_rcpt != NULL); pmt_rcpt = (pmt_rcpt_P) sm_zalloc(sizeof(**ppmt_rcpt)); if (pmt_rcpt == NULL) goto error; pmt_rcpt->pmtr_pa = sm_rpool_strdup(NULL, rcpt_pa); if (NULL == pmt_rcpt->pmtr_pa) goto error; PMT_RCPTS_INSERT_TAIL(&pmt_ctx->pmt_rcpts, pmt_rcpt); *ppmt_rcpt = pmt_rcpt; return SM_SUCCESS; error: SM_FREE(*ppmt_rcpt); return sm_err_temp(ENOMEM); } /* ** PMR_RCPT_FREE -- free a single recipient address ** ** Parameters: ** pmt_ctx -- SMTP server transaction context ** pmtr_rcpt -- recipient to free ** ** Returns: ** usual return code */ static sm_ret_T pmt_rcpt_free(pmt_ctx_P pmt_ctx, pmt_rcpt_P pmt_rcpt) { if (NULL == pmt_rcpt) return SM_SUCCESS; SM_FREE(pmt_rcpt->pmtr_pa); sm_free(pmt_rcpt); return SM_SUCCESS; } /* ** PMR_RCPTS_FREE -- free an entire recipient list ** ** Parameters: ** pmt_ctx -- SMTP server transaction context ** ** Returns: ** usual return code */ sm_ret_T pmt_rcpts_free(pmt_ctx_P pmt_ctx) { pmt_rcpt_P pmt_rcpt, pmt_rcpt_nxt; if (PMT_RCPTS_EMPTY(&pmt_ctx->pmt_rcpts)) return SM_SUCCESS; for (pmt_rcpt = PMT_RCPTS_FIRST(&pmt_ctx->pmt_rcpts); pmt_rcpt != PMT_RCPTS_END(&pmt_ctx->pmt_rcpts); pmt_rcpt = pmt_rcpt_nxt) { pmt_rcpt_nxt = PMT_RCPTS_NEXT(pmt_rcpt); /* remove adr from list? use PMT_RCPTS_REMOVE_FREE()? */ pmt_rcpt_free(pmt_ctx, pmt_rcpt); } PMT_RCPTS_INIT(&pmt_ctx->pmt_rcpts); return SM_SUCCESS; } #endif /* MTA_USE_PMILTER */