756 lines
25 KiB
C
756 lines
25 KiB
C
/************************************************************************/
|
|
/* SISCO SOFTWARE MODULE HEADER *****************************************/
|
|
/************************************************************************/
|
|
/* (c) Copyright Systems Integration Specialists Company, Inc., */
|
|
/* 1999 - 2002, All Rights Reserved */
|
|
/* */
|
|
/* MODULE NAME : mvl_objb.c */
|
|
/* PRODUCT(S) : MMSEASE-LITE */
|
|
/* */
|
|
/* MODULE DESCRIPTION : */
|
|
/* Functions for maintaining arrays of "generic objects" */
|
|
/* using "bsearch". */
|
|
/* */
|
|
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
|
|
/* mvl_obj_insert */
|
|
/* mvl_obj_delete */
|
|
/* mvl_obj_find */
|
|
/* mvl_obj_find_key */
|
|
/* mvl_vmd_dom_insert */
|
|
/* mvl_vmd_var_insert */
|
|
/* mvl_vmd_nvl_insert */
|
|
/* mvl_vmd_jou_insert */
|
|
/* mvl_vmd_dom_delete */
|
|
/* mvl_vmd_var_delete */
|
|
/* mvl_vmd_nvl_delete */
|
|
/* mvl_vmd_jou_delete */
|
|
/* mvl_vmd_find_dom */
|
|
/* mvl_vmd_find_var */
|
|
/* mvl_vmd_find_nvl */
|
|
/* mvl_vmd_find_jou */
|
|
/* mvl_vmd_dom_find_last */
|
|
/* */
|
|
/* MODIFICATION LOG : */
|
|
/* Date Who Rev Comments */
|
|
/* -------- --- ------ ------------------------------------------- */
|
|
/* 02/01/07 JRB 14 Fix function names in module header. */
|
|
/* 10/30/06 JRB 13 Add vmd_ctrl arg to several functions & chg */
|
|
/* prefix from "mvl_" to "mvl_vmd_". */
|
|
/* Also add net_info arg to "mvl_vmd_find_*" */
|
|
/* so global _mvl_curr_net_info not needed. */
|
|
/* Move all obj delete functs from mvl_obj.c to here.*/
|
|
/* 01/30/06 GLB 12 Integrated porting changes for VMS */
|
|
/* 04/11/05 CRM 11 Added mvl_dom_find_last */
|
|
/* 11/11/04 MDE 10 Check for 0 elements before calling bsearch */
|
|
/* 01/23/02 EJV 09 Added journals to domain: */
|
|
/* mvl_jou_insert - added DOM_SPEC case */
|
|
/* mvl_find_jou - added DOM_SPEC case */
|
|
/* mvl_sort_objs - added qsort dom->jou_tbl */
|
|
/* 04/14/00 JRB 08 Move sort & compare code FROM mvl_obj.c to */
|
|
/* here and make it ANSI compatible. */
|
|
/* 04/10/00 JRB 07 Fix usage of bsearch to be ANSI compatible. */
|
|
/* 09/15/99 JRB 06 Move mvl_obj_nosort here for DOS link */
|
|
/* 09/13/99 MDE 05 Added SD_CONST modifiers */
|
|
/* 09/07/99 MDE 04 Changed MVL_VA_SCOPE to MVL_SCOPE, added */
|
|
/* scope to MVL_NVLIST_CTRL */
|
|
/* 04/07/99 MDE 03 Logging improvements */
|
|
/* 03/18/99 MDE 02 Enhanced dynamic object facilities */
|
|
/* 01/15/99 JRB 01 Created */
|
|
/************************************************************************/
|
|
#include "glbtypes.h"
|
|
#include "sysincs.h"
|
|
#include "mvl_defs.h"
|
|
#include "mvl_log.h"
|
|
|
|
|
|
/************************************************************************/
|
|
/* 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
|
|
|
|
ST_BOOLEAN mvl_obj_nosort;
|
|
|
|
/************************************************************************/
|
|
/* Local functions. */
|
|
/************************************************************************/
|
|
int _mvl_obj_compare (const void *obj1, const void *obj2);
|
|
|
|
/************************************************************************/
|
|
/* Static variables. */
|
|
/************************************************************************/
|
|
/* NONE */
|
|
|
|
/************************************************************************/
|
|
/* mvl_obj_insert */
|
|
/* NOTE: newElement should point to a "real" structure that has already */
|
|
/* been allocated. This allows this function to work without */
|
|
/* caring about the size of the "real" structure. */
|
|
/* This function just adds the ptr to the array of ptrs. */
|
|
/************************************************************************/
|
|
|
|
ST_RET mvl_obj_insert (MVL_OBJ **elementTable,
|
|
ST_INT *numElement,
|
|
ST_INT maxElement,
|
|
MVL_OBJ *newElement)
|
|
{
|
|
MVL_OBJ **key;
|
|
|
|
if (*numElement >= maxElement)
|
|
{
|
|
MVL_LOG_ERR2 ("ERROR inserting '%s' object. Max num %d exceeded.",
|
|
newElement->name, maxElement);
|
|
return (SD_FAILURE); /* No more room in array. */
|
|
}
|
|
|
|
/* Check to see if we are bulk updating, and put at end if so */
|
|
if (mvl_obj_nosort || (*numElement == 0))
|
|
{
|
|
elementTable [(*numElement)++] = newElement; /* Add to end of array */
|
|
}
|
|
else
|
|
{
|
|
/* Make sure it's not already in array. Can't have duplicates. */
|
|
if (*numElement)
|
|
key = (MVL_OBJ **) bsearch (&newElement, elementTable, *numElement,
|
|
sizeof (MVL_OBJ *), _mvl_obj_compare);
|
|
else
|
|
key = NULL;
|
|
|
|
if (key != NULL)
|
|
{
|
|
MVL_LOG_ERR1 ("ERROR inserting '%s' object. Duplicate.",
|
|
newElement->name);
|
|
return (SD_FAILURE); /* Already in array. */
|
|
}
|
|
/* Add to array and resort. */
|
|
elementTable [(*numElement)++] = newElement; /* Add to end of array */
|
|
qsort (elementTable, *numElement, sizeof (MVL_OBJ *), _mvl_obj_compare);
|
|
}
|
|
|
|
return (SD_SUCCESS);
|
|
}
|
|
|
|
|
|
/************************************************************************/
|
|
/* mvl_obj_delete */
|
|
/************************************************************************/
|
|
|
|
MVL_OBJ *mvl_obj_delete (MVL_OBJ **elementTable,
|
|
ST_INT *numElement,
|
|
ST_CHAR *itemName)
|
|
{
|
|
MVL_OBJ *el;
|
|
MVL_OBJ **foundElement;
|
|
MVL_OBJ **destElement;
|
|
MVL_OBJ **endElement;
|
|
|
|
/* Locate the element of interest. We get a pointer into the array of */
|
|
/* element pointers if it is found. */
|
|
|
|
foundElement = mvl_obj_find_key (elementTable, *numElement, itemName);
|
|
if (!foundElement)
|
|
return (NULL);
|
|
el = *foundElement;
|
|
|
|
/* OK, now just move up the remaining pointers */
|
|
/* Array was sorted before, so it will still be sorted. */
|
|
destElement = foundElement;
|
|
endElement = elementTable + *numElement;
|
|
while (++destElement < endElement)
|
|
*(destElement-1) = *destElement;
|
|
|
|
--(*numElement);
|
|
|
|
/* Return the element for further work */
|
|
return (el);
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* mvl_obj_find */
|
|
/* This function is used to locate an element that is referenced in a */
|
|
/* sorted table of element pointers. */
|
|
/************************************************************************/
|
|
|
|
MVL_OBJ *mvl_obj_find (MVL_OBJ **elementTable,
|
|
ST_INT numElement,
|
|
ST_CHAR *itemName)
|
|
{
|
|
MVL_OBJ **key;
|
|
|
|
/* First find just the "key". */
|
|
key = mvl_obj_find_key (elementTable, numElement, itemName);
|
|
|
|
/* If key != NULL, return "*key", else return NULL. */
|
|
if (key) /* "key" is pointer to pointer to structure. */
|
|
return (*key); /* "*key" is pointer to structure. */
|
|
|
|
return (NULL); /* Not found!! */
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* mvl_obj_find_key */
|
|
/* This function is used to locate an element that is referenced in a */
|
|
/* sorted table of element pointers. */
|
|
/* This function only finds the key. Convenient for delete function. */
|
|
/************************************************************************/
|
|
|
|
MVL_OBJ **mvl_obj_find_key (MVL_OBJ **elementTable,
|
|
ST_INT numElement,
|
|
ST_CHAR *itemName)
|
|
{
|
|
MVL_OBJ **key;
|
|
MVL_OBJ TmpObj; /* Temporary object to search for. */
|
|
MVL_OBJ *pTmpObj; /* ptr to temp object. */
|
|
|
|
if (numElement == 0)
|
|
return (NULL);
|
|
|
|
/* Create a element from the itemName, such that a pointer to the */
|
|
/* element pointer can be passed to the search function. */
|
|
TmpObj.name = itemName;
|
|
pTmpObj = &TmpObj;
|
|
|
|
if (numElement)
|
|
key = (MVL_OBJ **) bsearch (&pTmpObj, elementTable, numElement,
|
|
sizeof (MVL_OBJ *), _mvl_obj_compare);
|
|
else
|
|
key = NULL;
|
|
|
|
return (key);
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* mvl_vmd_dom_insert */
|
|
/************************************************************************/
|
|
ST_RET mvl_vmd_dom_insert (MVL_VMD_CTRL *vmd_ctrl, MVL_DOM_CTRL *dom)
|
|
{
|
|
/* Domain can only be VMD_SPEC, so this one is easy. */
|
|
return (mvl_obj_insert ((MVL_OBJ **) vmd_ctrl->dom_tbl,
|
|
&vmd_ctrl->num_dom, vmd_ctrl->max_num_dom,
|
|
(MVL_OBJ *) dom));
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* mvl_vmd_var_insert */
|
|
/************************************************************************/
|
|
ST_RET mvl_vmd_var_insert (MVL_VMD_CTRL *vmd_ctrl, MVL_VAR_ASSOC *va, OBJECT_NAME *obj,
|
|
MVL_NET_INFO *net_info) /* Only used if AA_SPEC */
|
|
{
|
|
ST_RET retcode = SD_FAILURE;
|
|
MVL_DOM_CTRL *dom;
|
|
MVL_AA_OBJ_CTRL *aa_objs;
|
|
|
|
switch (obj->object_tag)
|
|
{
|
|
case VMD_SPEC:
|
|
retcode = mvl_obj_insert ((MVL_OBJ **) vmd_ctrl->var_assoc_tbl,
|
|
&vmd_ctrl->num_var_assoc, vmd_ctrl->max_num_var_assoc,
|
|
(MVL_OBJ *) va);
|
|
break;
|
|
|
|
case DOM_SPEC:
|
|
if ((dom = mvl_vmd_find_dom (vmd_ctrl, obj->domain_id)))
|
|
retcode = mvl_obj_insert ((MVL_OBJ **) dom->var_assoc_tbl,
|
|
&dom->num_var_assoc, dom->max_num_var_assoc,
|
|
(MVL_OBJ *) va);
|
|
else
|
|
{
|
|
MVL_LOG_NERR1 ("Insert var: Domain '%s' not found", obj->domain_id);
|
|
}
|
|
break;
|
|
|
|
case AA_SPEC:
|
|
if (net_info)
|
|
{
|
|
aa_objs = net_info->aa_objs;
|
|
retcode = mvl_obj_insert ((MVL_OBJ **) aa_objs->var_assoc_tbl,
|
|
&aa_objs->num_var_assoc, aa_objs->max_num_var_assoc,
|
|
(MVL_OBJ *) va);
|
|
}
|
|
else
|
|
MVL_LOG_ERR0 ("Association not known. Cannot insert Application Association-specific variable.");
|
|
break;
|
|
|
|
default:
|
|
MVL_LOG_ERR1 ("Illegal scope for '%s'", obj->obj_name.vmd_spec);
|
|
break;
|
|
}
|
|
return (retcode);
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* mvl_vmd_nvl_insert */
|
|
/************************************************************************/
|
|
ST_RET mvl_vmd_nvl_insert (MVL_VMD_CTRL *vmd_ctrl, MVL_NVLIST_CTRL *nvl, OBJECT_NAME *obj,
|
|
MVL_NET_INFO *net_info) /* Only used if AA_SPEC */
|
|
{
|
|
ST_RET retcode = SD_FAILURE;
|
|
MVL_DOM_CTRL *dom;
|
|
MVL_AA_OBJ_CTRL *aa_objs;
|
|
|
|
switch (obj->object_tag)
|
|
{
|
|
case VMD_SPEC:
|
|
retcode = mvl_obj_insert ((MVL_OBJ **) vmd_ctrl->nvlist_tbl,
|
|
&vmd_ctrl->num_nvlist, vmd_ctrl->max_num_nvlist,
|
|
(MVL_OBJ *) nvl);
|
|
nvl->nvl_scope.scope = VMD_SPEC;
|
|
break;
|
|
|
|
case DOM_SPEC:
|
|
if ((dom = mvl_vmd_find_dom (vmd_ctrl, obj->domain_id)))
|
|
retcode = mvl_obj_insert ((MVL_OBJ **) dom->nvlist_tbl,
|
|
&dom->num_nvlist, dom->max_num_nvlist,
|
|
(MVL_OBJ *) nvl);
|
|
else
|
|
{
|
|
MVL_LOG_NERR1 ("Insert NVL: Domain '%s' not found", obj->domain_id);
|
|
}
|
|
nvl->nvl_scope.scope = DOM_SPEC;
|
|
nvl->nvl_scope.dom = dom;
|
|
break;
|
|
|
|
case AA_SPEC:
|
|
if (net_info)
|
|
{
|
|
aa_objs = net_info->aa_objs;
|
|
retcode = mvl_obj_insert ((MVL_OBJ **) aa_objs->nvlist_tbl,
|
|
&aa_objs->num_nvlist, aa_objs->max_num_nvlist,
|
|
(MVL_OBJ *) nvl);
|
|
nvl->nvl_scope.scope = AA_SPEC;
|
|
}
|
|
else
|
|
MVL_LOG_ERR0 ("Association not known. Cannot insert Application Association-specific NVL.");
|
|
break;
|
|
|
|
default:
|
|
MVL_LOG_ERR1 ("Illegal scope for '%s'", obj->obj_name.vmd_spec);
|
|
break;
|
|
}
|
|
return (retcode);
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* mvl_vmd_jou_insert */
|
|
/************************************************************************/
|
|
ST_RET mvl_vmd_jou_insert (MVL_VMD_CTRL *vmd_ctrl, MVL_JOURNAL_CTRL *jou, OBJECT_NAME *obj,
|
|
MVL_NET_INFO *net_info) /* Only used if AA_SPEC */
|
|
{
|
|
ST_RET retcode = SD_FAILURE;
|
|
MVL_AA_OBJ_CTRL *aa_objs;
|
|
MVL_DOM_CTRL *dom;
|
|
|
|
switch (obj->object_tag)
|
|
{
|
|
case VMD_SPEC:
|
|
retcode = mvl_obj_insert ((MVL_OBJ **) vmd_ctrl->jou_tbl,
|
|
&vmd_ctrl->num_jou, vmd_ctrl->max_num_jou,
|
|
(MVL_OBJ *) jou);
|
|
break;
|
|
|
|
case AA_SPEC:
|
|
if (net_info)
|
|
{
|
|
aa_objs = net_info->aa_objs;
|
|
retcode = mvl_obj_insert ((MVL_OBJ **) aa_objs->jou_tbl,
|
|
&aa_objs->num_jou, aa_objs->max_num_jou,
|
|
(MVL_OBJ *) jou);
|
|
}
|
|
else
|
|
MVL_LOG_ERR0 ("Association not known. Cannot insert Application Association-specific journal.");
|
|
break;
|
|
|
|
case DOM_SPEC:
|
|
dom = mvl_vmd_find_dom (vmd_ctrl, obj->domain_id);
|
|
if (dom)
|
|
retcode = mvl_obj_insert ((MVL_OBJ **) dom->jou_tbl,
|
|
&dom->num_jou, dom->max_num_jou, (MVL_OBJ *) jou);
|
|
else
|
|
{
|
|
MVL_LOG_NERR1 ("Insert journal: Domain '%s' not found", obj->domain_id);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
/* NOTE: DOM_SPEC illegal for journals. */
|
|
MVL_LOG_ERR1 ("Illegal scope for '%s'", obj->obj_name.vmd_spec);
|
|
break;
|
|
}
|
|
return (retcode);
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* mvl_vmd_dom_delete */
|
|
/************************************************************************/
|
|
MVL_DOM_CTRL *mvl_vmd_dom_delete (MVL_VMD_CTRL *vmd_ctrl, ST_CHAR *dom_name)
|
|
{
|
|
MVL_DOM_CTRL *dom;
|
|
|
|
dom = (MVL_DOM_CTRL *) mvl_obj_delete ((MVL_OBJ **) vmd_ctrl->dom_tbl,
|
|
&vmd_ctrl->num_dom, dom_name);
|
|
return (dom);
|
|
}
|
|
|
|
|
|
/************************************************************************/
|
|
/* mvl_vmd_var_delete */
|
|
/************************************************************************/
|
|
MVL_VAR_ASSOC *mvl_vmd_var_delete (MVL_VMD_CTRL *vmd_ctrl, OBJECT_NAME *obj,
|
|
MVL_NET_INFO *net_info) /* Only used if AA_SPEC */
|
|
{
|
|
MVL_VAR_ASSOC *va;
|
|
MVL_DOM_CTRL *dom;
|
|
MVL_AA_OBJ_CTRL *aa_objs;
|
|
ST_CHAR *name;
|
|
|
|
va = NULL;
|
|
name = obj->obj_name.vmd_spec; /* We know this is a union ... */
|
|
switch (obj->object_tag)
|
|
{
|
|
case VMD_SPEC:
|
|
va = (MVL_VAR_ASSOC *) mvl_obj_delete ((MVL_OBJ **) vmd_ctrl->var_assoc_tbl,
|
|
&vmd_ctrl->num_var_assoc, name);
|
|
break;
|
|
|
|
case DOM_SPEC:
|
|
if ((dom = mvl_vmd_find_dom (vmd_ctrl, obj->domain_id)))
|
|
va = (MVL_VAR_ASSOC *) mvl_obj_delete ((MVL_OBJ **) dom->var_assoc_tbl,
|
|
&dom->num_var_assoc, name);
|
|
else
|
|
{
|
|
MVL_LOG_NERR1 ("Delete var: Domain '%s' not found", obj->domain_id);
|
|
}
|
|
break;
|
|
|
|
case AA_SPEC:
|
|
if (net_info)
|
|
{
|
|
aa_objs = net_info->aa_objs;
|
|
va = (MVL_VAR_ASSOC *) mvl_obj_delete ((MVL_OBJ **) aa_objs->var_assoc_tbl,
|
|
&aa_objs->num_var_assoc, name);
|
|
}
|
|
else
|
|
MVL_LOG_ERR0 ("Association not known. Cannot delete Application Association-specific variable.");
|
|
break;
|
|
|
|
default:
|
|
MVL_LOG_ERR1 ("Illegal scope for '%s'", name);
|
|
break;
|
|
}
|
|
return (va);
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* mvl_vmd_nvl_delete */
|
|
/************************************************************************/
|
|
MVL_NVLIST_CTRL *mvl_vmd_nvl_delete (MVL_VMD_CTRL *vmd_ctrl, OBJECT_NAME *obj,
|
|
MVL_NET_INFO *net_info) /* Only used if AA_SPEC */
|
|
{
|
|
MVL_NVLIST_CTRL *nvl = NULL;
|
|
MVL_DOM_CTRL *dom;
|
|
MVL_AA_OBJ_CTRL *aa_objs;
|
|
ST_CHAR *name;
|
|
|
|
name = obj->obj_name.vmd_spec; /* We know this is a union ... */
|
|
|
|
switch (obj->object_tag)
|
|
{
|
|
case VMD_SPEC:
|
|
nvl = (MVL_NVLIST_CTRL *) mvl_obj_delete ((MVL_OBJ **) vmd_ctrl->nvlist_tbl,
|
|
&vmd_ctrl->num_nvlist, name);
|
|
break;
|
|
|
|
case DOM_SPEC:
|
|
if ((dom = mvl_vmd_find_dom (vmd_ctrl, obj->domain_id)))
|
|
nvl = (MVL_NVLIST_CTRL *) mvl_obj_delete ((MVL_OBJ **) dom->nvlist_tbl,
|
|
&dom->num_nvlist, name);
|
|
else
|
|
{
|
|
MVL_LOG_NERR1 ("Delete NVL: Domain '%s' not found", obj->domain_id);
|
|
}
|
|
break;
|
|
|
|
case AA_SPEC:
|
|
if (net_info)
|
|
{
|
|
aa_objs = net_info->aa_objs;
|
|
nvl = (MVL_NVLIST_CTRL *) mvl_obj_delete ((MVL_OBJ **) aa_objs->nvlist_tbl,
|
|
&aa_objs->num_nvlist, name);
|
|
}
|
|
else
|
|
MVL_LOG_ERR0 ("Association not known. Cannot delete Application Association-specific NVL.");
|
|
break;
|
|
|
|
default:
|
|
MVL_LOG_ERR1 ("Illegal scope for '%s'", name);
|
|
break;
|
|
}
|
|
return (nvl);
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* mvl_vmd_jou_delete */
|
|
/************************************************************************/
|
|
MVL_JOURNAL_CTRL *mvl_vmd_jou_delete (MVL_VMD_CTRL *vmd_ctrl, OBJECT_NAME *obj,
|
|
MVL_NET_INFO *net_info) /* Only used if AA_SPEC */
|
|
{
|
|
MVL_JOURNAL_CTRL *jou;
|
|
MVL_AA_OBJ_CTRL *aa_objs;
|
|
MVL_DOM_CTRL *dom;
|
|
ST_CHAR *name;
|
|
|
|
jou = NULL;
|
|
name = obj->obj_name.vmd_spec; /* We know this is a union ... */
|
|
switch (obj->object_tag)
|
|
{
|
|
case VMD_SPEC:
|
|
jou = (MVL_JOURNAL_CTRL *) mvl_obj_delete ((MVL_OBJ **) vmd_ctrl->jou_tbl,
|
|
&vmd_ctrl->num_jou, name);
|
|
break;
|
|
|
|
case AA_SPEC:
|
|
if (net_info)
|
|
{
|
|
aa_objs = net_info->aa_objs;
|
|
jou = (MVL_JOURNAL_CTRL *) mvl_obj_delete ((MVL_OBJ **) aa_objs->jou_tbl,
|
|
&aa_objs->num_jou, name);
|
|
}
|
|
else
|
|
MVL_LOG_ERR0 ("Association not known. Cannot delete Application Association-specific journal.");
|
|
break;
|
|
|
|
case DOM_SPEC:
|
|
dom = mvl_vmd_find_dom (vmd_ctrl, obj->domain_id);
|
|
if (dom)
|
|
jou = (MVL_JOURNAL_CTRL *) mvl_obj_delete ((MVL_OBJ **) dom->jou_tbl,
|
|
&dom->num_jou, name);
|
|
else
|
|
{
|
|
MVL_LOG_NERR1 ("Delete journal: Domain '%s' not found", obj->domain_id);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
MVL_LOG_ERR1 ("Illegal scope for '%s'", name);
|
|
break;
|
|
}
|
|
return (jou);
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* mvl_vmd_find_dom */
|
|
/************************************************************************/
|
|
|
|
MVL_DOM_CTRL *mvl_vmd_find_dom (MVL_VMD_CTRL *vmd_ctrl, ST_CHAR *name)
|
|
{
|
|
MVL_DOM_CTRL *result;
|
|
|
|
result = (MVL_DOM_CTRL *) mvl_obj_find ((MVL_OBJ **) vmd_ctrl->dom_tbl,
|
|
vmd_ctrl->num_dom, name);
|
|
return(result);
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* mvl_vmd_dom_find_last */
|
|
/* Find the last domain. */
|
|
/************************************************************************/
|
|
MVL_DOM_CTRL *mvl_vmd_dom_find_last (MVL_VMD_CTRL *vmd_ctrl)
|
|
{
|
|
MVL_DOM_CTRL *dom;
|
|
|
|
if (vmd_ctrl->num_dom > 0)
|
|
dom = vmd_ctrl->dom_tbl [vmd_ctrl->num_dom-1];
|
|
else
|
|
dom = NULL; /* no more dynamically created domains. */
|
|
return (dom);
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* mvl_vmd_find_var */
|
|
/* This function finds the 'variable association' for a particular var */
|
|
/* name. */
|
|
/************************************************************************/
|
|
|
|
MVL_VAR_ASSOC *mvl_vmd_find_var (MVL_VMD_CTRL *vmd_ctrl,
|
|
OBJECT_NAME *obj,
|
|
MVL_NET_INFO *net_info) /* Only used if AA_SPEC */
|
|
{
|
|
MVL_DOM_CTRL *dom;
|
|
MVL_AA_OBJ_CTRL *aa;
|
|
ST_CHAR *name;
|
|
|
|
name = obj->obj_name.vmd_spec; /* We know this is a union ... */
|
|
|
|
switch (obj->object_tag)
|
|
{
|
|
case VMD_SPEC :
|
|
return ((MVL_VAR_ASSOC *) mvl_obj_find ((MVL_OBJ **) vmd_ctrl->var_assoc_tbl,
|
|
vmd_ctrl->num_var_assoc, name));
|
|
case DOM_SPEC :
|
|
dom = mvl_vmd_find_dom (vmd_ctrl, obj->domain_id);
|
|
if (dom)
|
|
return ((MVL_VAR_ASSOC *) mvl_obj_find ((MVL_OBJ **) dom->var_assoc_tbl,
|
|
dom->num_var_assoc, name));
|
|
else
|
|
{
|
|
MVL_LOG_NERR1 ("Find Va: Domain '%s' not found", obj->domain_id);
|
|
}
|
|
break;
|
|
|
|
case AA_SPEC :
|
|
if (net_info)
|
|
{
|
|
aa = (MVL_AA_OBJ_CTRL *) net_info->aa_objs;
|
|
return ((MVL_VAR_ASSOC *) mvl_obj_find ((MVL_OBJ **) aa->var_assoc_tbl,
|
|
aa->num_var_assoc, name));
|
|
}
|
|
else
|
|
MVL_LOG_ERR0 ("Association not known. Cannot find Application Association-specific variable.");
|
|
break;
|
|
|
|
default:
|
|
MVL_LOG_ERR1 ("Illegal scope for '%s'", name);
|
|
break;
|
|
}
|
|
return (NULL);
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* mvl_vmd_find_nvl */
|
|
/************************************************************************/
|
|
|
|
MVL_NVLIST_CTRL *mvl_vmd_find_nvl (MVL_VMD_CTRL *vmd_ctrl,
|
|
OBJECT_NAME *obj,
|
|
MVL_NET_INFO *net_info) /* Only used if AA_SPEC */
|
|
{
|
|
MVL_DOM_CTRL *dom;
|
|
MVL_AA_OBJ_CTRL *aa;
|
|
ST_CHAR *name;
|
|
|
|
/* Get the NVL name. We know this is a union ... */
|
|
name = obj->obj_name.vmd_spec;
|
|
|
|
switch (obj->object_tag)
|
|
{
|
|
case VMD_SPEC :
|
|
return ((MVL_NVLIST_CTRL *) mvl_obj_find ((MVL_OBJ **) vmd_ctrl->nvlist_tbl,
|
|
vmd_ctrl->num_nvlist, name));
|
|
case DOM_SPEC :
|
|
dom = mvl_vmd_find_dom (vmd_ctrl, obj->domain_id);
|
|
if (dom)
|
|
return ((MVL_NVLIST_CTRL *) mvl_obj_find ((MVL_OBJ **) dom->nvlist_tbl,
|
|
dom->num_nvlist, name));
|
|
else
|
|
{
|
|
MVL_LOG_NERR1 ("Find NVL: Domain '%s' not found", obj->domain_id);
|
|
}
|
|
break;
|
|
|
|
case AA_SPEC :
|
|
if (net_info)
|
|
{
|
|
aa = (MVL_AA_OBJ_CTRL *) net_info->aa_objs;
|
|
return ((MVL_NVLIST_CTRL *) mvl_obj_find ((MVL_OBJ **) aa->nvlist_tbl,
|
|
aa->num_nvlist, name));
|
|
}
|
|
else
|
|
MVL_LOG_ERR0 ("Association not known. Cannot find Application Association-specific NVL.");
|
|
break;
|
|
|
|
default:
|
|
MVL_LOG_ERR1 ("Illegal scope for '%s'", name);
|
|
break;
|
|
}
|
|
return (NULL);
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* mvl_vmd_find_jou */
|
|
/* This function finds the 'journal control' corresponding to 'obj'. */
|
|
/************************************************************************/
|
|
|
|
MVL_JOURNAL_CTRL *mvl_vmd_find_jou (MVL_VMD_CTRL *vmd_ctrl,
|
|
OBJECT_NAME *obj,
|
|
MVL_NET_INFO *net_info) /* Only used if AA_SPEC */
|
|
{
|
|
MVL_AA_OBJ_CTRL *aa_objs;
|
|
MVL_DOM_CTRL *dom;
|
|
ST_CHAR *name;
|
|
|
|
name = obj->obj_name.vmd_spec; /* We know this is a union ... */
|
|
|
|
switch (obj->object_tag)
|
|
{
|
|
case VMD_SPEC :
|
|
return ((MVL_JOURNAL_CTRL *) mvl_obj_find ((MVL_OBJ **) vmd_ctrl->jou_tbl,
|
|
vmd_ctrl->num_jou, name));
|
|
break;
|
|
|
|
case AA_SPEC :
|
|
if (net_info)
|
|
{
|
|
aa_objs = (MVL_AA_OBJ_CTRL *) net_info->aa_objs;
|
|
return ((MVL_JOURNAL_CTRL *) mvl_obj_find ((MVL_OBJ **) aa_objs->jou_tbl,
|
|
aa_objs->num_jou, name));
|
|
}
|
|
else
|
|
MVL_LOG_ERR0 ("Association not known. Cannot find Application Association-specific journal.");
|
|
break;
|
|
|
|
case DOM_SPEC :
|
|
dom = mvl_vmd_find_dom (vmd_ctrl, obj->domain_id);
|
|
if (dom)
|
|
return ((MVL_JOURNAL_CTRL *) mvl_obj_find ((MVL_OBJ **) dom->jou_tbl,
|
|
dom->num_jou, name));
|
|
else
|
|
{
|
|
MVL_LOG_NERR1 ("Find journal: Domain '%s' not found", obj->domain_id);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
/* NOTE: DOM_SPEC is illegal for Journals. */
|
|
MVL_LOG_ERR1 ("Illegal scope for '%s'", name);
|
|
break;
|
|
}
|
|
return (NULL);
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* mvl_sort_objs */
|
|
/************************************************************************/
|
|
ST_VOID mvl_sort_objs (ST_VOID)
|
|
{
|
|
ST_INT i;
|
|
MVL_DOM_CTRL *dom;
|
|
|
|
mvl_obj_nosort = SD_FALSE;
|
|
|
|
qsort (mvl_vmd.dom_tbl, mvl_vmd.num_dom, sizeof (MVL_OBJ *), _mvl_obj_compare);
|
|
qsort (mvl_vmd.var_assoc_tbl, mvl_vmd.num_var_assoc, sizeof (MVL_OBJ *), _mvl_obj_compare);
|
|
qsort (mvl_vmd.nvlist_tbl, mvl_vmd.num_nvlist, sizeof (MVL_OBJ *), _mvl_obj_compare);
|
|
qsort (mvl_vmd.jou_tbl, mvl_vmd.num_jou, sizeof (MVL_OBJ *), _mvl_obj_compare);
|
|
|
|
for (i = 0; i < mvl_vmd.num_dom; ++i)
|
|
{
|
|
dom = mvl_vmd.dom_tbl[i];
|
|
qsort (dom->var_assoc_tbl, dom->num_var_assoc, sizeof (MVL_OBJ *), _mvl_obj_compare);
|
|
qsort (dom->nvlist_tbl, dom->num_nvlist, sizeof (MVL_OBJ *), _mvl_obj_compare);
|
|
qsort (dom->jou_tbl, dom->num_jou, sizeof (MVL_OBJ *), _mvl_obj_compare);
|
|
}
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* _mvl_obj_compare */
|
|
/************************************************************************/
|
|
int _mvl_obj_compare (const void *obj1, const void *obj2)
|
|
{
|
|
const MVL_OBJ **mvl_obj1 = (const MVL_OBJ **) obj1;
|
|
const MVL_OBJ **mvl_obj2 = (const MVL_OBJ **) obj2;
|
|
return (strcmp ((*mvl_obj1)->name, (*mvl_obj2)->name));
|
|
}
|