Files
microser/mmslib/mvlu/s_getnam.c
2026-06-15 15:48:16 +08:00

440 lines
14 KiB
C

/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/* (c) Copyright Systems Integration Specialists Company, Inc., */
/* 1994 - 2005, All Rights Reserved */
/* */
/* MODULE NAME : s_getnam.c */
/* PRODUCT(S) : MMSEASE-LITE */
/* */
/* MODULE DESCRIPTION : */
/* */
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
/* NONE */
/* */
/* MODIFICATION LOG : */
/* Date Who Rev Comments */
/* -------- --- ------ ------------------------------------------- */
/* 04/09/07 MDE 21 Enhanced filtered logging */
/* 10/30/06 JRB 20 Use new mvl_vmd_* object handling functions. */
/* u_gnl_ind_*: add net_info arg to */
/* elim use of global var "_mvl_curr_net_info". */
/* 01/19/05 JRB 19 u_gnl_ind_* return (-1) on error. */
/* mvlas_namelist_resp: send err resp on error */
/* (instead of empty name list). */
/* 08/20/04 JRB 18 Del uninformative "#pragma message". */
/* 03/04/02 JRB 17 Avoid uninitialized locals in u_gnl_ind_jous */
/* 01/23/02 EJV 16 Added journals to domain: */
/* u_gnl_ind_jous - added DOM_SPEC case. */
/* 09/21/01 JRB 15 Alloc global bufs only once at startup. */
/* 03/30/01 MDE 14 Changed MSMEM_ENC_INFO to MSMEM_ENC_OS_INFO */
/* 10/25/00 JRB 13 Del GNL funct ptrs. Call functs directly. */
/* Control with #ifdefs. */
/* Del NO_GLB_VAR_INIT code (no longer needed). */
/* 01/21/00 MDE 12 Now use MEM_SMEM for dynamic memory */
/* 09/13/99 MDE 11 Added SD_CONST modifiers */
/* 04/07/99 MDE 10 Logging improvements */
/* 01/08/99 JRB 09 Use new "bsearch" object model. */
/* 11/16/98 MDE 08 Renamed internal functions (prefix '_') */
/* 09/21/98 MDE 07 Minor lint cleanup */
/* 07/02/98 MDE 06 Added Journal support */
/* 06/15/98 MDE 05 Changes to allow compile under C++ */
/* 05/14/98 JRB 04 Use MVL_IND_PEND. Add mplas resp function. */
/* 02/10/98 MDE 03 Added 'u_gnl_done' function pointer */
/* 09/18/97 MDE 02 Fixed 'continue after' handling */
/* 09/10/97 MDE 01 MMS-LITE V4.0 Release */
/************************************************************************/
#include "glbtypes.h"
#include "sysincs.h"
#include "mmsdefs.h"
#include "mms_pvmd.h"
#include "mvl_defs.h"
#include "mvl_log.h"
/************************************************************************/
/* Approximate worst case PDU overhead */
#define MVL_GNL_RESP_OH 25
/************************************************************************/
/* 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
/************************************************************************/
/************************************************************************/
static ST_INT getLocalObjectNames (MVL_OBJ ** obj_tbl, ST_INT num_obj,
NAMELIST_REQ_INFO *req_info, ST_CHAR **ptr,
ST_BOOLEAN *moreFollowsOut, ST_INT maxNames);
/************************************************************************/
/************************************************************************/
/* _mvl_process_getnam_ind */
/* A get name indication has been received, process it and respond */
/************************************************************************/
#define GETNAM_RESP_BUF_SIZE (sizeof(NAMELIST_RESP_INFO)+ \
(MVL_MAX_GNL_NAMES * sizeof(ST_CHAR *)))
ST_VOID _mvl_process_getnam_ind (MVL_IND_PEND *indCtrl)
{
indCtrl->u.namelist.req_info =
(NAMELIST_REQ_INFO *) indCtrl->event->u.mms.dec_rslt.data_ptr;
u_mvl_namelist_ind (indCtrl);
}
/************************************************************************/
/* mvlas_namelist_resp */
/* NOTE: u_gnl_ind_* functions return negative value on errors. */
/************************************************************************/
ST_VOID mvlas_namelist_resp (MVL_IND_PEND *indCtrl)
{
NAMELIST_REQ_INFO *req_info;
NAMELIST_RESP_INFO *resp_info;
ST_CHAR **ptr;
ST_INT num_obj;
ST_INT i;
ST_INT max_size;
ST_INT16 mms_class;
req_info = indCtrl->u.namelist.req_info;
mms_class = req_info->obj.mms_class;
/* Now create the response data structure */
resp_info = (NAMELIST_RESP_INFO *)
M_CALLOC (MSMEM_ENC_OS_INFO, 1, GETNAM_RESP_BUF_SIZE);
ptr = (ST_CHAR **)(resp_info + 1);
num_obj = 0;
switch (req_info->obj.mms_class)
{
case MMS_CLASS_VAR: /* NamedVariables */
num_obj = u_gnl_ind_vars(indCtrl->event->net_info, req_info, ptr, &resp_info->more_follows,
MVL_MAX_GNL_NAMES);
break;
case MMS_CLASS_VARLIST: /* NamedVariableLists */
num_obj = u_gnl_ind_nvls(indCtrl->event->net_info, req_info, ptr, &resp_info->more_follows,
MVL_MAX_GNL_NAMES);
break;
case MMS_CLASS_DOM: /* Domains */
num_obj = u_gnl_ind_doms(req_info, ptr, &resp_info->more_follows,
MVL_MAX_GNL_NAMES);
break;
case MMS_CLASS_JOU: /* Journals */
num_obj = u_gnl_ind_jous(indCtrl->event->net_info, req_info, ptr, &resp_info->more_follows,
MVL_MAX_GNL_NAMES);
break;
case MMS_CLASS_SCAT_ACC: /* Scattered Access */
case MMS_CLASS_TYPE: /* NamedTypes */
case MMS_CLASS_SEM: /* Semaphores */
case MMS_CLASS_EV_COND: /* Event Conditions */
case MMS_CLASS_EV_ACT: /* EventActions */
case MMS_CLASS_EV_ENROLL: /* EventEnrollments */
case MMS_CLASS_PI: /* Program Invocations */
case MMS_CLASS_OPER_STA: /* OperatorStations */
break;
default:
break;
}
if (num_obj < 0)
{ /* error. Send error response. */
_mplas_err_resp (indCtrl,7,2); /* access, non-existent */
}
else
{
/* Let's make sure they will all fit into the PDU */
max_size = indCtrl->event->net_info->max_pdu_size - MVL_GNL_RESP_OH;
resp_info->num_names = 0;
for (i = 0; i < num_obj; ++i, ++ptr)
{
max_size -= (2 + strlen (*ptr));
if (resp_info->num_names > MVL_MAX_GNL_NAMES || max_size <= 0)
{
resp_info->more_follows = SD_TRUE;
break;
}
++resp_info->num_names;
}
/* Build a Get Name List response */
indCtrl->u.namelist.resp_info = resp_info;
mplas_namelist_resp (indCtrl);
}
#if defined(MVL_UCA) /* extra cleanup for UCA */
u_gnl_done (mms_class, resp_info);
#endif /* defined(MVL_UCA) */
M_FREE (MSMEM_ENC_OS_INFO, resp_info);
}
/************************************************************************/
/* mplas_namelist_resp */
/************************************************************************/
ST_VOID mplas_namelist_resp (MVL_IND_PEND *indCtrl)
{
ST_RET rc;
rc = mpl_namelist_resp (indCtrl->event->u.mms.dec_rslt.id,
indCtrl->u.namelist.resp_info);
if (rc == SD_SUCCESS)
mpl_resp_log (indCtrl, indCtrl->u.namelist.resp_info);
_mvl_send_resp_i (indCtrl, rc);
}
/************************************************************************/
/************************************************************************/
#if defined(MVL_UCA)
/* This function not used. See customized 'u_gnl_ind_vars' in 'mvl_uca.c'.*/
#elif defined(USE_MANUFACTURED_OBJS)
#pragma message("USE_MANUFACTURED_OBJS defined. Must provide customized 'u_gnl_ind_vars'.")
#else /* default */
ST_INT u_gnl_ind_vars (MVL_NET_INFO *net_info, NAMELIST_REQ_INFO *req_info,
ST_CHAR **ptr, ST_BOOLEAN *moreFollowsOut,
ST_INT maxNames)
{
ST_INT num_obj;
MVL_VAR_ASSOC **va;
MVL_AA_OBJ_CTRL *aa;
MVL_DOM_CTRL *domCtrl;
/* First get the number of objects and pointer to the object table */
num_obj = 0;
if (req_info->objscope == VMD_SPEC)
{
num_obj = mvl_vmd.num_var_assoc;
va = mvl_vmd.var_assoc_tbl;
}
else if (req_info->objscope == DOM_SPEC)
{
domCtrl = mvl_vmd_find_dom (&mvl_vmd, req_info->dname);
if (domCtrl)
{
num_obj = domCtrl->num_var_assoc;
va = domCtrl->var_assoc_tbl;
}
else
{
MVL_LOG_NERR1 ("GetNameList variables: Domain '%s' not found", req_info->dname);
*moreFollowsOut = SD_FALSE;
return (-1); /* error. This triggers error response */
}
}
else /* AA_SPEC */
{
aa = (MVL_AA_OBJ_CTRL *) net_info->aa_objs;
if (aa)
{
num_obj = aa->num_var_assoc;
va = aa->var_assoc_tbl;
}
else
{
*moreFollowsOut = SD_FALSE;
return (-1); /* error. This triggers error response */
}
}
/* Get all the names. */
return (getLocalObjectNames ((MVL_OBJ **) va, num_obj,
req_info, ptr, moreFollowsOut, maxNames));
}
#endif /* default */
/************************************************************************/
/************************************************************************/
#if defined(MVL_UCA)
/* This function not used. See customized 'u_gnl_ind_nvls' in 'mvl_uca.c'.*/
#elif defined(USE_MANUFACTURED_OBJS)
#pragma message("USE_MANUFACTURED_OBJS defined. Must provide customized 'u_gnl_ind_nvls'.")
#else /* default */
ST_INT u_gnl_ind_nvls (MVL_NET_INFO *net_info, NAMELIST_REQ_INFO *req_info,
ST_CHAR **ptr, ST_BOOLEAN *moreFollowsOut,
ST_INT maxNames)
{
ST_INT num_obj;
MVL_AA_OBJ_CTRL *aa;
MVL_NVLIST_CTRL **vl;
MVL_DOM_CTRL *domCtrl;
/* First get the number of objects and pointer to the object table */
num_obj = 0;
if (req_info->objscope == VMD_SPEC)
{
num_obj = mvl_vmd.num_nvlist;
vl = mvl_vmd.nvlist_tbl;
}
else if (req_info->objscope == DOM_SPEC)
{
domCtrl = mvl_vmd_find_dom (&mvl_vmd, req_info->dname);
if (domCtrl)
{
num_obj = domCtrl->num_nvlist;
vl = domCtrl->nvlist_tbl;
}
else
{
MVL_LOG_NERR1 ("GetNameList NVL: Domain '%s' not found", req_info->dname);
*moreFollowsOut = SD_FALSE;
return (-1); /* error. This triggers error response */
}
}
else /* AA_SPEC */
{
aa = (MVL_AA_OBJ_CTRL *) net_info->aa_objs;
if (aa)
{
num_obj = aa->num_nvlist;
vl = aa->nvlist_tbl;
}
else
{
*moreFollowsOut = SD_FALSE;
return (-1); /* error. This triggers error response */
}
}
/* Get all the names. */
return (getLocalObjectNames ((MVL_OBJ **) vl, num_obj,
req_info, ptr, moreFollowsOut, maxNames));
}
#endif /* default */
/************************************************************************/
/************************************************************************/
#if defined(USE_MANUFACTURED_OBJS)
#pragma message("USE_MANUFACTURED_OBJS defined. Must provide customized 'u_gnl_ind_doms'.")
#else /* default */
ST_INT u_gnl_ind_doms (NAMELIST_REQ_INFO *req_info,
ST_CHAR **ptr, ST_BOOLEAN *moreFollowsOut,
ST_INT maxNames)
{
/* Get all the names. */
return (getLocalObjectNames ((MVL_OBJ **) mvl_vmd.dom_tbl, mvl_vmd.num_dom,
req_info, ptr, moreFollowsOut, maxNames));
}
#endif /* default */
/************************************************************************/
/************************************************************************/
ST_INT u_gnl_ind_jous (MVL_NET_INFO *net_info, NAMELIST_REQ_INFO *req_info,
ST_CHAR **ptr, ST_BOOLEAN *moreFollowsOut,
ST_INT maxNames)
{
ST_INT num_obj;
MVL_AA_OBJ_CTRL *aa;
MVL_DOM_CTRL *dom;
MVL_JOURNAL_CTRL **jou;
/* First get the number of objects and pointer to the object table */
num_obj = 0;
jou = NULL;
switch (req_info->objscope)
{
case VMD_SPEC:
num_obj = mvl_vmd.num_jou;
jou = mvl_vmd.jou_tbl;
break;
case AA_SPEC:
aa = (MVL_AA_OBJ_CTRL *) net_info->aa_objs;
if (aa)
{
num_obj = aa->num_jou;
jou = aa->jou_tbl;
}
break;
case DOM_SPEC:
dom = mvl_vmd_find_dom (&mvl_vmd, req_info->dname);
if (dom)
{
num_obj = dom->num_jou;
jou = dom->jou_tbl;
}
else
{
MVL_LOG_NERR1 ("GetNameList NVL Journal: Domain '%s' not found", req_info->dname);
*moreFollowsOut = SD_FALSE;
return (-1); /* error. This triggers error response */
}
break;
default:
*moreFollowsOut = SD_FALSE;
return (-1); /* error. This triggers error response */
}
/* Get all the names. */
if (num_obj)
return (getLocalObjectNames ((MVL_OBJ **) jou, num_obj,
req_info, ptr, moreFollowsOut, maxNames));
return (0);
}
/************************************************************************/
/* getLocalObjectNames */
/* Find index into array of pointers for name AFTER continue_after name.*/
/************************************************************************/
static ST_INT getLocalObjectNames (MVL_OBJ ** obj_tbl,
ST_INT num_obj,
NAMELIST_REQ_INFO *req_info,
ST_CHAR **ptr, /* array of ptrs to names*/
ST_BOOLEAN *moreFollowsOut,
ST_INT maxNames) /* max # of names */
{
ST_INT obj_index; /* index to array of objects */
ST_INT name_index; /* index to array of names */
MVL_OBJ **key;
if (req_info->cont_after_pres)
{
key = mvl_obj_find_key (obj_tbl, num_obj, req_info->continue_after);
if (key)
obj_index = key - obj_tbl + 1; /* index to next one (i.e. + 1).*/
else
{
MVL_LOG_ERR1 ("GetNameList Error: continue after name '%s' not found",
req_info->continue_after);
obj_index = num_obj; /* Treat as if there are no more objects.*/
}
}
else
obj_index = 0; /* No continue_after. Start with first entry. */
/* Now make the list for the response */
for (name_index = 0; name_index < maxNames && obj_index < num_obj;
++obj_index, ++name_index)
ptr[name_index] = obj_tbl[obj_index]->name;
if (obj_index < num_obj)
*moreFollowsOut = SD_TRUE;
return (name_index);
}