自主协议库编译通过

This commit is contained in:
lnk
2026-06-15 15:48:16 +08:00
parent d3579a2aa7
commit 7205cb5cb9
621 changed files with 224958 additions and 48 deletions

322
mmslib/mvlu/c_write.c Normal file
View File

@@ -0,0 +1,322 @@
/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/* (c) Copyright Systems Integration Specialists Company, Inc., */
/* 1994 - 2002, All Rights Reserved */
/* */
/* MODULE NAME : c_write.c */
/* PRODUCT(S) : MMSEASE-LITE */
/* */
/* MODULE DESCRIPTION : */
/* */
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
/* mvl_write_variables */
/* mvla_write_variables */
/* _mvl_process_write_conf */
/* */
/* MODIFICATION LOG : */
/* Date Who Rev Comments */
/* -------- --- ------ ------------------------------------------- */
/* 04/09/07 MDE 24 Enhanced filtered logging */
/* 01/30/06 GLB 23 Integrated porting changes for VMS */
/* 07/16/02 JRB 22 Skip memmove to front of asn1_buf. */
/* Make sure num vars matches num data. */
/* _mvla_send..: Del unused args, make static. */
/* 03/06/02 JRB 21 Add S_UNLOCK.. before ALL returns. */
/* 02/25/02 MDE 20 Now get max PDU size from mvl_cfg_info */
/* 01/02/02 JRB 19 Converted to use ASN1R (re-entrant ASN1) */
/* 11/01/01 JRB 18 mvl_wait_req_done now returns ST_RET. */
/* 09/21/01 JRB 17 Alloc global bufs only once at startup. */
/* 03/07/01 JRB 16 Del LOCK on sync functs: caused deadlocks. */
/* 03/08/00 JRB 15 Del #ifdef MVL_REQ_BUF_ENABLED: not used. */
/* Del mvl_free_req_ctrl call. User must call. */
/* Del invoke_id, numpend_req: see mvl_send_req.*/
/* 01/21/00 MDE 14 Now use MEM_SMEM for dynamic memory */
/* 01/21/00 MDE 13 Use '_mvl_get_req_buf' for MVL_REQ_BUF_EN.. */
/* 11/19/99 NAV 12 Add #ifdef MVL_REQ_BUF_ENABLED */
/* 10/20/99 NAV 11 Add maxpend_req support to aynsc functions */
/* 09/13/99 MDE 10 Added SD_CONST modifiers */
/* 03/05/99 MDE 09 Fixed NVL write pointer arithmatic problem */
/* 12/08/98 MDE 08 Added client alternate access support */
/* 11/17/98 MDE 07 Now use MVL_ERR_COMM_SERVE_ACTIVE error code */
/* Use MVL_SYNC_REQ_INTERFACE */
/* 11/16/98 MDE 06 Renamed internal functions (prefix '_') */
/* 06/15/98 MDE 05 Changes to allow compile under C++ */
/* 05/22/98 JRB 04 Pass (MVL_REQ_PEND**) to sync function also. */
/* 04/16/98 JRB 03 Conf func: Let caller do "common" stuff. */
/* Always set (*req_out) so user can always free*/
/* 02/10/98 MDE 02 Removed NEST_RT_TYPES support */
/* 09/10/97 MDE 01 MMS-LITE V4.0 Release */
/************************************************************************/
#include "glbtypes.h"
#include "sysincs.h"
#include "glbsem.h"
#include "mmsdefs.h"
#include "mms_pvar.h"
#include "mms_vvar.h"
#include "mvl_acse.h"
#include "mvl_log.h"
static ST_RET _mvla_send_write_variables (MVL_NET_INFO *net_info,
WRITE_REQ_INFO *write_info,
MVL_REQ_PEND *req_pend);
static ST_RET w_get_asn1_data (MVL_WRITE_REQ_INFO *w_info,
ST_UCHAR *asn1_dest_buffer,
ST_INT asn1_buffer_len,
ST_INT *asn1_len_out);
/************************************************************************/
/* For debug version, use a static pointer to avoid duplication of */
/* __FILE__ strings. */
/************************************************************************/
#ifdef DEBUG_SISCO
SD_CONST static ST_CHAR *SD_CONST thisFileName = __FILE__;
#endif
/************************************************************************/
/************************************************************************/
/* mvl_write_variables */
/************************************************************************/
#if defined(MVL_SYNC_REQ_INTERFACE)
ST_RET mvl_write_variables (MVL_NET_INFO *net_info,
WRITE_REQ_INFO *write_info,
ST_INT num_data,
MVL_WRITE_REQ_INFO *w_info,
MVL_REQ_PEND **req_out)
{
ST_RET rc;
if (_mvl_comm_serve_active == SD_TRUE)
{
MVL_LOG_NERR0 ("Error: mvl_comm_serv active");
return (MVL_ERR_COMM_SERVE_ACTIVE);
}
rc = mvla_write_variables (net_info, write_info, num_data, w_info, req_out);
if (rc == SD_SUCCESS)
rc = mvl_wait_req_done (*req_out);
return (rc);
}
#endif
/************************************************************************/
/* mvla_write_variables */
/************************************************************************/
ST_RET mvla_write_variables (MVL_NET_INFO *net_info,
WRITE_REQ_INFO *write_info,
ST_INT num_data,
MVL_WRITE_REQ_INFO *w_info,
MVL_REQ_PEND **req_out)
{
ST_RET rc;
MVL_REQ_PEND *req_pend;
VARIABLE_LIST *vl_ptr;
VAR_ACC_DATA *va_ptr;
ST_UCHAR *asn1_buf;
ST_INT asn1_len;
ST_INT asn1_buf_left;
ST_INT i;
*req_out = req_pend = _mvl_get_req_ctrl (net_info, MMSOP_WRITE);
if (!req_pend)
return (MVL_ERR_REQ_CONTROL);
req_pend->u.wr.w_info = w_info;
req_pend->u.wr.num_data = num_data;
S_LOCK_COMMON_RESOURCES ();
/* Make the write request operation specific data structure */
/* NOTE: Number of vars MUST match number of data. To be sure, */
/* overwrite values user entered. */
write_info->num_of_data = num_data;
write_info->va_spec.num_of_variables = num_data; /* only used if VARLIST*/
vl_ptr = (VARIABLE_LIST *) (write_info+1);
if (write_info->va_spec.var_acc_tag == VAR_ACC_NAMEDLIST)
write_info->va_data = (VAR_ACC_DATA *) (write_info + 1);
else
write_info->va_data = (VAR_ACC_DATA *) (vl_ptr +
write_info->va_spec.num_of_variables);
va_ptr = write_info->va_data;
/* encode the data */
asn1_buf = (ST_UCHAR *) M_MALLOC (MSMEM_ASN1_DATA_ENC, mvl_cfg_info->max_msg_size);
asn1_buf_left = mvl_cfg_info->max_msg_size;
for (i = 0; i < num_data; ++i, vl_ptr++, va_ptr++, w_info++)
{
rc = w_get_asn1_data(w_info,asn1_buf,asn1_buf_left,&asn1_len);
if (rc != SD_SUCCESS)
{
MVL_LOG_NERR1 ("Write : w_get_asn1_data failed, ret = %x", rc);
S_UNLOCK_COMMON_RESOURCES ();
return(rc);
}
else
{
/* Data encoded at end of asn1_buf. Adjust len so next data */
/* encodes before this data. Save ptr and len. */
asn1_buf_left -= asn1_len; /* adjust buffer control vars */
va_ptr->len = asn1_len;
va_ptr->data = asn1_buf + asn1_buf_left;
#if defined(MVL_AA_SUPP)
if (w_info->alt_acc_pres)
{
rc = _mvl_get_asn1_aa (w_info[i].alt_acc, vl_ptr);
if (rc != SD_SUCCESS)
{
MVL_LOG_NERR0 ("Error creating ASN.1 encoded Alternate Access");
S_UNLOCK_COMMON_RESOURCES ();
return (SD_FAILURE);
}
}
#endif
}
}
rc = _mvla_send_write_variables (net_info, write_info, req_pend);
M_FREE (MSMEM_ASN1_DATA_ENC, asn1_buf);
S_UNLOCK_COMMON_RESOURCES ();
return (rc);
}
/************************************************************************/
/* _mvla_send_write_variables */
/************************************************************************/
static ST_RET _mvla_send_write_variables (MVL_NET_INFO *net_info,
WRITE_REQ_INFO *write_info,
MVL_REQ_PEND *req_pend)
{
ST_RET rc;
/* Build a write request */
rc = mpl_write (write_info);
if (rc == SD_SUCCESS)
mpl_req_log (req_pend, write_info);
#if defined(MVL_AA_SUPP)
_m_free_aa_asn1_buf ();
#endif
rc = _mvl_send_req (net_info, req_pend, rc);
return (rc);
}
/************************************************************************/
/* w_get_asn1_data */
/************************************************************************/
/* This function is to provide ASN.1 encoded data, given the variable */
/* list element. */
static ST_RET w_get_asn1_data (MVL_WRITE_REQ_INFO *wr_info,
ST_UCHAR *asn1_dest_buffer,
ST_INT asn1_buffer_len,
ST_INT *asn1_len_out)
{
RUNTIME_TYPE *rt;
ST_INT num_rt;
ST_RET rc;
ST_UCHAR *asn1_start;
ST_INT asn1_len;
ST_BOOLEAN packed_save;
ASN1_ENC_CTXT localEncCtx; /* For readability, use "aCtx" to access this.*/
ASN1_ENC_CTXT *aCtx = &localEncCtx;
rc = mvl_get_runtime (wr_info->type_id,&rt, &num_rt);
if (rc != SD_SUCCESS)
{
MVL_LOG_NERR1 ("Get ASN1 Data : mvl_get_runtime failed, rc = %x", rc);
return (rc); /* bad type id */
}
/* Check to see if this is an array with variable number of elements */
/* and modify the size if necessary - */
if (wr_info->arr)
mvl_mod_arr_size (rt, wr_info->num_el);
/* First we need to initialize the ASN.1 encode tools, then do the */
/* encode */
asn1r_strt_asn1_bld (aCtx, asn1_dest_buffer, asn1_buffer_len);
#if defined(MVL_AA_SUPP)
if (wr_info->alt_acc_pres &&
wr_info->alt_acc_type_aa == SD_FALSE)
{
packed_save = m_alt_acc_packed;
m_alt_acc_packed = wr_info->alt_acc_data_packed;
rc = ms_local_to_asn1_aa (aCtx, rt, num_rt, wr_info->alt_acc,
(ST_CHAR *) wr_info->local_data);
m_alt_acc_packed = packed_save;
}
else
rc = ms_local_to_asn1 (aCtx, rt, num_rt, (ST_CHAR *) wr_info->local_data);
#else
rc = ms_local_to_asn1 (aCtx, rt, num_rt, (ST_CHAR *) wr_info->local_data);
#endif /* #if defined(MVL_AA_SUPP) */
if (rc != SD_SUCCESS)
{
MVL_LOG_NERR1 ("Get ASN1 Data : ms_local_to_asn1 failed, rc = %x", rc);
return (rc); /* bad type id */
}
/* When the ASN.1 encode is complete, 'asn1_field_ptr' points 1 byte ahead */
/* of the start of the message. The ASN.1 message is build from back to */
/* front, so that is now we calculate the length of the PDU */
asn1_start = aCtx->asn1r_field_ptr+1;
asn1_len = (asn1_dest_buffer + asn1_buffer_len) - asn1_start;
*asn1_len_out = asn1_len;
return (rc);
}
/************************************************************************/
/* _mvl_process_write_conf */
/************************************************************************/
ST_VOID _mvl_process_write_conf (MVL_REQ_PEND *req)
{
ST_INT i;
WRITE_RESP_INFO *write_info;
WRITE_RESULT *wr_rslt;
ST_INT num_variables;
MVL_WRITE_REQ_INFO *w_info;
write_info = (WRITE_RESP_INFO *) req->event->u.mms.dec_rslt.data_ptr;
wr_rslt = (WRITE_RESULT *) (write_info+1);
/* retrieve output information */
w_info = req->u.wr.w_info;
num_variables = req->u.wr.num_data;
/* just a sanity check */
if (num_variables != write_info->num_of_result)
{
req->result = SD_FAILURE;
return;
}
/* For each variable returned in the write response ... */
for (i=0; i < num_variables; i++, wr_rslt++, w_info++)
{ /* check for successful write of this variable */
if (wr_rslt->resp_tag == WR_RSLT_SUCCESS)
w_info->result = SD_SUCCESS;
else /* bad type ID */
w_info->result = SD_FAILURE;
} /* for each variable */
}