/************************************************************************/ /* 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); }