Hi Praveen,

good catch, I'll update. /Thanks HansN


On 06/13/2017 08:53 AM, praveen malviya wrote:
Hi Hans,

One comment on this patch inline with [Praveen].

Thanks,
Praveen
On 18-May-17 3:32 PM, Hans Nordeback wrote:
---
src/amf/amfnd/avnd_comp.h | 134 ++++++++++++++++++++++++++--------------------
  src/amf/amfnd/avnd_err.h  |   4 +-
  src/amf/amfnd/avnd_hc.h   |   2 +-
  src/amf/amfnd/avnd_proc.h |  10 ++--
  src/amf/amfnd/avnd_util.h |   2 +-
src/amf/amfnd/clc.cc | 125 ++++--------------------------------------
  src/amf/amfnd/comp.cc     |  35 ++++++++++++
  src/amf/amfnd/compdb.cc   |  36 +++----------
  src/amf/amfnd/proxydb.cc  |   2 +-
  9 files changed, 138 insertions(+), 212 deletions(-)

diff --git a/src/amf/amfnd/avnd_comp.h b/src/amf/amfnd/avnd_comp.h
index 611e90e11..68de4cc8e 100644
--- a/src/amf/amfnd/avnd_comp.h
+++ b/src/amf/amfnd/avnd_comp.h
@@ -31,6 +31,8 @@
  #define AMF_AMFND_AVND_COMP_H_
    #include <bitset>
+#include <string>
+#include <map>
    struct avnd_cb_tag;
  struct avnd_su_si_rec;
