/*
 * Copyright (c) 2003-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: ibdbh.c,v 1.12 2005/11/14 22:31:51 ca Exp $")
#include "sm/error.h"
#include "sm/memops.h"
#include "sm/heap.h"
#include "sm/assert.h"
#include "sm/str.h"
#include "sm/cstr.h"
#include "sm/ibdb.h"

/*
**  IBDBR_RCPT_FREE -- free a single recipient address
**
**	Parameters:
**		ibdbr_rcpt -- IBDB recipient
**
**	Returns:
**		usual sm_error code
*/

sm_ret_T
ibdbr_rcpt_free(ibdb_rcpt_P ibdb_rcpt)
{
	if (ibdb_rcpt == NULL)
		return SM_SUCCESS;
	SM_FREE(ibdb_rcpt->ibr_ta_id);
	SM_STR_FREE(ibdb_rcpt->ibr_pa);
	sm_free_size(ibdb_rcpt, sizeof(*ibdb_rcpt));
	return SM_SUCCESS;
}

/*
**  IBDBR_RCPT_NEW -- allocate a new recipient
**
**	Parameters:
**		pibdb_rcpt -- recipient (output)
**
**	Returns:
**		usual sm_error code
*/

sm_ret_T
ibdbr_rcpt_new(ibdb_rcpt_P *pibdb_rcpt)
{
	ibdb_rcpt_P ibdb_rcpt;

	ibdb_rcpt = NULL;
	ibdb_rcpt = (ibdb_rcpt_P) sm_zalloc(sizeof(*ibdb_rcpt));
	if (ibdb_rcpt == NULL)
		goto enomem;
	ibdb_rcpt->ibr_pa = sm_str_new(NULL, MAXADDRLEN, MAXADDRLEN + 4);
	if (ibdb_rcpt->ibr_pa == NULL)
		goto enomem;
	ibdb_rcpt->ibr_ta_id = (char *) sm_malloc(SMTP_STID_SIZE + 1);
	if (ibdb_rcpt->ibr_ta_id == NULL)
		goto enomem;
	*pibdb_rcpt = ibdb_rcpt;
	return SM_SUCCESS;

  enomem:
	ibdbr_rcpt_free(ibdb_rcpt);
	*pibdb_rcpt = NULL;
	return sm_error_temp(SM_EM_IBDB, ENOMEM);
}

/*
**  IBDBR_TA_FREE -- free a transaction
**
**	Parameters:
**		ibdb_ta -- IBDB transaction
**
**	Returns:
**		usual sm_error code
*/

sm_ret_T
ibdbr_ta_free(ibdb_ta_P ibdb_ta)
{
	if (ibdb_ta == NULL)
		return SM_SUCCESS;
	SM_FREE(ibdb_ta->ibt_ta_id);
	SM_STR_FREE(ibdb_ta->ibt_mail_pa);
	SM_CSTR_FREE(ibdb_ta->ibt_cdb_id);
	sm_free_size(ibdb_ta, sizeof(*ibdb_ta));
	return SM_SUCCESS;
}

/*
**  IBDBR_TA_NEW -- create new transaction
**
**	Parameters:
**		pibdb_ta -- pointer to IBDB transaction (output)
**
**	Returns:
**		usual sm_error code
*/

sm_ret_T
ibdbr_ta_new(ibdb_ta_P *pibdb_ta)
{
	ibdb_ta_P ibdb_ta;

	ibdb_ta = (ibdb_ta_P) sm_zalloc(sizeof(*ibdb_ta));
	if (ibdb_ta == NULL)
		goto enomem;

	ibdb_ta->ibt_mail_pa = sm_str_new(NULL, MAXADDRLEN, MAXADDRLEN + 4);
	if (ibdb_ta->ibt_mail_pa == NULL)
		goto enomem;
	ibdb_ta->ibt_ta_id = (char *) sm_malloc(SMTP_STID_SIZE + 1);
	if (ibdb_ta->ibt_ta_id == NULL)
		goto enomem;

	*pibdb_ta = ibdb_ta;
	return SM_SUCCESS;

  enomem:
	/* clean up... */
	(void) ibdbr_ta_free(ibdb_ta);
	*pibdb_ta = NULL;
	return sm_error_temp(SM_EM_IBDB, ENOMEM);
}

/*
**  IBDBR_HDRMOD_FREE -- free a transaction
**
**	Parameters:
**		ibdb_hdrmod -- IBDB transaction
**
**	Returns:
**		usual sm_error code
*/

sm_ret_T
ibdbr_hdrmod_free(ibdb_hdrmod_P ibdb_hdrmod)
{
	if (ibdb_hdrmod == NULL)
		return SM_SUCCESS;
	SM_FREE(ibdb_hdrmod->ibh_ta_id);
	SM_CSTR_FREE(ibdb_hdrmod->ibh_hdr);
	sm_free_size(ibdb_hdrmod, sizeof(*ibdb_hdrmod));
	return SM_SUCCESS;
}

/*
**  IBDBR_HDRMOD_NEW -- create new transaction
**
**	Parameters:
**		pibdb_hdrmod -- pointer to IBDB transaction (output)
**
**	Returns:
**		usual sm_error code
*/

sm_ret_T
ibdbr_hdrmod_new(ibdb_hdrmod_P *pibdb_hdrmod)
{
	ibdb_hdrmod_P ibdb_hdrmod;

	ibdb_hdrmod = (ibdb_hdrmod_P) sm_zalloc(sizeof(*ibdb_hdrmod));
	if (ibdb_hdrmod == NULL)
		goto enomem;

	ibdb_hdrmod->ibh_ta_id = (char *) sm_malloc(SMTP_STID_SIZE + 1);
	if (ibdb_hdrmod->ibh_ta_id == NULL)
		goto enomem;

	*pibdb_hdrmod = ibdb_hdrmod;
	return SM_SUCCESS;

  enomem:
	/* clean up... */
	(void) ibdbr_hdrmod_free(ibdb_hdrmod);
	*pibdb_hdrmod = NULL;
	return sm_error_temp(SM_EM_IBDB, ENOMEM);
}


syntax highlighted by Code2HTML, v. 0.9.1