osaf/tools/safimm/immadm/Makefile.am       |   1 +
 osaf/tools/safimm/immadm/imm_admin.c       |  14 +--
 osaf/tools/safimm/immcfg/Makefile.am       |   1 +
 osaf/tools/safimm/immcfg/imm_cfg.c         |  22 ++++--
 osaf/tools/safimm/immcfg/imm_import.cc     |  61 ++++++++++---------
 osaf/tools/safimm/immdump/Makefile.am      |   1 +
 osaf/tools/safimm/immdump/imm_xmlw_dump.cc |  10 +-
 osaf/tools/safimm/immfind/Makefile.am      |   1 +
 osaf/tools/safimm/immfind/imm_find.c       |  16 ++--
 osaf/tools/safimm/immlist/Makefile.am      |   1 +
 osaf/tools/safimm/immlist/imm_list.c       |   8 +-
 osaf/tools/safimm/src/immutil.c            |  92 ++++++++++++++++++-----------
 12 files changed, 129 insertions(+), 99 deletions(-)


The patch contains a code for the support long DNs in IMM tools

diff --git a/osaf/tools/safimm/immadm/Makefile.am 
b/osaf/tools/safimm/immadm/Makefile.am
--- a/osaf/tools/safimm/immadm/Makefile.am
+++ b/osaf/tools/safimm/immadm/Makefile.am
@@ -21,6 +21,7 @@ MAINTAINERCLEANFILES = Makefile.in
 bin_PROGRAMS = immadm
 
 immadm_CPPFLAGS = \
+       -DSA_EXTENDED_NAME_SOURCE \
        $(AM_CPPFLAGS) \
        -I$(top_srcdir)/osaf/tools/safimm/include \
        -I$(top_srcdir)/osaf/libs/common/immsv/include
diff --git a/osaf/tools/safimm/immadm/imm_admin.c 
b/osaf/tools/safimm/immadm/imm_admin.c
--- a/osaf/tools/safimm/immadm/imm_admin.c
+++ b/osaf/tools/safimm/immadm/imm_admin.c
@@ -201,7 +201,7 @@ void print_param(SaImmAdminOperationPara
                        }
                        break;
                case SA_IMM_ATTR_SANAMET :
