/*
 * Copyright (c) 2002-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: edbreqdel.c,v 1.23 2006/05/02 17:13:38 ca Exp $")
#include "sm/error.h"
#include "sm/memops.h"
#include "sm/assert.h"
#include "sm/mta.h"
#include "edb-int.h"
#include "sm/edb.h"
#include "sm/pthread.h"

/*
**  EDB_TA_DEL_REQ --  add a request to remove a TA
**
**	Parameters:
**		edb_ctx -- EDB context
**		ta_id -- SMTPS transaction id (key for DB)
**		edb_req_hd -- EDB request list (used if not NULL)
**
**	Side Effects: none on error (except if unlock fails)
**
**	Returns:
**		usual sm_error code
**
**	Last code review: 2005-03-30 19:59:38
**	Last code change: 2005-03-30 19:57:10
*/

sm_ret_T
edb_ta_rm_req(edb_ctx_P edb_ctx, sessta_id_T ta_id, edb_req_hd_P edb_req_hd)
{
	sm_ret_T ret;
	int r;
	edb_req_P edb_req;

	SM_IS_EDB_CTX(edb_ctx);
	r = pthread_mutex_lock(&edb_ctx->edb_mutex);
	SM_LOCK_OK(r);
	if (r != 0)
	{
		/* LOG? */
		return sm_error_perm(SM_EM_EDB, r);
	}

	/* Ask for a request element without RCB?? Two types of req? */
	ret = edb_req_new(edb_ctx, EDB_RQF_SMALL, &edb_req, false);
	if (sm_is_success(ret))
	{
		SESSTA_COPY(edb_req->edb_req_id, ta_id);
		edb_req->edb_req_type = EDB_REQ_TA_DEL;
		if (edb_req_hd == NULL)
			EDBREQL_APP(&edb_ctx->edb_reql_wr, edb_req);
		else
			EDBREQL_APP(edb_req_hd, edb_req);
	}
	r = pthread_mutex_unlock(&edb_ctx->edb_mutex);
	SM_ASSERT(r == 0);
	if (r != 0 && sm_is_success(ret))
		ret = sm_error_perm(SM_EM_EDB, r);
	return ret;
}

/*
**  EDB_RCPT_RM_REQ -- add a request to remove a recipient
**
**	Parameters:
**		edb_ctx -- EDB context
**		rcpt_id -- recipient id (key for DB)
**		edb_req_hd -- EDB request list (used if not NULL)
**
**	Side Effects: none on error (except if unlock fails)
**
**	Returns:
**		usual sm_error code; ENOMEM, (un)lock
**
**	Locking: locks/unlocks edb_ctx
**
**	Last code review: 2005-03-30 19:59:10
**	Last code change: 2005-03-30 19:54:51
*/

sm_ret_T
edb_rcpt_rm_req(edb_ctx_P edb_ctx, rcpt_id_T rcpt_id, edb_req_hd_P edb_req_hd)
{
	sm_ret_T ret;
	int r;
	edb_req_P edb_req;

	SM_IS_EDB_CTX(edb_ctx);
	r = pthread_mutex_lock(&edb_ctx->edb_mutex);
	SM_LOCK_OK(r);
	if (r != 0)
	{
		/* LOG? */
		return sm_error_perm(SM_EM_EDB, r);
	}

	/* Ask for a request element without RCB?? Two types of req? */
	ret = edb_req_new(edb_ctx, EDB_RQF_SMALL, &edb_req, THR_NO_LOCK);
	if (sm_is_success(ret))
	{
		RCPT_ID_COPY(edb_req->edb_req_id, rcpt_id);
		edb_req->edb_req_type = EDB_REQ_RCPT_DEL;
		if (edb_req_hd == NULL)
			EDBREQL_APP(&edb_ctx->edb_reql_wr, edb_req);
		else
			EDBREQL_APP(edb_req_hd, edb_req);
	}
	r = pthread_mutex_unlock(&edb_ctx->edb_mutex);
	SM_ASSERT(r == 0);
	if (r != 0 && sm_is_success(ret))
		ret = sm_error_perm(SM_EM_EDB, r);
	return ret;
}


syntax highlighted by Code2HTML, v. 0.9.1