1272 lines
38 KiB
C
1272 lines
38 KiB
C
/************************************************************************/
|
|
/* SISCO SOFTWARE MODULE HEADER *****************************************/
|
|
/************************************************************************/
|
|
/* (c) Copyright Systems Integration Specialists Company, Inc., */
|
|
/* 1996-2002 All Rights Reserved */
|
|
/* */
|
|
/* MODULE NAME : lean_cfg.c */
|
|
/* PRODUCT(S) : Lean-T Stack */
|
|
/* */
|
|
/* MODULE DESCRIPTION : */
|
|
/* This module implements parsing of the Lean-T Stack */
|
|
/* configuration file. */
|
|
/* */
|
|
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
|
|
/* */
|
|
/* MODIFICATION LOG : */
|
|
/* Date Who Rev Comments */
|
|
/* -------- --- ------ ------------------------------------------- */
|
|
/* 06/27/02 JRB 28 Add tp0_sock.h. */
|
|
/* 06/20/02 JRB 27 Chg to use new netAddr union in PRES_ADDR. */
|
|
/* 07/17/00 JRB 26 Set DriverID only if TP4_ENABLED defined. */
|
|
/* 06/15/00 JRB 25 Set DriverID only if MOSI defined. */
|
|
/* 05/02/00 JRB 24 Added DriverID for WIN32. */
|
|
/* 01/25/00 MDE 23 Fixed compile problem for DEBUG version */
|
|
/* 12/10/99 JRB 22 Fix save_dib_table when AP Title or AE Qual */
|
|
/* NOT CONFIGURED or AP Title parse fails. */
|
|
/* Fix parseObjId for invalid data. */
|
|
/* 06/08/99 JRB 21 Chg max_num_conns to ST_UINT16. */
|
|
/* 09/18/98 JRB 20 Del all logging cfg. Use "log_cfg.c" instead.*/
|
|
/* 08/13/98 JRB 19 Lint cleanup. */
|
|
/* 08/06/98 JRB 18 Use new cfg_get_octet_string function & */
|
|
/* delete parseSelector. */
|
|
/* 06/19/98 JRB 17 Allow TP_TYPE_TPX for multiple stack support.*/
|
|
/* 03/11/98 JRB 16 Del "max_spdu_length" param from tp4c_kwtbl..*/
|
|
/* Add "rfc1006_keepalive" param to tp4c_kwtbl..*/
|
|
/* 02/16/98 JRB 15 Clean up some #ifs. */
|
|
/* 08/26/97 JRB 14 RFC1006 changes: */
|
|
/* - Use new DIB_ENTRY with embedded PRES_ADDR. */
|
|
/* - Include "lean_a.h" instead of "suicacse.h" */
|
|
/* - Add "rfc1006_*" params to "tp4c_kwtbl". */
|
|
/* - Add "tranport", "ip_addr" to "dibc_kwtbl.."*/
|
|
/* - If !TP4_ENABLED, ignore TP4/CLNP config */
|
|
/* - If TP0_ENABLED, save TP0 config */
|
|
/* - parseSelector: chg arg back to (ST_INT *) */
|
|
/* - parseSelector: don't ignore maxSelLen arg */
|
|
/* - parseObjId: add default "return" statement.*/
|
|
/* 07/09/97 JRB 13 Deleted obsolete clnp_err.h include. */
|
|
/* 05/27/97 JRB 7.00 MMSEASE 7.0 release. */
|
|
/* 03/03/97 EJV 12 Removed CLNP_LOG_ALWAYS */
|
|
/* 11/19/96 MDE 11 Now handle 0 dib entries w/o mem error */
|
|
/* 11/13/96 JRB 10 Don't init globals unless they are constant. */
|
|
/* 10/04/96 JRB 09 Add ak_delay to TP4 config. */
|
|
/* 10/04/96 JRB 08 Chg parseSelector arg to (ST_INT16 *). */
|
|
/* 10/04/96 JRB 07 Chg funct name to "save_loc_rem_dib_tables" */
|
|
/* and modify for reconfig. */
|
|
/* 10/04/96 JRB 06 Add init_dirser_called flag for reconfig. */
|
|
/* 10/04/96 JRB 05 If MCGW defined, don't config TP4, and add */
|
|
/* adlcAddr to DIB config. */
|
|
/* 09/04/96 EJV 04 Fixed keyword table (_ENC_ instead of _END_) */
|
|
/* 07/24/96 EJV 03 Combined CLNP, TP4 and DIB configuration */
|
|
/* files into one. */
|
|
/* 07/22/96 JRB 02 Fixed up names, etc. for Lean-T. */
|
|
/* 07/22/96 MDE 01 Created from rs_cfg.c */
|
|
/************************************************************************/
|
|
#ifdef DEBUG_SISCO
|
|
static char *thisFileName = __FILE__;
|
|
#endif
|
|
|
|
#include "glbtypes.h"
|
|
#include "sysincs.h"
|
|
#include "mem_chk.h"
|
|
#include "gen_list.h"
|
|
#include "cfg_util.h"
|
|
#include "cfglog.h"
|
|
|
|
|
|
#if defined (MCGW)
|
|
/* For the MCGW, the following global variables and function names */
|
|
/* are renamed by macro so they don't conflict with names in OSI SUIC. */
|
|
#define num_loc_dib_entries num_loc_dib_entries_clt7
|
|
#define num_rem_dib_entries num_rem_dib_entries_clt7
|
|
#define loc_dib_table loc_dib_table_clt7
|
|
#define rem_dib_table rem_dib_table_clt7
|
|
#define init_dirser init_dirser_clt7
|
|
#endif /* defined (MCGW) */
|
|
|
|
#include "clnp_usr.h"
|
|
#include "tp4api.h"
|
|
#include "tp0_sock.h" /* portable "sockets" interface */
|
|
#include "lean_a.h" /* DIB_ENTRY definition. */
|
|
#include "acse2log.h"
|
|
|
|
#if defined (_WIN32)
|
|
#include "ethsub.h"
|
|
#endif
|
|
|
|
/************************************************************************/
|
|
/* Local variables in this module */
|
|
/************************************************************************/
|
|
|
|
static ST_CHAR *cfg_file_name = "lean.cfg";
|
|
static ST_BOOLEAN init_dirser_called;
|
|
|
|
static ST_RET save_loc_rem_dib_tables (void);
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* Base configuration keyword table for major sections in cfg file. */
|
|
/* Functions and keyword tables related to parsing specific section */
|
|
/* are defined in respective part of this module. */
|
|
/*----------------------------------------------------------------------*/
|
|
static void clnpc_begin (void);
|
|
static void tp4c_begin (void);
|
|
static void dibc_begin (void);
|
|
|
|
static CFG_KW_EL cfg_base_kwtbl [] =
|
|
{
|
|
{"%Clnp_Begin", clnpc_begin, NULL },
|
|
#if !defined (MCGW)
|
|
{ "%Tp4_Begin", tp4c_begin, NULL },
|
|
#endif /* !defined (MCGW) */
|
|
{ "%Dib_Begin", dibc_begin, NULL },
|
|
{ NULL, NULL, NULL}
|
|
};
|
|
|
|
/************************************************************************/
|
|
/* init_dirser */
|
|
/*----------------------------------------------------------------------*/
|
|
/* This function will initialize the LEAN-T Stack parameters from */
|
|
/* configuration file. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* ST_VOID none */
|
|
/* */
|
|
/* Return: */
|
|
/* SD_SUCCESS (0) if configuration successful */
|
|
/* SD_FAILURE (1) otherwise */
|
|
/************************************************************************/
|
|
|
|
ST_RET init_dirser (ST_VOID)
|
|
{
|
|
ST_RET ret;
|
|
|
|
ret = SD_FAILURE;
|
|
|
|
/* This function will initialize the state table for reading the */
|
|
/* configuration file and parse the file until EOF or end flag is set */
|
|
|
|
/* Read the configuration file */
|
|
ret = cfg_process_file (cfg_file_name, cfg_base_kwtbl);
|
|
|
|
if (ret == SD_SUCCESS)
|
|
{
|
|
save_loc_rem_dib_tables ();
|
|
}
|
|
else
|
|
{
|
|
ST_UINT cfg_log_mask_save = cfg_log_mask;
|
|
|
|
/* parsing cfg file failed, turn on cfg logging and parse file again */
|
|
cfg_log_mask = CFG_LOG_ERR | CFG_LOG_FLOW;
|
|
cfg_process_file (cfg_file_name, cfg_base_kwtbl);
|
|
cfg_log_mask = cfg_log_mask_save;
|
|
}
|
|
|
|
/* Set flag to prevent reconfiguring of critical parameters. */
|
|
init_dirser_called = SD_TRUE;
|
|
return (ret);
|
|
}
|
|
|
|
|
|
/*======================================================================*/
|
|
/************************************************************************/
|
|
/*======================================================================*/
|
|
/* */
|
|
/* Functions and keyword tables for parsing the CLNP section */
|
|
/* from configuration file. */
|
|
/* */
|
|
/*======================================================================*/
|
|
/************************************************************************/
|
|
/*======================================================================*/
|
|
|
|
#if defined(_WIN32) && defined(MOSI) && defined(TP4_ENABLED)
|
|
static void clnpc_driverid (void);
|
|
#endif
|
|
static void clnpc_lifetime (void);
|
|
static void clnpc_lifetime_dec (void);
|
|
static void clnpc_cfg_timer (void);
|
|
static void clnpc_esh_delay (void);
|
|
static void clnpc_loc_mac (void);
|
|
static void clnpc_loc_nsap (void);
|
|
|
|
static void clnpc_end (void);
|
|
|
|
|
|
/* CLNP section keyword tables */
|
|
|
|
static CFG_KW_EL clnpc_kwtbl [] =
|
|
{
|
|
#if defined(_WIN32) && defined(MOSI) && defined(TP4_ENABLED)
|
|
{"DriverID", clnpc_driverid, NULL },
|
|
#endif
|
|
{"Lifetime", clnpc_lifetime, NULL },
|
|
{"Lifetime_Decrement", clnpc_lifetime_dec, NULL },
|
|
{"Cfg_Timer", clnpc_cfg_timer, NULL },
|
|
{"Esh_Delay", clnpc_esh_delay, NULL },
|
|
{"Local_MAC", clnpc_loc_mac, NULL },
|
|
{"Local_NSAP", clnpc_loc_nsap, NULL },
|
|
{"%Clnp_End", clnpc_end, NULL },
|
|
{ NULL, NULL, NULL}
|
|
};
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* clnpc_begin */
|
|
/* keyword '%Clnp_Begin' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void clnpc_begin (void)
|
|
{
|
|
if (cfg_tbl_push (clnpc_kwtbl) != SD_SUCCESS)
|
|
cfg_set_config_err ();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* clnpc_end */
|
|
/* keyword '%Clnp_End' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void clnpc_end (void)
|
|
{
|
|
if (cfg_tbl_pop (1) != SD_SUCCESS)
|
|
cfg_set_config_err ();
|
|
}
|
|
|
|
#if defined(_WIN32) && defined(MOSI) && defined(TP4_ENABLED)
|
|
/*----------------------------------------------------------------------*/
|
|
/* clnpc_driverid */
|
|
/* keyword 'driverid' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void clnpc_driverid (void)
|
|
{
|
|
ST_INT iVal;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_int (&iVal) == SD_SUCCESS)
|
|
{
|
|
DriverID = iVal;
|
|
}
|
|
else
|
|
cfg_set_config_err();
|
|
}
|
|
#endif /* _WIN32 && MOSI && TP4_ENALBED */
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* clnpc_lifetime */
|
|
/* keyword 'Lifetime' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void clnpc_lifetime (void)
|
|
{
|
|
ST_UINT16 sVal;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_ushort (&sVal) == SD_SUCCESS)
|
|
{
|
|
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
|
|
clnp_param.pdu_lifetime = (ST_UCHAR) sVal;
|
|
#endif /* TP4_ENABLED */
|
|
}
|
|
else
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* clnpc_lifetime_dec */
|
|
/* keyword 'Lifetime_Decrement' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void clnpc_lifetime_dec (void)
|
|
{
|
|
ST_UINT16 sVal;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_ushort (&sVal) == SD_SUCCESS)
|
|
{
|
|
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
|
|
clnp_param.pdu_lifetime_dec = (ST_UCHAR) sVal;
|
|
#endif /* TP4_ENABLED */
|
|
}
|
|
else
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* clnpc_cfg_timer */
|
|
/* keyword 'Cfg_Timer' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void clnpc_cfg_timer (void)
|
|
{
|
|
ST_UINT16 sVal;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_ushort (&sVal) == SD_SUCCESS)
|
|
{
|
|
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
|
|
clnp_param.esh_cfg_timer = sVal;
|
|
#endif /* TP4_ENABLED */
|
|
}
|
|
else
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* clnpc_esh_delay */
|
|
/* keyword 'Esh_Delay' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void clnpc_esh_delay (void)
|
|
{
|
|
ST_UINT16 sVal;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_ushort (&sVal) == SD_SUCCESS)
|
|
{
|
|
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
|
|
clnp_param.esh_delay = sVal;
|
|
#endif /* TP4_ENABLED */
|
|
}
|
|
else
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* clnpc_loc_mac */
|
|
/* keyword 'Local_MAC' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void clnpc_loc_mac (void)
|
|
{
|
|
#if defined (TP4_ENABLED)
|
|
ST_UINT mac_len;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_octet_string (clnp_param.loc_mac, &mac_len, CLNP_MAX_LEN_MAC))
|
|
cfg_set_config_err();
|
|
#else /* !TP4_ENABLED */
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
#endif /* !TP4_ENABLED */
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* clnpc_loc_nsap */
|
|
/* keyword 'Local_NSAP' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void clnpc_loc_nsap (void)
|
|
{
|
|
#if defined (TP4_ENABLED)
|
|
ST_UINT nsap_len;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_octet_string (&clnp_param.loc_nsap[1], &nsap_len, CLNP_MAX_LEN_NSAP)
|
|
== SD_SUCCESS)
|
|
{
|
|
if (nsap_len > 0)
|
|
clnp_param.loc_nsap[0] = (ST_UCHAR) nsap_len;
|
|
}
|
|
else
|
|
cfg_set_config_err();
|
|
#else /* !TP4_ENABLED */
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
#endif /* !TP4_ENABLED */
|
|
}
|
|
|
|
|
|
#if !defined (MCGW)
|
|
/*======================================================================*/
|
|
/************************************************************************/
|
|
/*======================================================================*/
|
|
/* */
|
|
/* Functions and keyword tables for parsing the TP4 section */
|
|
/* from configuration file. */
|
|
/* */
|
|
/*======================================================================*/
|
|
/************************************************************************/
|
|
/*======================================================================*/
|
|
|
|
static void tp4c_end (void);
|
|
|
|
static void tp4c_max_tpdu_len (void);
|
|
static void tp4c_max_rem_cdt (void);
|
|
static void tp4c_loc_cdt (void);
|
|
static void tp4c_max_num_conns (void);
|
|
static void tp4c_max_spdu_outst (void);
|
|
static void tp4c_window_time (void);
|
|
static void tp4c_inact_time (void);
|
|
static void tp4c_retrans_time (void);
|
|
static void tp4c_max_trans (void);
|
|
static void tp4c_ak_delay (void);
|
|
|
|
static void rfc1006_max_tpdu_len (void);
|
|
static void rfc1006_max_num_conns (void);
|
|
static void rfc1006_keepalive (void);
|
|
|
|
/* TP4 section keyword tables */
|
|
|
|
static CFG_KW_EL tp4c_kwtbl [] =
|
|
{
|
|
{"Max_Tpdu_Length", tp4c_max_tpdu_len, NULL },
|
|
{"Max_Remote_Cdt", tp4c_max_rem_cdt, NULL },
|
|
{"Local_Cdt", tp4c_loc_cdt, NULL },
|
|
{"Max_Num_Connections", tp4c_max_num_conns, NULL },
|
|
{"Max_Spdu_Outstanding", tp4c_max_spdu_outst, NULL },
|
|
{"Window_Time", tp4c_window_time, NULL },
|
|
{"Inactivity_Time", tp4c_inact_time, NULL },
|
|
{"Retransmission_Time", tp4c_retrans_time, NULL },
|
|
{"Max_Transmissions", tp4c_max_trans, NULL },
|
|
{"ak_delay", tp4c_ak_delay, NULL },
|
|
{"RFC1006_Max_Tpdu_Len", rfc1006_max_tpdu_len, NULL },
|
|
{"RFC1006_Max_Num_Conns", rfc1006_max_num_conns, NULL },
|
|
{"rfc1006_keepalive", rfc1006_keepalive, NULL },
|
|
{"%Tp4_End", tp4c_end, NULL },
|
|
{ NULL, NULL, NULL}
|
|
};
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* tp4c_begin */
|
|
/* keyword '%Tp4_Begin' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void tp4c_begin (void)
|
|
{
|
|
if (cfg_tbl_push (tp4c_kwtbl) != SD_SUCCESS)
|
|
cfg_set_config_err ();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* tp4c_end */
|
|
/* keyword '%Tp4_End' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void tp4c_end (void)
|
|
{
|
|
if (cfg_tbl_pop (1) != SD_SUCCESS)
|
|
cfg_set_config_err ();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* tp4c_max_tpdu_len */
|
|
/* keyword 'Max_Tpdu_Length' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void tp4c_max_tpdu_len (void)
|
|
{
|
|
ST_UINT16 sVal;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_ushort (&sVal) == SD_SUCCESS)
|
|
{
|
|
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
|
|
tp_cfg.max_tpdu_len = sVal;
|
|
#endif /* TP4_ENABLED */
|
|
}
|
|
else
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* tp4c_max_rem_cdt */
|
|
/* keyword 'Max_Remote_Cdt' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void tp4c_max_rem_cdt (void)
|
|
{
|
|
ST_UINT16 sVal;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_ushort (&sVal) == SD_SUCCESS)
|
|
{
|
|
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
|
|
tp_cfg.max_rem_cdt = (ST_UCHAR) sVal;
|
|
#endif /* TP4_ENABLED */
|
|
}
|
|
else
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* tp4c_loc_cdt */
|
|
/* keyword 'Local_Cdt' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void tp4c_loc_cdt (void)
|
|
{
|
|
ST_UINT16 sVal;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_ushort (&sVal) == SD_SUCCESS)
|
|
{
|
|
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
|
|
tp_cfg.loc_cdt = (ST_UCHAR) sVal;
|
|
#endif /* TP4_ENABLED */
|
|
}
|
|
else
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* tp4c_max_num_conns */
|
|
/* keyword 'Max_Num_Connections' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void tp4c_max_num_conns (void)
|
|
{
|
|
ST_UINT16 sVal;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_ushort (&sVal) == SD_SUCCESS)
|
|
{
|
|
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
|
|
tp_cfg.max_num_conns = sVal;
|
|
#endif /* TP4_ENABLED */
|
|
}
|
|
else
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* tp4c_max_spdu_outst */
|
|
/* keyword 'Max_Spdu_Outstanding' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void tp4c_max_spdu_outst (void)
|
|
{
|
|
ST_UINT16 sVal;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_ushort (&sVal) == SD_SUCCESS)
|
|
{
|
|
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
|
|
tp_cfg.max_spdu_outst = (ST_UCHAR) sVal;
|
|
#endif /* TP4_ENABLED */
|
|
}
|
|
else
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* tp4c_window_time */
|
|
/* keyword 'Window_Time' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void tp4c_window_time (void)
|
|
{
|
|
ST_UINT16 sVal;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_ushort (&sVal) == SD_SUCCESS)
|
|
{
|
|
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
|
|
tp_cfg.window_time = sVal;
|
|
#endif /* TP4_ENABLED */
|
|
}
|
|
else
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* tp4c_inact_time */
|
|
/* keyword 'Inactivity_Time' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void tp4c_inact_time (void)
|
|
{
|
|
ST_UINT16 sVal;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_ushort (&sVal) == SD_SUCCESS)
|
|
{
|
|
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
|
|
tp_cfg.inact_time = sVal;
|
|
#endif /* TP4_ENABLED */
|
|
}
|
|
else
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* tp4c_retrans_time */
|
|
/* keyword 'Retransmission_Time' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void tp4c_retrans_time (void)
|
|
{
|
|
ST_UINT16 sVal;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_ushort (&sVal) == SD_SUCCESS)
|
|
{
|
|
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
|
|
tp_cfg.retrans_time = sVal;
|
|
#endif /* TP4_ENABLED */
|
|
}
|
|
else
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* tp4c_max_trans */
|
|
/* keyword 'Max_Transmissions' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void tp4c_max_trans (void)
|
|
{
|
|
ST_UINT16 sVal;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_ushort (&sVal) == SD_SUCCESS)
|
|
{
|
|
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
|
|
tp_cfg.max_trans = (ST_UCHAR) sVal;
|
|
#endif /* TP4_ENABLED */
|
|
}
|
|
else
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* tp4c_ak_delay */
|
|
/* keyword 'ak_delay' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void tp4c_ak_delay (void)
|
|
{
|
|
ST_UINT16 sVal;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_ushort (&sVal) == SD_SUCCESS)
|
|
{
|
|
#if defined (TP4_ENABLED) /* Just ignore if disabled. */
|
|
tp_cfg.ak_delay = (ST_UCHAR) sVal;
|
|
#endif /* TP4_ENABLED */
|
|
}
|
|
else
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* rfc1006_max_tpdu_len */
|
|
/* keyword 'RFC1006_Max_Tpdu_Len' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void rfc1006_max_tpdu_len (void)
|
|
{
|
|
ST_UINT16 sVal;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_ushort (&sVal) == SD_SUCCESS)
|
|
{
|
|
#if defined (TP0_ENABLED) /* Just ignore if not enabled. */
|
|
tp0_cfg.max_tpdu_len = sVal;
|
|
#endif /* defined (TP0_ENABLED) */
|
|
}
|
|
else
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* rfc1006_max_num_conns */
|
|
/* keyword 'RFC1006_Max_Num_Conns' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void rfc1006_max_num_conns (void)
|
|
{
|
|
ST_UINT16 sVal;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_ushort (&sVal) == SD_SUCCESS)
|
|
{
|
|
#if defined (TP0_ENABLED) /* Just ignore if not enabled. */
|
|
tp0_cfg.max_num_conns = sVal;
|
|
#endif /* defined (TP0_ENABLED) */
|
|
}
|
|
else
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* rfc1006_keepalive */
|
|
/* keyword 'rfc1006_keepalive' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void rfc1006_keepalive (void)
|
|
{
|
|
#if defined (TP0_ENABLED) /* Just ignore if not enabled. */
|
|
tp0_cfg.keepalive = SD_TRUE;
|
|
#endif /* defined (TP0_ENABLED) */
|
|
}
|
|
|
|
#endif /* !defined (MCGW) */
|
|
|
|
|
|
/*======================================================================*/
|
|
/************************************************************************/
|
|
/*======================================================================*/
|
|
/* */
|
|
/* Functions and keyword tables for parsing the Local and */
|
|
/* Remote DIB sections from configuration file. */
|
|
/* */
|
|
/*======================================================================*/
|
|
/************************************************************************/
|
|
/*======================================================================*/
|
|
|
|
|
|
#define CFG_MAX_AR_NAME 64
|
|
#define CFG_MAX_AP_TITLE 80
|
|
#define CFG_MAX_AE_QUAL 32
|
|
|
|
typedef struct _tagTransDevInfo
|
|
{
|
|
DBL_LNK l;
|
|
ST_CHAR name[CFG_MAX_AR_NAME +1];
|
|
ST_CHAR apTitle[CFG_MAX_AP_TITLE +1];
|
|
ST_CHAR aeQual[CFG_MAX_AE_QUAL +1];
|
|
PRES_ADDR pres_addr;
|
|
ST_CHAR ip_addr [MAX_IP_ADDR_LEN]; /* Overwrite pres_addr->nsap */
|
|
/* with this if tp_type = TCP */
|
|
} TRANS_DEV_INFO;
|
|
|
|
static void dibc_end (void);
|
|
|
|
static void dibc_begin_local (void);
|
|
static void dibc_begin_remote (void);
|
|
static void dibc_common_name (void);
|
|
static void dibc_ap_title (void);
|
|
static void dibc_ae_qualifier (void);
|
|
static void dibc_psel (void);
|
|
static void dibc_ssel (void);
|
|
static void dibc_tsel (void);
|
|
static void dibc_nsap (void);
|
|
static void dibc_tp_type (void);
|
|
static void dibc_ip_addr (void);
|
|
#if defined (MCGW)
|
|
static void dibc_adlcaddr (void);
|
|
#endif /* defined (MCGW) */
|
|
static void dibc_end_local (void);
|
|
static void dibc_end_remote (void);
|
|
|
|
static ST_RET parseObjId (MMS_OBJ_ID *o, ST_CHAR *buff);
|
|
static ST_VOID save_dib_table (TRANS_DEV_INFO *, DIB_ENTRY *);
|
|
|
|
|
|
|
|
static CFG_KW_EL dibc_kwtbl[] =
|
|
{
|
|
{"Begin_Local", dibc_begin_local, NULL },
|
|
{"Begin_Remote", dibc_begin_remote, NULL },
|
|
{"%Dib_End", dibc_end, NULL },
|
|
{ NULL, NULL, NULL}
|
|
};
|
|
|
|
static CFG_KW_EL dibc_kwtbl_param[] =
|
|
{
|
|
{"Common_Name", dibc_common_name, NULL },
|
|
{"AP_Title", dibc_ap_title, NULL },
|
|
{"AE_Qualifier", dibc_ae_qualifier, NULL },
|
|
{"Psel", dibc_psel, NULL },
|
|
{"Ssel", dibc_ssel, NULL },
|
|
{"Tsel", dibc_tsel, NULL },
|
|
{"NSAP", dibc_nsap, NULL },
|
|
{"Transport", dibc_tp_type, NULL },
|
|
{"IP_Addr", dibc_ip_addr, NULL },
|
|
#if defined (MCGW)
|
|
{"AdlcAddr", dibc_adlcaddr, NULL },
|
|
#endif /* defined (MCGW) */
|
|
{"End_Local", dibc_end_local, NULL },
|
|
{"End_Remote", dibc_end_remote, NULL },
|
|
{ NULL, NULL, NULL}
|
|
};
|
|
|
|
static TRANS_DEV_INFO *localTransList;
|
|
static TRANS_DEV_INFO *remoteTransList;
|
|
static TRANS_DEV_INFO *currTransEl;
|
|
|
|
static ST_BOOLEAN rem_section_flag;
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* dibc_begin */
|
|
/* keyword '%Dib_Begin' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void dibc_begin (void)
|
|
{
|
|
/* CRITICAL: Always start with empty temporary DIB Table linked lists */
|
|
/* (may be reconfiguring). */
|
|
localTransList = NULL;
|
|
remoteTransList = NULL;
|
|
|
|
if (cfg_tbl_push (dibc_kwtbl) != SD_SUCCESS)
|
|
cfg_set_config_err ();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* dibc_end */
|
|
/* keyword '%Dib_End' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void dibc_end (void)
|
|
{
|
|
if (cfg_tbl_pop (1) != SD_SUCCESS)
|
|
cfg_set_config_err ();
|
|
|
|
cfg_set_endfile_ok (); /* this is the end of configuration */
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* dibc_begin_local */
|
|
/* keyword 'Begin_Local' */
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
static void dibc_begin_local (void)
|
|
{
|
|
if (!init_dirser_called)
|
|
{ /* Don't alloc if reconfiguring. */
|
|
currTransEl = (TRANS_DEV_INFO *) chk_calloc (1, sizeof(TRANS_DEV_INFO));
|
|
currTransEl->pres_addr.tp_type = TP_TYPE_TP4; /* Default=TP4 */
|
|
list_add_last ((void**) &localTransList, currTransEl);
|
|
}
|
|
|
|
cfg_tbl_push (dibc_kwtbl_param);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* dibc_begin_remote */
|
|
/* keyword 'Begin_Remote' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void dibc_begin_remote (void)
|
|
{
|
|
currTransEl = (TRANS_DEV_INFO *) chk_calloc (1, sizeof(TRANS_DEV_INFO));
|
|
currTransEl->pres_addr.tp_type = TP_TYPE_TP4; /* Default=TP4 */
|
|
list_add_last ((void**) &remoteTransList, currTransEl);
|
|
cfg_tbl_push (dibc_kwtbl_param);
|
|
rem_section_flag = SD_TRUE;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* Processing of keywords found in one of sub-section: */
|
|
/* Local_Begin ... Local_End */
|
|
/* Remote_Begin ... Remote_End */
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
static void dibc_common_name (void)
|
|
{
|
|
ST_CHAR *p;
|
|
|
|
if (init_dirser_called && rem_section_flag == SD_FALSE)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
p = cfg_get_string_ptr ();
|
|
if (!p)
|
|
cfg_set_config_err();
|
|
else if (strlen (p) > CFG_MAX_AR_NAME)
|
|
cfg_set_config_err();
|
|
else
|
|
strcpy (currTransEl->name, p);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
static void dibc_ap_title (void)
|
|
{
|
|
ST_CHAR *p;
|
|
|
|
if (init_dirser_called && rem_section_flag == SD_FALSE)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
p = cfg_get_string_ptr ();
|
|
if (!p)
|
|
cfg_set_config_err();
|
|
else if (strlen (p) > CFG_MAX_AP_TITLE)
|
|
cfg_set_config_err();
|
|
else
|
|
strcpy (currTransEl->apTitle, p);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
static void dibc_ae_qualifier (void)
|
|
{
|
|
ST_CHAR *p;
|
|
|
|
if (init_dirser_called && rem_section_flag == SD_FALSE)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
p = cfg_get_string_ptr ();
|
|
if (!p)
|
|
cfg_set_config_err();
|
|
else if (strlen (p) > CFG_MAX_AE_QUAL)
|
|
cfg_set_config_err();
|
|
else
|
|
strcpy (currTransEl->aeQual, p);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
static void dibc_psel (void)
|
|
{
|
|
if (init_dirser_called && rem_section_flag == SD_FALSE)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_octet_string (currTransEl->pres_addr.psel,
|
|
&currTransEl->pres_addr.psel_len, MAX_PSEL_LEN) != SD_SUCCESS)
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
static void dibc_ssel (void)
|
|
{
|
|
if (init_dirser_called && rem_section_flag == SD_FALSE)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_octet_string (currTransEl->pres_addr.ssel,
|
|
&currTransEl->pres_addr.ssel_len, MAX_SSEL_LEN) != SD_SUCCESS)
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
static void dibc_tsel (void)
|
|
{
|
|
if (init_dirser_called && rem_section_flag == SD_FALSE)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
if (cfg_get_octet_string (currTransEl->pres_addr.tsel,
|
|
&currTransEl->pres_addr.tsel_len, MAX_TSEL_LEN) != SD_SUCCESS)
|
|
cfg_set_config_err();
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
static void dibc_nsap (void)
|
|
{
|
|
if (rem_section_flag)
|
|
{
|
|
/* NSAP only in remote DIB is valid */
|
|
/* NOTE: array size is MAX_IP_ADDR_LEN. Must be >= CLNP_MAX_LEN_NSAP.*/
|
|
if (cfg_get_octet_string (currTransEl->pres_addr.netAddr.nsap,
|
|
&currTransEl->pres_addr.nsap_len, CLNP_MAX_LEN_NSAP) != SD_SUCCESS)
|
|
cfg_set_config_err();
|
|
}
|
|
else
|
|
{
|
|
cfg_set_config_err();
|
|
}
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
static void dibc_tp_type (void)
|
|
{
|
|
ST_CHAR *p;
|
|
|
|
p = cfg_get_string_ptr ();
|
|
if (!p)
|
|
cfg_set_config_err();
|
|
else
|
|
{
|
|
if (strcmp (p, "TCP") == 0)
|
|
currTransEl->pres_addr.tp_type = TP_TYPE_TCP;
|
|
else if (strcmp (p, "TP4") == 0)
|
|
currTransEl->pres_addr.tp_type = TP_TYPE_TP4;
|
|
else if (strcmp (p, "TPX") == 0)
|
|
currTransEl->pres_addr.tp_type = TP_TYPE_TPX; /* Both. Only for Local*/
|
|
else
|
|
cfg_set_config_err(); /* too long to fit. */
|
|
}
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
static void dibc_ip_addr (void)
|
|
{
|
|
ST_CHAR *p;
|
|
|
|
if (rem_section_flag)
|
|
{
|
|
/* IP Addr only valid in remote DIB entry */
|
|
p = cfg_get_string_ptr ();
|
|
if (!p)
|
|
cfg_set_config_err();
|
|
else
|
|
{
|
|
if (strlen (p) < MAX_IP_ADDR_LEN) /* must fit with NULL terminator*/
|
|
strcpy (currTransEl->ip_addr, p);
|
|
else
|
|
cfg_set_config_err(); /* too long to fit. */
|
|
}
|
|
}
|
|
else
|
|
{
|
|
cfg_set_config_err();
|
|
}
|
|
}
|
|
|
|
#if defined (MCGW)
|
|
/*----------------------------------------------------------------------*/
|
|
static void dibc_adlcaddr (void)
|
|
{
|
|
ST_CHAR *p;
|
|
ST_LONG longval;
|
|
|
|
if (init_dirser_called)
|
|
{
|
|
cfg_get_string_ptr (); /* Get rest of line and ignore it. */
|
|
return; /* Don't allow reconfiguring. */
|
|
}
|
|
|
|
p = cfg_get_string_ptr ();
|
|
if (!p)
|
|
cfg_set_config_err();
|
|
else
|
|
{
|
|
longval = atol (p);
|
|
/* Make sure it's a legal ST_UINT16 before casting it. */
|
|
if (longval < 0 || longval > 0xffff)
|
|
cfg_set_config_err();
|
|
else
|
|
currTransEl->pres_addr.adlcAddr = (ST_UINT16) longval;
|
|
}
|
|
}
|
|
#endif /* defined (MCGW) */
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* dibc_end_local */
|
|
/* keyword 'Local_End' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void dibc_end_local (void)
|
|
{
|
|
cfg_tbl_pop (1);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* dibc_end_remote */
|
|
/* keyword 'Remote_End' */
|
|
/*----------------------------------------------------------------------*/
|
|
static void dibc_end_remote (void)
|
|
{
|
|
if (currTransEl->pres_addr.tp_type == TP_TYPE_TCP)
|
|
{
|
|
if ((currTransEl->pres_addr.netAddr.ip = tp0_convert_ip (currTransEl->ip_addr))
|
|
== htonl(INADDR_NONE))
|
|
cfg_set_config_err(); /* IP Addr invalid. */
|
|
}
|
|
|
|
cfg_tbl_pop (1);
|
|
rem_section_flag = SD_FALSE;
|
|
}
|
|
|
|
|
|
/************************************************************************/
|
|
/* parseObjId */
|
|
/*----------------------------------------------------------------------*/
|
|
/* Parses components of the 'ApTitle'. */
|
|
/************************************************************************/
|
|
|
|
static ST_RET parseObjId (MMS_OBJ_ID *objId, ST_CHAR *buff)
|
|
{
|
|
char *numStr;
|
|
|
|
/* Found keyword 'ApTitle', read the components */
|
|
objId->num_comps = 0;
|
|
numStr = strtok (buff, " \t");
|
|
while (numStr && strlen (numStr) > 0)
|
|
{
|
|
if (objId->num_comps >= MAX_OBJID_COMPONENTS)
|
|
{
|
|
return (SD_FAILURE);
|
|
}
|
|
objId->comps[objId->num_comps] = (ST_INT16) atoi (numStr);
|
|
numStr = strtok (NULL, " \t");
|
|
++objId->num_comps;
|
|
}
|
|
if (objId->num_comps == 0) /* couldn't parse anything */
|
|
return (SD_FAILURE);
|
|
return (SD_SUCCESS);
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* save_loc_rem_dib_tables */
|
|
/*----------------------------------------------------------------------*/
|
|
/* This function will initialize local and remote dib entries tables. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* void none */
|
|
/* */
|
|
/* Return: */
|
|
/* SD_SUCCESS (0) if initialization successful. */
|
|
/* SD_FAILURE (1) otherwise */
|
|
/* NOTES: Does not allow reconfiguration of loc_dib_table. */
|
|
/* Allows reconfiguration of rem_dib_table, but only after */
|
|
/* freeing the old table. */
|
|
/************************************************************************/
|
|
|
|
static ST_RET save_loc_rem_dib_tables (void)
|
|
{
|
|
ST_RET ret;
|
|
ST_INT j;
|
|
|
|
ret = SD_SUCCESS;
|
|
|
|
if (!init_dirser_called) /* Don't allow reconfiguring. */
|
|
{
|
|
num_loc_dib_entries = list_get_sizeof (localTransList);
|
|
if (num_loc_dib_entries)
|
|
{
|
|
loc_dib_table = (DIB_ENTRY *) chk_calloc (num_loc_dib_entries, sizeof (DIB_ENTRY));
|
|
save_dib_table (localTransList, loc_dib_table);
|
|
}
|
|
}
|
|
|
|
/* If Remote DIB table already configured, free old before allocating new.*/
|
|
if (init_dirser_called)
|
|
{
|
|
for (j = 0; j < num_rem_dib_entries; j++)
|
|
chk_free (rem_dib_table [j].name);
|
|
chk_free (rem_dib_table);
|
|
}
|
|
|
|
num_rem_dib_entries = list_get_sizeof (remoteTransList);
|
|
if (num_rem_dib_entries)
|
|
{
|
|
rem_dib_table = (DIB_ENTRY *) chk_calloc (num_rem_dib_entries, sizeof (DIB_ENTRY));
|
|
save_dib_table (remoteTransList, rem_dib_table);
|
|
}
|
|
return (ret);
|
|
}
|
|
|
|
|
|
/************************************************************************/
|
|
/* save_dib_table */
|
|
/*----------------------------------------------------------------------*/
|
|
/* This function copies the temporary DIB Table to the permanent */
|
|
/* DIB Table. It may be used for the Local as well as the Remote DIB */
|
|
/* Tables. */
|
|
/* */
|
|
/* Parameters: */
|
|
/* TRANS_DEV_INFO * temporary table (linked list of structs)*/
|
|
/* DIB_ENTRY * permanent table (array of structs) */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
static ST_VOID save_dib_table (TRANS_DEV_INFO *TransList, DIB_ENTRY *de)
|
|
{
|
|
TRANS_DEV_INFO *toFree;
|
|
TRANS_DEV_INFO *d;
|
|
|
|
d = TransList; /* Point to first in linked list */
|
|
while (d)
|
|
{
|
|
de->name = (ST_CHAR *) chk_malloc (strlen(d->name) + 1);
|
|
strcpy (de->name, d->name);
|
|
if (strlen (d->apTitle))
|
|
{
|
|
if (parseObjId (&de->AP_title, d->apTitle))
|
|
{
|
|
ACSELOG_ERR1 ("Invalid AP Title '%s'. Ignored.", d->apTitle);
|
|
}
|
|
else
|
|
de->AP_title_pres = SD_TRUE; /* defaults to FALSE */
|
|
}
|
|
|
|
if (strlen (d->aeQual))
|
|
{
|
|
de->AE_qual_pres = SD_TRUE; /* defaults to FALSE */
|
|
de->AE_qual = atol (d->aeQual);
|
|
}
|
|
|
|
de->AP_inv_id_pres = SD_FALSE;
|
|
de->AE_inv_id_pres = SD_FALSE;
|
|
|
|
memcpy (&de->pres_addr, &d->pres_addr, sizeof (PRES_ADDR));
|
|
|
|
toFree = d;
|
|
d = (TRANS_DEV_INFO *) list_get_next (TransList, d); /* Point to next TRANS_DEV_INFO */
|
|
chk_free (toFree);
|
|
++de; /* Point to next DIB_ENTRY */
|
|
} /* End "while" */
|
|
|
|
TransList = NULL; /* CRITICAL: clean up in case reconfigure later.*/
|
|
}
|