Hi Lennart,

Thanks for your comments. Please see my responses inline [Vu].

Regards, Vu

> -----Original Message-----
> From: Lennart Lund [mailto:lennart.l...@ericsson.com]
> Sent: Wednesday, August 3, 2016 8:57 PM
> To: Vu Minh Nguyen <vu.m.ngu...@dektech.com.au>;
> mahesh.va...@oracle.com
> Cc: opensaf-devel@lists.sourceforge.net
> Subject: RE: [PATCH 3 of 4] log: update logsv to support long DN [#1315]
> 
> Hi Vu
> 
> Ack with comments and after static checks done
> 
> See comments inline [Lennart]
> 
> Also if not done already, run the static checks (cppcheck and cpplint) and
fix
> found problems for at least the new code.
[Vu] Done. Most are "Lines should be <= 80 characters long". Also fixing all
"Redundant blank line ...".
> 
> Thanks
> Lennart
> 
> > -----Original Message-----
> > From: Vu Minh Nguyen [mailto:vu.m.ngu...@dektech.com.au]
> > Sent: den 1 juli 2016 12:42
> > To: mahesh.va...@oracle.com; Lennart Lund <lennart.l...@ericsson.com>
> > Cc: opensaf-devel@lists.sourceforge.net
> > Subject: [PATCH 3 of 4] log: update logsv to support long DN [#1315]
> >
> >  osaf/services/saf/logsv/lgs/Makefile.am     |    1 +
> >  osaf/services/saf/logsv/lgs/lgs.h           |    4 +-
> >  osaf/services/saf/logsv/lgs/lgs_amf.cc      |   14 +-
> >  osaf/services/saf/logsv/lgs/lgs_config.cc   |   30 +-
> >  osaf/services/saf/logsv/lgs/lgs_evt.cc      |   77 ++++--
> >  osaf/services/saf/logsv/lgs/lgs_filehdl.cc  |   12 +-
> >  osaf/services/saf/logsv/lgs/lgs_fmt.cc      |   41 ++-
> >  osaf/services/saf/logsv/lgs/lgs_imm.cc      |  256
++++++++++-----------
> >  osaf/services/saf/logsv/lgs/lgs_imm_gcfg.cc |   12 +-
> >  osaf/services/saf/logsv/lgs/lgs_main.cc     |    7 +-
> >  osaf/services/saf/logsv/lgs/lgs_mbcsv.cc    |   74 +++--
> >  osaf/services/saf/logsv/lgs/lgs_mds.cc      |  296
++++++++++++++++-------
> --
> >  osaf/services/saf/logsv/lgs/lgs_recov.cc    |   44 +--
> >  osaf/services/saf/logsv/lgs/lgs_recov.h     |    8 +-
> >  osaf/services/saf/logsv/lgs/lgs_stream.cc   |  322
+++++++++----------------
> --
> >  osaf/services/saf/logsv/lgs/lgs_stream.h    |   18 +-
> >  osaf/services/saf/logsv/lgs/lgs_util.cc     |   25 ++-
> >  osaf/services/saf/logsv/lgs/lgs_util.h      |    2 +
> >  18 files changed, 630 insertions(+), 613 deletions(-)
> >
> >
> > Major change overview:
> > 1) Replace all internal SaNameT with C/C++ strings
> > 2) Remove NCS_PATRICIA_TREE used to hold stream DNs,
> >    Using the existing database `stream_array` instead.
> > 3) Change a bit in `checkFieldSize()/lgs_fmt`,
> >    check `numOfDigits` agains number of digits of the constant
> >    SA_LOG_MAX_RECORD_SIZE
> >
> > diff --git a/osaf/services/saf/logsv/lgs/Makefile.am
> > b/osaf/services/saf/logsv/lgs/Makefile.am
> > --- a/osaf/services/saf/logsv/lgs/Makefile.am
> > +++ b/osaf/services/saf/logsv/lgs/Makefile.am
> > @@ -45,6 +45,7 @@ osaf_execbin_PROGRAMS = osaflogd
> >  osaflogd_CXXFLAGS = $(AM_CXXFLAGS)
> >
> >  osaflogd_CPPFLAGS = \
> > +   -DSA_EXTENDED_NAME_SOURCE \
> >     $(AM_CPPFLAGS) \
> >     -I$(top_srcdir)/osaf/libs/common/logsv/include \
> >     -I$(top_srcdir)/osaf/libs/common/immsv/include
> > diff --git a/osaf/services/saf/logsv/lgs/lgs.h
> > b/osaf/services/saf/logsv/lgs/lgs.h
> > --- a/osaf/services/saf/logsv/lgs/lgs.h
> > +++ b/osaf/services/saf/logsv/lgs/lgs.h
> > @@ -123,11 +123,11 @@ extern  SaAisErrorT lgs_imm_init_configS
> >
> >  // Functions for recovery handling
> >  void lgs_cleanup_abandoned_streams();
> > -void lgs_delete_one_stream_object(char *name_str);
> > +void lgs_delete_one_stream_object(const std::string &name_str);
> >  void lgs_search_stream_objects();
> >  SaUint32T *lgs_get_scAbsenceAllowed_attr(SaUint32T *attr_val);
> >  int lgs_get_streamobj_attr(SaImmAttrValuesT_2 ***attrib_out,
> > -                      char *object_name,
> > +                      const std::string &object_name,
> >                        SaImmHandleT *immOmHandle);
> >  int lgs_free_streamobj_attr(SaImmHandleT immHandle);
> >
> > diff --git a/osaf/services/saf/logsv/lgs/lgs_amf.cc
> > b/osaf/services/saf/logsv/lgs/lgs_amf.cc
> > --- a/osaf/services/saf/logsv/lgs/lgs_amf.cc
> > +++ b/osaf/services/saf/logsv/lgs/lgs_amf.cc
> > @@ -27,13 +27,13 @@
> >  static void close_all_files()
> >  {
> >     log_stream_t *stream;
> > -
> > -   stream = log_stream_getnext_by_name(NULL);
> > +   int num = get_number_of_streams();
> > +   stream = log_stream_get_by_id(--num);
> >     while (stream != NULL) {
> >             if (log_stream_file_close(stream) != 0)
> > -                   LOG_WA("Could not close file for stream %s",
> > stream->name);
> > +                   LOG_WA("Could not close file for stream %s",
> > stream->name.c_str());
> >
> > -           stream = log_stream_getnext_by_name(stream->name);
> > +           stream = log_stream_get_by_id(--num);
> >     }
> >  }
> >
> > @@ -54,6 +54,7 @@ static SaAisErrorT amf_active_state_hand
> >  {
> >     log_stream_t *stream;
> >     SaAisErrorT error = SA_AIS_OK;
> > +   int num;
> >
> >     TRACE_ENTER2("HA ACTIVE request");
> >
> > @@ -67,12 +68,13 @@ static SaAisErrorT amf_active_state_hand
> >     lgs_start_gcfg_applier();
> >
> >     /* check existing streams */
> > -   stream = log_stream_getnext_by_name(NULL);
> > +   num = get_number_of_streams();
> > +   stream = log_stream_get_by_id(--num);
> >     if (!stream)
> >             LOG_ER("No streams exist!");
> >     while (stream != NULL) {
> >             *stream->p_fd = -1; /* First Initialize fd */
> > -           stream = log_stream_getnext_by_name(stream->name);
> > +           stream = log_stream_get_by_id(--num);
> >     }
> >
> >  done:
> > diff --git a/osaf/services/saf/logsv/lgs/lgs_config.cc
> > b/osaf/services/saf/logsv/lgs/lgs_config.cc
> > --- a/osaf/services/saf/logsv/lgs/lgs_config.cc
> > +++ b/osaf/services/saf/logsv/lgs/lgs_config.cc
> > @@ -464,6 +464,7 @@ int lgs_cfg_verify_root_dir(const std::s
> >     int rc = 0;
> >     log_stream_t *stream = NULL;
> >     size_t n = root_str_in.size();
> > +   int num;
> >
> >     if (n > PATH_MAX) {
> >             LOG_NO("verify_root_dir Fail. Path > PATH_MAX");
> > @@ -475,7 +476,8 @@ int lgs_cfg_verify_root_dir(const std::s
> >      * Make sure that the path /rootPath/streamPath/<fileName><tail>
> >      * must not be larger than PATH_MAX.
> >      */
> > -   stream = log_stream_getnext_by_name(NULL);
> > +   num = get_number_of_streams();
> > +   stream = log_stream_get_by_id(--num);
> >     while (stream != NULL) {
> >             if (lgs_is_valid_pathlength(stream->pathName, stream-
> > >fileName,
> >
> >     root_str_in) == false) {
> > @@ -483,7 +485,8 @@ int lgs_cfg_verify_root_dir(const std::s
> >                     rc = -1;
> >                     goto done;
> >             }
> > -           stream = log_stream_getnext_by_name(stream->name);
> > +
> > +           stream = log_stream_get_by_id(--num);
> >     }
> >
> >     if (lgs_path_is_writeable_dir_h(root_str_in) == false) {
> > @@ -785,7 +788,6 @@ static int verify_all_init()
> >   */
> >  static void read_logsv_config_obj_2() {
> >     SaImmHandleT omHandle;
> > -   SaNameT objectName;
> >     SaImmAccessorHandleT accessorHandle;
> >     SaImmAttrValuesT_2 *attribute;
> >     SaImmAttrValuesT_2 **attributes;
> > @@ -808,18 +810,15 @@ static void read_logsv_config_obj_2() {
> >             osaf_abort(0);
> >     }
> >
> > -   n = snprintf((char *) objectName.value, SA_MAX_NAME_LENGTH,
> > "%s",
> > -                   LGS_IMM_LOG_CONFIGURATION);
> > -   if (n >= SA_MAX_NAME_LENGTH) {
> > -           LOG_ER("%s: Fail Object name > SA_MAX_NAME_LENGTH",
> > __FUNCTION__);
> > -           osaf_abort(0); /* Should never happen */
> > -   }
> > -   objectName.length = strlen((char *) objectName.value);
> > +   SaConstStringT objectName = LGS_IMM_LOG_CONFIGURATION;
> > +
> > +   SaNameT tmpObjName;
> > +   osaf_extended_name_lend(objectName, &tmpObjName);
> >
> >     /* Get all attributes of the object */
> >     if ((om_rc = immutil_saImmOmAccessorGet_2(
> >                  accessorHandle,
> > -                &objectName,
> > +                &tmpObjName,
> >                  NULL,
> >                  &attributes)) != SA_AIS_OK) {
> >             LOG_NO("%s immutil_saImmOmAccessorGet_2 Fail: %s",
> > @@ -1396,15 +1395,14 @@ void conf_runtime_obj_create(SaImmOiHand
> >             NULL
> >     };
> >
> > -   SaNameT parent_name, *parent_name_p;
> > -   strcpy((char *) parent_name.value, "safApp=safLogService");
> > -   parent_name.length = strlen((char *) parent_name.value);
> > -   parent_name_p = &parent_name;
> > +   SaNameT parent_name_p;
> > +   SaConstStringT parent_name = "safApp=safLogService";
> > +   osaf_extended_name_lend(parent_name, &parent_name_p);
> >
> >     rc = immutil_saImmOiRtObjectCreate_2(
> >             immOiHandle,
> >
> >     const_cast<SaImmClassNameT>("OpenSafLogCurrentConfig"),
> > -           parent_name_p,
> > +           &parent_name_p,
> >             attrValues);
> >
> >     if (rc == SA_AIS_ERR_EXIST) {
> > diff --git a/osaf/services/saf/logsv/lgs/lgs_evt.cc
> > b/osaf/services/saf/logsv/lgs/lgs_evt.cc
> > --- a/osaf/services/saf/logsv/lgs/lgs_evt.cc
> > +++ b/osaf/services/saf/logsv/lgs/lgs_evt.cc
> > @@ -23,6 +23,7 @@
> >  #include "lgs_mbcsv_v2.h"
> >  #include "lgs_recov.h"
> >  #include "lgs_imm_gcfg.h"
> > +#include "osaf_extended_name.h"
> >
> >  /* Macro to validate the version */
> >  #define m_LOG_VER_IS_VALID(ver)   \
> > @@ -542,12 +543,13 @@ static uint32_t proc_rda_cb_msg(lgsv_lgs
> >             lgs_process_lga_down_list();
> >
> >             /* Check existing streams */
> > -           stream = log_stream_getnext_by_name(NULL);
> > +           int num = get_number_of_streams();
> > +           stream = log_stream_get_by_id(--num);
> >             if (!stream)
> >                     LOG_ER("No streams exist!");
> >             while (stream != NULL) {
> > -                   *stream->p_fd = -1; /* Initialize fd */
> > -                   stream = log_stream_getnext_by_name(stream-
> > >name);
> > +                   *stream->p_fd = -1; /* Initialize fd */
> > +                   stream = log_stream_get_by_id(--num);
> >             }
> >     }
> >
> > @@ -764,7 +766,7 @@ static uint32_t lgs_ckpt_stream_open(lgs
> >             ckpt_rec_open_ptr->logPath = const_cast<char
> > *>(logStream->pathName.c_str());
> >             ckpt_rec_open_ptr->logFileCurrent = const_cast<char
> > *>(logStream->logFileCurrent.c_str());
> >             ckpt_rec_open_ptr->fileFmt = logStream->logFileFormat;
> > -           ckpt_rec_open_ptr->logStreamName = logStream->name;
> > +           ckpt_rec_open_ptr->logStreamName = const_cast<char
> > *>(logStream->name.c_str());
> >
> >             ckpt_rec_open_ptr->maxFileSize = logStream-
> > >maxLogFileSize;
> >             ckpt_rec_open_ptr->maxLogRecordSize = logStream-
> > >fixedLogRecordSize;
> > @@ -803,11 +805,13 @@ SaAisErrorT create_new_app_stream(
> [Lennart] This function has an unused in parameter "creationFlag". Remove
if
> no longer needed.
> The original usage of this flag was when creation of a stream it could be
> selected whether also new files for the stream should be created or not.
> The flag was introduced so that a stream could be created during recovery
in
> such a way that already exiting files could be reused
[Vu] Done. I removed it.
> 
> >     log_stream_t *stream;
> >     SaBoolT twelveHourModeFlag;
> >     SaUint32T logMaxLogrecsize_conf = 0;
> > +   SaConstStringT str_name;
> > +   int num, err = 0;
> >
> >     TRACE_ENTER();
> >
> > -   if (open_sync_param->lstr_name.length >
> > SA_MAX_NAME_LENGTH) {
> > -           TRACE("Name too long");
> > +   if (lgs_is_extended_name_valid(&open_sync_param->lstr_name)
> > == false) {
> > +           TRACE("SaNameT is invalid");
> >             rc = SA_AIS_ERR_INVALID_PARAM;
> >             goto done;
> >     }
> > @@ -863,7 +867,8 @@ SaAisErrorT create_new_app_stream(
> >     }
> >
> >     /* Verify that path and file are unique */
> > -   stream = log_stream_getnext_by_name(NULL);
> > +   num = get_number_of_streams();
> > +   stream = log_stream_get_by_id(--num);
> >     while (stream != NULL) {
> >             if ((stream->fileName == open_sync_param->logFileName)
> > &&
> >                 (stream->pathName == open_sync_param-
> > >logFilePathName)) {
> > @@ -871,12 +876,13 @@ SaAisErrorT create_new_app_stream(
> >                     rc = SA_AIS_ERR_INVALID_PARAM;
> >                     goto done;
> >             }
> > -           stream = log_stream_getnext_by_name(stream->name);
> > +           stream = log_stream_get_by_id(--num);
> >     }
> >
> >     /* Verify that the name seems to be a DN */
> > -   if (strncmp("safLgStr=", (char *)open_sync_param-
> > >lstr_name.value, sizeof("safLgStr=") != 0)) {
> > -           TRACE("'%s' is not a valid stream name => invalid param",
> > open_sync_param->lstr_name.value);
> > +   str_name = osaf_extended_name_borrow(&open_sync_param-
> > >lstr_name);
> > +   if (strncmp("safLgStr=", str_name, sizeof("safLgStr=") != 0)) {
> > +           TRACE("'%s' is not a valid stream name => invalid param",
> > str_name);
> >             rc = SA_AIS_ERR_INVALID_PARAM;
> >             goto done;
> >     }
> > @@ -891,25 +897,34 @@ SaAisErrorT create_new_app_stream(
> >             goto done;
> >     }
> >
> > -   stream = log_stream_new_1(&open_sync_param->lstr_name,
> > -                           open_sync_param->logFileName,
> > -                           open_sync_param->logFilePathName,
> > -                           open_sync_param->maxLogFileSize,
> > -                           open_sync_param->maxLogRecordSize,
> > -                           open_sync_param->logFileFullAction,
> > -                           open_sync_param->maxFilesRotated,
> > -                           open_sync_param->logFileFmt,
> > -                           STREAM_TYPE_APPLICATION,
> > -                           STREAM_NEW,
> > -                           twelveHourModeFlag,
> > -                           0,
> > -                           creationFlag);
> > +   *o_stream = log_stream_new(str_name, STREAM_NEW);
> > +   if (*o_stream == NULL) {
> > +           rc = SA_AIS_ERR_NO_MEMORY;
> > +           goto done;
> >
> > -   if (stream == NULL) {
> > +   }
> > +
> > +   err = lgs_populate_log_stream(
> > +           open_sync_param->logFileName,
> > +           open_sync_param->logFilePathName,
> > +           open_sync_param->maxLogFileSize,
> > +           open_sync_param->maxLogRecordSize,
> > +           open_sync_param->logFileFullAction,
> > +           open_sync_param->maxFilesRotated,
> > +           open_sync_param->logFileFmt,
> > +           STREAM_TYPE_APPLICATION,
> > +           twelveHourModeFlag,
> > +           0,
> > +           *o_stream // output
> > +           );
> > +   if (err == -1) {
> > +           log_stream_delete(o_stream);
> >             rc = SA_AIS_ERR_NO_MEMORY;
> >             goto done;
> >     }
> > -   *o_stream = stream;
> > +
> > +   rc = lgs_create_rt_appstream(*o_stream);
> > +   if (rc != SA_AIS_OK) log_stream_delete(o_stream);
> >
> >   done:
> >     TRACE_LEAVE();
> > @@ -926,7 +941,7 @@ static SaAisErrorT file_attribute_cmp(lg
> >  {
> >     SaAisErrorT rs = SA_AIS_OK;
> >
> > -   TRACE_ENTER2("Stream: %s", applicationStream->name);
> > +   TRACE_ENTER2("Stream: %s", applicationStream->name.c_str());
> >
> >     if (open_sync_param->maxLogFileSize != applicationStream-
> > >maxLogFileSize ||
> >         open_sync_param->maxLogRecordSize != applicationStream-
> > >fixedLogRecordSize ||
> > @@ -983,15 +998,14 @@ static uint32_t proc_stream_open_msg(lgs
> >     lgsv_msg_t msg;
> >     lgsv_stream_open_req_t *open_sync_param = &(evt-
> > >info.msg.info.api_info.param.lstr_open_sync);
> >     log_stream_t *logStream;
> > -   char name[SA_MAX_NAME_LENGTH + 1];
> > +   std::string name;
> >     time_t file_closetime = 0;
> >     int i_rc = 0;
> >
> >     /* Create null-terminated stream name */
> > -   memcpy(name, open_sync_param->lstr_name.value,
> > open_sync_param->lstr_name.length);
> > -   memset(&name[open_sync_param->lstr_name.length], 0,
> > SA_MAX_NAME_LENGTH + 1 - open_sync_param->lstr_name.length);
> > +   name = osaf_extended_name_borrow(&open_sync_param-
> > >lstr_name);
> >
> > -   TRACE_ENTER2("stream '%s', client_id %u", name,
> > open_sync_param->client_id);
> > +   TRACE_ENTER2("stream '%s', client_id %u", name.c_str(),
> > open_sync_param->client_id);
> >
> >     logStream = log_stream_get_by_name(name);
> >     if (logStream != NULL) {
> > @@ -1036,7 +1050,7 @@ static uint32_t proc_stream_open_msg(lgs
> >                                     ais_rv = SA_AIS_ERR_NOT_EXIST;
> >                                     goto snd_rsp;
> >                             }
> > -                           TRACE("%s Stream %s is recovered",
> > __FUNCTION__, name);
> > +                           TRACE("%s Stream %s is recovered",
> > __FUNCTION__, name.c_str());
> >                             log_stream_print(logStream); /* TRACE */
> >                             lstr_id = logStream->streamId;
> >                             goto snd_rsp;
> > @@ -1112,6 +1126,7 @@ static uint32_t proc_stream_open_msg(lgs
> >     free(open_sync_param->logFileFmt);
> >     free(open_sync_param->logFilePathName);
> >     free(open_sync_param->logFileName);
> > +   osaf_extended_name_free(&open_sync_param->lstr_name);
> >
> >     TRACE_LEAVE();
> >     return rc;
> > diff --git a/osaf/services/saf/logsv/lgs/lgs_filehdl.cc
> > b/osaf/services/saf/logsv/lgs/lgs_filehdl.cc
> > --- a/osaf/services/saf/logsv/lgs/lgs_filehdl.cc
> > +++ b/osaf/services/saf/logsv/lgs/lgs_filehdl.cc
> > @@ -539,17 +539,17 @@ static int check_oldest(char *line, char
> >     int date, time, c, d;
> >     date = time = c = d = 0;
> >     int len = 0;
> > -   char name_format[SA_MAX_NAME_LENGTH];
> > +   std::string name_format;
> >     char time_stamps[] = "_%d_%d_%d_%d.log";
> >
> >     len = strlen(time_stamps);
> >     len += fname_prefix_size;
> >
> > -   strncpy(name_format, fname_prefix, fname_prefix_size);
> > -   name_format[fname_prefix_size] = '\0';
> > -   TRACE_3("fname: %s", name_format);
> > -   strncat(name_format, time_stamps, SA_MAX_NAME_LENGTH-1);
> > -   if (sscanf(line, name_format, &date, &time, &c, &d) >= 2) {
> > +   name_format = std::string(fname_prefix);
> > +   TRACE_3("fname: %s", name_format.c_str());
> > +
> > +   name_format = name_format + time_stamps;
> > +   if (sscanf(line, name_format.c_str(), &date, &time, &c, &d) >= 2) {
> >             TRACE_3("%s: line: arg 1: %d 2: %d 3: %d 4: %d ok",
> > __FUNCTION__,
> >                             date, time, c, d);
> >             if (date < *old_date || *old_date == -1) {
> > diff --git a/osaf/services/saf/logsv/lgs/lgs_fmt.cc
> > b/osaf/services/saf/logsv/lgs/lgs_fmt.cc
> > --- a/osaf/services/saf/logsv/lgs/lgs_fmt.cc
> > +++ b/osaf/services/saf/logsv/lgs/lgs_fmt.cc
> > @@ -24,6 +24,7 @@
> >
> >  #include "lgs_fmt.h"
> >  #include "lgs.h"
> > +#include "osaf_extended_name.h"
> >
> >  /* Number of seconds per an hour/minute */
> >  #define SECOND_PER_HOUR  3600L
> > @@ -40,19 +41,23 @@
> >  static SaInt32T checkFieldSize(SaStringT inputString, SaUint16T
> > *numOfDigits)
> >  {
> >     SaInt32T result = 0;
> > -   SaInt8T dest[SA_MAX_NAME_LENGTH];
> > +   std::string dest;
> >     char **endptr = NULL;
> > +   int maxDigitsNum =
> > std::to_string(SA_LOG_MAX_RECORD_SIZE).size() + 1;
> >
> > -   (void)strcpy(dest, ""); /* Init dest */
> >     *numOfDigits = 0;
> > +   dest.clear();
> >
> >     /* Build string of characters */
> > -   while ((isdigit(*inputString) != 0) && (*numOfDigits <
> > SA_MAX_NAME_LENGTH)) {
> > +   while ((isdigit(*inputString) != 0) && (*numOfDigits <
> > maxDigitsNum)) {
> > +           char c = *inputString;
> > +           dest += c;
> > +           inputString++;
> >             *numOfDigits = *numOfDigits + 1;
> > -           (void)strncat(dest, inputString++, sizeof(SaInt8T));
> >     }
> >
> > -   result = strtol(dest, endptr, 0);
> > +   result = strtol(dest.c_str(), endptr, 0);
> > +
> >     return result;
> >  }
> >
> > @@ -1048,12 +1053,11 @@ static int extractNotificationField(char
> >             fieldSize = checkFieldSize(fmtExpPtr, &fieldSizeOffset);
> >             if (fieldSize == 0) {
> >                     characters = snprintf(dest, dest_size, "%s",
> > -                                           logRecord-
> > >logHeader.ntfHdr.notificationObject->value);
> > +
> > osaf_extended_name_borrow(logRecord-
> > >logHeader.ntfHdr.notificationObject));
> >             } else {
> > -                   characters = snprintf(dest, dest_size,
> > -                                           "%*.*s",
> > -                                           (int) -fieldSize,
> > -                                           (int) fieldSize, logRecord-
> > >logHeader.ntfHdr.notificationObject->value);
> > +                   characters = snprintf(dest, dest_size, "%*.*s",
(int) -
> > fieldSize,
> > +                                         (int) fieldSize,
> > +
> > osaf_extended_name_borrow(logRecord-
> > >logHeader.ntfHdr.notificationObject));
> >             }
> >
> >             *fmtExpPtrOffset = *fmtExpPtrOffset + fieldSizeOffset;
> > @@ -1063,13 +1067,12 @@ static int extractNotificationField(char
> >             /* Check field size and trunkate alternative pad with blanks
> > */
> >             fieldSize = checkFieldSize(fmtExpPtr, &fieldSizeOffset);
> >             if (fieldSize == 0) {
> > -                   characters = snprintf(dest,
> > -                                           dest_size, "%s", logRecord-
> > >logHeader.ntfHdr.notifyingObject->value);
> > +                   characters = snprintf(dest, dest_size, "%s",
> > +
> > osaf_extended_name_borrow(logRecord-
> > >logHeader.ntfHdr.notifyingObject));
> >             } else {
> > -                   characters = snprintf(dest, dest_size,
> > -                                           "%*.*s",
> > -                                           (int) -fieldSize,
> > -                                           (int) fieldSize, logRecord-
> > >logHeader.ntfHdr.notifyingObject->value);
> > +                   characters = snprintf(dest, dest_size, "%*.*s",
(int) -
> > fieldSize,
> > +                                         (int) fieldSize,
> > +
> > osaf_extended_name_borrow(logRecord-
> > >logHeader.ntfHdr.notifyingObject));
> >             }
> >
> >             *fmtExpPtrOffset = *fmtExpPtrOffset + fieldSizeOffset;
> > @@ -1114,10 +1117,12 @@ static int extractSystemField(char *dest
> >                     characters = snprintf(dest, dest_size,
> >                                           "%*.*s",
> >                                           (int)-fieldSize,
> > -                                         (int)fieldSize, logRecord-
> > >logHeader.genericHdr.logSvcUsrName->value);
> > +                                         (int)fieldSize,
> > +
> > osaf_extended_name_borrow(logRecord-
> > >logHeader.genericHdr.logSvcUsrName));
> >             } else {
> >                     characters = snprintf(dest, dest_size,
> > -                                         "%s", logRecord-
> > >logHeader.genericHdr.logSvcUsrName->value);
> > +                                         "%s",
> > +
> > osaf_extended_name_borrow(logRecord-
> > >logHeader.genericHdr.logSvcUsrName));
> >             }
> >             *fmtExpPtrOffset = *fmtExpPtrOffset + fieldSizeOffset;
> >             break;
> > diff --git a/osaf/services/saf/logsv/lgs/lgs_imm.cc
> > b/osaf/services/saf/logsv/lgs/lgs_imm.cc
> > --- a/osaf/services/saf/logsv/lgs/lgs_imm.cc
> > +++ b/osaf/services/saf/logsv/lgs/lgs_imm.cc
> > @@ -248,7 +248,7 @@ static uint32_t ckpt_stream_config(log_s
> >             ckpt_v2.header.num_ckpt_records = 1;
> >             ckpt_v2.header.data_len = 1;
> >
> > -           ckpt_v2.ckpt_rec.stream_cfg.name = (char *)stream->name;
> > +           ckpt_v2.ckpt_rec.stream_cfg.name = const_cast<char
> > *>(stream->name.c_str());
> >             ckpt_v2.ckpt_rec.stream_cfg.fileName = const_cast<char
> > *>(stream->fileName.c_str());
> >             ckpt_v2.ckpt_rec.stream_cfg.pathName = const_cast<char
> > *>(stream->pathName.c_str());
> >             ckpt_v2.ckpt_rec.stream_cfg.maxLogFileSize = stream-
> > >maxLogFileSize;
> > @@ -267,7 +267,7 @@ static uint32_t ckpt_stream_config(log_s
> >             ckpt_v1.header.num_ckpt_records = 1;
> >             ckpt_v1.header.data_len = 1;
> >
> > -           ckpt_v1.ckpt_rec.stream_cfg.name = (char *)stream->name;
> > +           ckpt_v1.ckpt_rec.stream_cfg.name = const_cast<char
> > *>(stream->name.c_str());
> >             ckpt_v1.ckpt_rec.stream_cfg.fileName = const_cast<char
> > *>(stream->fileName.c_str());
> >             ckpt_v1.ckpt_rec.stream_cfg.pathName = const_cast<char
> > *>(stream->pathName.c_str());
> >             ckpt_v1.ckpt_rec.stream_cfg.maxLogFileSize = stream-
> > >maxLogFileSize;
> > @@ -389,17 +389,17 @@ static void adminOperationCallback(SaImm
> >     const SaImmAdminOperationParamsT_2 *param = params[0];
> >     log_stream_t *stream;
> >     SaAisErrorT ais_rc = SA_AIS_OK;
> > -
> > -   TRACE_ENTER2("%s", objectName->value);
> > +   SaConstStringT objName =
> > osaf_extended_name_borrow(objectName);
> > +
> > +   TRACE_ENTER2("%s", objName);
> >
> >     if (lgs_cb->ha_state != SA_AMF_HA_ACTIVE) {
> >             LOG_ER("admin op callback in applier");
> >             goto done;
> >     }
> >
> > -   if ((stream = log_stream_get_by_name((char *)objectName-
> > >value)) == NULL) {
> > -           report_om_error(immOiHandle, invocation, "Stream %s not
> > found",
> > -                           objectName->value);
> > +   if ((stream = log_stream_get_by_name(objName)) == NULL) {
> > +           report_om_error(immOiHandle, invocation, "Stream %s not
> > found", objName);
> >             goto done;
> >     }
> >
> > @@ -467,12 +467,12 @@ static void adminOperationCallback(SaImm
> >                     goto done;
> >             }
> >
> > -           TRACE("Changing severity for stream %s to %u", stream-
> > >name, severityFilter);
> > +           TRACE("Changing severity for stream %s to %u", stream-
> > >name.c_str(), severityFilter);
> >             stream->severityFilter = severityFilter;
> >
> >             ais_rc = immutil_update_one_rattr(
> >                     immOiHandle,
> > -                   reinterpret_cast<const char *>(objectName->value),
> > +                   objName,
> >
> >     const_cast<SaImmAttrNameT>("saLogStreamSeverityFilter"),
> >                     SA_IMM_ATTR_SAUINT32T,
> >                     &stream->severityFilter);
> > @@ -505,8 +505,9 @@ static SaAisErrorT ccbObjectDeleteCallba
> >  {
> >     SaAisErrorT rc = SA_AIS_OK;
> >     struct CcbUtilCcbData *ccbUtilCcbData;
> > -
> > -   TRACE_ENTER2("CCB ID %llu, '%s'", ccbId, objectName->value);
> > +   SaConstStringT objName =
> > osaf_extended_name_borrow(objectName);
> > +
> > +   TRACE_ENTER2("CCB ID %llu, '%s'", ccbId, objName);
> >
> >     if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) {
> >             if ((ccbUtilCcbData = ccbutil_getCcbData(ccbId)) == NULL) {
> > @@ -530,9 +531,10 @@ static SaAisErrorT ccbObjectCreateCallba
> >  {
> >     SaAisErrorT rc = SA_AIS_OK;
> >     struct CcbUtilCcbData *ccbUtilCcbData;
> > +   SaConstStringT parName =
> > osaf_extended_name_borrow(parentName);
> >
> >     TRACE_ENTER2("CCB ID %llu, class '%s', parent '%s'",
> > -                   ccbId, className, parentName->value);
> > +                ccbId, className, parName);
> >
> >     if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) {
> >             if ((ccbUtilCcbData = ccbutil_getCcbData(ccbId)) == NULL) {
> > @@ -565,8 +567,9 @@ static SaAisErrorT ccbObjectModifyCallba
> >  {
> >     SaAisErrorT rc = SA_AIS_OK;
> >     struct CcbUtilCcbData *ccbUtilCcbData;
> > -
> > -   TRACE_ENTER2("CCB ID %llu, '%s'", ccbId, objectName->value);
> > +   SaConstStringT objName =
> > osaf_extended_name_borrow(objectName);
> > +
> > +   TRACE_ENTER2("CCB ID %llu, '%s'", ccbId, objName);
> >
> >     if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) {
> >             if ((ccbUtilCcbData = ccbutil_getCcbData(ccbId)) == NULL) {
> > @@ -745,8 +748,8 @@ static SaAisErrorT config_ccb_completed_
> >     };
> >
> >     char oi_err_str[256];
> > -
> > -   TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, opdata-
> > >objectName.value);
> > +   SaConstStringT objName = osaf_extended_name_borrow(&opdata-
> > >objectName);
> > +   TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, objName);
> >
> >     attrMod = opdata->param.modify.attrMods[i++];
> >     while (attrMod != NULL) {
> > @@ -765,7 +768,7 @@ static SaAisErrorT config_ccb_completed_
> >                      (attribute->attrValuesNumber == 0)) {
> >                             report_oi_error(immOiHandle, opdata-
> > >ccbId,
> >                                     "deletion of value is not allowed
for
> > attribute %s stream %s",
> > -                                   attribute->attrName, opdata-
> > >objectName.value);
> > +                                           attribute->attrName,
> > objName);
> >                             ais_rc = SA_AIS_ERR_BAD_OPERATION;
> >                             goto done;
> >             }
> > @@ -1044,6 +1047,7 @@ bool chk_filepath_stream_exist(
> >     log_stream_t *i_stream = NULL;
> >     std::string i_fileName;
> >     std::string i_pathName;
> > +   int num;
> >     bool rc = false;
> >
> >     TRACE_ENTER();
> > @@ -1093,15 +1097,17 @@ bool chk_filepath_stream_exist(
> >
> >     /* Check if any stream has given filename and path */
> >     TRACE("Check if any stream has given filename and path");
> > -   i_stream = log_stream_getnext_by_name(NULL);
> > +   num = get_number_of_streams();
> > +   i_stream = log_stream_get_by_id(--num);
> >     while (i_stream != NULL) {
> > -           TRACE("Check stream \"%s\"", i_stream->name);
> > +           TRACE("Check stream \"%s\"", i_stream->name.c_str());
> >             if ((i_stream->fileName == i_fileName) &&
> >                     (i_stream->pathName == i_pathName)) {
> >                     rc = true;
> >                     break;
> >             }
> > -           i_stream = log_stream_getnext_by_name(i_stream-
> > >name);
> > +
> > +           i_stream = log_stream_get_by_id(--num);
> >     }
> >
> >     TRACE_LEAVE2("rc = %d", rc);
> > @@ -1317,8 +1323,8 @@ static SaAisErrorT check_attr_validity(S
> >      */
> >     if (opdata->operationType == CCBUTIL_MODIFY) {
> >             TRACE("Validate for MODIFY");
> > -           stream = log_stream_get_by_name(
> > -                           (char *) opdata->param.modify.objectName-
> > >value);
> > +           SaConstStringT objName =
> > osaf_extended_name_borrow(opdata->param.modify.objectName);
> > +           stream = log_stream_get_by_name(objName);
> >             if (stream == NULL) {
> >                     /* No stream to modify */
> >                     report_oi_error(immOiHandle, opdata->ccbId,
> > @@ -1687,7 +1693,7 @@ static SaAisErrorT stream_ccb_completed_
> >  {
> >     SaAisErrorT rc;
> >
> > -   TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, opdata-
> > >objectName.value);
> > +   TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId,
> > osaf_extended_name_borrow(&opdata->objectName));
> >     rc = check_attr_validity(immOiHandle, opdata);
> >     TRACE_LEAVE2("rc = %u", rc);
> >     return rc;
> > @@ -1703,9 +1709,9 @@ static SaAisErrorT stream_ccb_completed_
> >  {
> >     SaAisErrorT rc = SA_AIS_ERR_BAD_OPERATION;
> >
> > -   TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, opdata-
> > >objectName.value);
> > -
> > -   const char *name = (char*) opdata->param.delete_.objectName-
> > >value;
> > +   TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId,
> > osaf_extended_name_borrow(&opdata->objectName));
> > +
> > +   SaConstStringT name = osaf_extended_name_borrow(opdata-
> > >param.delete_.objectName);
> >     log_stream_t *stream = log_stream_get_by_name(name);
> >
> >     if (stream != NULL) {
> > @@ -1728,8 +1734,7 @@ static SaAisErrorT stream_ccb_completed_
> >
> >             rc = SA_AIS_OK;
> >     } else {
> > -           report_oi_error(immOiHandle, opdata->ccbId,
> > -                           "stream %s not found", name);
> > +           report_oi_error(immOiHandle, opdata->ccbId, "stream %s
> > not found", name);
> >     }
> >
> >  done:
> > @@ -1806,7 +1811,7 @@ static SaAisErrorT ccbCompletedCallback(
> >                     break;
> >             case CCBUTIL_DELETE:
> >             case CCBUTIL_MODIFY:
> > -                   if (!strncmp((char*)opdata->objectName.value,
> > "safLgStrCfg", 11)) {
> > +                   if
> > (!strncmp(osaf_extended_name_borrow(&opdata->objectName),
> > "safLgStrCfg", 11)) {
> >                             rc = stream_ccb_completed(immOiHandle,
> > opdata);
> >                     } else {
> >                             rc = config_ccb_completed(immOiHandle,
> > opdata);
> > @@ -1854,10 +1859,12 @@ void logRootDirectory_filemove(
> >     TRACE_ENTER();
> >     log_stream_t *stream;
> >     std::string current_logfile;
> > +   int num;
> >
> >     /* Close and rename files at current path
> >      */
> > -   stream = log_stream_getnext_by_name(NULL);
> > +   num = get_number_of_streams();
> > +   stream = log_stream_get_by_id(--num);
> >     while (stream != NULL) {
> >             TRACE("Handling file %s", stream->logFileCurrent.c_str());
> >
> > @@ -1873,18 +1880,19 @@ void logRootDirectory_filemove(
> >                             old_logRootDirectory, stream,
> > current_logfile,
> >                             cur_time_in) != 0) {
> >                     LOG_ER("Old log files could not be renamed and
> > closed for stream: %s",
> > -                                   stream->name);
> > +                          stream->name.c_str());
> >             }
> > -           stream = log_stream_getnext_by_name(stream->name);
> > +           stream = log_stream_get_by_id(--num);
> >     }
> >
> >     /* Create new files at new path
> >      */
> > -   stream = log_stream_getnext_by_name(NULL);
> > +   num = get_number_of_streams();
> > +   stream = log_stream_get_by_id(--num);
> >     while (stream != NULL) {
> >             if (lgs_create_config_file_h(new_logRootDirectory, stream)
> > != 0) {
> >                     LOG_ER("New config file could not be created for
> > stream: %s",
> > -                                   stream->name);
> > +                          stream->name.c_str());
> >             }
> >
> >             /* Create the new log file based on updated configuration */
> > @@ -1894,14 +1902,14 @@ void logRootDirectory_filemove(
> >             if ((*stream->p_fd = log_file_open(new_logRootDirectory,
> >                     stream, stream->logFileCurrent, NULL)) == -1) {
> >                     LOG_ER("New log file could not be created for
> > stream: %s",
> > -                                   stream->name);
> > +                          stream->name.c_str());
> >             }
> >
> >             /* Also update standby current file name
> >              * Used if standby and configured for split file system
> >              */
> >             stream->stb_logFileCurrent = stream->logFileCurrent;
> > -           stream = log_stream_getnext_by_name(stream->name);
> > +           stream = log_stream_get_by_id(--num);
> >     }
> >     TRACE_LEAVE();
> >  }
> > @@ -1918,6 +1926,7 @@ void logDataGroupname_fileown(const char
> >  {
> >     TRACE_ENTER();
> >     log_stream_t *stream;
> > +   int num;
> >
> >     if (new_logDataGroupname == NULL) {
> >             LOG_ER("Data group is NULL");
> > @@ -1929,10 +1938,11 @@ void logDataGroupname_fileown(const char
> >             /* Not attribute values deletion
> >              * Change ownership of log files to this new group
> >              */
> > -           stream = log_stream_getnext_by_name(NULL);
> > +           num = get_number_of_streams();
> > +           stream = log_stream_get_by_id(--num);
> >             while (stream != NULL) {
> >                     lgs_own_log_files_h(stream,
> > new_logDataGroupname);
> > -                   stream = log_stream_getnext_by_name(stream-
> > >name);
> > +                   stream = log_stream_get_by_id(--num);
> >             }
> >     }
> >     TRACE_LEAVE();
> > @@ -1993,7 +2003,7 @@ static void config_ccb_apply_modify(cons
> >     /* Flag set if any of the mailbox limit values have changed */
> >     bool mailbox_lim_upd = false;
> >
> > -   TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, opdata-
> > >objectName.value);
> > +   TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId,
> > osaf_extended_name_borrow(&opdata->objectName));
> >
> >     attrMod = opdata->param.modify.attrMods[i++];
> >     while (attrMod != NULL) {
> > @@ -2141,7 +2151,7 @@ static SaAisErrorT stream_create_and_con
> >     SaAisErrorT rc = SA_AIS_OK;
> >     *stream = NULL;
> >     int i = 0;
> > -   SaNameT objectName;
> > +   std::string objectName;
> >     std::string fileName;
> >     std::string pathName;
> >
> > @@ -2150,16 +2160,15 @@ static SaAisErrorT stream_create_and_con
> >     while (ccb->param.create.attrValues[i] != NULL) {
> >             if (!strncmp(ccb->param.create.attrValues[i]->attrName,
> > "safLgStrCfg",
> >                             sizeof("safLgStrCfg"))) {
> > -                   if (ccb->param.create.parentName->length > 0) {
> > -                           objectName.length = snprintf((char*)
> > objectName.value, sizeof(objectName.value),
> > -                                           "%s,%s", *(const SaStringT*)
> > ccb->param.create.attrValues[i]->attrValues[0],
> > -                                           ccb-
> > >param.create.parentName->value);
> > +                   SaConstStringT parentName =
> > osaf_extended_name_borrow(ccb->param.create.parentName);
> > +                   if (strlen(parentName) > 0) {
> > +                           objectName =  std::string(*(const
SaStringT*)
> > ccb->param.create.attrValues[i]->attrValues[0])
> > +                                   + "," + parentName ;
> >                     } else {
> > -                           objectName.length = snprintf((char*)
> > objectName.value, sizeof(objectName.value),
> > -                                           "%s", *(const SaStringT*)
> ccb-
> > >param.create.attrValues[i]->attrValues[0]);
> > +                           objectName =  std::string(*(const
SaStringT*)
> > ccb->param.create.attrValues[i]->attrValues[0]);
> >                     }
> >
> > -                   if ((*stream = log_stream_new_2(&objectName,
> > STREAM_NEW)) == NULL) {
> > +                   if ((*stream = log_stream_new(objectName,
> > STREAM_NEW)) == NULL) {
> >                             rc = SA_AIS_ERR_NO_MEMORY;
> >                             goto done;
> >                     }
> > @@ -2203,7 +2212,7 @@ static SaAisErrorT stream_create_and_con
> >                             SaBoolT dummy;
> >                             char *logFileFormat = *((char **) value);
> >                             if
> > (!lgs_is_valid_format_expression(logFileFormat, (*stream)->streamType,
> > &dummy)) {
> > -                                   LOG_WA("Invalid logFileFormat for
> > stream %s, using default", (*stream)->name);
> > +                                   LOG_WA("Invalid logFileFormat for
> > stream %s, using default", (*stream)->name.c_str());
> >                                     logFileFormat = const_cast<char
> > *>(static_cast<const char *>(
> >
> >     lgs_cfg_get(LGS_IMM_LOG_STREAM_FILE_FORMAT)));
> >                             }
> > @@ -2236,16 +2245,16 @@ static SaAisErrorT stream_create_and_con
> >     }
> >
> >     /* Update creation timestamp */
> > -   rc = immutil_update_one_rattr(lgs_cb->immOiHandle,
> > reinterpret_cast<const char *>(objectName.value),
> > -
> >     const_cast<SaImmAttrNameT>("saLogStreamCreationTimestamp"),
> > SA_IMM_ATTR_SATIMET,
> > -                   &(*stream)->creationTimeStamp);
> > +   rc = immutil_update_one_rattr(lgs_cb->immOiHandle,
> > objectName.c_str(),
> > +
> > const_cast<SaImmAttrNameT>("saLogStreamCreationTimestamp"),
> > SA_IMM_ATTR_SATIMET,
> > +                                 &(*stream)->creationTimeStamp);
> >     if (rc != SA_AIS_OK) {
> >             LOG_ER("immutil_update_one_rattr failed %s",
> > saf_error(rc));
> >             osaf_abort(0);
> >     }
> >
> >     done:
> > -   TRACE_LEAVE();
> > +   TRACE_LEAVE2("rc: %s", saf_error(rc));
> >     return rc;
> >  }
> >
> > @@ -2254,7 +2263,7 @@ static void stream_ccb_apply_create(cons
> >     SaAisErrorT rc;
> >     log_stream_t *stream;
> >
> > -   TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, opdata-
> > >objectName.value);
> > +   TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId,
> > osaf_extended_name_borrow(&opdata->objectName));
> >
> >     if ((rc = stream_create_and_configure1(opdata, &stream)) ==
> > SA_AIS_OK) {
> >             log_stream_open_fileinit(stream);
> > @@ -2276,10 +2285,10 @@ static void stream_ccb_apply_modify(cons
> >     struct timespec curtime_tspec;
> >     std::string fileName;
> >     bool modify = false;
> > -
> > -   TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, opdata-
> > >objectName.value);
> > -
> > -   stream = log_stream_get_by_name((char*)opdata-
> > >objectName.value);
> > +   SaConstStringT objName = osaf_extended_name_borrow(&opdata-
> > >objectName);
> > +   TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, objName);
> > +
> > +   stream = log_stream_get_by_name(objName);
> >     osafassert(stream);
> >
> >     current_logfile_name = stream->logFileCurrent;
> > @@ -2384,10 +2393,11 @@ static void stream_ccb_apply_delete(cons
> >     struct timespec closetime_tspec;
> >     osaf_clock_gettime(CLOCK_REALTIME, &closetime_tspec);
> >     time_t file_closetime = closetime_tspec.tv_sec;
> > -
> > -   TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, opdata-
> > >objectName.value);
> > -
> > -   stream = log_stream_get_by_name((char *) opdata-
> > >objectName.value);
> > +   SaConstStringT objName = osaf_extended_name_borrow(&opdata-
> > >objectName);
> > +
> > +   TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, objName);
> > +
> > +   stream = log_stream_get_by_name(objName);
> >
> >     /* Checkpoint to standby LOG server */
> >     ckpt_stream_close(stream, file_closetime);
> > @@ -2448,7 +2458,7 @@ static void ccbApplyCallback(SaImmOiHand
> >                     break;
> >             case CCBUTIL_DELETE:
> >             case CCBUTIL_MODIFY:
> > -                   if (!strncmp((char*)opdata->objectName.value,
> > "safLgStrCfg", 11))
> > +                   if
> > (!strncmp(osaf_extended_name_borrow(&opdata->objectName),
> > "safLgStrCfg", 11))
> >                             stream_ccb_apply(opdata);
> >                     else
> >                             config_ccb_apply(opdata);
> > @@ -2495,8 +2505,8 @@ static SaAisErrorT rtAttrUpdateCallback(
> >     SaAisErrorT rc = SA_AIS_ERR_FAILED_OPERATION;
> >     SaImmAttrNameT attributeName;
> >     int i = 0;
> > -
> > -   TRACE_ENTER2("%s", objectName->value);
> > +   SaConstStringT objName =
> > osaf_extended_name_borrow(objectName);
> > +   TRACE_ENTER2("%s", objName);
> >
> >     if (lgs_cb->ha_state != SA_AMF_HA_ACTIVE) {
> >             LOG_ER("admin op callback in applier");
> > @@ -2504,17 +2514,16 @@ static SaAisErrorT rtAttrUpdateCallback(
> >     }
> >
> >     /* Handle configuration runtime object */
> > -   if (strncmp((char *) objectName->value,
> > LGS_CFG_RUNTIME_OBJECT,
> > -                   objectName->length) == 0) {
> > +   if (strncmp(objName, LGS_CFG_RUNTIME_OBJECT,
> > strlen(objName)) == 0) {
> >             /* Handle Runtome configuration object */
> >             conf_runtime_obj_hdl(immOiHandle, attributeNames);
> >     } else {
> >
> >             /* Handle stream object if valid
> >              */
> > -           log_stream_t *stream = log_stream_get_by_name((char
> > *)objectName->value);
> > +           log_stream_t *stream =
> > log_stream_get_by_name(objName);
> >             if (stream == NULL) {
> > -                   LOG_ER("%s: stream %s not found", __FUNCTION__,
> > objectName->value);
> > +                   LOG_ER("%s: stream %s not found", __FUNCTION__,
> > objName);
> >                     goto done;
> >             }
> >
> > @@ -2523,12 +2532,12 @@ static SaAisErrorT rtAttrUpdateCallback(
> >                     rc = SA_AIS_OK;
> >                     if (!strcmp(attributeName,
> > "saLogStreamNumOpeners")) {
> >                             rc =
> > immutil_update_one_rattr(immOiHandle,
> > -                                   (char *)objectName->value,
> > +                                   objName,
> >                                     attributeName,
> > SA_IMM_ATTR_SAUINT32T,
> >                                     &stream->numOpeners);
> >                     } else if (!strcmp(attributeName,
> > "logStreamDiscardedCounter")) {
> >                             rc =
> > immutil_update_one_rattr(immOiHandle,
> > -                                   (char *) objectName->value,
> > +                                   objName,
> >                                     attributeName,
> > SA_IMM_ATTR_SAUINT64T,
> >                                     &stream->filtered);
> >                     } else {
> > @@ -2562,7 +2571,7 @@ done:
> >   *
> >   * @return SaAisErrorT
> >   */
> > -static SaAisErrorT stream_create_and_configure(const char *dn,
> > +static SaAisErrorT stream_create_and_configure(const std::string &dn,
> >             log_stream_t **in_stream, int stream_id,
> >             SaImmAccessorHandleT accessorHandle)
> >  {
> > @@ -2586,23 +2595,22 @@ static SaAisErrorT stream_create_and_con
> >             NULL
> >     };
> >
> > -   TRACE_ENTER2("(%s)", dn);
> > -
> > -   strncpy((char *)objectName.value, dn, SA_MAX_NAME_LENGTH);
> > -   objectName.length = strlen((char *)objectName.value);
> > -
> > -   *in_stream = stream = log_stream_new_2(&objectName,
> > stream_id);
> > +   TRACE_ENTER2("(%s)", dn.c_str());
> > +
> > +   osaf_extended_name_lend(dn.c_str(), &objectName);
> > +
> > +   *in_stream = stream = log_stream_new(dn, stream_id);
> >
> >     if (stream == NULL) {
> >             rc = SA_AIS_ERR_NO_MEMORY;
> >             goto done;
> >     }
> >
> > -   if (strcmp(dn, SA_LOG_STREAM_ALARM) == 0)
> > +   if (dn == SA_LOG_STREAM_ALARM)
> >             stream->streamType = STREAM_TYPE_ALARM;
> > -   else if (strcmp(dn , SA_LOG_STREAM_NOTIFICATION) == 0)
> > +   else if (dn == SA_LOG_STREAM_NOTIFICATION)
> >             stream->streamType = STREAM_TYPE_NOTIFICATION;
> > -   else if (strcmp(dn , SA_LOG_STREAM_SYSTEM) == 0)
> > +   else if (dn == SA_LOG_STREAM_SYSTEM)
> >             stream->streamType = STREAM_TYPE_SYSTEM;
> >     else
> >             stream->streamType = STREAM_TYPE_APPLICATION;
> > @@ -2612,7 +2620,7 @@ static SaAisErrorT stream_create_and_con
> >                  accessorHandle,
> >                  &objectName,
> >                  attribute_names, &attributes)) != SA_AIS_OK) {
> > -           LOG_ER("Configuration for %s not found: %s",
> > objectName.value, saf_error(rc));
> > +           LOG_ER("Configuration for %s not found: %s", dn.c_str(),
> > saf_error(rc));
> >             rc = SA_AIS_ERR_NOT_EXIST;
> >             goto done;
> >     }
> > @@ -2651,7 +2659,7 @@ static SaAisErrorT stream_create_and_con
> >                     SaBoolT dummy;
> >                     char *logFileFormat = *((char **)value);
> >                     if (!lgs_is_valid_format_expression(logFileFormat,
> > stream->streamType, &dummy)) {
> > -                           LOG_WA("Invalid logFileFormat for stream
> > %s, using default", stream->name);
> > +                           LOG_WA("Invalid logFileFormat for stream
> > %s, using default", stream->name.c_str());
> >
> >                             if (stream->streamType ==
> > STREAM_TYPE_APPLICATION) {
> >                                     logFileFormat = const_cast<char
> > *>(static_cast<const char*>(
> > @@ -2696,7 +2704,7 @@ static SaAisErrorT stream_create_and_con
> >     }
> >
> >   done:
> > -   TRACE_LEAVE();
> > +   TRACE_LEAVE2("rc: %s", saf_error(rc));
> >     return rc;
> >  }
> >
> > @@ -2734,7 +2742,7 @@ SaAisErrorT lgs_imm_init_configStreams(l
> >     SaImmAttrValuesT_2 **attributes;
> >     int wellknownStreamId = 0;
> >     int appStreamId = 3;
> > -   int streamId = 0;
> > +   int streamId = 0, num;
> >     SaNameT objectName;
> >     const char *className = "SaLogStreamConfig";
> >
> > @@ -2775,9 +2783,9 @@ SaAisErrorT lgs_imm_init_configStreams(l
> >                      *
> >                      * With well-known streams, stream ID is in reserved
> > numbers [0-2].
> >                      */
> > -                   streamId = is_well_know_stream((char
> > *)objectName.value)? wellknownStreamId++:appStreamId++;
> > -                   ais_rc = stream_create_and_configure((char*)
> > objectName.value,
> > -                                   &stream, streamId, accessorHandle);
> > +                   SaConstStringT name =
> > osaf_extended_name_borrow(&objectName);
> > +                   streamId = is_well_know_stream(name)?
> > wellknownStreamId++:appStreamId++;
> > +                   ais_rc = stream_create_and_configure(name,
> > &stream, streamId, accessorHandle);
> >                     if (ais_rc != SA_AIS_OK) {
> >                             LOG_WA("stream_create_and_configure
> > failed %d", ais_rc);
> >                             goto done;
> > @@ -2798,7 +2806,8 @@ SaAisErrorT lgs_imm_init_configStreams(l
> >             osaf_abort(0);
> >     }
> >
> > -   stream = log_stream_getnext_by_name(NULL);
> > +   num = get_number_of_streams();
> > +   stream = log_stream_get_by_id(--num);
> >     while (stream != NULL) {
> >             if (cb->scAbsenceAllowed != 0) {
> >                     int_rc = log_stream_open_file_restore(stream);
> > @@ -2817,7 +2826,7 @@ SaAisErrorT lgs_imm_init_configStreams(l
> >             }
> >
> >             ais_rc = immutil_update_one_rattr(
> > -                   cb->immOiHandle, stream->name,
> > +                   cb->immOiHandle, stream->name.c_str(),
> >
> >     const_cast<SaImmAttrNameT>("saLogStreamCreationTimestamp"),
> >                     SA_IMM_ATTR_SATIMET,
> >                     &stream->creationTimeStamp);
> > @@ -2826,7 +2835,7 @@ SaAisErrorT lgs_imm_init_configStreams(l
> >                     osaf_abort(0);
> >             }
> >
> > -           stream = log_stream_getnext_by_name(stream->name);
> > +           stream = log_stream_get_by_id(--num);
> >     }
> >
> >   done:
> > @@ -2846,7 +2855,7 @@ SaAisErrorT lgs_imm_init_configStreams(l
> >             LOG_NO("%s immutil_saImmOmFinalize() Fail
> > %d",__FUNCTION__, om_rc);
> >     }
> >
> > -   TRACE_LEAVE();
> > +   TRACE_LEAVE2("rc: %s", saf_error(ais_rc));
> >     return ais_rc;
> >  }
> >
> > @@ -2888,7 +2897,7 @@ void lgs_imm_init_OI_handle(SaImmOiHandl
> >             lgs_exit("saImmOiSelectionObjectGet failed",
> > SA_AMF_COMPONENT_RESTART);
> >     }
> >
> > -   TRACE_LEAVE();
> > +   TRACE_LEAVE2("rc: %s", saf_error(rc));
> >  }
> >
> >  /**
> > @@ -2991,8 +3000,8 @@ static SaAisErrorT imm_impl_set_sequence
> >          }
> >
> >  done:
> > +   TRACE_LEAVE2("rc: %s", saf_error(rc));
> >     return rc;
> > -   TRACE_LEAVE();
> >  }
> >
> >  /**
> > @@ -3136,13 +3145,10 @@ void lgs_search_stream_objects()
> >     searchParam.searchOneAttr.attrName = const_cast<char
> > *>("SaImmAttrClassName");
> >     searchParam.searchOneAttr.attrValueType =
> > SA_IMM_ATTR_SASTRINGT;
> >     searchParam.searchOneAttr.attrValue = &class_name;
> > -   SaNameT root_name;
> > -   root_name.value[0] = '\0';
> > -   root_name.length = 1;
> >
> >     ais_rc = immutil_saImmOmSearchInitialize_2(
> >                     immOmHandle,
> > -                   &root_name,
> > +                   NULL,
> >                     SA_IMM_SUBTREE,
> >                     SA_IMM_SEARCH_ONE_ATTR |
> > SA_IMM_SEARCH_GET_NO_ATTR,
> >                     &searchParam,
> > @@ -3164,13 +3170,13 @@ void lgs_search_stream_objects()
> >     }
> >
> >     while (ais_rc == SA_AIS_OK) {
> > -           TRACE("\tFound object \"%s\"", reinterpret_cast<char
> > *>(object_name.value));
> > +           SaConstStringT objName =
> > osaf_extended_name_borrow(&object_name);
> > +           TRACE("\tFound object \"%s\"", objName);
> >             /* Add the string to the list
> >              */
> > -           rc = log_rtobj_list_add(reinterpret_cast<char
> > *>(object_name.value));
> > +           rc = log_rtobj_list_add(objName);
> >             if (rc == -1) {
> > -                   TRACE("%s Could not add %s to list Fail",
> > -                         __FUNCTION__, reinterpret_cast<char
> > *>(object_name.value));
> > +                   TRACE("%s Could not add %s to list Fail",
> > __FUNCTION__, objName);
> >             }
> >
> >             /* Get next object */
> > @@ -3199,33 +3205,29 @@ done_fin_Om:
> >     }
> >
> >  done:
> > -
> > -   TRACE_LEAVE();
> > +   TRACE_LEAVE2("rc: %s", saf_error(ais_rc));
> >  }
> >
> > -void lgs_delete_one_stream_object(char *name_str)
> > +void lgs_delete_one_stream_object(const std::string &name_str)
> >  {
> >     SaAisErrorT ais_rc = SA_AIS_OK;
> >     SaNameT object_name;
> >
> > -   if (name_str == NULL) {
> > +   if (name_str.empty() == true) {
> >             TRACE("%s No object name given", __FUNCTION__);
> >             return;
> >     }
> >
> >     /* Copy name to a SaNameT */
> > -   (void) strncpy(reinterpret_cast<char *>(object_name.value),
> > -                  name_str, SA_MAX_NAME_LENGTH);
> > -   object_name.length = strlen(name_str) + 1;
> > +   osaf_extended_name_lend(name_str.c_str(), &object_name);
> >
> >     /* and delete the object */
> >     ais_rc = immutil_saImmOiRtObjectDelete(lgs_cb->immOiHandle,
> > &object_name);
> >     if (ais_rc == SA_AIS_OK) {
> > -           TRACE("%s Object \"%s\" deleted", __FUNCTION__,
> > -                 reinterpret_cast<char *>(object_name.value));
> > +           TRACE("%s Object \"%s\" deleted", __FUNCTION__,
> > name_str.c_str());
> >     } else {
> >             LOG_WA("%s saImmOiRtObjectDelete for \"%s\" FAILED
> > %d",
> > -                  __FUNCTION__, reinterpret_cast<char
> > *>(object_name.value), ais_rc);
> > +                  __FUNCTION__, name_str.c_str(), ais_rc);
> >     }
> >  }
> >
> > @@ -3261,19 +3263,14 @@ void lgs_cleanup_abandoned_streams()
> >              */
> >             if (name_str != NULL) {
> >                     /* Copy name to a SaNameT */
> > -                   (void) strncpy(reinterpret_cast<char
> > *>(object_name.value),
> > -                                  name_str, SA_MAX_NAME_LENGTH);
> > -                   object_name.length = strlen(name_str) + 1;
> > +                   osaf_extended_name_lend(name_str,
> > &object_name);
> >                     /* and delete the object */
> > -                   ais_rc = immutil_saImmOiRtObjectDelete(lgs_cb-
> > >immOiHandle,
> > -                           &object_name);
> > +                   ais_rc = immutil_saImmOiRtObjectDelete(lgs_cb-
> > >immOiHandle, &object_name);
> >                     if (ais_rc == SA_AIS_OK) {
> > -                           TRACE("\tObject \"%s\" deleted",
> > -                                 reinterpret_cast<char
> > *>(object_name.value));
> > +                           TRACE("\tObject \"%s\" deleted", name_str);
> >                     } else {
> >                             LOG_WA("%s saImmOiRtObjectDelete for
> > \"%s\" FAILED %d",
> > -                                  __FUNCTION__,
> > -                                  reinterpret_cast<char
> > *>(object_name.value), ais_rc);
> > +                                  __FUNCTION__, name_str, ais_rc);
> >                     }
> >             } else {
> >                     /* Should never happen! */
> > @@ -3297,8 +3294,9 @@ void lgs_cleanup_abandoned_streams()
> >   * @param immOmHandle[out]
> >   * @return -1 on error
> >   */
> > -int lgs_get_streamobj_attr(SaImmAttrValuesT_2 ***attrib_out, char
> > *object_name_in,
> > -   SaImmHandleT *immOmHandle)
> > +int lgs_get_streamobj_attr(SaImmAttrValuesT_2 ***attrib_out,
> > +                      const std::string &object_name_in,
> > +                      SaImmHandleT *immOmHandle)
> >  {
> >     int rc = 0;
> >     SaAisErrorT ais_rc = SA_AIS_OK;
> > @@ -3317,10 +3315,10 @@ int lgs_get_streamobj_attr(SaImmAttrValu
> >             NULL
> >     };
> >
> > -   TRACE_ENTER2("object_name_in \"%s\"", object_name_in);
> > +   TRACE_ENTER2("object_name_in \"%s\"", object_name_in.c_str());
> >
> >     SaNameT object_name;
> > -   if (object_name_in == NULL) {
> > +   if (object_name_in.empty() == true) {
> >             TRACE("%s No object name given (NULL)", __FUNCTION__);
> >             rc = -1;
> >             goto done;
> > @@ -3345,9 +3343,7 @@ int lgs_get_streamobj_attr(SaImmAttrValu
> >             goto done;
> >     }
> >
> > -   strncpy(reinterpret_cast<char *>(object_name.value),
> > -           object_name_in, SA_MAX_NAME_LENGTH);
> > -   object_name.length = strlen(reinterpret_cast<char
> > *>(object_name.value)) + 1;
> > +   osaf_extended_name_lend(object_name_in.c_str(),
> > &object_name);
> >
> >     ais_rc = immutil_saImmOmAccessorGet_2(accessorHandle,
> > &object_name,
> >                     attribute_names, attrib_out);
> > @@ -3421,12 +3417,10 @@ SaUint32T *lgs_get_scAbsenceAllowed_attr
> >             const_cast<char *>("scAbsenceAllowed"),
> >             NULL
> >     };
> > -   char object_name_str[] =
> > "opensafImm=opensafImm,safApp=safImmService";
> > +   std::string object_name_str =
> > "opensafImm=opensafImm,safApp=safImmService";
> >
> >     SaNameT object_name;
> > -   strncpy(reinterpret_cast<char *>(object_name.value),
> > -           object_name_str, SA_MAX_NAME_LENGTH);
> > -   object_name.length = strlen(reinterpret_cast<char
> > *>(object_name.value)) + 1;
> > +   osaf_extended_name_lend(object_name_str.c_str(),
> > &object_name);
> >
> >     /* Default restore handling shall be disabled. Is enabled if the
> >      * scAbsenceAllowed attribute is not empty
> > diff --git a/osaf/services/saf/logsv/lgs/lgs_imm_gcfg.cc
> > b/osaf/services/saf/logsv/lgs/lgs_imm_gcfg.cc
> > --- a/osaf/services/saf/logsv/lgs/lgs_imm_gcfg.cc
> > +++ b/osaf/services/saf/logsv/lgs/lgs_imm_gcfg.cc
> > @@ -30,7 +30,7 @@
> >  #include "immutil.h"
> >  #include "osaf_time.h"
> >  #include "osaf_poll.h"
> > -
> > +#include "osaf_extended_name.h"
> >  /*
> >   * Implements an IMM applier for the OpensafConfig class.
> >   * Used for detecting changes of opensafNetworkName attribute.
> > @@ -362,7 +362,7 @@ static SaAisErrorT ccbObjectModifyCallba
> >     SaAisErrorT rc = SA_AIS_OK;
> >     struct CcbUtilCcbData *ccbUtilCcbData;
> >
> > -   TRACE_ENTER2("CCB ID %llu, '%s'", ccbId, objectName->value);
> > +   TRACE_ENTER2("CCB ID %llu, '%s'", ccbId,
> > osaf_extended_name_borrow(objectName));
> >
> >     if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) {
> >             if ((ccbUtilCcbData = ccbutil_getCcbData(ccbId)) == NULL) {
> > @@ -414,6 +414,7 @@ static void ccbApplyCallback(SaImmOiHand
> >     const SaImmAttrModificationT_2 *attrMod;
> >     char *value_str = NULL;
> >     int i = 0;
> > +   SaConstStringT objName;
> >
> >     TRACE_ENTER2("CCB ID %llu", ccbId);
> >
> > @@ -432,10 +433,9 @@ static void ccbApplyCallback(SaImmOiHand
> >             goto done;
> >     }
> >
> > -   if (strncmp(reinterpret_cast<char *>(opdata->objectName.value),
> > -           "opensafConfigId", sizeof("opensafConfigId") - 1) != 0) {
> > -           TRACE("Object \"%s\" not a OpensafConfig object",
> > -                 reinterpret_cast<char *>(opdata->objectName.value));
> > +   objName = osaf_extended_name_borrow(&opdata->objectName);
> > +   if (strncmp(objName, "opensafConfigId", sizeof("opensafConfigId") -
> > 1) != 0) {
> > +           TRACE("Object \"%s\" not a OpensafConfig object",
> > objName);
> >             goto done;
> >     }
> >
> > diff --git a/osaf/services/saf/logsv/lgs/lgs_main.cc
> > b/osaf/services/saf/logsv/lgs/lgs_main.cc
> > --- a/osaf/services/saf/logsv/lgs/lgs_main.cc
> > +++ b/osaf/services/saf/logsv/lgs/lgs_main.cc
> > @@ -481,7 +481,12 @@ int main(int argc, char *argv[])
> >     const time_t CLEAN_TIMEOUT = 600; /* 10 min */
> >
> >     daemonize(argc, argv);
> > -
> > +
> > +   if (setenv("SA_ENABLE_EXTENDED_NAMES", "1", 1) != 0 ) {
> > +           LOG_ER("Failed to set SA_ENABLE_EXTENDED_NAMES (%s)",
> > strerror(errno));
> > +           goto done;
> > +   }
> > +
> >     if (log_initialize() != NCSCC_RC_SUCCESS) {
> >             LOG_ER("log_initialize failed");
> >             goto done;
> > diff --git a/osaf/services/saf/logsv/lgs/lgs_mbcsv.cc
> > b/osaf/services/saf/logsv/lgs/lgs_mbcsv.cc
> > --- a/osaf/services/saf/logsv/lgs/lgs_mbcsv.cc
> > +++ b/osaf/services/saf/logsv/lgs/lgs_mbcsv.cc
> > @@ -268,6 +268,8 @@ uint32_t lgs_mbcsv_change_HA_state(lgs_c
> >  {
> >     TRACE_ENTER();
> >     NCS_MBCSV_ARG mbcsv_arg;
> > +   int num;
> > +
> >     memset(&mbcsv_arg, '\0', sizeof(NCS_MBCSV_ARG));
> >
> >     /* Set the mbcsv args */
> > @@ -289,7 +291,8 @@ uint32_t lgs_mbcsv_change_HA_state(lgs_c
> >      */
> >     log_stream_t *stream;
> >     if (lgs_is_split_file_system()) {
> > -           stream = log_stream_getnext_by_name(NULL);
> > +           num = get_number_of_streams();
> > +           stream = log_stream_get_by_id(--num);
> >             while (stream != NULL) { /* Iterate over all streams */
> >                     if (ha_state == SA_AMF_HA_ACTIVE) {
> >                             stream->logFileCurrent = stream-
> > >stb_logFileCurrent;
> > @@ -302,7 +305,7 @@ uint32_t lgs_mbcsv_change_HA_state(lgs_c
> >                             *stream->p_fd = -1; /* Reopen files */
> >                     }
> >
> > -                   stream = log_stream_getnext_by_name(stream-
> > >name);
> > +                   stream = log_stream_get_by_id(--num);
> >             }
> >     }
> >
> > @@ -598,7 +601,7 @@ uint32_t lgs_ckpt_stream_open_set(log_st
> >     stream_open->logPath = const_cast<char *>(logStream-
> > >pathName.c_str());
> >     stream_open->logFileCurrent = const_cast<char *>(logStream-
> > >logFileCurrent.c_str());
> >     stream_open->fileFmt = logStream->logFileFormat;
> > -   stream_open->logStreamName = logStream->name;
> > +   stream_open->logStreamName = const_cast<char *>(logStream-
> > >name.c_str());
> >     stream_open->maxFileSize = logStream->maxLogFileSize;
> >     stream_open->maxLogRecordSize = logStream->fixedLogRecordSize;
> >     stream_open->logFileFullAction = logStream->logFullAction;
> > @@ -625,6 +628,7 @@ static uint32_t edu_enc_streams(lgs_cb_t
> >     uint32_t rc = NCSCC_RC_SUCCESS, num_rec = 0;
> >     uint8_t *pheader = NULL;
> >     lgsv_ckpt_header_t ckpt_hdr;
> > +   int num;
> >
> >     /* Prepare reg. structure to encode */
> >     ckpt_stream_rec = static_cast<lgs_ckpt_stream_open_t
> > *>(malloc(sizeof(lgs_ckpt_stream_open_t)));
> > @@ -641,8 +645,9 @@ static uint32_t edu_enc_streams(lgs_cb_t
> >             return (rc = EDU_ERR_MEM_FAIL);
> >     }
> >     ncs_enc_claim_space(uba, sizeof(lgsv_ckpt_header_t));
> > -   log_stream_rec = log_stream_getnext_by_name(NULL);
> >
> > +   num = get_number_of_streams();
> > +   log_stream_rec = log_stream_get_by_id(--num);
> >     /* Walk through the reg list and encode record by record */
> >     while (log_stream_rec != NULL) {
> >             lgs_ckpt_stream_open_set(log_stream_rec,
> > ckpt_stream_rec);
> > @@ -656,7 +661,7 @@ static uint32_t edu_enc_streams(lgs_cb_t
> >                     return rc;
> >             }
> >             ++num_rec;
> > -           log_stream_rec =
> > log_stream_getnext_by_name(log_stream_rec->name);
> > +           log_stream_rec = log_stream_get_by_id(--num);
> >     }                       /* End while RegRec */
> >
> >     /* Encode RegHeader */
> > @@ -1581,8 +1586,8 @@ static void insert_localmsg_in_stream(lo
> >
> >     /* Construct logSvcUsrName for log service */
> >     SaNameT logSvcUsrName;
> > -   sprintf((char *)logSvcUsrName.value, "%s",
> > "safApp=safLogService");
> > -   logSvcUsrName.length = strlen((char *)logSvcUsrName.value);
> > +   SaConstStringT tmpSvcName = "safApp=safLogService";
> > +   osaf_extended_name_lend(tmpSvcName, &logSvcUsrName);
> >
> >     /* Create a log header corresponding to type of stream */
> >     if ((stream->streamType == STREAM_TYPE_ALARM) ||
> > @@ -1834,7 +1839,7 @@ static uint32_t ckpt_proc_close_stream(l
> >             goto done;
> >     }
> >
> > -   TRACE("close stream %s, id: %u", stream->name, stream->streamId);
> > +   TRACE("close stream %s, id: %u", stream->name.c_str(), stream-
> > >streamId);
> >
> >     if ((stream->numOpeners > 0) || (clientId < 0)){
> >             /* No clients to remove if no openers or if closing a stream
> > opened
> > @@ -1868,7 +1873,7 @@ uint32_t ckpt_proc_open_stream(lgs_cb_t
> >  {
> >     lgs_ckpt_stream_open_t *param;
> >     log_stream_t *stream;
> > -   int pos = 0;
> > +   int pos = 0, err = 0;
> >
> >     TRACE_ENTER();
> >
> > @@ -1898,30 +1903,37 @@ uint32_t ckpt_proc_open_stream(lgs_cb_t
> >              */
> >             stream->numOpeners = param->numOpeners;
> >     } else {
> > -           SaNameT name;
> > +           TRACE("\tNew stream %s, id %u", param->logStreamName,
> > param->streamId);
> >
> > -           TRACE("\tNew stream %s, id %u", param->logStreamName,
> > param->streamId);
> > -           strcpy((char *)name.value, param->logStreamName);
> > -           name.length = strlen(param->logStreamName);
> > +           SaAisErrorT rc = SA_AIS_OK;
> > +           stream = log_stream_new(param->logStreamName, param-
> > >streamId);
> > +           if (stream == NULL) {
> > +                   LOG_ER("Failed to create log stream %s", param-
> > >logStreamName);
> > +                   goto done;
> >
> > -           stream = log_stream_new_1(&name,
> > -                           param->logFile,
> > -                           param->logPath,
> > -                           param->maxFileSize,
> > -                           param->maxLogRecordSize,
> > -                           param->logFileFullAction,
> > -                           param->maxFilesRotated,
> > -                           param->fileFmt,
> > -                           param->streamType,
> > -                           param->streamId,
> > -                           SA_FALSE,       // FIX sync or calculate?
> > -                           param->logRecordId,
> > -                           0);
> > +           }
> > +           err = lgs_populate_log_stream(
> > +                                 param->logFile,
> > +                                 param->logPath,
> > +                                 param->maxFileSize,
> > +                                 param->maxLogRecordSize,
> > +                                 param->logFileFullAction,
> > +                                 param->maxFilesRotated,
> > +                                 param->fileFmt,
> > +                                 param->streamType,
> > +                                 SA_FALSE, // FIX sync or calculate?
> > +                                 param->logRecordId,
> > +                                 stream  // output
> > +                   );
> >
> > -           if (stream == NULL) {
> > -                   /* Do not allow standby to get out of sync */
> > -                   LOG_ER("%s - Failed to create stream '%s'",
> > __FUNCTION__,
> > -                                   param->logStreamName);
> > +           if (err == -1) {
> > +                   log_stream_delete(&stream);
> > +                   goto done;
> > +           }
> > +
> > +           rc = lgs_create_rt_appstream(stream);
> > +           if (rc != SA_AIS_OK) {
> > +                   log_stream_delete(&stream);
> >                     goto done;
> >             }
> >
> > @@ -2133,7 +2145,7 @@ static uint32_t ckpt_proc_cfg_stream(lgs
> >             goto done;
> >     }
> >
> > -   TRACE("config stream %s, id: %u", stream->name, stream-
> > >streamId);
> > +   TRACE("config stream %s, id: %u", stream->name.c_str(), stream-
> > >streamId);
> >     stream->act_last_close_timestamp = closetime; /* Not used if ver 1
> > */
> >     stream->fileName = fileName;
> >     stream->maxLogFileSize = maxLogFileSize;
> > diff --git a/osaf/services/saf/logsv/lgs/lgs_mds.cc
> > b/osaf/services/saf/logsv/lgs/lgs_mds.cc
> > --- a/osaf/services/saf/logsv/lgs/lgs_mds.cc
> > +++ b/osaf/services/saf/logsv/lgs/lgs_mds.cc
> > @@ -19,6 +19,7 @@
> >
> >  #include "lgs.h"
> >  #include "osaf_time.h"
> > +#include "osaf_extended_name.h"
> >
> >  #define LGS_SVC_PVT_SUBPART_VERSION 1
> >  #define LGS_WRT_LGA_SUBPART_VER_AT_MIN_MSG_FMT 1
> > @@ -129,6 +130,7 @@ static uint32_t dec_lstr_open_sync_msg(N
> >     uint32_t rc = NCSCC_RC_SUCCESS;
> >     lgsv_stream_open_req_t *param = &msg-
> > >info.api_info.param.lstr_open_sync;
> >     uint8_t local_data[256];
> > +   char *str_name = NULL;
> >
> >     TRACE_ENTER();
> >     // To make it safe when using free()
> > @@ -143,17 +145,28 @@ static uint32_t dec_lstr_open_sync_msg(N
> >
> >     /* log stream name length */
> >     p8 = ncs_dec_flatten_space(uba, local_data, 2);
> > -   param->lstr_name.length = ncs_decode_16bit(&p8);
> > +   size_t length = ncs_decode_16bit(&p8);
> >     ncs_dec_skip_space(uba, 2);
> >
> > -   if (param->lstr_name.length >= SA_MAX_NAME_LENGTH) {
> > +   if (length >= kOsafMaxDnLength) {
> >             TRACE("%s - lstr_name too long",__FUNCTION__);
> >             rc = NCSCC_RC_FAILURE;
> >             goto done;
> >     }
> >
> >     /* log stream name */
> > -   ncs_decode_n_octets_from_uba(uba, param->lstr_name.value,
> > (uint32_t)param->lstr_name.length);
> > +   str_name = static_cast<char *> (calloc(1, length + 1));
> > +   if (str_name == NULL) {
> > +           LOG_ER("Fail to allocated memory - str_name");
> > +           rc = NCSCC_RC_FAILURE;
> > +           goto done;
> > +   }
> > +   ncs_decode_n_octets_from_uba(uba,
> > +                                reinterpret_cast<uint8_t *>(str_name),
> > +                                static_cast<uint32_t>(length));
> > +   osaf_extended_name_clear(&param->lstr_name);
> > +   /* This allocated memory must be freed in proc_stream_open_msg
> > @lgs_evt */
> > +   osaf_extended_name_alloc(str_name, &param->lstr_name);
> >
> >     /* log file name */
> >     p8 = ncs_dec_flatten_space(uba, local_data, 2);
> > @@ -238,6 +251,8 @@ done_err:
> >     free(param->logFileFmt);
> >
> >  done:
> > +   free(str_name);
> > +   str_name = NULL;
> >     TRACE_8("LGSV_STREAM_OPEN_REQ");
> >     return rc;
> >  }
> > @@ -271,6 +286,156 @@ static uint32_t dec_lstr_close_msg(NCS_U
> >     return rc;
> >  }
> >
> > +static uint32_t dec_write_ntf_log_header(NCS_UBAID *uba,
> > SaLogNtfLogHeaderT *const ntfLogH)
> > +{
> > +   uint8_t *p8;
> > +   uint8_t local_data[1024];
> > +   size_t notificationL, notifyingL;
> > +   uint32_t rc = NCSCC_RC_SUCCESS;
> > +   char *notificationObj = NULL;
> > +   char *notifyingObj = NULL;
> > +
> > +   ntfLogH->notificationObject = NULL;
> > +   ntfLogH->notifyingObject = NULL;
> > +   ntfLogH->notificationClassId = NULL;
> > +
> > +   p8 = ncs_dec_flatten_space(uba, local_data, 14);
> > +   ntfLogH->notificationId = ncs_decode_64bit(&p8);
> > +   ntfLogH->eventType =
> > static_cast<SaNtfEventTypeT>(ncs_decode_32bit(&p8));
> > +
> > +   ntfLogH->notificationObject = static_cast<SaNameT
> > *>(malloc(sizeof(SaNameT) + 1));
> > +   if (ntfLogH->notificationObject == NULL) {
> > +           LOG_WA("malloc FAILED");
> > +           rc = NCSCC_RC_FAILURE;
> > +           goto done;
> > +   }
> > +
> > +   notificationL = ncs_decode_16bit(&p8);
> > +   if (kOsafMaxDnLength <= notificationL) {
> > +           LOG_WA("notificationObject length is so long (max: %d)",
> > kOsafMaxDnLength);
> > +           rc = NCSCC_RC_FAILURE;
> > +           goto done;
> > +   }
> > +   ncs_dec_skip_space(uba, 14);
> > +
> > +   notificationObj = static_cast<char *> (calloc(1, notificationL +
1));
> > +   if (notificationObj == NULL) {
> > +           LOG_WA("Fail to allocated memory - notificationObj");
> > +           rc = NCSCC_RC_FAILURE;
> > +           goto done;
> > +   }
> > +   ncs_decode_n_octets_from_uba(uba,
> > +                                reinterpret_cast<uint8_t
> > *>(notificationObj),
> > +                                static_cast<uint32_t>(notificationL));
> > +   osaf_extended_name_clear(ntfLogH->notificationObject);
> > +   osaf_extended_name_alloc(notificationObj, ntfLogH-
> > >notificationObject);
> > +
> > +   ntfLogH->notifyingObject = static_cast<SaNameT
> > *>(malloc(sizeof(SaNameT) + 1));
> > +   if (ntfLogH->notifyingObject == NULL) {
> > +           LOG_WA("malloc FAILED");
> > +           rc = NCSCC_RC_FAILURE;
> > +           goto done;
> > +   }
> > +
> > +   p8 = ncs_dec_flatten_space(uba, local_data, 2);
> > +   notifyingL = ncs_decode_16bit(&p8);
> > +   ncs_dec_skip_space(uba, 2);
> > +
> > +   if (kOsafMaxDnLength <= notifyingL) {
> > +           LOG_WA("notifyingObject is so long (max: %d)",
> > kOsafMaxDnLength);
> > +           rc = NCSCC_RC_FAILURE;
> > +           goto done;
> > +   }
> > +   notifyingObj = static_cast<char *> (calloc(1, notifyingL + 1));
> > +   if (notifyingObj == NULL) {
> > +           LOG_WA("Fail to allocated memory - notifyingObj");
> > +           rc = NCSCC_RC_FAILURE;
> > +           goto done;
> > +   }
> > +   ncs_decode_n_octets_from_uba(uba,
> > +                                reinterpret_cast<uint8_t
*>(notifyingObj),
> > +                                static_cast<uint32_t>(notifyingL));
> > +   osaf_extended_name_clear(ntfLogH->notifyingObject);
> > +   osaf_extended_name_alloc(notifyingObj, ntfLogH-
> > >notifyingObject);
> > +
> > +   ntfLogH->notificationClassId = static_cast<SaNtfClassIdT
> > *>(malloc(sizeof(SaNtfClassIdT)));
> > +   if (ntfLogH->notificationClassId == NULL) {
> > +           LOG_WA("malloc FAILED");
> > +           rc = NCSCC_RC_FAILURE;
> > +           goto done;
> > +   }
> > +   p8 = ncs_dec_flatten_space(uba, local_data, 16);
> > +   ntfLogH->notificationClassId->vendorId = ncs_decode_32bit(&p8);
> > +   ntfLogH->notificationClassId->majorId = ncs_decode_16bit(&p8);
> > +   ntfLogH->notificationClassId->minorId = ncs_decode_16bit(&p8);
> > +   ntfLogH->eventTime = ncs_decode_64bit(&p8);
> > +   ncs_dec_skip_space(uba, 16);
> > +
> > +done:
> > +   free(notificationObj);
> > +   free(notifyingObj);
> > +   TRACE("%s - rc = %d", __func__, rc);
> > +   return rc;
> > +}
> > +
> > +static uint32_t dec_write_gen_log_header(NCS_UBAID *uba,
> > SaLogGenericLogHeaderT *const genLogH)
> > +{
> > +   uint8_t *p8;
> > +   uint8_t local_data[1024];
> > +   size_t svcLength;
> > +   uint32_t rc = NCSCC_RC_SUCCESS;
> > +   char *logSvcUsrName = NULL;
> > +
> > +   genLogH->notificationClassId = NULL;
> > +   genLogH->logSvcUsrName = NULL;
> > +
> > +   genLogH->notificationClassId = static_cast<SaNtfClassIdT
> > *>(malloc(sizeof(SaNtfClassIdT)));
> > +   if (genLogH->notificationClassId == NULL) {
> > +           LOG_WA("malloc FAILED");
> > +           rc = NCSCC_RC_FAILURE;
> > +           goto done;
> > +   }
> > +
> > +   p8 = ncs_dec_flatten_space(uba, local_data, 10);
> > +   genLogH->notificationClassId->vendorId = ncs_decode_32bit(&p8);
> > +   genLogH->notificationClassId->majorId = ncs_decode_16bit(&p8);
> > +   genLogH->notificationClassId->minorId = ncs_decode_16bit(&p8);
> > +
> > +   svcLength = ncs_decode_16bit(&p8);
> > +   if (kOsafMaxDnLength <= svcLength) {
> > +           LOG_WA("logSvcUsrName too big (max: %d)",
> > kOsafMaxDnLength);
> > +           rc = NCSCC_RC_FAILURE;
> > +           goto done;
> > +   }
> > +   logSvcUsrName = static_cast<char *>(malloc(svcLength + 1));
> > +   if (logSvcUsrName == NULL) {
> > +           LOG_WA("malloc FAILED");
> > +           rc = NCSCC_RC_FAILURE;
> > +           goto done;
> > +   }
> > +   genLogH->logSvcUsrName = static_cast<SaNameT
> > *>(malloc(sizeof(SaNameT) + 1));
> > +   if (genLogH->logSvcUsrName == NULL) {
> > +           LOG_WA("malloc FAILED");
> > +           rc = NCSCC_RC_FAILURE;
> > +           goto done;
> > +   }
> > +   ncs_dec_skip_space(uba, 10);
> > +   ncs_decode_n_octets_from_uba(uba,
> > +                                reinterpret_cast<uint8_t
> > *>(logSvcUsrName),
> > +                                static_cast<uint32_t>(svcLength));
> > +   osaf_extended_name_clear(const_cast<SaNameT *>(genLogH-
> > >logSvcUsrName));
> > +   osaf_extended_name_alloc(logSvcUsrName, const_cast<SaNameT
> > *>(genLogH->logSvcUsrName));
> > +
> > +   p8 = ncs_dec_flatten_space(uba, local_data, 2);
> > +   genLogH->logSeverity = ncs_decode_16bit(&p8);
> > +   ncs_dec_skip_space(uba, 2);
> > +
> > +done:
> > +   free(logSvcUsrName);
> > +   TRACE("%s - rc = %d", __func__, rc);
> > +   return rc;
> > +}
> > +
> >
> > /**********************************************************
> > ******************
> >    Name          : dec_write_log_async_msg
> >
> > @@ -294,7 +459,6 @@ static uint32_t dec_write_log_async_msg(
> >      * Note that more pointers has to be initiated in the allocation
> > sequence
> >      * below.
> >      */
> > -   SaNameT *logSvcUsrName = NULL;
> >     SaLogNtfLogHeaderT *ntfLogH = NULL;
> >     SaLogGenericLogHeaderT *genLogH = NULL;
> >     param->logRecord = NULL;
> > @@ -330,109 +494,14 @@ static uint32_t dec_write_log_async_msg(
> >     switch (param->logRecord->logHdrType) {
> >     case SA_LOG_NTF_HEADER:
> >             ntfLogH = &param->logRecord->logHeader.ntfHdr;
> > -           /* Initiate log ntf header pointers */
> > -           ntfLogH->notificationObject = NULL;
> > -           ntfLogH->notifyingObject = NULL;
> > -           ntfLogH->notificationClassId = NULL;
> > -
> > -           p8 = ncs_dec_flatten_space(uba, local_data, 14);
> > -           ntfLogH->notificationId = ncs_decode_64bit(&p8);
> > -           ntfLogH->eventType =
> > static_cast<SaNtfEventTypeT>(ncs_decode_32bit(&p8));
> > -
> > -           ntfLogH->notificationObject = static_cast<SaNameT
> > *>(malloc(sizeof(SaNameT) + 1));
> > -           if (!ntfLogH->notificationObject) {
> > -                   LOG_WA("malloc FAILED");
> > -                   rc = NCSCC_RC_FAILURE;
> > -                   goto err_done;
> > -           }
> > -
> > -           ntfLogH->notificationObject->length =
> > ncs_decode_16bit(&p8);
> > -           if (SA_MAX_NAME_LENGTH <= ntfLogH->notificationObject-
> > >length) {
> > -                   TRACE("notificationObject to big");
> > -                   rc = NCSCC_RC_FAILURE;
> > -                   goto err_done;
> > -           }
> > -           ncs_dec_skip_space(uba, 14);
> > -
> > -           ncs_decode_n_octets_from_uba(uba,
> > -                                        ntfLogH->notificationObject-
> > >value, ntfLogH->notificationObject->length);
> > -           ntfLogH->notificationObject->value[ntfLogH-
> > >notificationObject->length] = '\0';
> > -
> > -           ntfLogH->notifyingObject = static_cast<SaNameT
> > *>(malloc(sizeof(SaNameT) + 1));
> > -           if (!ntfLogH->notifyingObject) {
> > -                   LOG_WA("malloc FAILED");
> > -                   rc = NCSCC_RC_FAILURE;
> > -                   goto err_done;
> > -           }
> > -           p8 = ncs_dec_flatten_space(uba, local_data, 2);
> > -           ntfLogH->notifyingObject->length = ncs_decode_16bit(&p8);
> > -           ncs_dec_skip_space(uba, 2);
> > -
> > -           if (SA_MAX_NAME_LENGTH <= ntfLogH->notifyingObject-
> > >length) {
> > -                   TRACE("notifyingObject to big");
> > -                   rc = NCSCC_RC_FAILURE;
> > -                   goto err_done;
> > -           }
> > -
> > -           ncs_decode_n_octets_from_uba(uba, ntfLogH-
> > >notifyingObject->value, ntfLogH->notifyingObject->length);
> > -           ntfLogH->notifyingObject->value[ntfLogH->notifyingObject-
> > >length] = '\0';
> > -
> > -           ntfLogH->notificationClassId = static_cast<SaNtfClassIdT
> > *>(malloc(sizeof(SaNtfClassIdT)));
> > -           if (!ntfLogH->notificationClassId) {
> > -                   LOG_WA("malloc FAILED");
> > -                   rc = NCSCC_RC_FAILURE;
> > -                   goto err_done;
> > -           }
> > -           p8 = ncs_dec_flatten_space(uba, local_data, 16);
> > -           ntfLogH->notificationClassId->vendorId =
> > ncs_decode_32bit(&p8);
> > -           ntfLogH->notificationClassId->majorId =
> > ncs_decode_16bit(&p8);
> > -           ntfLogH->notificationClassId->minorId =
> > ncs_decode_16bit(&p8);
> > -           ntfLogH->eventTime = ncs_decode_64bit(&p8);
> > -           ncs_dec_skip_space(uba, 16);
> > +           rc = dec_write_ntf_log_header(uba, ntfLogH);
> > +           if (rc != NCSCC_RC_SUCCESS) goto err_done;
> >             break;
> >
> >     case SA_LOG_GENERIC_HEADER:
> >             genLogH = &param->logRecord->logHeader.genericHdr;
> > -           /* Initiate general header pointers */
> > -           genLogH->notificationClassId = NULL;
> > -
> > -           genLogH->notificationClassId = static_cast<SaNtfClassIdT
> > *>(malloc(sizeof(SaNtfClassIdT)));
> > -           if (!genLogH->notificationClassId) {
> > -                   LOG_WA("malloc FAILED");
> > -                   rc = NCSCC_RC_FAILURE;
> > -                   goto err_done;
> > -           }
> > -           p8 = ncs_dec_flatten_space(uba, local_data, 10);
> > -           genLogH->notificationClassId->vendorId =
> > ncs_decode_32bit(&p8);
> > -           genLogH->notificationClassId->majorId =
> > ncs_decode_16bit(&p8);
> > -           genLogH->notificationClassId->minorId =
> > ncs_decode_16bit(&p8);
> > -
> > -           logSvcUsrName = static_cast<SaNameT
> > *>(malloc(sizeof(SaNameT) + 1));
> > -           if (!logSvcUsrName) {
> > -                   LOG_WA("malloc FAILED");
> > -                   rc = NCSCC_RC_FAILURE;
> > -                   goto err_done;
> > -           }
> > -
> > -           /*
> > -            ** A const value in genLogHeader is fucking up...
> > -            ** Extra instance used.
> > -            */
> > -           logSvcUsrName->length = ncs_decode_16bit(&p8);
> > -
> > -           if (SA_MAX_NAME_LENGTH <= logSvcUsrName->length) {
> > -                   LOG_WA("logSvcUsrName too big");
> > -                   rc = NCSCC_RC_FAILURE;
> > -                   goto err_done;
> > -           }
> > -           ncs_dec_skip_space(uba, 10);
> > -
> > -           ncs_decode_n_octets_from_uba(uba, logSvcUsrName-
> > >value, logSvcUsrName->length);
> > -           logSvcUsrName->value[logSvcUsrName->length] = '\0';
> > -           genLogH->logSvcUsrName = logSvcUsrName;
> > -           p8 = ncs_dec_flatten_space(uba, local_data, 2);
> > -           genLogH->logSeverity = ncs_decode_16bit(&p8);
> > -           ncs_dec_skip_space(uba, 2);
> > +           rc = dec_write_gen_log_header(uba, genLogH);
> > +           if (rc != NCSCC_RC_SUCCESS) goto err_done;
> >             break;
> >
> >     default:
> > @@ -467,7 +536,7 @@ static uint32_t dec_write_log_async_msg(
> >                                          param->logRecord->logBuffer-
> > >logBuf,
> >                                          (uint32_t)param->logRecord-
> > >logBuffer->logBufSize);
> >     }
> > -
> > +
> >      /************ end saLogRecord decode ****************/
> >     TRACE_8("LGSV_WRITE_LOG_ASYNC_REQ");
> >     return rc;
> > @@ -483,24 +552,29 @@ static uint32_t dec_write_log_async_msg(
> >                     free(param->logRecord->logBuffer);
> >             }
> >             if (ntfLogH != NULL) { /* &param->logRecord-
> > >logHeader.ntfHdr */
> > -                   if (ntfLogH->notificationObject != NULL)
> > +                   if (ntfLogH->notificationObject != NULL) {
> > +                           osaf_extended_name_free(ntfLogH-
> > >notificationObject);
> >                             free(ntfLogH->notificationObject);
> > -                   if (ntfLogH->notifyingObject != NULL)
> > +                   }
> > +                   if (ntfLogH->notifyingObject != NULL) {
> > +                           osaf_extended_name_free(ntfLogH-
> > >notifyingObject);
> >                             free(ntfLogH->notifyingObject);
> > +                   }
> >                     if (ntfLogH->notificationClassId != NULL)
> >                             free(ntfLogH->notificationClassId);
> >             }
> >             if (genLogH != NULL) { /* &param->logRecord-
> > >logHeader.genericHdr */
> >                     if (genLogH->notificationClassId != NULL)
> >                             free(genLogH->notificationClassId);
> > +                   if (genLogH->logSvcUsrName != NULL) {
> > +
> >     osaf_extended_name_free(const_cast<SaNameT *>(genLogH-
> > >logSvcUsrName));
> > +                           free(const_cast<SaNameT *>(genLogH-
> > >logSvcUsrName));
> > +
> > +                   }
> >             }
> > -
> > +
> >             free(param->logRecord);
> >     }
> > -
> > -   if (logSvcUsrName != NULL)
> > -           free(logSvcUsrName);
> > -
> >      /************ end saLogRecord decode ****************/
> >     TRACE_8("LGSV_WRITE_LOG_ASYNC_REQ (error)");
> >     return rc;
> > diff --git a/osaf/services/saf/logsv/lgs/lgs_recov.cc
> > b/osaf/services/saf/logsv/lgs/lgs_recov.cc
> > --- a/osaf/services/saf/logsv/lgs/lgs_recov.cc
> > +++ b/osaf/services/saf/logsv/lgs/lgs_recov.cc
> > @@ -93,7 +93,7 @@ void log_rtobj_list_free()
> >   * @param dn_str[in] '\0' terminated string containing a dn
> >   * @return -1 on error
> >   */
> > -int log_rtobj_list_add(char *dn_str)
> > +int log_rtobj_list_add(const std::string &dn_str)
> >  {
> >     char *str_ptr = NULL;
> >     size_t len = 0;
> > @@ -116,8 +116,8 @@ int log_rtobj_list_add(char *dn_str)
> >     }
> >
> >     /* Save dn string */
> > -   len = strlen(dn_str) + 1; /* Including '\0' */
> > -   if (len > SA_MAX_NAME_LENGTH) {
> > +   len = dn_str.size() + 1; /* Including '\0' */
> > +   if (len > kOsafMaxDnLength) {
> >             /* Should never happen */
> >             LOG_WA("%s\tToo long dn string!",__FUNCTION__);
> >             rc = -1;
> > @@ -131,7 +131,7 @@ int log_rtobj_list_add(char *dn_str)
> >             goto done;
> >     }
> >
> > -   strcpy(str_ptr, dn_str);
> > +   strcpy(str_ptr, dn_str.c_str());
> >
> >     /* Add dn to list */
> >     rtobj_list[rtobj_cnt] = str_ptr;
> > @@ -158,12 +158,12 @@ int log_rtobj_list_no()
> >   * @param dn_str[in] '\0' terminated string with dn to find
> >   * @return Position of found name or -1 if name not found
> >   */
> > -int log_rtobj_list_find(char *dn_str)
> > +int log_rtobj_list_find(const std::string &dn_str)
> >  {
> >     uint32_t i = 0;
> >     int pos = -1;
> >
> > -   TRACE_ENTER2("dn_str \"%s\"", dn_str);
> > +   TRACE_ENTER2("dn_str \"%s\"", dn_str.c_str());
> >
> >     if (rtobj_list == NULL) {
> >             TRACE("\t No rtobj_list exist");
> > @@ -173,7 +173,7 @@ int log_rtobj_list_find(char *dn_str)
> >     for (i = 0; i < rtobj_list_len; i++) {
> >             if (rtobj_list[i] == NULL)
> >                     continue;
> > -           if (strcmp(rtobj_list[i], dn_str) == 0) {
> > +           if (strcmp(rtobj_list[i], dn_str.c_str()) == 0) {
> >                     /* Found! */
> >                     pos = (int) i;
> >                     break;
> > @@ -339,7 +339,7 @@ static void lgs_remove_stream(uint32_t c
> >   * @return -1 on error
> >   */
> >  int lgs_restore_one_app_stream(
> > -   char *stream_name, uint32_t client_id,
> > +   const std::string &stream_name, uint32_t client_id,
> >     log_stream_t **o_stream)
> [Lennart] In this function an app stream will be restored by being
(re)created.
> This stream already has log files so no log files shall be created. Is
this
> handled correctly since the last in-parameter in the
> create_new_app_stream(&open_stream_param, &log_stream, 0) has no
> meaning any longer?
[Vu] No file is created in `create_new_app_stream` . The function is for
creating IMM RT object.
So, removing the `creatingFlag` in that function has no impact.
> 
> >  {
> >     int int_rc = 0;
> > @@ -365,31 +365,27 @@ int lgs_restore_one_app_stream(
> >     // Make it safe for free
> >     par_out.curFileName = NULL;
> >
> > -   TRACE_ENTER2("object_name \"%s\", client_id=%d", stream_name,
> > client_id);
> > +   TRACE_ENTER2("object_name \"%s\", client_id=%d",
> > stream_name.c_str(), client_id);
> >
> >     memset(&open_stream_param, 0, sizeof(open_stream_param));
> >
> >     /* Check and save stream file name */
> > -   if (stream_name == NULL) {
> > +   if (stream_name.empty() == true) {
> >             TRACE("%s: No object name <NULL>", __FUNCTION__);
> >             rc_out = -1;
> >             goto done;
> >     }
> > -   n = snprintf(reinterpret_cast<char
> > *>(open_stream_param.lstr_name.value),
> > -           SA_MAX_NAME_LENGTH, "%s", stream_name);
> > -
> > -   open_stream_param.lstr_name.length = strlen(stream_name) + 1;
> > -   if (n >= SA_MAX_NAME_LENGTH) {
> > -           TRACE("Log stream name \"%s\" is truncated",
> > -                   open_stream_param.lstr_name.value);
> > +   if (stream_name.size() >= kOsafMaxDnLength) {
> > +           TRACE("Log stream name \"%s\" is truncated",
> > stream_name.c_str());
> >             rc_out = -1;
> >             goto done;
> >     }
> > +   osaf_extended_name_lend(stream_name.c_str(),
> > &open_stream_param.lstr_name);
> >
> >     /* Check if in found objects list */
> >     list_pos = log_rtobj_list_find(stream_name);
> >     if (list_pos == -1) {
> > -           TRACE("%s: No stream \"%s\" found to restore",
> > __FUNCTION__, stream_name);
> > +           TRACE("%s: No stream \"%s\" found to restore",
> > __FUNCTION__, stream_name.c_str());
> >             rc_out = -1;
> >             goto done;
> >     }
> > @@ -726,7 +722,7 @@ int log_stream_open_file_restore(log_str
> >      */
> >     if (par_out.curFileName == NULL) {
> >             /* There is no current log file. Consider as logsv starts
from
> > scratch */
> > -           TRACE("\t Create new cfg/logfile for stream (%s)", stream-
> > >name);
> > +           TRACE("\t Create new cfg/logfile for stream (%s)", stream-
> > >name.c_str());
> >             log_stream_open_fileinit(stream);
> >             stream->creationTimeStamp = lgs_get_SaTime();
> >             goto done;
> > @@ -774,7 +770,7 @@ done:
> >   * @param stream_name[in]  The name of the stream
> >   * @return -1 on error
> >   */
> > -int log_close_rtstream_files(char *stream_name)
> > +int log_close_rtstream_files(const std::string &stream_name)
> >  {
> >     int int_rc = 0;
> >     int rc_out = 0;
> > @@ -793,10 +789,10 @@ int log_close_rtstream_files(char *strea
> >     // Make it safe for free
> >     par_out.curFileName = NULL;
> >
> > -   TRACE_ENTER2("object_name \"%s\"", stream_name);
> > +   TRACE_ENTER2("object_name \"%s\"", stream_name.c_str());
> >
> >     /* Check and save stream file name */
> > -   if (stream_name == NULL) {
> > +   if (stream_name.empty() == true) {
> >             TRACE("%s: No object name <NULL>", __FUNCTION__);
> >             rc_out = -1;
> >             goto done;
> > @@ -878,7 +874,7 @@ int log_close_rtstream_files(char *strea
> >                                current_time, LGS_LOG_FILE_EXT,
> > emptyStr);
> >     if (int_rc == -1) {
> >             LOG_WA("Failed to rename log file (%s) for stream (%s)",
> > -                  par_out.curFileName, stream_name);
> > +                  par_out.curFileName, stream_name.c_str());
> >     }
> >
> >     int_rc = lgs_file_rename_h(rootPath, pathName_bk, fileName,
> > @@ -886,7 +882,7 @@ int log_close_rtstream_files(char *strea
> >
> >     if (int_rc == -1) {
> >             LOG_WA("Failed to rename configuration file (%s) for stream
> > (%s)",
> > -                  fileName.c_str(), stream_name);
> > +                  fileName.c_str(), stream_name.c_str());
> >     }
> >
> >  done_free_attr:
> > diff --git a/osaf/services/saf/logsv/lgs/lgs_recov.h
> > b/osaf/services/saf/logsv/lgs/lgs_recov.h
> > --- a/osaf/services/saf/logsv/lgs/lgs_recov.h
> > +++ b/osaf/services/saf/logsv/lgs/lgs_recov.h
> > @@ -20,19 +20,19 @@
> >
> >  #include "lgs.h"
> >
> > -int log_rtobj_list_add(char *dn_str);
> > +int log_rtobj_list_add(const std::string &dn_str);
> >  int log_rtobj_list_no();
> > -int log_rtobj_list_find(char *stream_name);
> > +int log_rtobj_list_find(const std::string &stream_name);
> >  int log_rtobj_list_getnamepos();
> >  char *log_rtobj_list_getname(int pos);
> >  void log_rtobj_list_erase_one_pos(int pos);
> >  void log_rtobj_list_free();
> >  int lgs_restore_one_app_stream(
> > -   char *stream_name,
> > +   const std::string &stream_name,
> >     uint32_t client_id,
> >     log_stream_t **o_stream
> >     );
> >  int log_stream_open_file_restore(log_stream_t *log_stream);
> > -int log_close_rtstream_files(char *stream_name);
> > +int log_close_rtstream_files(const std::string &stream_name);
> >
> >  #endif     /* LGS_STATE_H */
> > diff --git a/osaf/services/saf/logsv/lgs/lgs_stream.cc
> > b/osaf/services/saf/logsv/lgs/lgs_stream.cc
> > --- a/osaf/services/saf/logsv/lgs/lgs_stream.cc
> > +++ b/osaf/services/saf/logsv/lgs/lgs_stream.cc
> > @@ -31,11 +31,10 @@
> >  #include "lgs_file.h"
> >  #include "lgs_filehdl.h"
> >  #include "osaf_time.h"
> > +#include "immutil.h"
> >
> >  #define DEFAULT_NUM_APP_LOG_STREAMS 64
> >
> > -static NCS_PATRICIA_TREE stream_dn_tree;
> > -
> >  static log_stream_t **stream_array;
> >  /* We have at least the 3 well known streams. */
> >  static unsigned int stream_array_size = 3;
> > @@ -104,6 +103,17 @@ done:
> >  }
> >
> >  /**
> > + * Get current number of openning streams
> > + *
> > + * @param: none
> > + * @return current number of opening streams
> > + */
> > +unsigned int get_number_of_streams()
> > +{
> > +   return numb_of_streams;
> > +}
> > +
> > +/**
> >   * Close with retry at EINTR
> >   *
> >   * @param fd [in]
> > @@ -260,48 +270,6 @@ static int rotate_if_needed(log_stream_t
> >     return rc;
> >  }
> >
> > -static uint32_t log_stream_add(NCS_PATRICIA_NODE *node, const char
> > *key)
> > -{
> > -   uint32_t rc = NCSCC_RC_SUCCESS;
> > -
> > -   node->key_info = (uint8_t *)key;
> > -
> > -   if ( NULL == ncs_patricia_tree_get(&stream_dn_tree,node-
> > >key_info)){
> > -           rc = ncs_patricia_tree_add(&stream_dn_tree, node);
> > -           if (rc != NCSCC_RC_SUCCESS) {
> > -                   LOG_WA("ncs_patricia_tree_add FAILED for '%s'
> > %u", key, rc);
> > -                   node->key_info = NULL;
> > -                   goto done;
> > -           }
> > -   }
> > -
> > - done:
> > -   return rc;
> > -}
> > -
> > -static uint32_t log_stream_remove(const char *key)
> > -{
> > -   uint32_t rc = NCSCC_RC_SUCCESS;
> > -   log_stream_t *stream;
> > -
> > -   stream = reinterpret_cast<log_stream_t
> > *>(ncs_patricia_tree_get(&stream_dn_tree, (uint8_t *)key));
> > -   if (stream == NULL) {
> > -           TRACE_2("ncs_patricia_tree_get FAILED");
> > -           rc = NCSCC_RC_FAILURE;
> > -           goto done;
> > -   }
> > -
> > -   if (ncs_patricia_tree_get(&stream_dn_tree,stream-
> > >pat_node.key_info)){
> > -           if ((rc = ncs_patricia_tree_del(&stream_dn_tree, &stream-
> > >pat_node)) != NCSCC_RC_SUCCESS) {
> > -                   LOG_WA("ncs_patricia_tree_del FAILED for  '%s'
> > %u",key,rc);
> > -                   goto done;
> > -           }
> > -   }
> > -
> > - done:
> > -   return rc;
> > -}
> > -
> >  /**
> >   * Initiate the files belonging to a stream
> >   *
> > @@ -357,35 +325,11 @@ done:
> >     TRACE_LEAVE();
> >  }
> >
> > -log_stream_t *log_stream_get_by_name(const char *name)
> > -{
> > -   char nname[SA_MAX_NAME_LENGTH + 1];
> > -
> > -   /* Create null-terminated stream name */
> > -   strcpy(nname, name);
> > -   memset(&nname[strlen(name)], 0, SA_MAX_NAME_LENGTH + 1 -
> > strlen(name));
> > -
> > -   return reinterpret_cast<log_stream_t
> > *>(ncs_patricia_tree_get(&stream_dn_tree, (uint8_t *)nname));
> > -}
> > -
> > -log_stream_t *log_stream_getnext_by_name(const char *name)
> > -{
> > -   char nname[SA_MAX_NAME_LENGTH + 1];
> > -
> > -   if (name != NULL) {
> > -           /* Create SA_MAX_NAME_LENGTH stream name */
> > -           strcpy(nname, name);
> > -           memset(&nname[strlen(name)], 0,
> > SA_MAX_NAME_LENGTH + 1 - strlen(name));
> > -           return reinterpret_cast<log_stream_t
> > *>(ncs_patricia_tree_getnext(&stream_dn_tree, (uint8_t *)nname));
> > -   } else
> > -           return reinterpret_cast<log_stream_t
> > *>(ncs_patricia_tree_getnext(&stream_dn_tree, NULL));
> > -}
> > -
> >  void log_stream_print(log_stream_t *stream)
> >  {
> >     osafassert(stream != NULL);
> >
> > -   TRACE_2("******** Stream %s ********", stream->name);
> > +   TRACE_2("******** Stream %s ********", stream->name.c_str());
> >     TRACE_2("  fileName:             %s", stream->fileName.c_str());
> >     TRACE_2("  pathName:             %s", stream->pathName.c_str());
> >     TRACE_2("  maxLogFileSize:       %llu", stream->maxLogFileSize);
> > @@ -418,9 +362,6 @@ void log_free_stream_resources(log_strea
> >     if (stream->streamId != 0)
> >             lgs_stream_array_remove(stream->streamId);
> >
> > -   if (stream->pat_node.key_info != NULL)
> > -           log_stream_remove(stream->name);
> > -
> >     if (stream->logFileFormat != NULL)
> >             free(stream->logFileFormat);
> >
> > @@ -442,20 +383,19 @@ void log_stream_delete(log_stream_t **s)
> >     osafassert(s != NULL && *s != NULL);
> >     stream = *s;
> >
> > -   TRACE_ENTER2("%s", stream->name);
> > +   TRACE_ENTER2("%s", stream->name.c_str());
> >
> >     if (lgs_cb->ha_state == SA_AMF_HA_ACTIVE) {
> >             if (stream->streamType == STREAM_TYPE_APPLICATION) {
> >                     SaAisErrorT rv;
> >                     TRACE("Stream is closed, I am HA active so remove
> > IMM object");
> >                     SaNameT objectName;
> > -                   strcpy((char *)objectName.value, stream->name);
> > -                   objectName.length = strlen((char
> > *)objectName.value);
> > +                   osaf_extended_name_lend(stream->name.c_str(),
> > &objectName);
> >                     rv = saImmOiRtObjectDelete(lgs_cb->immOiHandle,
> > &objectName);
> >                     if (rv != SA_AIS_OK) {
> >                             /* no retry; avoid blocking LOG service
#1886
> > */
> >                             LOG_WA("saImmOiRtObjectDelete returned
> > %u for %s",
> > -                                           rv, stream->name);
> > +                                  rv, stream->name.c_str());
> >                     }
> >             }
> >     }
> > @@ -463,9 +403,6 @@ void log_stream_delete(log_stream_t **s)
> >     if (stream->streamId != 0)
> >             lgs_stream_array_remove(stream->streamId);
> >
> > -   if (stream->pat_node.key_info != NULL)
> > -           log_stream_remove(stream->name);
> > -
> >     if (stream->logFileFormat != NULL)
> >             free(stream->logFileFormat);
> >
> > @@ -491,33 +428,7 @@ static void init_log_stream_fd(log_strea
> >     *stream->p_fd = -1;
> >  }
> >
> > -/**
> > - * Create a new stream object. If HA state active, create the
> > - * correspronding IMM runtime object.
> > - *
> > - * Note: log_stream_new() is replaced by this function.
> > - *       The new function is doing the same as the old but the
possibility
> > - *       to create a stream without creating a corresponding runtime
object
> > - *       is added. See creationFlag parameter
> > - *
> > - * Stream attributes[in]:
> > - * @param name
> > - * @param filename
> > - * @param pathname
> > - * @param maxLogFileSize
> > - * @param fixedLogRecordSize
> > - * @param logFullAction
> > - * @param maxFilesRotated
> > - * @param logFileFormat
> > - * @param streamType
> > - * @param stream_id
> > - * @param twelveHourModeFlag
> > - * @param logRecordId
> > - *
> > - * @return log_stream_t*
> > - */
> > -log_stream_t *log_stream_new_1(
> > -   SaNameT *dn,
> > +int lgs_populate_log_stream(
> >     const std::string &filename,
> >     const std::string &pathname,
> >     SaUint64T maxLogFileSize,
> > @@ -526,76 +437,51 @@ log_stream_t *log_stream_new_1(
> >     SaUint32T maxFilesRotated,
> >     const char *logFileFormat,
> >     logStreamTypeT streamType,
> > -   int stream_id,
> >     SaBoolT twelveHourModeFlag,
> >     uint32_t logRecordId,
> > -   int creationFlag
> > +   log_stream_t *const o_stream
> >     )
> >  {
> > -   int rc;
> > -   log_stream_t *stream = NULL;
> > +   int rc = 0;
> >
> > -   osafassert(dn != NULL);
> > -   TRACE_ENTER2("%s, l: %u", dn->value, dn->length);
> > +   o_stream->fileName = filename;
> > +   o_stream->pathName = pathname;
> > +   o_stream->maxLogFileSize = maxLogFileSize;
> > +   o_stream->fixedLogRecordSize = fixedLogRecordSize;
> > +   o_stream->haProperty = SA_TRUE;
> > +   o_stream->logFullAction = logFullAction;
> > +   o_stream->maxFilesRotated = maxFilesRotated;
> > +   o_stream->creationTimeStamp = lgs_get_SaTime();
> > +   o_stream->severityFilter = 0x7f;        /* by default all levels are
> > allowed */
> > +   o_stream->streamType = streamType;
> > +   o_stream->twelveHourModeFlag = twelveHourModeFlag;
> > +   o_stream->logRecordId = logRecordId;
> > +   o_stream->stb_logRecordId = 0;
> >
> > -   if (lgs_relative_path_check_ts(pathname)) {
> > -           goto done;
> > +   o_stream->logFileFormat = strdup(logFileFormat);
> > +   if (o_stream->logFileFormat == NULL) {
> > +           LOG_WA("Failed to allocate memory for logFileFormat");
> > +           rc = -1;
> >     }
> >
> > -   stream = new (std::nothrow) log_stream_t();
> > -   if (stream == NULL) {
> > -           LOG_WA("log_stream_new calloc FAILED");
> > -           goto done;
> > -   }
> > -   memcpy(stream->name, dn->value, dn->length);
> > -   stream->name[SA_MAX_NAME_LENGTH] = '\0';
> > -   stream->fileName = filename;
> > -   stream->pathName = pathname;
> > -   stream->maxLogFileSize = maxLogFileSize;
> > -   stream->fixedLogRecordSize = fixedLogRecordSize;
> > -   stream->haProperty = SA_TRUE;
> > -   stream->logFullAction = logFullAction;
> > -   stream->streamId = stream_id;
> > -   stream->logFileFormat = strdup(logFileFormat);
> > -   if (stream->logFileFormat == NULL) {
> > -           log_stream_delete(&stream);
> > -           goto done;
> > -   }
> > -   stream->maxFilesRotated = maxFilesRotated;
> > -   stream->creationTimeStamp = lgs_get_SaTime();
> > -   stream->severityFilter = 0x7f;  /* by default all levels are allowed
*/
> > -   stream->streamType = streamType;
> > -   stream->twelveHourModeFlag = twelveHourModeFlag;
> > -   stream->logRecordId = logRecordId;
> > -   stream->stb_logRecordId = 0;
> > -
> > -   /* Initiate local or shared stream file descriptor dependant on
shared
> > or
> > -    * split file system
> > -    */
> > -   init_log_stream_fd(stream);
> > +   return rc;
> > +}
> >
> > -   /* Add stream to tree */
> > -   if (log_stream_add(&stream->pat_node, stream->name) !=
> > NCSCC_RC_SUCCESS) {
> > -           log_stream_delete(&stream);
> > -           goto done;
> > -   }
> > +/**
> > + * Create a new rt app stream object.
> > + *
> > + * @param rt runtimem app stream
> > + * @return SaAisErrorT
> > + */
> > +SaAisErrorT lgs_create_rt_appstream(log_stream_t *const rt)
> > +{
> > +   SaAisErrorT rc = SA_AIS_OK;
> > +   TRACE_ENTER2("%s, l: %lu", rt->name.c_str(), rt->name.size());
> >
> > -   /* Add stream to array */
> > -   if (stream->streamId == kInvalidId)
> > -           rc = lgs_stream_array_insert_new(stream, &stream-
> > >streamId);
> > -   else
> > -           rc = lgs_stream_array_insert(stream, stream->streamId);
> > -
> > -   if (rc < 0) {
> > -           LOG_WA("Add stream to array FAILED");
> > -           log_stream_delete(&stream);
> > -           goto done;
> > -   }
> > -
> > -   /* Create IMM runtime object for stream (if ACTIVE) */
> > +   /* Create IMM runtime object for rt (if ACTIVE) */
> >     if (lgs_cb->ha_state == SA_AMF_HA_ACTIVE) {
> > -           char *dndup = strdup(stream->name);
> > -           char *parent_name = strchr(stream->name, ',');
> > +           char *dndup = strdup(rt->name.c_str());
> > +           char *parent_name = strchr(const_cast<char *>(rt-
> > >name.c_str()), ',');
> >             char *rdnstr;
> >             SaNameT parent, *parentName = NULL;
> >
> > @@ -603,10 +489,9 @@ log_stream_t *log_stream_new_1(
> >                     rdnstr = strtok(dndup, ",");
> >                     parent_name++;  /* FIX, vulnerable for
> > malformed DNs */
> >                     parentName = &parent;
> > -                   strcpy((char *)parent.value, parent_name);
> > -                   parent.length = strlen((char *)parent.value);
> > +                   osaf_extended_name_lend(parent_name,
> > &parent);
> >             } else
> > -                   rdnstr = stream->name;
> > +                   rdnstr = const_cast<char *>(rt->name.c_str());
> >
> >             void *arr1[] = { &rdnstr };
> >             const SaImmAttrValuesT_2 attr_safLgStr = {
> > @@ -615,7 +500,7 @@ log_stream_t *log_stream_new_1(
> >                     .attrValuesNumber = 1,
> >                     .attrValues = arr1
> >             };
> > -           char *str2 = const_cast<char *>(stream->fileName.c_str());
> > +           char *str2 = const_cast<char *>(rt->fileName.c_str());
> >             void *arr2[] = { &str2 };
> >             const SaImmAttrValuesT_2 attr_safLogStreamFileName = {
> >                     .attrName =
> > const_cast<SaImmAttrNameT>("saLogStreamFileName"),
> > @@ -623,7 +508,7 @@ log_stream_t *log_stream_new_1(
> >                     .attrValuesNumber = 1,
> >                     .attrValues = arr2
> >             };
> > -           char *str3 = const_cast<char *>(stream->pathName.c_str());
> > +           char *str3 = const_cast<char *>(rt->pathName.c_str());
> >             void *arr3[] = { &str3 };
> >             const SaImmAttrValuesT_2 attr_safLogStreamPathName = {
> >                     .attrName =
> > const_cast<SaImmAttrNameT>("saLogStreamPathName"),
> > @@ -631,42 +516,42 @@ log_stream_t *log_stream_new_1(
> >                     .attrValuesNumber = 1,
> >                     .attrValues = arr3
> >             };
> > -           void *arr4[] = { &stream->maxLogFileSize };
> > +           void *arr4[] = { &rt->maxLogFileSize };
> >             const SaImmAttrValuesT_2 attr_saLogStreamMaxLogFileSize
> > = {
> >                     .attrName =
> > const_cast<SaImmAttrNameT>("saLogStreamMaxLogFileSize"),
> >                     .attrValueType = SA_IMM_ATTR_SAUINT64T,
> >                     .attrValuesNumber = 1,
> >                     .attrValues = arr4
> >             };
> > -           void *arr5[] = { &stream->fixedLogRecordSize };
> > +           void *arr5[] = { &rt->fixedLogRecordSize };
> >             const SaImmAttrValuesT_2
> > attr_saLogStreamFixedLogRecordSize = {
> >                     .attrName =
> > const_cast<SaImmAttrNameT>("saLogStreamFixedLogRecordSize"),
> >                     .attrValueType = SA_IMM_ATTR_SAUINT32T,
> >                     .attrValuesNumber = 1,
> >                     .attrValues = arr5
> >             };
> > -           void *arr6[] = { &stream->haProperty };
> > +           void *arr6[] = { &rt->haProperty };
> >             const SaImmAttrValuesT_2 attr_saLogStreamHaProperty = {
> >                     .attrName =
> > const_cast<SaImmAttrNameT>("saLogStreamHaProperty"),
> >                     .attrValueType = SA_IMM_ATTR_SAUINT32T,
> >                     .attrValuesNumber = 1,
> >                     .attrValues = arr6
> >             };
> > -           void *arr7[] = { &stream->logFullAction };
> > +           void *arr7[] = { &rt->logFullAction };
> >             const SaImmAttrValuesT_2 attr_saLogStreamLogFullAction =
> > {
> >                     .attrName =
> > const_cast<SaImmAttrNameT>("saLogStreamLogFullAction"),
> >                     .attrValueType = SA_IMM_ATTR_SAUINT32T,
> >                     .attrValuesNumber = 1,
> >                     .attrValues = arr7
> >             };
> > -           void *arr8[] = { &stream->maxFilesRotated };
> > +           void *arr8[] = { &rt->maxFilesRotated };
> >             const SaImmAttrValuesT_2
> > attr_saLogStreamMaxFilesRotated = {
> >                     .attrName =
> > const_cast<SaImmAttrNameT>("saLogStreamMaxFilesRotated"),
> >                     .attrValueType = SA_IMM_ATTR_SAUINT32T,
> >                     .attrValuesNumber = 1,
> >                     .attrValues = arr8
> >             };
> > -           char *str9 = stream->logFileFormat;
> > +           char *str9 = rt->logFileFormat;
> >             void *arr9[] = { &str9 };
> >             const SaImmAttrValuesT_2 attr_saLogStreamLogFileFormat
> =
> > {
> >                     .attrName =
> > const_cast<SaImmAttrNameT>("saLogStreamLogFileFormat"),
> > @@ -674,14 +559,14 @@ log_stream_t *log_stream_new_1(
> >                     .attrValuesNumber = 1,
> >                     .attrValues = arr9
> >             };
> > -           void *arr10[] = { &stream->severityFilter };
> > +           void *arr10[] = { &rt->severityFilter };
> >             const SaImmAttrValuesT_2 attr_saLogStreamSeverityFilter =
> > {
> >                     .attrName =
> > const_cast<SaImmAttrNameT>("saLogStreamSeverityFilter"),
> >                     .attrValueType = SA_IMM_ATTR_SAUINT32T,
> >                     .attrValuesNumber = 1,
> >                     .attrValues = arr10
> >             };
> > -           void *arr11[] = { &stream->creationTimeStamp };
> > +           void *arr11[] = { &rt->creationTimeStamp };
> >             const SaImmAttrValuesT_2
> > attr_saLogStreamCreationTimestamp = {
> >                     .attrName =
> > const_cast<SaImmAttrNameT>("saLogStreamCreationTimestamp"),
> >                     .attrValueType = SA_IMM_ATTR_SATIMET,
> > @@ -703,26 +588,26 @@ log_stream_t *log_stream_new_1(
> >                     NULL
> >             };
> >
> > -           /* parentName needs to be configurable? */
> >             {
> > -                   SaAisErrorT rv;
> > -
> > -                   rv = saImmOiRtObjectCreate_2(lgs_cb-
> > >immOiHandle,
> > +                   /**
> > +                    * Have to have retry for Rt creation.
> > +                    * Rt update could consider removing retry to avoid
> > blocking
> > +                    */
> > +                   rc = immutil_saImmOiRtObjectCreate_2(lgs_cb-
> > >immOiHandle,
> >
> > const_cast<SaImmClassNameT>("SaLogStream"),
> >                                                  parentName,
attrValues);
> >                     free(dndup);
> >
> > -                   if (rv != SA_AIS_OK) {
> > -                           /* no retry; avoid blocking LOG service
#1886
> > */
> > +                   if (rc != SA_AIS_OK) {
> >                             LOG_WA("saImmOiRtObjectCreate_2
> > returned %u for %s, parent %s",
> > -                                 rv, stream->name, parent_name);
> > +                                  rc, rt->name.c_str(), parent_name);
> > +
> >                     }
> >             }
> >     }
> >
> > - done:
> > -   TRACE_LEAVE();
> > -   return stream;
> > +   TRACE_LEAVE2("rc: %s", saf_error(rc));
> > +   return rc;
> >  }
> >
> >  /**
> > @@ -732,21 +617,19 @@ log_stream_t *log_stream_new_1(
> >   *
> >   * @return log_stream_t*
> >   */
> > -log_stream_t *log_stream_new_2(SaNameT *name, int stream_id)
> > +log_stream_t *log_stream_new(const std::string &name, int stream_id)
> >  {
> > -   int rc;
> > +   int rc = 0;
> >     log_stream_t *stream = NULL;
> >
> > -   osafassert(name != NULL);
> > -   TRACE_ENTER2("%s, l: %u", name->value, (unsigned int)name-
> > >length);
> > +   TRACE_ENTER2("%s, l: %lu", name.c_str(), name.size());
> >
> >     stream = new (std::nothrow) log_stream_t();
> >     if (stream == NULL) {
> >             LOG_WA("calloc FAILED");
> >             goto done;
> >     }
> > -   memcpy(stream->name, name->value, name->length);
> > -   stream->name[SA_MAX_NAME_LENGTH] = '\0';
> > +   stream->name = name;
> >     stream->streamId = stream_id;
> >     stream->creationTimeStamp = lgs_get_SaTime();
> >     stream->severityFilter = 0x7f;  /* by default all levels are allowed
*/
> > @@ -756,12 +639,6 @@ log_stream_t *log_stream_new_2(SaNameT *
> >      */
> >     init_log_stream_fd(stream);
> >
> > -   /* Add stream to tree */
> > -   if (log_stream_add(&stream->pat_node, stream->name) !=
> > NCSCC_RC_SUCCESS) {
> > -           log_stream_delete(&stream);
> > -           goto done;
> > -   }
> > -
> >     /* Add stream to array */
> >     if (stream->streamId == kInvalidId)
> >             rc = lgs_stream_array_insert_new(stream, &stream-
> > >streamId);
> > @@ -774,7 +651,7 @@ log_stream_t *log_stream_new_2(SaNameT *
> >     }
> >
> >   done:
> > -   TRACE_LEAVE();
> > +   TRACE_LEAVE2("rc: %d", rc);
> >     return stream;
> >  }
> >
> > @@ -834,7 +711,7 @@ int log_file_open(
> >   */
> >  void log_stream_open_fileinit(log_stream_t *stream)
> >  {
> > -   TRACE_ENTER2("%s, numOpeners=%u", stream->name, stream-
> > >numOpeners);
> > +   TRACE_ENTER2("%s, numOpeners=%u", stream->name.c_str(),
> > stream->numOpeners);
> >     osafassert(stream != NULL);
> >
> >     /* first time open? */
> > @@ -882,7 +759,7 @@ void log_stream_close(log_stream_t **s,
> >             lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY));
> >
> >     osafassert(stream != NULL);
> > -   TRACE_ENTER2("%s", stream->name);
> > +   TRACE_ENTER2("%s", stream->name.c_str());
> >
> >     osafassert(stream->numOpeners > 0);
> >     stream->numOpeners--;
> > @@ -979,7 +856,7 @@ int log_stream_file_close(log_stream_t *
> >     int errno_ret;
> >
> >     osafassert(stream != NULL);
> > -   TRACE_ENTER2("%s", stream->name);
> > +   TRACE_ENTER2("%s", stream->name.c_str());
> >
> >     osafassert(stream->numOpeners > 0);
> >
> > @@ -1254,7 +1131,7 @@ int log_stream_write_h(log_stream_t *str
> >     int write_errno=0;
> >
> >     osafassert(stream != NULL && buf != NULL);
> > -   TRACE_ENTER2("%s", stream->name);
> > +   TRACE_ENTER2("%s", stream->name.c_str());
> >
> >     /* Open files on demand e.g. on new active after fail/switch-over.
> > This
> >      * enables LOG to cope with temporary file system problems. */
> > @@ -1266,7 +1143,7 @@ int log_stream_write_h(log_stream_t *str
> >
> >             if (*stream->p_fd == -1) {
> >                     TRACE("%s - Initiating stream files \"%s\" Failed",
> > __FUNCTION__,
> > -                                   stream->name);
> > +                         stream->name.c_str());
> >             } else {
> >                     TRACE("%s - stream files initiated", __FUNCTION__);
> >             }
> > @@ -1371,6 +1248,26 @@ log_stream_t *log_stream_get_by_id(uint3
> >  }
> >
> >  /**
> > + * Get the stream from database stream_array by its name (dn)
> > + *
> > + * @param name stream name (dn)
> > + * @ret pointer to log_stream_t
> > + */
> > +log_stream_t *log_stream_get_by_name(const std::string &name)
> > +{
> > +   log_stream_t *tmp = NULL;
> > +   uint32_t i = 0;
> > +
> > +   for (i = 0; i < stream_array_size; i++) {
> > +           tmp = stream_array[i];
> > +           if (tmp != NULL && name == tmp->name) return tmp;
> > +   }
> > +
> > +   return NULL;
> > +
> > +}
> > +
> > +/**
> >   * Insert stream into array at specified position.
> >   * @param stream
> >   * @param id
> > @@ -1466,13 +1363,12 @@ void log_stream_id_print()
> >     TRACE("  Current number of streams: %u", numb_of_streams);
> >     for (i = 0; i < stream_array_size; i++) {
> >             if (stream_array[i] != NULL)
> > -                   TRACE("    Id %u - %s", i, stream_array[i]->name);
> > +                   TRACE("    Id %u - %s", i, stream_array[i]-
> > >name.c_str());
> >     }
> >  }
> >
> >  uint32_t log_stream_init()
> >  {
> > -   NCS_PATRICIA_PARAMS param;
> >     SaUint32T value;
> >
> >     /* Get configuration of how many application streams we should
> > allow. */
> > @@ -1486,11 +1382,7 @@ uint32_t log_stream_init()
> >             return NCSCC_RC_FAILURE;
> >     }
> >
> > -   memset(&param, 0, sizeof(NCS_PATRICIA_PARAMS));
> > -
> > -   param.key_size = SA_MAX_NAME_LENGTH;
> > -
> > -   return ncs_patricia_tree_init(&stream_dn_tree, &param);
> > +   return NCSCC_RC_SUCCESS;
> >  }
> >
> >  /**
> > @@ -1519,7 +1411,7 @@ int log_stream_config_change(bool create
> >     char *current_time = lgs_get_time(cur_time_in);
> >     std::string emptyStr = "";
> >
> > -   TRACE_ENTER2("%s", stream->name);
> > +   TRACE_ENTER2("%s", stream->name.c_str());
> >
> >     /* Peer sync needed due to change in logFileCurrent */
> >
> > @@ -1527,7 +1419,7 @@ int log_stream_config_change(bool create
> >             /* lgs has not yet recieved any stream operation request
> > after this swtchover/failover.
> >              *  stream shall be opened on-request after a switchover,
> > failover
> >              */
> > -           TRACE("log file of the stream: %s does not exist",stream-
> > >name);
> > +           TRACE("log file of the stream: %s does not exist", stream-
> > >name.c_str());
> >     } else {
> >             /* close the existing log file, and only when there is a
valid fd
> > */
> >
> > diff --git a/osaf/services/saf/logsv/lgs/lgs_stream.h
> > b/osaf/services/saf/logsv/lgs/lgs_stream.h
> > --- a/osaf/services/saf/logsv/lgs/lgs_stream.h
> > +++ b/osaf/services/saf/logsv/lgs/lgs_stream.h
> > @@ -24,6 +24,7 @@
> >  #include <limits.h>
> >
> >  #include "lgs_fmt.h"
> > +#include "osaf_extended_name.h"
> >
> >  #define LGS_LOG_FILE_EXT ".log"
> >  #define LGS_LOG_FILE_CONFIG_EXT ".cfg"
> > @@ -34,10 +35,8 @@
> >   * attributes like file descriptor.
> >   */
> >  typedef struct log_stream {
> > -   NCS_PATRICIA_NODE pat_node;
> > -
> >     /* --- Corresponds to IMM Class SaLogStream/SaLogStreamConfig --
> -
> > */
> > -   char name[SA_MAX_NAME_LENGTH + 1];      /* add for null
> > termination */
> > +   std::string name;
> >     std::string fileName;
> >     std::string pathName;
> >     SaUint64T maxLogFileSize;
> > @@ -82,8 +81,7 @@ extern uint32_t log_stream_init();
> >  extern void log_stream_delete(log_stream_t **s);
> >
> >  #define STREAM_NEW -1
> > -extern log_stream_t *log_stream_new_1(
> > -   SaNameT *name,
> > +extern int lgs_populate_log_stream(
> >     const std::string &filename,
> >     const std::string &pathname,
> >     SaUint64T maxLogFileSize,
> > @@ -92,13 +90,13 @@ extern log_stream_t *log_stream_new_1(
> >     SaUint32T maxFilesRotated,
> >     const char *logFileFormat,
> >     logStreamTypeT streamType,
> > -   int stream_id,
> >     SaBoolT twelveHourModeFlag,
> >     uint32_t logRecordId,
> > -   int creationFlag
> > +   log_stream_t *const o_stream
> >     );
> >
> > -extern log_stream_t *log_stream_new_2(SaNameT *name, int
> stream_id);
> > +extern SaAisErrorT lgs_create_rt_appstream(log_stream_t *const rt);
> > +extern log_stream_t *log_stream_new(const std::string &name, int
> > stream_id);
> >
> >  extern void log_stream_open_fileinit(log_stream_t *stream);
> >  extern void log_initiate_stream_files(log_stream_t *stream);
> > @@ -120,11 +118,11 @@ extern int log_file_open(const std::stri
> >                      int *errno_save);
> >
> >  /* Accessor functions */
> > -extern log_stream_t *log_stream_get_by_name(const char *name);
> > -extern log_stream_t *log_stream_getnext_by_name(const char *name);
> >  extern void log_stream_print(log_stream_t *stream);
> >  extern log_stream_t *log_stream_get_by_id(uint32_t id);
> >  extern bool check_max_stream();
> >  void log_free_stream_resources(log_stream_t *stream);
> > +unsigned int get_number_of_streams();
> > +extern log_stream_t *log_stream_get_by_name(const std::string
> &name);
> >
> >  #endif
> > diff --git a/osaf/services/saf/logsv/lgs/lgs_util.cc
> > b/osaf/services/saf/logsv/lgs/lgs_util.cc
> > --- a/osaf/services/saf/logsv/lgs/lgs_util.cc
> > +++ b/osaf/services/saf/logsv/lgs/lgs_util.cc
> > @@ -420,11 +420,14 @@ void lgs_send_write_log_ack(uint32_t cli
> >   */
> >  void lgs_free_write_log(const lgsv_write_log_async_req_t *param)
> >  {
> > +   TRACE_ENTER();
> > +
> >     if (param->logRecord->logHdrType == SA_LOG_GENERIC_HEADER) {
> >             SaLogGenericLogHeaderT *genLogH = &param->logRecord-
> > >logHeader.genericHdr;
> >             free(param->logRecord->logBuffer->logBuf);
> >             free(param->logRecord->logBuffer);
> >             free(genLogH->notificationClassId);
> > +           osaf_extended_name_free(const_cast<SaNameT
> > *>(genLogH->logSvcUsrName));
> >             free((void *)genLogH->logSvcUsrName);
> >             free(param->logRecord);
> >     } else {
> > @@ -432,10 +435,14 @@ void lgs_free_write_log(const lgsv_write
> >             free(param->logRecord->logBuffer->logBuf);
> >             free(param->logRecord->logBuffer);
> >             free(ntfLogH->notificationClassId);
> > +           osaf_extended_name_free(ntfLogH->notifyingObject);
> >             free(ntfLogH->notifyingObject);
> > +           osaf_extended_name_free(ntfLogH->notificationObject);
> >             free(ntfLogH->notificationObject);
> >             free(param->logRecord);
> >     }
> > +
> > +   TRACE_LEAVE();
> >  }
> >
> >  /**
> > @@ -593,7 +600,7 @@ int lgs_own_log_files_h(log_stream_t *st
> >     std::string dir_path;
> >     olfbgh_t *data_in = static_cast<olfbgh_t
> > *>(malloc(sizeof(olfbgh_t)));
> >
> > -   TRACE_ENTER2("stream %s",stream->name);
> > +   TRACE_ENTER2("stream %s", stream->name.c_str());
> >
> >     /* Set in parameter dir_path */
> >     const std::string logsv_root_dir = static_cast<const char
> > *>(lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY));
> > @@ -834,3 +841,19 @@ bool lgs_is_valid_pathlength(const std::
> >
> >     return ((rootlen + pathlen + filelen + LOG_TAIL_MAX) < PATH_MAX);
> >  }
> > +
> > +/**
> > + * Check if the name is valid or not.
> > + */
> > +bool lgs_is_extended_name_valid(const SaNameT* name)
> > +{
> > +
> > +   if (name == NULL) return false;
> > +   if (osaf_is_extended_name_valid(name) == false) return false;
> > +
> > +   SaConstStringT str = osaf_extended_name_borrow(name);
> > +   if (strlen(str) >= kOsafMaxDnLength) return false;
> > +
> > +   return true;
> > +
> > +}
> > diff --git a/osaf/services/saf/logsv/lgs/lgs_util.h
> > b/osaf/services/saf/logsv/lgs/lgs_util.h
> > --- a/osaf/services/saf/logsv/lgs/lgs_util.h
> > +++ b/osaf/services/saf/logsv/lgs/lgs_util.h
> > @@ -81,4 +81,6 @@ bool lgs_is_valid_pathlength(const std::
> >  int lgs_init_timer(time_t timeout_s);
> >  void lgs_close_timer(int ufd);
> >
> > +bool lgs_is_extended_name_valid(const SaNameT* name);
> > +
> >  #endif   /* ifndef __LGS_UTIL_H */



------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to