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.

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

>       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?

>  {
>       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