/**********************************************************************

    prototype:

        BOOL
        DslhVarroIsValidMacAddList
            (
                PCHAR                       pAddList
            );

    description:

        This function is called check if it's a valid MacAddress List;

    argument:   PCHAR                       pAddList
                The MacAddress List string seperated by ',';

    return:     TRUE or FALSE

**********************************************************************/
BOOL
DslhVarroIsValidMacAddList
    (
        PCHAR                       pAddList
    )
{
    PANSC_TOKEN_CHAIN               pAddrListTokenChain = (PANSC_TOKEN_CHAIN         )NULL;
    PANSC_STRING_TOKEN              pAddrStringToken    = (PANSC_STRING_TOKEN        )NULL;
    BOOL                            bIsValid            = TRUE;
    ULONG                           i                   = 0;

    if( !pAddList || AnscSizeOfString(pAddList) == 0)
    {
        return bIsValid;
    }

    if ( DslhVarroDelSpaceInCommaSeparator((PCHAR)pAddList) )
    {
        if ( pAddrListTokenChain = AnscTcAllocate( pAddList, "," ) )
        {
            while ( pAddrStringToken = AnscTcUnlinkToken(pAddrListTokenChain) )
            {
                if( ! DslhVarroIsValidMacAddress((PCHAR)pAddrStringToken->Name))
                {
                    bIsValid = FALSE;

                    AnscFreeMemory(pAddrStringToken);

                    goto EXIT;
                }

                AnscFreeMemory(pAddrStringToken);
            }
        }
        else
        {

            return bIsValid = FALSE;
        }
    }
    else
    {
        return bIsValid = FALSE;
    }

EXIT:

    if ( pAddrListTokenChain )
    {
        AnscTcFree((ANSC_HANDLE)pAddrListTokenChain);
    }

    return bIsValid;
}
BOOL
DslhVarroIsValidMaskString
    (
        PCHAR                           pStringValue
    )
{
    PANSC_TOKEN_CHAIN                   pAddrListTokenChain = (PANSC_TOKEN_CHAIN         )NULL;
    PANSC_STRING_TOKEN                  pAddrStringToken    = (PANSC_STRING_TOKEN        )NULL;
    ULONG                               ulMaskValue         = 0;
    ULONG                               i                   = 0;
    BOOL                                bIsValid            = FALSE;

    if ( !pStringValue || (AnscSizeOfString(pStringValue) == 0) )
    {
        return TRUE;
    }

    if ( pAddrListTokenChain = AnscTcAllocate(pStringValue, ".") )
    {
        if (pAddrListTokenChain->TokensQueue.Depth != 0x4)
        {
            goto EXIT;
        }

        while ( pAddrStringToken = AnscTcUnlinkToken(pAddrListTokenChain) )
        {
            ulMaskValue = (ulMaskValue<<0x8) + AnscGetStringUlong(pAddrStringToken->Name);

            AnscFreeMemory(pAddrStringToken);
        }

        if ( ! ulMaskValue )
        {
            bIsValid = TRUE;
            goto EXIT;
        }

        for ( i = 0; !(ulMaskValue & 0x1); i++)
        {
            ulMaskValue >>= 0x1;
        }

        /* Subnet mask shorter than 8 bits is rejected */
        if ( i > 24)
        {
            goto EXIT;
        }

        else if ( (!i && !(~(0x0 ^ ulMaskValue)))           /* 255.255.255.255 */
                  ||
                  ! (~( ( (~0x0<<(32-i))) ^ ulMaskValue ))  /* Other subnet masks */
                )
        {
            bIsValid = TRUE;
            goto EXIT;
        }
    }

EXIT:

    if ( pAddrListTokenChain )
    {
        AnscTcFree((ANSC_HANDLE)pAddrListTokenChain);
    }

    return bIsValid;
}
/**********************************************************************

    prototype:

        BOOL
        DslhVarroIsValidIpAddRangeList
            (
                PCHAR                       pAddRangeList
            );

    description:

        This function is called check if it's a valid IpAddress 
        range List;

    argument:   PCHAR                       pAddList
                The IpAddress List string seperated by ',';

    return:     TRUE or FALSE

**********************************************************************/
BOOL
DslhVarroIsValidIpAddRangeList
    (
        PCHAR                       pAddRangeList
    )
{
    PANSC_TOKEN_CHAIN               pAddrRangeTokenChain = (PANSC_TOKEN_CHAIN         )NULL;
    PANSC_TOKEN_CHAIN               pAddrTokenChain      = (PANSC_TOKEN_CHAIN         )NULL;
    PANSC_STRING_TOKEN              pAddrStringToken     = (PANSC_STRING_TOKEN        )NULL;
    PANSC_STRING_TOKEN              pAddrStringToken1    = (PANSC_STRING_TOKEN        )NULL;
    PANSC_STRING_TOKEN              pAddrStringToken2    = (PANSC_STRING_TOKEN        )NULL;
    BOOL                            bIsValid             = TRUE;
    ULONG                           i                    = 0;

    if( !pAddRangeList || AnscSizeOfString(pAddRangeList) == 0)
    {
        return bIsValid;
    }

    if ( DslhVarroDelSpaceInCommaSeparator((PCHAR)pAddRangeList) )
    {
        if ( (AnscSizeOfString(pAddRangeList) != 0) && (pAddrRangeTokenChain = AnscTcAllocate( pAddRangeList, "," )) )
        {
            while ( pAddrStringToken = AnscTcUnlinkToken(pAddrRangeTokenChain) )
            {
                if ( pAddrTokenChain = AnscTcAllocate(pAddrStringToken->Name, "-") )
                {

                    pAddrStringToken1 = AnscTcUnlinkToken(pAddrTokenChain);

                    if( ! AnscIsValidIpString((PCHAR)pAddrStringToken1->Name))
                    {
                        bIsValid = FALSE;

                        goto EXIT2;
                    }

                    pAddrStringToken2 = AnscTcUnlinkToken(pAddrTokenChain);

                    if( !pAddrStringToken2 || ! AnscIsValidIpString((PCHAR)pAddrStringToken2->Name))
                    {
                        bIsValid = FALSE;

                        goto EXIT3;
                    }

                    if ( _ansc_inet_addr(pAddrStringToken1->Name) > _ansc_inet_addr(pAddrStringToken2->Name) )
                    {
                        bIsValid = FALSE;

                        goto EXIT3;
                    }

                    AnscFreeMemory(pAddrStringToken2);
                    AnscFreeMemory(pAddrStringToken1);
                    AnscFreeMemory(pAddrStringToken);
                    AnscTcFree((ANSC_HANDLE)pAddrTokenChain);
                }
                else
                {
                    bIsValid = FALSE;

                    goto EXIT1;
                }
            }

            goto EXIT;
        }
        else
        {
            return bIsValid = FALSE;
        }
    }
    else
    {
        return bIsValid = FALSE;
    }

EXIT3:

    if ( pAddrStringToken2 )
    {
        AnscFreeMemory(pAddrStringToken2);
    }

EXIT2:
    
    if ( pAddrStringToken1 )
    {
        AnscFreeMemory(pAddrStringToken1);
    }

    if ( pAddrStringToken )
    {
        AnscFreeMemory(pAddrStringToken);
    }

EXIT1:

    if ( pAddrTokenChain )
    {
        AnscTcFree((ANSC_HANDLE)pAddrTokenChain);
    }

EXIT:

    if ( pAddrRangeTokenChain )
    {
        AnscTcFree((ANSC_HANDLE)pAddrRangeTokenChain);
    }

    return bIsValid;
}
Ejemplo n.º 4
0
ANSC_STATUS
SysRdoDelRecord
    (
        ANSC_HANDLE                 hThisObject,
        char*                       pRecordName
    )
{
    ANSC_STATUS                     returnStatus = ANSC_STATUS_SUCCESS;
    PSYS_REPOSITORY_DRIVER_OBJECT   pMyObject    = (PSYS_REPOSITORY_DRIVER_OBJECT  )hThisObject;
    PSYS_REPOSITORY_DRIVER_PROPERTY pProperty    = (PSYS_REPOSITORY_DRIVER_PROPERTY)&pMyObject->Property;
    PSYS_REPOSITORY_FOLDER_OBJECT   pRootFolder  = (PSYS_REPOSITORY_FOLDER_OBJECT  )pMyObject->hRootFolder;
    PSYS_REPOSITORY_FOLDER_OBJECT   pThisFolder  = pRootFolder;
    PSYS_REPOSITORY_FOLDER_OBJECT   pNextFolder  = NULL;
    PSYS_REPOSITORY_RECORD_OBJECT   pThisRecord  = NULL;
    PANSC_TOKEN_CHAIN               pTokenChain  = NULL;
    PANSC_STRING_TOKEN              pTokenEntry  = NULL;

    pTokenChain =
        (PANSC_TOKEN_CHAIN)AnscTcAllocate
            (
                pRecordName,
                SYS_RDO_PATH_SEPARATORS
            );

    if ( !pTokenChain )
    {
        returnStatus = ANSC_STATUS_BAD_NAME;

        goto  EXIT1;
    }
    else if ( AnscTcGetTokenCount(pTokenChain) == 0 )
    {
        returnStatus = ANSC_STATUS_BAD_NAME;

        goto  EXIT2;
    }

    pThisFolder->AcquireAccess((ANSC_HANDLE)pThisFolder);

    while ( pTokenEntry = AnscTcUnlinkToken(pTokenChain) )
    {
        pNextFolder =
            pThisFolder->GetFolderByName
                (
                    (ANSC_HANDLE)pThisFolder,
                    pTokenEntry->Name
                );

        if ( pNextFolder )
        {
            pThisFolder->ReleaseAccess((ANSC_HANDLE)pThisFolder);

            AnscFreeMemory(pTokenEntry);
        }
        else
        {
            AnscTcPrefixToken(pTokenChain, pTokenEntry);

            break;
        }

        pThisFolder = pNextFolder;
    }

    if ( !pTokenEntry )
    {
        pThisFolder->ReleaseAccess((ANSC_HANDLE)pThisFolder);

        returnStatus = ANSC_STATUS_BAD_NAME;

        goto  EXIT2;
    }
    else if ( !pThisFolder )
    {
        returnStatus = ANSC_STATUS_BAD_NAME;

        goto  EXIT2;
    }
    else if ( AnscTcGetTokenCount(pTokenChain) != 1 )
    {
        pThisFolder->ReleaseAccess((ANSC_HANDLE)pThisFolder);

        returnStatus = ANSC_STATUS_BAD_NAME;

        goto  EXIT2;
    }
    else if ( (pThisFolder->GetPermission((ANSC_HANDLE)pThisFolder) & SYS_RFO_PERMISSION_RECORD_DELETE) == 0 )
    {
        pThisFolder->ReleaseAccess((ANSC_HANDLE)pThisFolder);

        returnStatus = ANSC_STATUS_ACCESS_DENIED;

        goto  EXIT2;
    }
    else
    {
        pTokenEntry = AnscTcUnlinkToken(pTokenChain);
    }

    returnStatus =
        pThisFolder->DelRecord
            (
                (ANSC_HANDLE)pThisFolder,
                pTokenEntry->Name
            );

    pThisFolder->ReleaseAccess((ANSC_HANDLE)pThisFolder);

    AnscFreeMemory(pTokenEntry);


    /******************************************************************
                GRACEFUL ROLLBACK PROCEDURES AND EXIT DOORS
    ******************************************************************/

EXIT2:

    AnscTcFree((ANSC_HANDLE)pTokenChain);

EXIT1:

    return  returnStatus;
}
/**********************************************************************

    prototype:

        BOOL
        DslhVarroIsValidIp6AddList
            (
                PCHAR						pAddList
            );

    description:

        This function is called check if it's a valid Ip6Address List;

    argument:   PCHAR						pAddList
                The MacAddress List string seperated by ',';

    return:     TRUE or FALSE

**********************************************************************/
BOOL
DslhVarroIsValidIp6AddList
    (
        PCHAR						pAddList
    )
{
    PANSC_TOKEN_CHAIN               pAddrListTokenChain = (PANSC_TOKEN_CHAIN         )NULL;
    PANSC_STRING_TOKEN              pAddrStringToken    = (PANSC_STRING_TOKEN        )NULL;
	BOOL							bIsValid			= TRUE;
    ULONG                           uLength             = 0;
	ULONG							i					= 0;

	if( !pAddList || AnscSizeOfString(pAddList) == 0)
	{
		return bIsValid;
	}

    uLength = AnscSizeOfString(pAddList);

    /* cannot start or end with ',' */
    if( pAddList[0] == ',' || pAddList[uLength-1] == ',' )
    {
        return FALSE;
    }

    /* cannot have empty address in the middle */
    if( _ansc_strstr(pAddList, ",,") != NULL)
    {
        return FALSE;
    }

	if ( DslhVarroDelSpaceInCommaSeparator((PCHAR)pAddList) )
	{
		if ( pAddrListTokenChain = AnscTcAllocate( pAddList, "," ) )
		{
			while ( pAddrStringToken = AnscTcUnlinkToken(pAddrListTokenChain) )
			{
				if( ! AnscIsValidIp6String((PCHAR)pAddrStringToken->Name))
				{
					bIsValid = FALSE;

					AnscFreeMemory(pAddrStringToken);

					goto EXIT;
				}

                AnscFreeMemory(pAddrStringToken);
			}            
		}
		else
		{
			
			return FALSE;
		}
	}
	else
	{
		return FALSE;
	}

EXIT:

    if ( pAddrListTokenChain )
    {
        AnscTcFree((ANSC_HANDLE)pAddrListTokenChain);
    }

	return bIsValid;
}
Ejemplo n.º 6
0
ANSC_HANDLE
SysRdoGetFolder2
    (
        ANSC_HANDLE                 hThisObject,
        ANSC_HANDLE                 hCurFolder,
        char*                       pSubFolderName
    )
{
    ANSC_STATUS                     returnStatus = ANSC_STATUS_SUCCESS;
    PSYS_REPOSITORY_DRIVER_OBJECT   pMyObject    = (PSYS_REPOSITORY_DRIVER_OBJECT  )hThisObject;
    PSYS_REPOSITORY_DRIVER_PROPERTY pProperty    = (PSYS_REPOSITORY_DRIVER_PROPERTY)&pMyObject->Property;
    PSYS_REPOSITORY_FOLDER_OBJECT   pRootFolder  = (PSYS_REPOSITORY_FOLDER_OBJECT  )pMyObject->hRootFolder;
    PSYS_REPOSITORY_FOLDER_OBJECT   pThisFolder  = (hCurFolder != NULL)? (PSYS_REPOSITORY_FOLDER_OBJECT)hCurFolder : pRootFolder;
    PSYS_REPOSITORY_FOLDER_OBJECT   pNextFolder  = NULL;
    PANSC_TOKEN_CHAIN               pTokenChain  = NULL;
    PANSC_STRING_TOKEN              pTokenEntry  = NULL;

    pTokenChain =
        (PANSC_TOKEN_CHAIN)AnscTcAllocate
            (
                pSubFolderName,
                SYS_RDO_PATH_SEPARATORS
            );

    if ( !pTokenChain )
    {
        pThisFolder = (PSYS_REPOSITORY_FOLDER_OBJECT)NULL;

        goto  EXIT1;
    }
    else if ( AnscTcGetTokenCount(pTokenChain) == 0 )
    {
        pThisFolder = (PSYS_REPOSITORY_FOLDER_OBJECT)NULL;

        goto  EXIT2;
    }

    pThisFolder->AcquireAccess((ANSC_HANDLE)pThisFolder);

    while ( pTokenEntry = AnscTcUnlinkToken(pTokenChain) )
    {
        pNextFolder =
            pThisFolder->GetFolderByName
                (
                    (ANSC_HANDLE)pThisFolder,
                    pTokenEntry->Name
                );

        if ( pNextFolder )
        {
            pThisFolder->ReleaseAccess((ANSC_HANDLE)pThisFolder);

            AnscFreeMemory(pTokenEntry);
        }
        else
        {
            AnscTcPrefixToken(pTokenChain, pTokenEntry);

            break;
        }

        pThisFolder = pNextFolder;
    }

    if ( pTokenEntry )
    {
        pThisFolder->ReleaseAccess((ANSC_HANDLE)pThisFolder);

        pThisFolder = (PSYS_REPOSITORY_FOLDER_OBJECT)NULL;
    }


    /******************************************************************
                GRACEFUL ROLLBACK PROCEDURES AND EXIT DOORS
    ******************************************************************/

EXIT2:

    AnscTcFree((ANSC_HANDLE)pTokenChain);

EXIT1:

    return  (ANSC_HANDLE)pThisFolder;
}
Ejemplo n.º 7
0
ANSC_HANDLE
SysRdoAddFolder2
    (
        ANSC_HANDLE                 hThisObject,
        ANSC_HANDLE                 hCurFolder,
        char*                       pSubFolderName,
        ULONG                       ulPermission,
        ULONG                       ulFolderType,
        ANSC_HANDLE                 hRenderAttr,
        ANSC_HANDLE                 hReserved
    )
{
    ANSC_STATUS                     returnStatus = ANSC_STATUS_SUCCESS;
    PSYS_REPOSITORY_DRIVER_OBJECT   pMyObject    = (PSYS_REPOSITORY_DRIVER_OBJECT  )hThisObject;
    PSYS_REPOSITORY_DRIVER_PROPERTY pProperty    = (PSYS_REPOSITORY_DRIVER_PROPERTY)&pMyObject->Property;
    PSYS_REPOSITORY_FOLDER_OBJECT   pRootFolder  = (PSYS_REPOSITORY_FOLDER_OBJECT  )pMyObject->hRootFolder;
    PSYS_REPOSITORY_FOLDER_OBJECT   pThisFolder  = (hCurFolder != NULL)? (PSYS_REPOSITORY_FOLDER_OBJECT)hCurFolder : pRootFolder;
    PSYS_REPOSITORY_FOLDER_OBJECT   pNextFolder  = NULL;
    PANSC_TOKEN_CHAIN               pTokenChain  = NULL;
    PANSC_STRING_TOKEN              pTokenEntry  = NULL;

    pTokenChain =
        (PANSC_TOKEN_CHAIN)AnscTcAllocate
            (
                pSubFolderName,
                SYS_RDO_PATH_SEPARATORS
            );

    if ( !pTokenChain )
    {
        pThisFolder = (PSYS_REPOSITORY_FOLDER_OBJECT)NULL;

        goto  EXIT1;
    }
    else if ( AnscTcGetTokenCount(pTokenChain) == 0 )
    {
        pThisFolder = (PSYS_REPOSITORY_FOLDER_OBJECT)NULL;

        goto  EXIT2;
    }

    /*
     * The specified folder name is the absolute path where the new folder should be created in the
     * repository tree. We first try to go as far as we can using specified folder name as the path
     * into tree, then creates a new branch based on the rest of the token chain.
     */
    pThisFolder->AcquireAccess((ANSC_HANDLE)pThisFolder);

    while ( pTokenEntry = AnscTcUnlinkToken(pTokenChain) )
    {
        pNextFolder =
            pThisFolder->GetFolderByName
                (
                    (ANSC_HANDLE)pThisFolder,
                    pTokenEntry->Name
                );

        if ( pNextFolder )
        {
            pThisFolder->ReleaseAccess((ANSC_HANDLE)pThisFolder);

            AnscFreeMemory(pTokenEntry);
        }
        else
        {
            AnscTcPrefixToken(pTokenChain, pTokenEntry);

            break;
        }

        pThisFolder = pNextFolder;
    }

    if ( !pTokenEntry )
    {
        if ( !pThisFolder )
        {
            goto  EXIT2;
        }
        else if ( (pThisFolder->GetPermission((ANSC_HANDLE)pThisFolder) != ulPermission) ||
                  (pThisFolder->GetFolderType((ANSC_HANDLE)pThisFolder) != ulFolderType) )
        {
            pThisFolder->ReleaseAccess((ANSC_HANDLE)pThisFolder);

            pThisFolder = (PSYS_REPOSITORY_FOLDER_OBJECT)NULL;
        }

        goto  EXIT2;
    }

    /*
     * We have found the Repository Folder Object whose name is the longest match for the specified
     * folder name. For each path segment that is left in the specified path name, we create a sub-
     * folder under each previously-created folder object starting with the current folder object.
     * While this approach has the benefit of saving other components from having to follow strict
     * layering rule by creating a folder every step along the way, it does introduce an ambiguous
     * situation: what folder-permission and folder-type shall we assign to the folders that are
     * created for the middle segments of the specified path? As you shall see below, we assign the
     * default permission and type to all the unspecified folders.
     */
    while ( pTokenEntry = AnscTcUnlinkToken(pTokenChain) )
    {
        if ( AnscTcGetTokenCount(pTokenChain) > 0 )
        {
            pNextFolder =
                pThisFolder->AddFolder
                    (
                        (ANSC_HANDLE)pThisFolder,
                        pTokenEntry->Name,
                        SYS_RFO_PERMISSION_ALL,
                        SYS_REP_FOLDER_TYPE_STORAGE,
                        (ANSC_HANDLE)NULL,
                        (ANSC_HANDLE)NULL
                    );
        }
        else
        {
            pNextFolder =
                pThisFolder->AddFolder
                    (
                        (ANSC_HANDLE)pThisFolder,
                        pTokenEntry->Name,
                        ulPermission,
                        ulFolderType,
                        hRenderAttr,
                        hReserved
                    );
        }

        if ( pNextFolder )
        {
            pThisFolder->ReleaseAccess((ANSC_HANDLE)pThisFolder);

            AnscFreeMemory(pTokenEntry);
        }
        else
        {
            AnscTcPrefixToken(pTokenChain, pTokenEntry);

            break;
        }

        pThisFolder = pNextFolder;
    }

    if ( pTokenEntry )
    {
        pThisFolder->ReleaseAccess((ANSC_HANDLE)pThisFolder);

        pThisFolder = (PSYS_REPOSITORY_FOLDER_OBJECT)NULL;
    }


    /******************************************************************
                GRACEFUL ROLLBACK PROCEDURES AND EXIT DOORS
    ******************************************************************/

EXIT2:

    AnscTcFree((ANSC_HANDLE)pTokenChain);

EXIT1:

    return  (ANSC_HANDLE)pThisFolder;
}
ANSC_HANDLE
Bmc2EnvcoGetCommandProperty
    (
        ANSC_HANDLE                 hThisObject,
        char*                       pCommandName,
        char*                       pDomainName
    )
{
    ANSC_STATUS                     returnStatus         = ANSC_STATUS_SUCCESS;
    PBMC2_ENV_CONTROLLER_OBJECT     pMyObject            = (PBMC2_ENV_CONTROLLER_OBJECT  )hThisObject;
    PBMC2_ENV_CONTROLLER_PROPERTY   pProperty            = (PBMC2_ENV_CONTROLLER_PROPERTY)&pMyObject->Property;
    PBMC2_COMMAND_PROPERTY          pBmc2CommandProperty = (PBMC2_COMMAND_PROPERTY       )NULL;
    PSINGLE_LINK_ENTRY              pSLinkEntry          = (PSINGLE_LINK_ENTRY           )NULL;
    ULONG                           ulHashIndex          = AnscHashString(pCommandName, AnscSizeOfString(pCommandName), BMC2_ENVCO_COMPO_TABLE_SIZE);

    AnscAcquireLock(&pMyObject->CompoTableLock);

    pSLinkEntry = AnscQueueGetFirstEntry(&pMyObject->CompoTable[ulHashIndex]);

    while ( pSLinkEntry )
    {
        pBmc2CommandProperty = ACCESS_BMC2_COMMAND_PROPERTY(pSLinkEntry);
        pSLinkEntry          = AnscQueueGetNextEntry(pSLinkEntry);

        if ( AnscEqualString
                (
                    pBmc2CommandProperty->CommandName,
                    pCommandName,
                    FALSE
                ) )
        {
            BOOL                    bDomainMatched = FALSE;

            /* check if the specified domain matches pattern defined in command property */
            if ( !pBmc2CommandProperty->DomainNamePattern || 
                 AnscEqualString(pBmc2CommandProperty->DomainNamePattern, "*", TRUE) )
            {
                bDomainMatched = TRUE;
            }
            else
            {
                char*               pStar = _ansc_strstr(pBmc2CommandProperty->DomainNamePattern, "*");

                if ( !pStar )
                {
                    bDomainMatched = 
                        AnscEqualString
                            (
                                pBmc2CommandProperty->DomainNamePattern, 
                                pDomainName, 
                                FALSE
                            );
                }
                else
                {
                    PANSC_TOKEN_CHAIN   pTokenChain  = (PANSC_TOKEN_CHAIN)NULL;
                    PANSC_STRING_TOKEN  pStringToken = (PANSC_STRING_TOKEN)NULL;
                    ULONG               ulCurPos     = 0;
                    char*               pCurDomain   = pDomainName;
                    char*               pSubStr      = NULL;
                    
                    bDomainMatched = TRUE;

                    pTokenChain =
                        AnscTcAllocate3
                            (
                                pBmc2CommandProperty->DomainNamePattern,
                                "*"
                            );

                    if(pTokenChain) /*RDKB-5887 , CID-24415, null check before use*/
                    {

                        while ( pStringToken = AnscTcUnlinkToken(pTokenChain) )
                        {
                            pSubStr = Bmc2EnvcoFindSubStrNoCase(pCurDomain, pStringToken->Name);

                            if ( !pSubStr )
                            {
                                bDomainMatched = FALSE;
                            }
                            else if ( pCurDomain == pDomainName && *pBmc2CommandProperty->DomainNamePattern != '*' )
                            {
                                if ( pSubStr != pCurDomain )
                                {
                                    bDomainMatched = FALSE;
                                }
                            }

                            if ( pSubStr )
                            {
                                pCurDomain = pSubStr + AnscSizeOfString(pStringToken->Name);    /* move to next part */
                            }

                            AnscFreeMemory(pStringToken);

                            if ( !bDomainMatched )
                            {
                                break;
                            }
                        }

                        AnscTcFree((ANSC_HANDLE)pTokenChain);

                    }

                }
            }

            if ( !bDomainMatched )
            {
                continue;
            }

            AnscReleaseLock(&pMyObject->CompoTableLock);

            return  (ANSC_HANDLE)pBmc2CommandProperty;
        }
    }

    AnscReleaseLock(&pMyObject->CompoTableLock);

    return  (ANSC_HANDLE)NULL;
}
ANSC_STATUS
SlapOeoResolveCallDescrR
    (
        ANSC_HANDLE                 hThisObject,
        char*                       call_description,
        SLAP_VARIABLE*              return_var
    )
{
    ANSC_STATUS                     returnStatus         = ANSC_STATUS_SUCCESS;
    PSLAP_OBJ_ENTITY_OBJECT         pMyObject            = (PSLAP_OBJ_ENTITY_OBJECT)hThisObject;
    PSLAP_BSS_INTERFACE             pSlapBssIf           = (PSLAP_BSS_INTERFACE    )pMyObject->hSlapBssIf;
    PSLAP_VAR_MAPPER_OBJECT         pSlapVarMapper       = (PSLAP_VAR_MAPPER_OBJECT)pSlapBssIf->GetVarMapper(pSlapBssIf->hOwnerContext);
    PANSC_TOKEN_CHAIN               pTokenChainParamDesp = NULL;
    PANSC_STRING_TOKEN              pTokenSyntax         = NULL;
    PANSC_STRING_TOKEN              pTokenContentType    = NULL;

    if ( !pSlapVarMapper )
    {
        return  ANSC_STATUS_INTERNAL_ERROR;
    }
    else
    {
        SlapCleanVariable(return_var);
        SlapInitVariable (return_var);
    }

    pTokenChainParamDesp =
        (PANSC_TOKEN_CHAIN)AnscTcAllocate
            (
                call_description,
                SLAP_CALL_PARAMETER_SEPARATORS
            );

    if ( !pTokenChainParamDesp )
    {
        return  ANSC_STATUS_UNAPPLICABLE;
    }
    else
    {
        pTokenSyntax      = (PANSC_STRING_TOKEN)AnscTcPopToken((ANSC_HANDLE)pTokenChainParamDesp);
        pTokenContentType = (PANSC_STRING_TOKEN)AnscTcPopToken((ANSC_HANDLE)pTokenChainParamDesp);

        AnscTcFree(pTokenChainParamDesp);
    }

    if ( !pTokenSyntax )
    {
        return  ANSC_STATUS_UNAPPLICABLE;
    }
    else
    {
        return_var->Name        = NULL;
        return_var->ContentType = SLAP_CONTENT_TYPE_UNSPECIFIED;
        return_var->UsageType   = 0;
        return_var->Syntax      =
            pSlapVarMapper->GetVarSyntax
                (
                    (ANSC_HANDLE)pSlapVarMapper,
                    pTokenSyntax->Name
                );

        AnscFreeMemory(pTokenSyntax);
    }

    if ( pTokenContentType )
    {
        return_var->ContentType =
            pSlapVarMapper->GetVarContentType
                (
                    (ANSC_HANDLE)pSlapVarMapper,
                    pTokenContentType->Name
                );

        AnscFreeMemory(pTokenContentType);
    }

    return  ANSC_STATUS_SUCCESS;
}
ANSC_STATUS
SlapOeoResolveCallDescrI
    (
        ANSC_HANDLE                 hThisObject,
        char*                       call_description,
        SLAP_PARAMETER_LIST*        param_list
    )
{
    ANSC_STATUS                     returnStatus         = ANSC_STATUS_SUCCESS;
    PSLAP_OBJ_ENTITY_OBJECT         pMyObject            = (PSLAP_OBJ_ENTITY_OBJECT)hThisObject;
    PSLAP_BSS_INTERFACE             pSlapBssIf           = (PSLAP_BSS_INTERFACE    )pMyObject->hSlapBssIf;
    PSLAP_VAR_MAPPER_OBJECT         pSlapVarMapper       = (PSLAP_VAR_MAPPER_OBJECT)pSlapBssIf->GetVarMapper(pSlapBssIf->hOwnerContext);
    PANSC_TOKEN_CHAIN               pTokenChainParamList = NULL;
    PANSC_TOKEN_CHAIN               pTokenChainParamDesp = NULL;
    PANSC_STRING_TOKEN              pTokenParamDesp      = NULL;
    PANSC_STRING_TOKEN              pTokenSyntax         = NULL;
    PANSC_STRING_TOKEN              pTokenContentType    = NULL;
    ULONG                           ulParamCount         = 0;

    if ( !pSlapVarMapper )
    {
        return  ANSC_STATUS_INTERNAL_ERROR;
    }
    else
    {
        SlapCleanParamList(param_list);
        SlapInitParamList (param_list);
    }

    pTokenChainParamList =
        (PANSC_TOKEN_CHAIN)AnscTcAllocate
            (
                call_description,
                SLAP_CALL_PARAMETER_LIST_SEPARATORS
            );

    if ( !pTokenChainParamList )
    {
        returnStatus = ANSC_STATUS_UNAPPLICABLE;

        goto  EXIT1;
    }

    while ( pTokenParamDesp = (PANSC_STRING_TOKEN)AnscTcPopToken((ANSC_HANDLE)pTokenChainParamList) )
    {
        pTokenChainParamDesp =
            (PANSC_TOKEN_CHAIN)AnscTcAllocate
                (
                    pTokenParamDesp->Name,
                    SLAP_CALL_PARAMETER_SEPARATORS
                );

        if ( !pTokenChainParamDesp )
        {
            AnscFreeMemory(pTokenParamDesp);

            returnStatus = ANSC_STATUS_UNAPPLICABLE;

            goto  EXIT2;
        }
        else
        {
            AnscFreeMemory(pTokenParamDesp);

            pTokenSyntax      = (PANSC_STRING_TOKEN)AnscTcPopToken((ANSC_HANDLE)pTokenChainParamDesp);
            pTokenContentType = (PANSC_STRING_TOKEN)AnscTcPopToken((ANSC_HANDLE)pTokenChainParamDesp);

            AnscTcFree(pTokenChainParamDesp);
        }

        if ( !pTokenSyntax )
        {
            returnStatus = ANSC_STATUS_UNAPPLICABLE;

            goto  EXIT2;
        }
        else
        {
            param_list->ParamArray[ulParamCount].Name        = NULL;
            param_list->ParamArray[ulParamCount].ContentType = SLAP_CONTENT_TYPE_UNSPECIFIED;
            param_list->ParamArray[ulParamCount].UsageType   = 0;
            param_list->ParamArray[ulParamCount].Syntax      =
                pSlapVarMapper->GetVarSyntax
                    (
                        (ANSC_HANDLE)pSlapVarMapper,
                        pTokenSyntax->Name
                    );

            AnscFreeMemory(pTokenSyntax);
        }

        if ( pTokenContentType )
        {
            param_list->ParamArray[ulParamCount].ContentType =
                pSlapVarMapper->GetVarContentType
                    (
                        (ANSC_HANDLE)pSlapVarMapper,
                        pTokenContentType->Name
                    );

            AnscFreeMemory(pTokenContentType);
        }

        ulParamCount++;
    }

    param_list->ParamCount = ulParamCount;

    returnStatus = ANSC_STATUS_SUCCESS;


    /******************************************************************
                GRACEFUL ROLLBACK PROCEDURES AND EXIT DOORS
    ******************************************************************/

EXIT2:

    AnscTcFree((ANSC_HANDLE)pTokenChainParamList);

EXIT1:

    return  returnStatus;
}