@@ -57,7 +59,7 @@ struct avnd_srm_req_tag;
    /* clc event handler declaration */
  typedef uint32_t (*AVND_COMP_CLC_FSM_FN)(struct avnd_cb_tag *,
-                                         struct avnd_comp_tag *);
+                                         AVND_COMP *);
    /* clc fsm events */
  typedef enum avnd_comp_clc_pres_fsm_ev {
@@ -141,7 +143,7 @@ typedef struct avnd_cbk_tag {
    AVSV_AMF_CBK_INFO *cbk_info; /* callbk info */
      /* link to other elements */
-  struct avnd_comp_tag *comp; /* bk ptr to the comp */
+  AVND_COMP *comp; /* bk ptr to the comp */
    struct avnd_cbk_tag *next;
    std::string comp_name; /* For checkpointing */
  } AVND_COMP_CBK;
@@ -182,7 +184,7 @@ typedef struct avnd_comp_csi_rec {
                                                     wrt prv ha state */
      /* links to other entities */
-  struct avnd_comp_tag *comp;             /* bk ptr to the comp */
+  AVND_COMP *comp;             /* bk ptr to the comp */
struct avnd_su_si_rec *si; /* bk ptr to the si record */
    std::string comp_name;                  /* For Checkpointing */
    std::string si_name;                    /* For Checkpointing */
@@ -256,7 +258,7 @@ typedef struct avnd_hc_rec_tag {
uint32_t opq_hdl; /* hdl returned by hdl-mngr (used during tmr expiry) */
    AVND_COMP_HC_STATUS status; /* indicates status of hc rec */
  -  struct avnd_comp_tag *comp; /* back ptr to the comp */
+  AVND_COMP *comp; /* back ptr to the comp */
    struct avnd_hc_rec_tag *next;
    std::string comp_name; /* For checkpoiting */
  } AVND_COMP_HC_REC;
@@ -278,7 +280,7 @@ typedef struct avnd_pm_rec {
    } rec_rcvr;
      /* links to other entities */
-  struct avnd_comp_tag *comp; /* back ptr to the comp */
+  AVND_COMP *comp; /* back ptr to the comp */
  } AVND_COMP_PM_REC;
/*##########################################################################
@@ -288,7 +290,7 @@ typedef struct avnd_pm_rec {
  /* proxied info */
  typedef struct avnd_pxied_rec {
NCS_DB_LINK_LIST_NODE comp_dll_node; /* node in the comp-pxied dll */
-  struct avnd_comp_tag *pxied_comp;    /* ptr to the proxied comp */
+  AVND_COMP *pxied_comp;    /* ptr to the proxied comp */
  } AVND_COMP_PXIED_REC;
    #define AVND_COMP_TYPE_LOCAL_NODE 0x00000001
@@ -319,100 +321,115 @@ enum UsedComptypeAttrs {
    NumAttrs
  };
  -typedef struct avnd_comp_tag {
- NCS_DB_LINK_LIST_NODE su_dll_node; /* su dll node (key is inst-level) */
+class AVND_COMP {
+ public:
+ // TODO(uabhano) replace the NCS_DB_LINK_LIST_NODE with C++ STL. Now su_dll_node must be first in AVND_COMP + // as the macro m_AVND_COMP_SU_DLL_NODE_OFFSET depends on the offset. offsetof is to be avoided in classes. + NCS_DB_LINK_LIST_NODE su_dll_node {}; /* su dll node (key is inst-level) */
+  AVND_COMP() {}
+  ~AVND_COMP() {}
      std::string name; /* comp name */
    std::string saAmfCompType;
- uint32_t numOfCompCmdEnv; /* number of comp command environment variables */
-  SaStringT *saAmfCompCmdEnv; /* comp command environment variables */
-  uint32_t inst_level;        /* comp instantiation level */
  -  uint32_t comp_hdl; /* hdl returned by hdl-mngr */
+  uint32_t inst_level {};        /* comp instantiation level */
+
+  uint32_t comp_hdl {}; /* hdl returned by hdl-mngr */
      /* component attributes */
-  uint32_t flag;      /* comp attributes */
-  bool is_restart_en; /* flag to indicate if comp-restart is allowed */
-  SaAmfCompCapabilityModelT cap; /* comp capability model */
-  bool is_am_en;
-  bool is_hc_cmd_configured;
+  uint32_t flag {};      /* comp attributes */
+ bool is_restart_en {}; /* flag to indicate if comp-restart is allowed */
+  SaAmfCompCapabilityModelT cap {}; /* comp capability model */
+  bool is_am_en {};
+  bool is_hc_cmd_configured {};
      /* clc info */
-  AVND_COMP_CLC_INFO clc_info;
+  AVND_COMP_CLC_INFO clc_info {};
      /* Update received flag, which will normally be false and will be
     * true if updates are received from the AVD on fail-over.*/
-  bool avd_updt_flag;
+  bool avd_updt_flag {};
      /* component registration info */
-  SaAmfHandleT reg_hdl; /* registered handle value */
-  MDS_DEST reg_dest;    /* mds dest of the registering prc */
+  SaAmfHandleT reg_hdl {}; /* registered handle value */
+  MDS_DEST reg_dest {};    /* mds dest of the registering prc */
      /* component states */
-  SaAmfOperationalStateT oper;    /* operational state */
-  SaAmfPresenceStateT pres;       /* presence state */
-  SaAmfProxyStatusT proxy_status; /* status for component with proxy */
+  SaAmfOperationalStateT oper {};    /* operational state */
+  SaAmfPresenceStateT pres {};       /* presence state */
+ SaAmfProxyStatusT proxy_status {}; /* status for component with proxy */
      /*
     * component request info (healthcheck, passive
     * monitoring, protection group tracking etc)
     */
-  NCS_DB_LINK_LIST hc_list; /* health check info list */
-  NCS_DB_LINK_LIST pm_list; /* passive monitoring req list */
+  NCS_DB_LINK_LIST hc_list {}; /* health check info list */
+  NCS_DB_LINK_LIST pm_list {}; /* passive monitoring req list */
  -  AVND_COMP_CBK *cbk_list; /* pending callback list */
+  AVND_COMP_CBK *cbk_list {}; /* pending callback list */
      /* call back responce timeout values */
-  SaTimeT term_cbk_timeout;           /* terminate          */
-  SaTimeT csi_set_cbk_timeout;        /* csi set            */
-  SaTimeT quies_complete_cbk_timeout; /* quiescing_complete */
+  SaTimeT term_cbk_timeout {};           /* terminate */
+  SaTimeT csi_set_cbk_timeout {};        /* csi set */
+  SaTimeT quies_complete_cbk_timeout {}; /* quiescing_complete */
    /* Timer for qscing comlpete */
-  AVND_TMR qscing_tmr;
+  AVND_TMR qscing_tmr {};
  -  SaTimeT csi_rmv_cbk_timeout;     /* csi remove         */
-  SaTimeT pxied_inst_cbk_timeout;  /* proxied instantiate */
-  SaTimeT pxied_clean_cbk_timeout; /* proxied cleanup    */
+  SaTimeT csi_rmv_cbk_timeout {};     /* csi remove         */
+  SaTimeT pxied_inst_cbk_timeout {};  /* proxied instantiate */
+  SaTimeT pxied_clean_cbk_timeout {}; /* proxied cleanup    */
  -  AVND_CERR_INFO err_info; /* comp error information */
+  AVND_CERR_INFO err_info {}; /* comp error information */
  -  uint32_t curr_proxied_cnt; /* proxied comp count (if any)
+  uint32_t curr_proxied_cnt {}; /* proxied comp count (if any)
                          ## not used, to be deleted */
  -  NCS_DB_LINK_LIST csi_list; /* csi list */
+  NCS_DB_LINK_LIST csi_list {}; /* csi list */
  -  struct avnd_su_tag *su; /* back ptr to parent SU */
+  struct avnd_su_tag *su {}; /* back ptr to parent SU */
- struct avnd_comp_tag *pxy_comp; /* ptr to the proxy comp (if any) */
+  AVND_COMP *pxy_comp {}; /* ptr to the proxy comp (if any) */
      AVND_COMP_CLC_PRES_FSM_EV
-      pend_evt; /* stores last fsm event got in orph state */
+      pend_evt {}; /* stores last fsm event got in orph state */
      AVND_TMR
- orph_tmr; /* proxied component registration timer alias orphaned timer */ + orph_tmr {}; /* proxied component registration timer alias orphaned timer */ - NCS_DB_LINK_LIST pxied_list; /* list of proxied comp in this proxy */ - NODE_ID node_id; /* It will used for internode proxy-proxied components. */ - uint32_t comp_type; /* Whether the component is LOCAL, INTERNODE or EXT */
-  MDS_SYNC_SND_CTXT mds_ctxt;
-  bool reg_resp_pending;       /* If the reg resp is pending from
+ NCS_DB_LINK_LIST pxied_list {}; /* list of proxied comp in this proxy */ + NODE_ID node_id {}; /* It will used for internode proxy-proxied components. */ + uint32_t comp_type {}; /* Whether the component is LOCAL, INTERNODE or EXT */
+  MDS_SYNC_SND_CTXT mds_ctxt {};
+  bool reg_resp_pending {};       /* If the reg resp is pending from
proxied comp AvND, it true. */
    std::string proxy_comp_name; /* Used for Checkpointing. */
- bool admin_oper; /*set to true if undergoing admin operation */ - int config_is_valid; /* Used to indicate that config has to be refreshed from + bool admin_oper {}; /*set to true if undergoing admin operation */ + int config_is_valid {}; /* Used to indicate that config has to be refreshed from
                                    IMM */
- bool assigned_flag; /* Used in finding multiple csi for a single comp while + bool assigned_flag {}; /* Used in finding multiple csi for a single comp while
                                    csi mod.*/
- bool pending_delete; /* Used in deleting component when su is in + bool pending_delete {}; /* Used in deleting component when su is in
                                    instantiated state.*/
- bool error_report_sent; /* true when error is repoted on component using + bool error_report_sent {}; /* true when error is repoted on component using
                                    saAmfComponentErrorReport() or
saAmfComponentErrorReport_4()*/
  -  std::bitset<NumAttrs> *use_comptype_attr;
+  std::bitset<NumAttrs> *use_comptype_attr {};
    SaInvocationT
- term_cbq_inv_value; /* invocation value for termination callback. */
-  SaVersionT version;     // SAF version of comp.
-} AVND_COMP;
+ term_cbq_inv_value {}; /* invocation value for termination callback. */
+  SaVersionT version {};     // SAF version of comp.
+
+  void add_cmd_env(const std::string &key_value);
+  void add_cmd_env(const std::string &name, const std::string &value);
+  void create_ncs_env_arg(NCS_OS_ENVIRON_ARGS* args);
+
+ private:
+  std::map<std::string, std::string> env_var_ {};
+
+  // disallow copy and assign
+  AVND_COMP(const AVND_COMP&) = delete;
+  void operator=(const AVND_COMP&) = delete;
+};
    #define AVND_COMP_NULL ((AVND_COMP *)0)
  @@ -611,8 +628,9 @@ typedef struct avnd_comp_tag {
  #define m_AVND_COMP_IS_PROXIED(x) ((x)->proxy_comp)
    /* macro to retrieve component ptr from su dll node ptr */
-#define m_AVND_COMP_SU_DLL_NODE_OFFSET \
- ((uint8_t *)&(AVND_COMP_NULL->su_dll_node) - (uint8_t *)AVND_COMP_NULL)
+/* TODO(uabhano) remove these macros */
+#define m_AVND_COMP_SU_DLL_NODE_OFFSET 0
+
  #define m_AVND_COMP_FROM_SU_DLL_NODE_GET(x) \
((x) ? ((AVND_COMP *)(((uint8_t *)(x)) - m_AVND_COMP_SU_DLL_NODE_OFFSET)) : 0) @@ -851,7 +869,7 @@ extern uint32_t avnd_comp_cbk_send(struct avnd_cb_tag *, AVND_COMP *, AVSV_AMF_CBK_TYPE, AVND_COMP_HC_REC *,
                                     AVND_COMP_CSI_REC *);
  extern uint32_t avnd_comp_clc_cmd_execute(struct avnd_cb_tag *,
-                                          struct avnd_comp_tag *,
+                                          AVND_COMP *,
enum avnd_comp_clc_cmd_type); extern AVND_COMP_HC_REC *avnd_comp_hc_get(AVND_COMP *, uint32_t, uint32_t);
diff --git a/src/amf/amfnd/avnd_err.h b/src/amf/amfnd/avnd_err.h
index de8c1172f..17e236d80 100644
--- a/src/amf/amfnd/avnd_err.h
+++ b/src/amf/amfnd/avnd_err.h
@@ -113,10 +113,10 @@ typedef struct avnd_err_tag {
***************************************************************************/
    struct avnd_cb_tag;
-struct avnd_comp_tag;
+class AVND_COMP;
  struct avnd_su_tag;
-extern uint32_t avnd_err_process(struct avnd_cb_tag *, struct avnd_comp_tag *,
+extern uint32_t avnd_err_process(struct avnd_cb_tag *, AVND_COMP *,
                                   AVND_ERR_INFO *);
extern uint32_t avnd_err_su_repair(struct avnd_cb_tag *, struct avnd_su_tag *);
  extern bool is_no_assignment_due_to_escalations(struct avnd_su_tag *);
diff --git a/src/amf/amfnd/avnd_hc.h b/src/amf/amfnd/avnd_hc.h
index 1f7ffcd34..cc51304b5 100644
--- a/src/amf/amfnd/avnd_hc.h
+++ b/src/amf/amfnd/avnd_hc.h
@@ -55,7 +55,7 @@ extern void avnd_hcdb_init(struct avnd_cb_tag *);
extern AVND_HC *avnd_hcdb_rec_add(struct avnd_cb_tag *, AVND_HC_PARAM *,
                                    uint32_t *);
extern uint32_t avnd_hcdb_rec_del(struct avnd_cb_tag *, AVSV_HLT_KEY *);
-extern SaAisErrorT avnd_hc_config_get(struct avnd_comp_tag *comp);
+extern SaAisErrorT avnd_hc_config_get(AVND_COMP *comp);
  extern SaAisErrorT avnd_hctype_config_get(SaImmHandleT immOmHandle,
const std::string &comptype_dn);
  extern AVND_HCTYPE *avnd_hctypedb_rec_get(struct avnd_cb_tag *,
diff --git a/src/amf/amfnd/avnd_proc.h b/src/amf/amfnd/avnd_proc.h
index 8d5bea3c4..a65ae948f 100644
--- a/src/amf/amfnd/avnd_proc.h
+++ b/src/amf/amfnd/avnd_proc.h
@@ -36,7 +36,7 @@
    struct avnd_cb_tag;
  struct avnd_evt_tag;
-struct avnd_comp_tag;
+class AVND_COMP;
  struct avnd_pxied_rec;
typedef uint32_t (*AVND_EVT_HDLR)(struct avnd_cb_tag *, struct avnd_evt_tag *);
@@ -46,11 +46,11 @@ void avnd_main_process(void);
uint32_t avnd_evt_avd_node_up_evh(struct avnd_cb_tag *, struct avnd_evt_tag *); uint32_t avnd_evt_avd_reg_su_evh(struct avnd_cb_tag *, struct avnd_evt_tag *); uint32_t avnd_evt_avd_reg_comp_evh(struct avnd_cb_tag *, struct avnd_evt_tag *); -uint32_t avnd_comp_proxied_add(struct avnd_cb_tag *, struct avnd_comp_tag *,
-                               struct avnd_comp_tag *, bool);
+uint32_t avnd_comp_proxied_add(struct avnd_cb_tag *, AVND_COMP *,
+                               AVND_COMP *, bool);
  ;
-uint32_t avnd_comp_proxied_del(struct avnd_cb_tag *, struct avnd_comp_tag *,
-                               struct avnd_comp_tag *, bool,
+uint32_t avnd_comp_proxied_del(struct avnd_cb_tag *, AVND_COMP *,
+                               AVND_COMP *, bool,
                                 struct avnd_pxied_rec *);
  uint32_t avnd_evt_avd_info_su_si_assign_evh(struct avnd_cb_tag *,
                                              struct avnd_evt_tag *);
diff --git a/src/amf/amfnd/avnd_util.h b/src/amf/amfnd/avnd_util.h
index 3add13aae..f32f448f8 100644
--- a/src/amf/amfnd/avnd_util.h
+++ b/src/amf/amfnd/avnd_util.h
@@ -31,7 +31,7 @@
  #define AMF_AMFND_AVND_UTIL_H_
    struct avnd_cb_tag;
-struct avnd_comp_tag;
+class AVND_COMP;
  enum avnd_comp_clc_cmd_type;
    extern const char *presence_state[];
diff --git a/src/amf/amfnd/clc.cc b/src/amf/amfnd/clc.cc
index c317f093b..13c9af614 100644
--- a/src/amf/amfnd/clc.cc
+++ b/src/amf/amfnd/clc.cc
@@ -2917,29 +2917,6 @@ uint32_t avnd_comp_clc_orph_restart_hdler(AVND_CB *cb, AVND_COMP *comp) {
    return rc;
  }
  -/**
- * Determine if name is in the environment variable set
- *
- * @param name
- * @param env_set
- * @param env_counter
- *
- * @return bool
- */
-static bool var_in_envset(const char *name,
-                          const NCS_OS_ENVIRON_SET_NODE *env_set,
-                          unsigned int env_counter) {
-  unsigned int i;
-  const char *var;
-
-  for (i = 0, var = env_set[i].name; i < env_counter;
-       i++, var = env_set[i].name) {
-    if (strcmp(var, name) == 0) return true;
-  }
-
-  return false;
-}
-
/****************************************************************************
    Name          : avnd_comp_clc_cmd_execute
@@ -2959,12 +2936,7 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_CB *cb, AVND_COMP *comp,
                                     AVND_COMP_CLC_CMD_TYPE cmd_type) {
    NCS_OS_PROC_EXECUTE_TIMED_INFO cmd_info;
    NCS_OS_ENVIRON_ARGS arg;
-  NCS_OS_ENVIRON_SET_NODE *env_set;
-  char env_val_nodeid[11];
-  char env_val_comp_err[11]; /*we req only 10 */
-  char env_var_name[] = "SA_AMF_COMPONENT_NAME";
-  char env_var_nodeid[] = "NCS_ENV_NODE_ID";
-  char env_var_comp_err[] = "OSAF_COMPONENT_ERROR_SOURCE";
+
    AVND_CLC_EVT *clc_evt;
    AVND_EVT *evt = 0;
    AVND_COMP_CLC_INFO *clc_info = &comp->clc_info;
@@ -2972,10 +2944,6 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_CB *cb, AVND_COMP *comp,
    char *argv[AVND_COMP_CLC_PARAM_MAX + 2];
char tmp_argv[AVND_COMP_CLC_PARAM_MAX + 2][AVND_COMP_CLC_PARAM_SIZE_MAX];
    uint32_t argc = 0, rc = NCSCC_RC_SUCCESS, count = 0;
-  unsigned int env_counter;
-  unsigned int i;
-  SaStringT env;
-  size_t env_set_nmemb;
      TRACE_ENTER2("'%s':CLC CLI command type:'%s'", comp->name.c_str(),
                 clc_cmd_type[cmd_type]);
@@ -3024,48 +2992,12 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_CB *cb, AVND_COMP *comp,
      }
    }
+ comp->add_cmd_env("NCS_ENV_NODE_ID", std::to_string(cb->node_info.nodeId));
+
    /* Allocate environment variable set */
-  env_set_nmemb = comp->numOfCompCmdEnv + 3;
-  env_set = static_cast<NCS_OS_ENVIRON_SET_NODE *>(
-      calloc(env_set_nmemb, sizeof(NCS_OS_ENVIRON_SET_NODE)));
    memset(&cmd_info, 0, sizeof(NCS_OS_PROC_EXECUTE_TIMED_INFO));
    memset(&arg, 0, sizeof(NCS_OS_ENVIRON_ARGS));
  -  /*** populate the env variable set ***/
-  env_counter = 0;
-
-  if (comp->saAmfCompCmdEnv != nullptr) {
-    while ((env = comp->saAmfCompCmdEnv[env_counter]) != nullptr) {
-      char *equalPos = strchr(env, '=');
-      if (equalPos == nullptr) {
- LOG_ER("Unknown enviroment variable format '%s'. Should be 'var=value'",
-               env);
-        env_counter++;
-        continue;
-      }
-      env_set[env_counter].name = strndup(env, equalPos - env);
-      env_set[env_counter].value = strdup(equalPos + 1);
-      env_set[env_counter].overwrite = 1;
-      arg.num_args++;
-      env_counter++;
-    }
-  }
-
-  /* comp name env */
-  env_set[env_counter].overwrite = 1;
-  env_set[env_counter].name = strdup(env_var_name);
- env_set[env_counter].value = strndup(comp->name.c_str(), comp->name.length());
-  arg.num_args++;
-  env_counter++;
-
-  /* node id env */
-  env_set[env_counter].overwrite = 1;
-  env_set[env_counter].name = strdup(env_var_nodeid);
-  sprintf(env_val_nodeid, "%u", (uint32_t)(cb->node_info.nodeId));
-  env_set[env_counter].value = strdup(env_val_nodeid);
-  arg.num_args++;
-  env_counter++;
-
    /* Note:- we will set OSAF_COMPONENT_ERROR_SOURCE only for
     * cleanup script
     */
@@ -3073,13 +3005,7 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_CB *cb, AVND_COMP *comp,
    /* populate the env arg */
    if (cmd_type == AVND_COMP_CLC_CMD_TYPE_CLEANUP) {
      /* error code, will be set only if we are cleaning up */
-    memset(env_val_comp_err, '\0', sizeof(env_val_comp_err));
-    env_set[env_counter].overwrite = 1;
-    env_set[env_counter].name = strdup(env_var_comp_err);
- sprintf((char *)env_val_comp_err, "%u", (uint32_t)(comp->err_info.src));
-    env_set[env_counter].value = strdup(env_val_comp_err);
-    arg.num_args++;
-    env_counter++;
+ comp->add_cmd_env("OSAF_COMPONENT_ERROR_SOURCE", std::to_string(comp->err_info.src));
    }
      /*
@@ -3102,46 +3028,17 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_CB *cb, AVND_COMP *comp,
          osafassert(csi);
  -      /* allocate additional env_set memory for the CSI attributes */
- NCS_OS_ENVIRON_SET_NODE *tmp = static_cast<NCS_OS_ENVIRON_SET_NODE *>(
-          realloc(env_set, sizeof(NCS_OS_ENVIRON_SET_NODE) *
-                               (env_set_nmemb + csi->attrs.number)));
-      osafassert(tmp);
-      env_set = tmp;
-
-      /* initialize newly allocated memory */
-      memset(&env_set[env_set_nmemb], 0,
-             sizeof(NCS_OS_ENVIRON_SET_NODE) * csi->attrs.number);
-
        for (i = 0, csiattr = csi->attrs.list; i < csi->attrs.number;
             i++, csiattr++) {
- if (var_in_envset(osaf_extended_name_borrow(&csiattr->name), env_set,
-                          env_counter)) {
- LOG_NO("Ignoring second (or more) value '%s' for '%s' CSI attr '%s'",
-                 csiattr->string_ptr, comp->name.c_str(),
- osaf_extended_name_borrow(&csiattr->name));
-          continue;
-        }
-
          TRACE("%s=%s", osaf_extended_name_borrow(&csiattr->name),
                csiattr->string_ptr);
-        env_set[env_counter].overwrite = 1;
-        env_set[env_counter].name =
- strdup(osaf_extended_name_borrow(&csiattr->name));
-        osafassert(env_set[env_counter].name != nullptr);
-        if (nullptr != csiattr->string_ptr) {
-          env_set[env_counter].value = strdup(csiattr->string_ptr);
-          osafassert(env_set[env_counter].value != nullptr);
-        } else {
-          env_set[env_counter].value = new char();
-        }
-        arg.num_args++;
-        env_counter++;
+
+ comp->add_cmd_env(osaf_extended_name_borrow(&csiattr->name), csiattr->string_ptr);
        }
      } /* if (comp->csi_list.n_nodes == 1) */
    }
  -  arg.env_arg = env_set;
+  comp->create_ncs_env_arg(&arg);
      /* tokenize the cmd */
m_AVND_COMP_CLC_STR_PARSE(clc_info->cmds[cmd_type - 1].cmd, scr, argc, argv, @@ -3173,11 +3070,11 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_CB *cb, AVND_COMP *comp,
    rc = ncs_os_process_execute_timed(&cmd_info);
      /* Remove the env_set structure */
-  for (i = 0; i < env_counter; i++) {
-    free(env_set[i].name);
-    free(env_set[i].value);
+  for (unsigned int i = 0; i < arg.num_args; i++) {
+    free(arg.env_arg[i].name);
+    free(arg.env_arg[i].value);
    }
-  free(env_set);
+  delete [] arg.env_arg;
      if (NCSCC_RC_SUCCESS != rc) {
      TRACE_2("The CLC CLI command execution failed");
diff --git a/src/amf/amfnd/comp.cc b/src/amf/amfnd/comp.cc
index 9dfe87a12..93aeddcf1 100644
--- a/src/amf/amfnd/comp.cc
+++ b/src/amf/amfnd/comp.cc
@@ -3086,3 +3086,38 @@ uint32_t avnd_amfa_mds_info_evh(AVND_CB *cb, AVND_EVT *evt) {
    TRACE_LEAVE();
    return NCSCC_RC_SUCCESS;
  }
+
+void AVND_COMP::add_cmd_env(const std::string &key_value) {
+  std::string::size_type pos;
+
+  pos = key_value.find('=');
+
+  if (pos != std::string::npos) {
+ add_cmd_env(key_value.substr(0, pos - 1), key_value.substr(pos + 1));
[Praveen]It should be add_cmd_env(key_value.substr(0, pos), key_value.substr(pos + 1));

otherwise it is missing last character in the name of environment variable.

+  } else {
+ LOG_ER("Unknown environment variable format '%s'. Should be 'var=value'",
+               key_value.c_str());
+  }
+}
+
+void AVND_COMP::add_cmd_env(const std::string &key, const std::string &value) {
+  if (env_var_.insert({key, value}).second) {
+ TRACE("Environment variable %s added with value %s", key.c_str(), value.c_str());
+  } else {
+ LOG_NO("Environment variable %s already exists with value %s", key.c_str(), value.c_str());
+  }
+}
+
+void AVND_COMP::create_ncs_env_arg(NCS_OS_ENVIRON_ARGS* args) {
+  args->num_args = env_var_.size();
+
+ NCS_OS_ENVIRON_SET_NODE *env = new NCS_OS_ENVIRON_SET_NODE[args->num_args];
+  int i = 0;
+  for (const auto &it : env_var_) {
+    env[i].name = strdup(it.first.c_str());
+    env[i].value = strdup(it.second.c_str());
+    env[i].overwrite = 1;
+    i++;
+  }
+  args->env_arg = env;
+}
diff --git a/src/amf/amfnd/compdb.cc b/src/amf/amfnd/compdb.cc
index decf3abcb..0774e920b 100644
--- a/src/amf/amfnd/compdb.cc
+++ b/src/amf/amfnd/compdb.cc
@@ -1269,7 +1269,7 @@ static int comp_init(AVND_COMP *comp, const SaImmAttrValuesT_2 **attributes) {
    unsigned int num_of_ct_env = 0;
    unsigned int env_cntr = 0;
    const char *str;
-  SaStringT env;
+
    SaImmHandleT immOmHandle;
    SaVersionT immVersion = {'A', 2, 15};
    SaNameT node_name;
@@ -1387,14 +1387,6 @@ static int comp_init(AVND_COMP *comp, const SaImmAttrValuesT_2 **attributes) { /* Set oper status to enable irrespective of comp category PI or NPI. */
    m_AVND_COMP_OPER_STATE_SET(comp, SA_AMF_OPERATIONAL_ENABLED);
  -  /* Remove any previous environment variables */
-  if (comp->saAmfCompCmdEnv != nullptr) {
-    env_cntr = 0;
- while ((env = comp->saAmfCompCmdEnv[env_cntr++]) != nullptr) delete env;
-    delete[] comp->saAmfCompCmdEnv;
-    comp->saAmfCompCmdEnv = nullptr;
-  }
-
/* Find out how many environment variables there are in our comp type */
    num_of_ct_env = 0;
    if (comptype->saAmfCtDefCmdEnv != nullptr) {
@@ -1406,29 +1398,21 @@ static int comp_init(AVND_COMP *comp, const SaImmAttrValuesT_2 **attributes) {
immutil_getAttrValuesNumber(const_cast<SaImmAttrNameT>("saAmfCompCmdEnv"),
                                attributes, &num_of_comp_env);
  -  /* Store the total number of env variables */
-  comp->numOfCompCmdEnv = num_of_ct_env + num_of_comp_env;
-
-  /* Allocate total number of environment variables */
-  comp->saAmfCompCmdEnv = new SaStringT[comp->numOfCompCmdEnv + 1]();
-  osafassert(comp->saAmfCompCmdEnv);
-
    /* Copy environment variables from our comp type */
    env_cntr = 0;
    while ((comptype->saAmfCtDefCmdEnv[env_cntr]) != nullptr) {
-    comp->saAmfCompCmdEnv[env_cntr] =
-        StrDup(comptype->saAmfCtDefCmdEnv[env_cntr]);
-    env_cntr++;
+ comp->add_cmd_env(comptype->saAmfCtDefCmdEnv[env_cntr++]);
    }
      /* Get environment variables from our IMM comp object */
    for (i = 0; i < num_of_comp_env; i++, env_cntr++) {
      str = immutil_getStringAttr(attributes, "saAmfCompCmdEnv", i);
      osafassert(str);
-    comp->saAmfCompCmdEnv[env_cntr] = StrDup(str);
-    osafassert(comp->saAmfCompCmdEnv[env_cntr]);
+    comp->add_cmd_env(str);
    }
  +  comp->add_cmd_env("SA_AMF_COMPONENT_NAME", comp->name);
+
    /* The env string array will be terminated by zero due to the c++
     * value-initialized new above */
  @@ -1454,15 +1438,7 @@ done1:
   * @return
   */
  void avnd_comp_delete(AVND_COMP *comp) {
-  SaStringT env;
-
    /* Free saAmfCompCmdEnv[i] before freeing saAmfCompCmdEnv */
-  if (comp->saAmfCompCmdEnv != nullptr) {
-    int env_counter = 0;
-    while ((env = comp->saAmfCompCmdEnv[env_counter++]) != nullptr)
-      delete[] env;
-    delete[] comp->saAmfCompCmdEnv;
-  }
      delete comp->use_comptype_attr;
    delete comp;
@@ -1489,7 +1465,7 @@ static AVND_COMP *avnd_comp_create(const std::string &comp_name,
      TRACE_ENTER2("%s", comp_name.c_str());
  -  comp = new AVND_COMP();
+  comp = new AVND_COMP;
    comp->use_comptype_attr = new std::bitset<NumAttrs>;
      comp->name = comp_name;
diff --git a/src/amf/amfnd/proxydb.cc b/src/amf/amfnd/proxydb.cc
index 4cb0acd93..69f2f4e52 100644
--- a/src/amf/amfnd/proxydb.cc
+++ b/src/amf/amfnd/proxydb.cc
@@ -171,7 +171,7 @@ AVND_COMP *avnd_internode_comp_add(AVND_CB *cb, const std::string &name,
    }
      /* a fresh comp... */
-  comp = new AVND_COMP();
+  comp = new AVND_COMP;
    comp->use_comptype_attr = new std::bitset<NumAttrs>;
      /* update the comp-name (patricia key) */



------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to