-                       printf("%-50s %-12s %s\n", param->paramName, 
"SA_NAME_T", (*((SaNameT *)param->paramBuffer)).value);
+                       printf("%-50s %-12s %s\n", param->paramName, 
"SA_NAME_T", saAisNameBorrow((SaNameT*) param->paramBuffer));
                        break;
                case SA_IMM_ATTR_SAFLOATT :
                        printf("%-50s %-12s %f\n", param->paramName, 
"SA_FLOAT_T", (*((SaFloatT *)param->paramBuffer)));
@@ -371,10 +371,9 @@ int main(int argc, char *argv[])
        }
 
        if((optind < argc) && (!explicitAdmo)) {
-               strncpy((char *)objectName.value, argv[optind], 
SA_MAX_NAME_LENGTH);
-               objectName.length = strlen((char *)objectName.value);
+               saAisNameLend(argv[optind], &objectName);
 
-               if(strcmp((char *) objectName.value, OPENSAF_IMM_OBJECT_DN)==0) 
{
+               if(strcmp(saAisNameBorrow(&objectName), 
OPENSAF_IMM_OBJECT_DN)==0) {
                        releaseAdmo=false;
                        adminOwnerName = (SaImmAdminOwnerNameT) 
malloc(strlen(OPENSAF_IMM_SERVICE_NAME) + 1);
                        strcpy(adminOwnerName, OPENSAF_IMM_SERVICE_NAME);
@@ -390,18 +389,17 @@ int main(int argc, char *argv[])
 
        /* Remaining arguments should be object names on which the admin op 
should be performed. */
        while (optind < argc) {
-               strncpy((char *)objectName.value, argv[optind], 
SA_MAX_NAME_LENGTH);
-               objectName.length = strlen((char *)objectName.value);
+               saAisNameLend(argv[optind], &objectName);
 
                error = immutil_saImmOmAdminOwnerSet(ownerHandle, objectNames, 
SA_IMM_ONE);
                if (error != SA_AIS_OK) {
                        if (error == SA_AIS_ERR_NOT_EXIST) {
-                               if(strcmp(adminOwnerName, (const char *) 
objectName.value)==0) {
+                               if(strcmp(adminOwnerName, 
saAisNameBorrow(&objectName))==0) {
                                        fprintf(stderr, "AdminOwnerName == 
ImplementerName (%s) - Could be direct admin-op on OI\n", adminOwnerName);
                                        goto retry;
                                }
                                fprintf(stderr, "error - saImmOmAdminOwnerSet - 
object '%s' does not exist\n",
-                                       objectName.value);
+                                       saAisNameBorrow(&objectName));
                        }
                        else
                                fprintf(stderr, "error - saImmOmAdminOwnerSet 
FAILED: %s\n", saf_error(error));
diff --git a/osaf/tools/safimm/immcfg/Makefile.am 
b/osaf/tools/safimm/immcfg/Makefile.am
--- a/osaf/tools/safimm/immcfg/Makefile.am
+++ b/osaf/tools/safimm/immcfg/Makefile.am
@@ -27,6 +27,7 @@ immcfg_CXXFLAGS = \
        @XML2_CFLAGS@
 
 immcfg_CPPFLAGS = \
+       -DSA_EXTENDED_NAME_SOURCE \
        $(AM_CPPFLAGS) \
        -I$(top_srcdir)/osaf/tools/safimm/include \
        -I$(top_srcdir)/osaf/libs/common/immsv/include \
diff --git a/osaf/tools/safimm/immcfg/imm_cfg.c 
b/osaf/tools/safimm/immcfg/imm_cfg.c
--- a/osaf/tools/safimm/immcfg/imm_cfg.c
+++ b/osaf/tools/safimm/immcfg/imm_cfg.c
@@ -44,6 +44,7 @@
 #include <saf_error.h>
 #include <immsv_api.h>
 
+#include "osaf_extended_name.h"
 
 static SaVersionT immVersion = { 'A', 2, 13 };
 int verbose = 0;
@@ -183,6 +184,8 @@ static void free_attr_value(SaImmValueTy
        if(attrValue) {
                if(attrValueType == SA_IMM_ATTR_SASTRINGT)
                        free(*((SaStringT *)attrValue));
+               else if(attrValueType == SA_IMM_ATTR_SANAMET)
+                       osaf_extended_name_free((SaNameT*) attrValue);
                else if(attrValueType == SA_IMM_ATTR_SAANYT)
                        free(((SaAnyT*)attrValue)->bufferAddr);
                free(attrValue);
@@ -233,7 +236,7 @@ static SaImmAttrModificationT_2 *new_att
        SaImmAttrModificationTypeT modType = SA_IMM_ATTR_VALUES_REPLACE;
 
        if (className == NULL) {
-               fprintf(stderr, "Object with DN '%s' does not exist\n", 
objectName->value);
+               fprintf(stderr, "Object with DN '%s' does not exist\n", 
osaf_extended_name_borrow(objectName));
                res = -1;
                goto done;
        }
@@ -434,7 +437,7 @@ int object_create(const SaNameT **object
 
        i = 0;
        while (objectNames[i] != NULL) {
-               str = strdup((char*)objectNames[i]->value);
+               str = strdup(osaf_extended_name_borrow(objectNames[i]));
                if ((delim = strchr(str, ',')) != NULL) {
                        /* a parent exist */
                        while (delim && *(delim - 1) == 0x5c) {
@@ -451,14 +454,15 @@ int object_create(const SaNameT **object
                                        goto done;
                                }
 
-                               dn.length = sprintf((char*)dn.value, "%s", 
parent);
+
+                               osaf_extended_name_lend(parent, &dn);
                                parentName = &dn;
                                parentNames[0] = parentName;
 
                                VERBOSE_INFO("call saImmOmAdminOwnerSet for 
parent: %s\n", parent);
                                if ((error = 
immutil_saImmOmAdminOwnerSet(ownerHandle, parentNames, SA_IMM_SUBTREE)) != 
SA_AIS_OK) {
                                        if (error == SA_AIS_ERR_NOT_EXIST)
-                                               fprintf(stderr, "error - parent 
'%s' does not exist\n", dn.value);
+                                               fprintf(stderr, "error - parent 
'%s' does not exist\n", osaf_extended_name_borrow(&dn));
                                        else {
                                                fprintf(stderr, "error - 
saImmOmAdminOwnerSet FAILED: %s\n", saf_error(error));
                                                goto done;
@@ -565,7 +569,7 @@ int object_modify(const SaNameT **object
 
        if ((error = immutil_saImmOmAdminOwnerSet(ownerHandle, (const SaNameT 
**)objectNames, SA_IMM_ONE)) != SA_AIS_OK) {
                if (error == SA_AIS_ERR_NOT_EXIST)
-                       fprintf(stderr, "error - object '%s' does not exist\n", 
objectNames[0]->value);
+                       fprintf(stderr, "error - object '%s' does not exist\n", 
osaf_extended_name_borrow(objectNames[0]));
                else
                        fprintf(stderr, "error - saImmOmAdminOwnerSet FAILED: 
%s\n", saf_error(error));
 
@@ -656,7 +660,7 @@ int object_delete(const SaNameT **object
        while (objectNames[i] != NULL) {
                if ((error = immutil_saImmOmCcbObjectDelete(ccbHandle, 
objectNames[i])) != SA_AIS_OK) {
                        fprintf(stderr, "error - saImmOmCcbObjectDelete for 
'%s' FAILED: %s\n",
-                               objectNames[i]->value, saf_error(error));
+                               osaf_extended_name_borrow(objectNames[i]), 
saf_error(error));
 
                        SaAisErrorT rc2 = saImmOmCcbGetErrorStrings(ccbHandle, 
&errStrings);
                        if(errStrings) {
@@ -746,8 +750,8 @@ static int class_change(SaImmHandleT imm
 {
        SaAisErrorT error;
        SaImmAccessorHandleT accessorHandle;
-       SaNameT opensafImmObjectName = { 
strlen("opensafImm=opensafImm,safApp=safImmService"),
-                                                                       
"opensafImm=opensafImm,safApp=safImmService" };
+       SaNameT opensafImmObjectName;
+       osaf_extended_name_lend("opensafImm=opensafImm,safApp=safImmService", 
&opensafImmObjectName);
        const SaNameT *objectNameList[] = { &opensafImmObjectName, NULL };
        SaImmAttrNameT opensafImmAttrName[2] = { "opensafImmNostdFlags", NULL };
        SaImmAttrValuesT_2 **attributes;
@@ -1402,7 +1406,7 @@ static int imm_operation(int argc, char 
                        objectNames = realloc(objectNames, (objectNames_len + 
1) * sizeof(SaNameT*));
                        objectName = objectNames[objectNames_len - 1] = 
malloc(sizeof(SaNameT));
                        objectNames[objectNames_len++] = NULL;
-                       objectName->length = snprintf((char*)objectName->value, 
SA_MAX_NAME_LENGTH, "%s", argv[optind++]);
+                       osaf_extended_name_lend(argv[optind++], objectName);
                }
        }
 
diff --git a/osaf/tools/safimm/immcfg/imm_import.cc 
b/osaf/tools/safimm/immcfg/imm_import.cc
--- a/osaf/tools/safimm/immcfg/imm_import.cc
+++ b/osaf/tools/safimm/immcfg/imm_import.cc
@@ -37,6 +37,8 @@
 #include <saImmOm.h>
 #include <immutil.h>
 
+#include "osaf_extended_name.h"
+
 #define MAX_DEPTH 10
 #define MAX_CHAR_BUFFER_SIZE 8192  //8k
 
@@ -240,6 +242,8 @@ static void free_attr_value(SaImmValueTy
        if(attrValue) {
                if(attrValueType == SA_IMM_ATTR_SASTRINGT)
                        free(*((SaStringT *)attrValue));
+               else if(attrValueType == SA_IMM_ATTR_SANAMET)
+                       osaf_extended_name_free((SaNameT*) attrValue);
                else if(attrValueType == SA_IMM_ATTR_SAANYT)
                        free(((SaAnyT*)attrValue)->bufferAddr);
                free(attrValue);
@@ -308,6 +312,8 @@ static void free_parserState(ParserState
                        if(it->attrDefaultValue) {
                                if(it->attrValueType == SA_IMM_ATTR_SASTRINGT 
&& *(void **)(it->attrDefaultValue))
                                        free(*(void **)(it->attrDefaultValue));
+                               else if(it->attrValueType == 
SA_IMM_ATTR_SANAMET && (SaNameT*) (it->attrDefaultValue))
+                                       osaf_extended_name_free((SaNameT*) 
(it->attrDefaultValue));
                                else if(it->attrValueType == SA_IMM_ATTR_SAANYT 
&& (SaAnyT *)(it->attrDefaultValue))
                                        free(((SaAnyT 
*)(it->attrDefaultValue))->bufferAddr);
                                free(it->attrDefaultValue);
@@ -330,7 +336,9 @@ static void free_parserState(ParserState
                                if(it->attrValueType == SA_IMM_ATTR_SASTRINGT
                                                || it->attrValueType == 
SA_IMM_ATTR_SAANYT) {
                                        free(*(void **)(it->attrValues[i]));
-                               }
+                               } else if (it->attrValueType == 
SA_IMM_ATTR_SANAMET) {
+                                       osaf_extended_name_free((SaNameT*) 
it->attrValues[i]);
+                                }
                                free(it->attrValues[i]);
                        }
                        free(it->attrValues);
@@ -491,13 +499,10 @@ void setAdminOwnerHelper(ParserState* st
         * This function checks if there is a need to call
           saImmOmAdminOwnerSet on the parent or if a call is redundant */
 
-       // safe conversion of SaNameT to  char*
-       int len = parentOfObject->length;
-       char tmpStr[len+1];
-       strncpy(tmpStr, (char*) parentOfObject->value, len);
-       tmpStr[len] = '\0';
-
-       if (len < 1) {
+       // safe conversion of SaNameT to const char*
+       const char* tmpStr = osaf_extended_name_borrow(parentOfObject);
+
+       if (osaf_is_extended_name_empty(parentOfObject)) {
                // this is a root object, no need to set AdminOwner
                LOG_IN("  This is a root object, no need to call 
saImmOmAdminOwnerSet");
                // state->adminOwnerSetSet.insert(state->objectName);
@@ -637,14 +642,11 @@ static void createImmObject(ParserState*
        /* Set the class name */
        className = state->objectClass;
 
-       objectName.length = snprintf((char*) objectName.value,
-                                                                
sizeof(objectName.value),
-                                                                "%s", 
state->objectName);
-
        /* Set the parent name */
-       parentName.length = 0;
+       osaf_extended_name_clear(&parentName);
        if (state->objectName != NULL) {
                char* parent;
+               osaf_extended_name_lend(state->objectName, &objectName);
 
                /* ',' is the delimeter */
                /* but '\' is the escape character, used for association 
objects */
@@ -658,11 +660,7 @@ static void createImmObject(ParserState*
                        parent = NULL;
                }
 
-               if (parent != NULL) {
-                       parentName.length = (SaUint16T)strlen(parent);
-                       strncpy((char*)parentName.value, parent, 
parentName.length);
-                       parentName.value[parentName.length] = 0;
-               }
+               if (parent != NULL) osaf_extended_name_lend(parent, 
&parentName);
        } else {
                LOG_ER("Empty DN for object");
                stopParser(state);
@@ -679,8 +677,8 @@ static void createImmObject(ParserState*
 
 #ifdef TRACE_8
        /* Get the length of the DN and truncate state->objectName */
-       if (parentName.length > 0) {
-               DNlen = strlen(state->objectName) - (parentName.length + 1);
+       if (!osaf_is_extended_name_empty(&parentName)) {
+               DNlen = strlen(state->objectName) - 
(strlen(osaf_extended_name_borrow(&parentName)) + 1);
        } else {
                DNlen = strlen(state->objectName);
        }
@@ -833,7 +831,9 @@ done:
                        if(it->attrValueType == SA_IMM_ATTR_SASTRINGT
                                        || it->attrValueType == 
SA_IMM_ATTR_SAANYT) {
                                free(*(void **)(it->attrValues[i]));
-                       }
+                       } else if (it->attrValueType == SA_IMM_ATTR_SANAMET) {
+                               osaf_extended_name_free((SaNameT*) 
it->attrValues[i]);
+                        }
                        free(it->attrValues[i]);
                }
                free(it->attrValues);
@@ -899,8 +899,11 @@ static bool attrvalue_is_equal(SaImmValu
                return *((SaTimeT*) val1) == *((SaTimeT*) val2);
                break;
        case SA_IMM_ATTR_SANAMET:
-               return (memcmp(val1, val2, sizeof(SaNameT)) == 0);
-               break;
+        {
+               const char* s1 = osaf_extended_name_borrow((SaNameT*) val1);
+               const char* s2 = osaf_extended_name_borrow((SaNameT*) val2);
+               return strcmp(s1, s2) == 0;
+       }
        case SA_IMM_ATTR_SAFLOATT:
                return *((SaFloatT*) val1) == *((SaFloatT*) val2);
                break;
@@ -1113,6 +1116,8 @@ static void createImmClass(ParserState* 
                if(it->attrDefaultValue) {
                        if(it->attrValueType == SA_IMM_ATTR_SASTRINGT && *(void 
**)(it->attrDefaultValue))
                                free(*(void **)(it->attrDefaultValue));
+                       else if (it->attrValueType == SA_IMM_ATTR_SANAMET && 
(SaNameT*) (it->attrDefaultValue))
+                               osaf_extended_name_free((SaNameT*) 
it->attrDefaultValue);
                        else if(it->attrValueType == SA_IMM_ATTR_SAANYT && 
(SaAnyT *)(it->attrDefaultValue))
                                free(((SaAnyT 
*)(it->attrDefaultValue))->bufferAddr);
                        free(it->attrDefaultValue);
@@ -1758,7 +1763,7 @@ static void charactersHandler(void* user
                break;
        case DN:
                /* Copy the distinguished name */
-               if(len >= SA_MAX_NAME_LENGTH) {
+               if (len > kMaxDnLength) {
                        LOG_ER("DN is too long (%d characters)", len);
                        stopParser(state);
                        state->parsingStatus = 1;
@@ -2184,6 +2189,8 @@ static void addObjectAttributeDefinition
                while(attrValues.attrValues[i]) {
                        if(attrValues.attrValueType == SA_IMM_ATTR_SASTRINGT)
                                free(*((SaStringT *)attrValues.attrValues[i]));
+                       else if(attrValues.attrValueType == SA_IMM_ATTR_SANAMET)
+                               osaf_extended_name_free((SaNameT*) 
attrValues.attrValues[i]);
                        else if(attrValues.attrValueType == SA_IMM_ATTR_SAANYT)
                                
free(((SaAnyT*)attrValues.attrValues[i])->bufferAddr);
                        free(attrValues.attrValues[i]);
@@ -2467,14 +2474,12 @@ static int charsToValueHelper(SaImmAttrV
                break;
        case SA_IMM_ATTR_SANAMET:
                len = strlen(str);
-               if(len >= SA_MAX_NAME_LENGTH) {
+               if (len > kMaxDnLength) {
                        LOG_ER("SaNameT value is too long: %d characters", len);
                        return 1;
                }
                *value = malloc(sizeof(SaNameT));
-               ((SaNameT*)*value)->length = (SaUint16T)len;
-               strncpy((char*)((SaNameT*)*value)->value, str, len);
-               ((SaNameT*)*value)->value[len] = '\0';
+               osaf_extended_name_alloc(str, (SaNameT*) *value);
                break;
        case SA_IMM_ATTR_SAFLOATT:
                *value = malloc(sizeof(SaFloatT));
diff --git a/osaf/tools/safimm/immdump/Makefile.am 
b/osaf/tools/safimm/immdump/Makefile.am
--- a/osaf/tools/safimm/immdump/Makefile.am
+++ b/osaf/tools/safimm/immdump/Makefile.am
@@ -30,6 +30,7 @@ immdump_SOURCES = \
        imm_xmlw_dump.cc
 
 immdump_CPPFLAGS = \
+       -DSA_EXTENDED_NAME_SOURCE \
        $(AM_CPPFLAGS) \
        -I$(top_srcdir)/osaf/libs/common/immsv/include
 
diff --git a/osaf/tools/safimm/immdump/imm_xmlw_dump.cc 
b/osaf/tools/safimm/immdump/imm_xmlw_dump.cc
--- a/osaf/tools/safimm/immdump/imm_xmlw_dump.cc
+++ b/osaf/tools/safimm/immdump/imm_xmlw_dump.cc
@@ -20,8 +20,9 @@
 #include <iostream>
 #include <libxml/encoding.h>
 #include <unistd.h>
-#include <osaf_unicode.h>
-
+#include "saAis.h"
+#include "osaf_unicode.h"
+#include "osaf_extended_name.h"
 
 
 /* Functions */
@@ -40,8 +41,7 @@ void dumpObjectsXMLw(SaImmHandleT immHan
     unsigned int           tryCount=0;
     TRACE_ENTER();
 
-    root.length = 0;
-    strncpy((char*)root.value, "", 3);
+    osaf_extended_name_clear(&root);
 
     /* Initialize immOmSearch */
 
@@ -93,7 +93,7 @@ void dumpObjectsXMLw(SaImmHandleT immHan
             continue;
         }
 
-        objectToXMLw(std::string((char*)objectName.value, objectName.length),
+        objectToXMLw(std::string(osaf_extended_name_borrow(&objectName)),
                     attrs,
                     immHandle,
                     classRDNMap,
diff --git a/osaf/tools/safimm/immfind/Makefile.am 
b/osaf/tools/safimm/immfind/Makefile.am
--- a/osaf/tools/safimm/immfind/Makefile.am
+++ b/osaf/tools/safimm/immfind/Makefile.am
@@ -26,6 +26,7 @@ immfind_CXXFLAGS = \
        -I$(top_srcdir)/osaf/libs/common/immsv/include
 
 immfind_CPPFLAGS = \
+       -DSA_EXTENDED_NAME_SOURCE \
        $(AM_CPPFLAGS) \
        -I$(top_srcdir)/osaf/tools/safimm/include \
        -I$(top_srcdir)/osaf/libs/common/immsv/include
diff --git a/osaf/tools/safimm/immfind/imm_find.c 
b/osaf/tools/safimm/immfind/imm_find.c
--- a/osaf/tools/safimm/immfind/imm_find.c
+++ b/osaf/tools/safimm/immfind/imm_find.c
@@ -39,6 +39,7 @@
 #include <saImmOm.h>
 #include <immutil.h>
 #include <saf_error.h>
+#include "osaf_extended_name.h"
 
 static SaVersionT immVersion = { 'A', 2, 11 };
 extern struct ImmutilWrapperProfile immutilWrapperProfile;
@@ -102,10 +103,10 @@ int main(int argc, char *argv[])
        SaImmSearchParametersT_2 searchParam;
        SaNameT objectName;
        SaImmAttrValuesT_2 **attributes;
-       SaNameT rootName = { 0, "" };
+       SaNameT rootName;
+       osaf_extended_name_clear(&rootName);
        SaImmScopeT scope = SA_IMM_SUBTREE;     /* default search scope */
-       char classNameBuf[SA_MAX_NAME_LENGTH] = {0};
-       const char *className = classNameBuf;
+       const char* className = "";
        unsigned long timeoutVal = 60;
 
        while (1) {
@@ -116,7 +117,7 @@ int main(int argc, char *argv[])
 
                switch (c) {
                case 'c':
-                       strncpy(classNameBuf, optarg, SA_MAX_NAME_LENGTH);
+                       className = optarg;
                        break;
                case 's':
                        if (strcmp(optarg, "sublevel") == 0)
@@ -155,10 +156,7 @@ int main(int argc, char *argv[])
         immutilWrapperProfile.nTries = timeoutVal;
         immutilWrapperProfile.retryInterval = 1000;
 
-       if (optind < argc) {
-               strncpy((char *)rootName.value, argv[optind], 
SA_MAX_NAME_LENGTH);
-               rootName.length = strlen((char *)rootName.value);
-       }
+       if (optind < argc) osaf_extended_name_lend(argv[optind], &rootName);
 
        error = immutil_saImmOmInitialize(&immHandle, NULL, &immVersion);
        if (error != SA_AIS_OK) {
@@ -190,7 +188,7 @@ int main(int argc, char *argv[])
                        exit(EXIT_FAILURE);
                }
                if (error == SA_AIS_OK)
-                       printf("%s\n", objectName.value);
+                       printf("%s\n", osaf_extended_name_borrow(&objectName));
        } while (error != SA_AIS_ERR_NOT_EXIST);
 
        error = immutil_saImmOmSearchFinalize(searchHandle);
diff --git a/osaf/tools/safimm/immlist/Makefile.am 
b/osaf/tools/safimm/immlist/Makefile.am
--- a/osaf/tools/safimm/immlist/Makefile.am
+++ b/osaf/tools/safimm/immlist/Makefile.am
@@ -21,6 +21,7 @@ MAINTAINERCLEANFILES = Makefile.in
 bin_PROGRAMS = immlist
 
 immlist_CPPFLAGS = \
+       -DSA_EXTENDED_NAME_SOURCE \
        $(AM_CPPFLAGS) \
        -I$(top_srcdir)/osaf/tools/safimm/include \
        -I$(top_srcdir)/osaf/libs/common/immsv/include
diff --git a/osaf/tools/safimm/immlist/imm_list.c 
b/osaf/tools/safimm/immlist/imm_list.c
--- a/osaf/tools/safimm/immlist/imm_list.c
+++ b/osaf/tools/safimm/immlist/imm_list.c
@@ -103,7 +103,7 @@ static void print_attr_value_raw(SaImmVa
                break;
        case SA_IMM_ATTR_SANAMET: {
                SaNameT *myNameT = (SaNameT *)attrValue;
-               printf("%s", myNameT->value);
+               printf("%s", saAisNameBorrow(myNameT));
                break;
        }
        case SA_IMM_ATTR_SASTRINGT:
@@ -166,7 +166,8 @@ static void print_attr_value(SaImmValueT
        case SA_IMM_ATTR_SANAMET:
                {
                        SaNameT *myNameT = (SaNameT *)attrValue;
-                       printf("%s (%u) ", myNameT->value, myNameT->length);
+                       printf("%s (%zu) ", saAisNameBorrow(myNameT),
+                               strlen(saAisNameBorrow(myNameT)));
                        break;
                }
        case SA_IMM_ATTR_SASTRINGT:
@@ -371,8 +372,7 @@ static void display_object(const char *n
        SaAisErrorT error;
        SaImmAttrValuesT_2 **attributes;
 
-       strncpy((char *)objectName.value, name, SA_MAX_NAME_LENGTH);
-       objectName.length = strlen((char *)objectName.value);
+       saAisNameLend(name, &objectName);
 
        error = immutil_saImmOmAccessorGet_2(accessorHandle, &objectName, 
attributeNames, &attributes);
        if (SA_AIS_OK != error) {
diff --git a/osaf/tools/safimm/src/immutil.c b/osaf/tools/safimm/src/immutil.c
--- a/osaf/tools/safimm/src/immutil.c
+++ b/osaf/tools/safimm/src/immutil.c
@@ -15,11 +15,13 @@
  *
  */
 
+#define _GNU_SOURCE
+#ifndef SA_EXTENDED_NAME_SOURCE
+#define SA_EXTENDED_NAME_SOURCE
+#endif
+#include "immutil.h"
 #include <stdio.h>
 #include <unistd.h>
-#ifndef __USE_ISOC99
-#define __USE_ISOC99 // strtof and LLONG_MAX in older gcc versions like 4.3.2
-#endif
 #include <stdlib.h>
 #include <string.h>
 #include <limits.h>
@@ -28,12 +30,11 @@
 #include <syslog.h>
 #include <errno.h>
 
-#include <immutil.h>
-
-#include <logtrace.h>
+#include "saAis.h"
+#include "logtrace.h"
+#include "osaf_extended_name.h"
 
 static const SaVersionT immVersion = { 'A', 2, 11 };
-size_t strnlen(const char *s, size_t maxlen);
 
 /* Memory handling functions */
 #define CHUNK  4000
@@ -107,9 +108,17 @@ void ccbutil_deleteCcbData(struct CcbUti
 {
        struct CcbUtilCcbData *item = ccbList;
        struct CcbUtilCcbData *prev = NULL;
+       struct CcbUtilOperationData *op;
        if (ccb == NULL)
                return;
        while (item != NULL) {
+               op = item->operationListHead;
+               while(op) {
+                       osaf_extended_name_free(&op->objectName);
+                       op = op->next;
+                       if(op == item->operationListTail)
+                               break;
+               }
                if (ccb->ccbId == item->ccbId) {
                        if (prev == NULL) {
                                ccbList = item->next;
@@ -152,7 +161,7 @@ CcbUtilOperationData_t *ccbutil_ccbAddCr
        operation->param.create.className = dupSaImmClassNameT(clist, 
className);
        operation->param.create.parentName = dupSaNameT(clist, parentName);
        operation->param.create.attrValues = dupSaImmAttrValuesT_array(clist, 
attrValues);
-       operation->objectName.length = 0;
+       saAisNameLend("", &operation->objectName);
        return operation;
 }
 
@@ -162,26 +171,39 @@ CcbUtilOperationData_t *ccbutil_ccbAddCr
        const SaNameT *parentName,
        const SaImmAttrValuesT_2 **attrValues)
 {
+       const char *str;
+       size_t len;
        struct Chunk *clist = (struct Chunk *)ccb->memref;
        struct CcbUtilOperationData *operation = newOperationData(ccb, 
CCBUTIL_CREATE);
        operation->param.create.className = dupSaImmClassNameT(clist, 
className);
        operation->param.create.parentName = dupSaNameT(clist, parentName);
        operation->param.create.attrValues = dupSaImmAttrValuesT_array(clist, 
attrValues);
-       operation->objectName = *objectName;
+
+       str = saAisNameBorrow(objectName);
+       len = strlen(str);
+       saAisNameLend(len < SA_MAX_UNEXTENDED_NAME_LENGTH ? str : strdup(str), 
&operation->objectName);
+
        return operation;
 }
 
 void ccbutil_ccbAddDeleteOperation(struct CcbUtilCcbData *ccb, const SaNameT 
*objectName)
 {
+       const char *str;
+       size_t len;
        struct Chunk *clist = (struct Chunk *)ccb->memref;
        struct CcbUtilOperationData *operation = newOperationData(ccb, 
CCBUTIL_DELETE);
        operation->param.deleteOp.objectName = dupSaNameT(clist, objectName);
-       operation->objectName = *objectName;
+
+       str = saAisNameBorrow(objectName);
+       len = strlen(str);
+       saAisNameLend(len < SA_MAX_UNEXTENDED_NAME_LENGTH ? str : strdup(str), 
&operation->objectName);
 }
 
 int ccbutil_ccbAddModifyOperation(struct CcbUtilCcbData *ccb,
                                   const SaNameT *objectName, const 
SaImmAttrModificationT_2 **attrMods)
 {
+       const char *str;
+       size_t len;
        struct Chunk *clist = (struct Chunk *)ccb->memref;
        struct CcbUtilOperationData *operation;
 
@@ -191,9 +213,12 @@ int ccbutil_ccbAddModifyOperation(struct
 
        operation = newOperationData(ccb, CCBUTIL_MODIFY);
        operation->param.modify.objectName = dupSaNameT(clist, objectName);
-       operation->objectName = *objectName;
        operation->param.modify.attrMods = 
dupSaImmAttrModificationT_array(clist, attrMods);
 
+       str = saAisNameBorrow(objectName);
+       len = strlen(str);
+       saAisNameLend(len < SA_MAX_UNEXTENDED_NAME_LENGTH ? str : strdup(str), 
&operation->objectName);
+
        return 0;
 }
 
@@ -212,8 +237,7 @@ CcbUtilOperationData_t *ccbutil_getCcbOp
         CcbUtilOperationData_t *opData = ccbutil_getNextCcbOp(ccbId, NULL);
 
         while (opData != NULL) {
-                if ((dn->length == opData->objectName.length) &&
-                    (memcmp(dn->value, opData->objectName.value, dn->length) 
== 0))
+               if (strcmp(saAisNameBorrow(dn), 
saAisNameBorrow(&opData->objectName)) == 0)
                         break;
 
                 opData = ccbutil_getNextCcbOp(ccbId, opData);
@@ -267,13 +291,10 @@ char const *immutil_getClassName(struct 
 
 char const *immutil_getStringValue(char const *key, SaNameT const *name)
 {
-       static char buffer[SA_MAX_NAME_LENGTH + 1];
+       const char* buffer = saAisNameBorrow(name);
        unsigned int klen;
        char *cp;
 
-       assert(name->length <= SA_MAX_NAME_LENGTH);
-       memcpy(buffer, name->value, name->length);
-       buffer[name->length] = 0;
        assert(key != NULL);
        klen = strlen(key);
        assert(klen > 1 || key[klen - 1] == '=');
@@ -297,14 +318,13 @@ char const *immutil_getStringValue(char 
 
 char const *immutil_getDnItem(SaNameT const *name, unsigned int index)
 {
-       static char buffer[SA_MAX_NAME_LENGTH + 1];
+       static char* buffer = NULL;
        char *cp;
        char *value;
+       size_t size = strlen(saAisNameBorrow(name)) + 1;
 
-       assert(name->length <= SA_MAX_NAME_LENGTH);
-       memcpy(buffer, name->value, name->length);
-       buffer[name->length] = 0;
-
+       buffer = realloc(buffer, size);
+       memcpy(buffer, saAisNameBorrow(name), size);
        value = buffer;
        cp = strchr(value, ',');
        while (index > 0) {
@@ -494,10 +514,9 @@ const SaUint32T *immutil_getUint32Attr(c
 
 int immutil_matchName(SaNameT const *name, regex_t const *preg)
 {
-       char buffer[SA_MAX_NAME_LENGTH + 1];
+       const char* buffer;
        assert(name != NULL && preg != NULL);
-       memcpy(buffer, name->value, name->length);
-       buffer[name->length] = 0;
+       buffer = saAisNameBorrow(name);
        return regexec(preg, buffer, 0, NULL, 0);
 }
 
@@ -510,8 +529,7 @@ SaAisErrorT immutil_update_one_rattr(SaI
        SaImmAttrValueT attrValues[] = { value };
        SaNameT objectName;
 
-       strncpy((char *)objectName.value, dn, SA_MAX_NAME_LENGTH);
-       objectName.length = strlen((char *)objectName.value);
+       saAisNameLend(dn, &objectName);
 
        attrMod.modType = SA_IMM_ATTR_VALUES_REPLACE;
        attrMod.modAttr.attrName = attributeName;
@@ -531,7 +549,7 @@ SaImmClassNameT immutil_get_className(co
 
        (void)immutil_saImmOmInitialize(&omHandle, NULL, &immVersion);
        (void)immutil_saImmOmAccessorInitialize(omHandle, &accessorHandle);
-        if (immutil_saImmOmAccessorGet_2(accessorHandle, objectName, 
attributeNames, &attributes) == SA_AIS_OK)
+       if (immutil_saImmOmAccessorGet_2(accessorHandle, objectName, 
attributeNames, &attributes) == SA_AIS_OK)
                className = strdup(*((char **)attributes[0]->attrValues[0]));
        (void)immutil_saImmOmAccessorFinalize(accessorHandle);
        (void)immutil_saImmOmFinalize(omHandle);
@@ -549,7 +567,7 @@ SaAisErrorT immutil_get_attrValueType(co
        SaImmAttrDefinitionT_2 **attrDefinitions;
        int i = 0;
 
-        (void)immutil_saImmOmInitialize(&omHandle, NULL, &immVersion);
+       (void)immutil_saImmOmInitialize(&omHandle, NULL, &immVersion);
 
        if ((rc = saImmOmClassDescriptionGet_2(omHandle, className, 
&classCategory, &attrDefinitions)) != SA_AIS_OK)
                goto done;
@@ -665,13 +683,8 @@ void *immutil_new_attrValue(SaImmValueTy
        case SA_IMM_ATTR_SANAMET: {
                SaNameT *mynamet;
                len = strlen(str);
-               if (len > SA_MAX_NAME_LENGTH) {
-                       fprintf(stderr, "too long SaNameT\n");
-                       return NULL;
-               }
                attrValue = mynamet = malloc(sizeof(SaNameT));
-               mynamet->length = len;
-               strncpy((char *)mynamet->value, str, SA_MAX_NAME_LENGTH);
+               saAisNameLend(len < SA_MAX_UNEXTENDED_NAME_LENGTH ? str : 
strdup(str), mynamet);
                break;
        }
        case SA_IMM_ATTR_SASTRINGT: {
@@ -741,8 +754,9 @@ static const SaNameT *dupSaNameT(struct 
        SaNameT *copy;
        if (original == NULL)
                return NULL;
+       const char* value = saAisNameBorrow(original);
        copy = (SaNameT *)clistMalloc(clist, sizeof(SaNameT));
-       memcpy(copy, original, sizeof(SaNameT));
+       saAisNameLend(strlen(value) < SA_MAX_UNEXTENDED_NAME_LENGTH ? value : 
dupStr(clist, value), copy);
        return copy;
 }
 
@@ -823,6 +837,12 @@ static void copySaImmAttrValuesT(struct 
                        char *cporig = *((char **)original->attrValues[i]);
                        char **cpp = (char **)databuffer;
                        *cpp = dupStr(clist, cporig);
+               } else if(original->attrValueType == SA_IMM_ATTR_SANAMET) {
+                       SaNameT* cporig = (SaNameT*) original->attrValues[i];
+                       SaNameT* cpdest = (SaNameT*) copy->attrValues[i];
+                       const char* value = saAisNameBorrow(cporig);
+                       saAisNameLend(strlen(value) < 
SA_MAX_UNEXTENDED_NAME_LENGTH ? value :
+                               dupStr(clist, value), cpdest);
                } else if(original->attrValueType == SA_IMM_ATTR_SAANYT) {
                        SaAnyT* cporig = (SaAnyT *) original->attrValues[i];
                        SaAnyT* cpdest = (SaAnyT *) copy->attrValues[i];

------------------------------------------------------------------------------
Want fast and easy access to all the code in your enterprise? Index and
search up to 200,000 lines of code with a free copy of Black Duck
Code Sight - the same software that powers the world's largest code
search on Ohloh, the Black Duck Open Hub! Try it now.
http://p.sf.net/sfu/bds
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to