/* * 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: cdb_open_wr.c,v 1.4 2006/07/18 02:43:18 ca Exp $") #include "sm/error.h" #include "sm/heap.h" #include "sm/assert.h" #include "sm/str.h" #include "sm/io.h" #include "sm/cdb.h" #include "cdb.h" /* ** CDB_OPEN_WR -- open a CDB file for writing ** ** Parameters: ** cdb_ctx -- CDB context ** ta_id -- transaction id ** pfp -- (pointer to) file pointer (output) ** mode -- mode for open ** instance -- instance of file (0: default, valid: 0-9) ** io_vector -- I/O vector (can be NULL) ** bufsize -- size of buffer (only for buffered file) ** pcdb_id -- (pointer to) cdb id (output) ** ** Returns: ** usual sm_error code; ENOMEM, EINVAL ** ** Last code review: ** Last code change: */ sm_ret_T cdb_open_wr(cdb_ctx_P cdb_ctx, sessta_id_T ta_id, sm_file_T **pfp, int mode, int instance, sm_stream_T *io_vector, size_t bufsize, cdb_id_P *pcdb_id) { cdb_id_P cdb_id; sessta_id_P pta_id; SM_REQUIRE(cdb_ctx != NULL); if (instance < 0 || instance > 9) return sm_error_perm(SM_EM_CDB, EINVAL); if (instance > 0) SM_REQUIRE(pcdb_id != NULL); if (pcdb_id != NULL) { pta_id = sm_zalloc(sizeof(sessta_id_T)); if (NULL == pta_id) return sm_error_perm(SM_EM_CDB, ENOMEM); strlcpy(pta_id, ta_id, sizeof(sessta_id_T)); } else pta_id = ta_id; if (1 == instance) pta_id[0] = 'M'; else if (instance > 0) pta_id[0] = (char) instance + '0'; if (pcdb_id != NULL) { cdb_id = sm_cstr_crt((uchar *) pta_id, sizeof(sessta_id_T)); if (NULL == cdb_id) { sm_free_size(pta_id, sizeof(sessta_id_T)); return sm_error_perm(SM_EM_CDB, ENOMEM); } *pcdb_id = cdb_id; } if (io_vector != NULL) { if (bufsize > 0) return sm_io_open(&SmCDBStL, pta_id, mode, pfp, SM_IO_WHAT_CDB_HDL, cdb_ctx, SM_IO_WHAT_VECTORS, io_vector, SM_IO_WHAT_BSIZE, bufsize, SM_IO_WHAT_END); else return sm_io_open(&SmCDBStL, pta_id, mode, pfp, SM_IO_WHAT_CDB_HDL, cdb_ctx, SM_IO_WHAT_VECTORS, io_vector, SM_IO_WHAT_END); } else return sm_io_open(&SmCDBSt, pta_id, mode, pfp, SM_IO_WHAT_CDB_HDL, cdb_ctx, SM_IO_WHAT_END); }