12e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley/**
22e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * Copyright(c) 2011 Trusted Logic.   All rights reserved.
32e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *
42e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * Redistribution and use in source and binary forms, with or without
52e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * modification, are permitted provided that the following conditions
62e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * are met:
72e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *
82e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *  * Redistributions of source code must retain the above copyright
92e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *    notice, this list of conditions and the following disclaimer.
102e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *  * Redistributions in binary form must reproduce the above copyright
112e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *    notice, this list of conditions and the following disclaimer in
122e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *    the documentation and/or other materials provided with the
132e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *    distribution.
142e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *  * Neither the name Trusted Logic nor the names of its
152e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *    contributors may be used to endorse or promote products derived
162e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *    from this software without specific prior written permission.
172e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *
182e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
192e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
202e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
212e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
222e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
232e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
242e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
252e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
262e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
272e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
282e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
292e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley */
302e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
312e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <stdlib.h>
322e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <assert.h>
332e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <stdio.h>
342e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <ctype.h>
352e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <string.h>
362e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
372e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#if defined(_WIN32_WCE)
382e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include "os_wm.h"
392e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#else
402e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <errno.h>
412e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#endif
422e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
432e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include "smc_properties_parser.h"
442e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include "lib_manifest2.h"
452e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include "s_error.h"
462e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
472e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley/* ---------------------------------------------------------------------------------
482e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   Defines
492e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   ---------------------------------------------------------------------------------*/
502e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
512e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#define STRUE                             "true"
522e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#define SFALSE                            "false"
532e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
542e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#if defined(_WIN32_WCE)
552e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#define GET_LAST_ERR GetLastError()
562e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#else
572e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#define GET_LAST_ERR  errno
582e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#endif
592e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
602e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#if defined (LINUX) || defined (__SYMBIAN32__) || defined (__ANDROID32__)
612e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#define STRICMP strcasecmp
622e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#elif defined(_WIN32_WCE)
632e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#define STRICMP _stricmp
642e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#else
652e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#define STRICMP stricmp
662e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#endif
672e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
682e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
692e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley/* ---------------------------------------------------------------------------------
702e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   Logs and Traces.
712e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   ---------------------------------------------------------------------------------*/
722e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#ifdef __SYMBIAN32__
732e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include "os_symbian.h"
742e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#elif NDEBUG
752e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley/* Compile-out the traces */
762e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#define TRACE_ERROR(...)
772e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#define TRACE_WARNING(...)
782e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#define TRACE_INFO(...)
792e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#else
802e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <stdarg.h>
812e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleystatic void TRACE_ERROR(const char* format, ...)
822e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
832e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   va_list ap;
842e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   va_start(ap, format);
852e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   fprintf(stderr, "TRACE: ERROR: ");
862e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   vfprintf(stderr, format, ap);
872e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   fprintf(stderr, "\n");
882e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   va_end(ap);
892e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
902e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
912e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleystatic void TRACE_WARNING(const char* format, ...)
922e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
932e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   va_list ap;
942e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   va_start(ap, format);
952e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   fprintf(stderr, "TRACE: WARNING: ");
962e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   vfprintf(stderr, format, ap);
972e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   fprintf(stderr, "\n");
982e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   va_end(ap);
992e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
1002e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1012e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleystatic void TRACE_INFO(const char* format, ...)
1022e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
1032e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   va_list ap;
1042e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   va_start(ap, format);
1052e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   fprintf(stderr, "TRACE: ");
1062e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   vfprintf(stderr, format, ap);
1072e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   fprintf(stderr, "\n");
1082e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   va_end(ap);
1092e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
1102e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#endif /* NDEBUG */
1112e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1122e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley/* ---------------------------------------------------------------------------------
1132e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   private functions.
1142e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   ---------------------------------------------------------------------------------*/
1152e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1162e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleystatic NODE* static_listFindNodeElement(NODE* pList,char* pName,bool bIsCaseSensitive)
1172e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
1182e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   int32_t nCmp;
1192e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1202e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   assert(pName!=NULL);
1212e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1222e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   while (pList!=NULL)
1232e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
1242e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      if (bIsCaseSensitive)
1252e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
1262e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         nCmp=strcmp(pName,pList->pName);
1272e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
1282e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      else
1292e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
1302e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         nCmp=STRICMP(pName,pList->pName);
1312e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
1322e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      if (nCmp>0)
1332e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
1342e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         pList=pList->pRight;
1352e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
1362e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      else if (nCmp<0)
1372e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
1382e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         pList=pList->pLeft;
1392e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
1402e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      else
1412e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
1422e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         break;
1432e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
1442e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
1452e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   return pList;
1462e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
1472e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1482e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1492e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleystatic S_RESULT static_listSortedAddNode(NODE* pList,NODE* pNode)
1502e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
1512e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   int32_t nCmp;
1522e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1532e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   do {
1542e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      nCmp=strcmp(pNode->pName,pList->pName);
1552e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      if (nCmp>0)
1562e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
1572e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         if (pList->pRight!=NULL)
1582e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         {
1592e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            pList=pList->pRight;
1602e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
1612e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         else
1622e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         {
1632e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            pList->pRight=pNode;
1642e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            /* update linked list */
1652e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            pNode->pPrevious=pList;
1662e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            pNode->pNext=pList->pNext;
1672e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            if (pList->pNext!=NULL)
1682e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            {
1692e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               pList->pNext->pPrevious=pNode;
1702e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            }
1712e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            pList->pNext=pNode;
1722e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            return S_SUCCESS;
1732e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
1742e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
1752e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      else if (nCmp<0)
1762e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
1772e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         if (pList->pLeft!=NULL)
1782e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         {
1792e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            pList=pList->pLeft;
1802e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
1812e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         else
1822e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         {
1832e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            pList->pLeft=pNode;
1842e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            /* update linked list */
1852e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            pNode->pNext=pList;
1862e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            pNode->pPrevious=pList->pPrevious;
1872e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            if (pList->pPrevious!=NULL)
1882e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            {
1892e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               pList->pPrevious->pNext=pNode;
1902e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            }
1912e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            pList->pPrevious=pNode;
1922e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            return S_SUCCESS;
1932e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
1942e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
1952e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   } while (nCmp!=0);
1962e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1972e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   TRACE_ERROR("%s already exist !\n",pNode->pName);
1982e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   return S_ERROR_ITEM_EXISTS;
1992e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
2002e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2012e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2022e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleystatic S_RESULT SMCPropListSortedAdd(LIST* pList,NODE* pNode)
2032e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
2042e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   S_RESULT nResult;
2052e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2062e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   assert(pList!=NULL && pNode!=NULL);
2072e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2082e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if (pNode->pName==NULL)
2092e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
2102e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley	   TRACE_ERROR("Trying to insert a NULL node name !\n");
2112e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      return S_ERROR_BAD_PARAMETERS;
2122e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
2132e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2142e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if (pList->pRoot==NULL)
2152e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
2162e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      pList->pRoot=pNode;
2172e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      pList->pFirst=pNode;
2182e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      return S_SUCCESS;
2192e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
2202e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   else
2212e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
2222e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      nResult=static_listSortedAddNode(pList->pRoot,pNode);
2232e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      /* update the first node of the linked list */
2242e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      if (nResult==S_SUCCESS && pNode->pPrevious==NULL)
2252e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
2262e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         pList->pFirst=pNode;
2272e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
2282e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
2292e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   return nResult;
2302e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
2312e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2322e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2332e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleystatic NODE* SMCPropListFindElement(LIST* pList,char* pName,bool bIsCaseSensitive)
2342e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
2352e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if (pList->pRoot!=NULL)
2362e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
2372e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      return static_listFindNodeElement(pList->pRoot,pName,bIsCaseSensitive);
2382e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
2392e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   return NULL;
2402e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
2412e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2422e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2432e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleystatic S_RESULT SMCPropYacc(uint8_t* pBuffer, uint32_t nBufferLength,
2442e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley                     CONF_FILE* pConfFile)
2452e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
2462e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   S_RESULT nError=S_SUCCESS;
2472e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   LIST *pPublicPropertyList=NULL;
2482e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   LIST *pPrivatePropertyList=NULL;
2492e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   PROPERTY* pProperty=NULL;
2502e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   SERVICE_SECTION* pServSection;
2512e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   SERVICE_SECTION* pPreviousService=NULL;
2522e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2532e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   uint8_t* pName;
2542e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   uint32_t nNameLength;
2552e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   uint8_t* pValue;
2562e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   uint32_t nValueLength;
2572e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   char* pNameZ = NULL;
2582e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   char* pValueZ = NULL;
2592e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   LIB_MANIFEST2_CONTEXT sParserContext;
2602e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   char serviceManifestName[1024];
2612e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2622e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   sParserContext.pManifestName = "Configuration File";
2632e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   sParserContext.pManifestContent = pBuffer;
2642e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   sParserContext.nManifestLength = nBufferLength;
2652e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   sParserContext.nType = LIB_MANIFEST2_TYPE_SOURCE_WITH_SECTIONS;
2662e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2672e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   libManifest2InitContext(&sParserContext);
2682e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2692e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   while (true)
2702e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
2712e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      nError = libManifest2GetNextItem(
2722e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         &sParserContext,
2732e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         &pName,
2742e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         &nNameLength,
2752e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         &pValue,
2762e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         &nValueLength);
2772e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      if (nError == S_ERROR_ITEM_NOT_FOUND)
2782e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
2792e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         /* End of parsing */
2802e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         nError = S_SUCCESS;
2812e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         break;
2822e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
2832e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      else if (nError != S_SUCCESS)
2842e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
2852e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         /* Error */
2862e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         goto error;
2872e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
2882e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2892e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      /* Duplicate name and value in as zero-terminated strings */
2902e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      /* Unclean: those strings are not going to be deallocated
2912e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         This is not a problem because this code is run in a tool
2922e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      */
2932e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      pNameZ = malloc(nNameLength+1);
2942e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      if (pNameZ == NULL)
2952e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
2962e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         nError = S_ERROR_OUT_OF_MEMORY;
2972e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         goto error;
2982e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
2992e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      memcpy(pNameZ, pName, nNameLength);
3002e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      pNameZ[nNameLength] = 0;
3012e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
3022e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      if (pValue == NULL)
3032e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
3042e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         /* It's a section */
3052e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         if (STRICMP(pNameZ, SYSTEM_SECTION_NAME) == 0)
3062e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         {
3072e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            free(pNameZ);
3082e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            pPublicPropertyList=&pConfFile->sSystemSectionPropertyList;
3092e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
3102e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         else
3112e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         {
3122e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            pServSection=(SERVICE_SECTION*)SMCPropListFindElement(
3132e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               &pConfFile->sDriverSectionList,
3142e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               pNameZ,
3152e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               false);
3162e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            if (pServSection==NULL)
3172e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            {
3182e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               pServSection=(SERVICE_SECTION*)SMCPropListFindElement(
3192e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley                     &pConfFile->sPreinstalledSectionList,
3202e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley                     pNameZ,
3212e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley                     false);
3222e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            }
3232e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            if (pServSection==NULL)
3242e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            {
3252e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               pServSection=(SERVICE_SECTION*)SMCPropListFindElement(
3262e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley                  &pConfFile->sSectionList,
3272e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley                  pNameZ,
3282e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley                  false);
3292e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               if (pServSection==NULL)
3302e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               {
3312e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley                  nError=S_ERROR_ITEM_NOT_FOUND;
3322e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley                  goto error;
3332e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               }
3342e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            }
3352e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            free(pNameZ);
3362e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
3372e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            pServSection->inSCF=true;
3382e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            if (pPreviousService!=NULL)
3392e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            {
3402e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               pPreviousService->pNextInSCF=pServSection;
3412e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            }
3422e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            else
3432e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            {
3442e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               pConfFile->pFirstSectionInSCF=pServSection;
3452e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            }
3462e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            pPreviousService=pServSection;
3472e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
3482e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            pPublicPropertyList=&pServSection->sPublicPropertyList;
3492e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            pPrivatePropertyList=&pServSection->sPrivatePropertyList;
3502e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
3512e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
3522e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      else
3532e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
3542e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         /* It's a property definition */
3552e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         pValueZ = malloc(nValueLength+1);
3562e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         if (pValueZ == NULL)
3572e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         {
3582e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            nError = S_ERROR_OUT_OF_MEMORY;
3592e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            goto error;
3602e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
3612e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         memcpy(pValueZ, pValue, nValueLength);
3622e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         pValueZ[nValueLength] = 0;
3632e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
3642e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         pProperty=(PROPERTY*)malloc(sizeof(PROPERTY));
3652e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         if (pProperty==NULL)
3662e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         {
3672e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            nError=S_ERROR_OUT_OF_MEMORY;
3682e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            goto error;
3692e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
3702e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         memset(pProperty, 0x00, sizeof(PROPERTY));
3712e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         pProperty->sNode.pName=pNameZ;
3722e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
3732e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         pProperty->pValue=pValueZ;
3742e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
3752e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         if (pPrivatePropertyList==NULL)
3762e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         {
3772e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            nError=SMCPropListSortedAdd(pPublicPropertyList,(NODE*)pProperty);
3782e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            if (nError!=S_SUCCESS)
3792e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            {
3802e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               goto error;
3812e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            }
3822e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
3832e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         else
3842e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         {
3852e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            if ((nValueLength > strlen(CONFIG_PROPERTY_NAME)) &&
3862e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley                (memcmp(pProperty->sNode.pName, CONFIG_PROPERTY_NAME, strlen(CONFIG_PROPERTY_NAME)) == 0))
3872e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            {
3882e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               nError=SMCPropListSortedAdd(pPrivatePropertyList,(NODE*)pProperty);
3892e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            }
3902e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            else
3912e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            {
3922e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               nError=SMCPropListSortedAdd(pPublicPropertyList,(NODE*)pProperty);
3932e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            }
3942e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            if (nError!=S_SUCCESS)
3952e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            {
3962e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               goto error;
3972e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            }
3982e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
3992e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
4002e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
4012e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
4022e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleyerror:
4032e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if (nError!=S_SUCCESS)
4042e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
4052e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      switch (nError)
4062e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
4072e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      case S_ERROR_BAD_FORMAT:
4082e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         /* Error message already output */
4092e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         break;
4102e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      case S_ERROR_WRONG_SIGNATURE:
4112e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         TRACE_ERROR("Configuration file: wrong service UUID: %s\n", pValueZ);
4122e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         break;
4132e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      case S_ERROR_OUT_OF_MEMORY:
4142e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley	  TRACE_ERROR("Out of memory\n");
4152e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         break;
4162e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      case S_ERROR_ITEM_NOT_FOUND:
4172e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley	  TRACE_ERROR("Configuration file: service \"%s\" not found\n", pNameZ);
4182e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         break;
4192e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
4202e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
4212e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   return nError;
4222e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
4232e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
4242e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
4252e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan BuckleyS_RESULT static_readFile(const char* pFilename, void** ppFile, uint32_t* pnFileLength)
4262e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
4272e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   S_RESULT nResult = S_SUCCESS;
4282e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   long nFilesize;
4292e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   FILE* pFile = NULL;
4302e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   void *pBuff = NULL;
4312e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
4322e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   // open file and get its size...
4332e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if ((pFile = fopen(pFilename, "rb")) == NULL)
4342e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
4352e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      TRACE_ERROR("static_readFile: fopen(%s) failed [%d]", pFilename, GET_LAST_ERR);
4362e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley	   nResult = S_ERROR_ITEM_NOT_FOUND;
4372e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley	   return nResult;
4382e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
4392e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if (fseek(pFile, 0, SEEK_END) != 0)
4402e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
4412e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      TRACE_ERROR("static_readFile: fseek(%s) failed [%d]", pFilename, GET_LAST_ERR);
4422e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley	   nResult = S_ERROR_UNDERLYING_OS;
4432e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley	   goto error;
4442e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
4452e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   nFilesize = ftell(pFile);
4462e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if (nFilesize < 0)
4472e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
4482e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      TRACE_ERROR("static_readFile: ftell(%s) failed [%d]", pFilename, GET_LAST_ERR);
4492e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley	   nResult = S_ERROR_UNDERLYING_OS;
4502e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley	   goto error;
4512e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
4522e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   rewind(pFile);
4532e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
4542e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   // allocate the buffer
4552e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   pBuff = malloc(nFilesize + 1);
4562e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if (pBuff == NULL)
4572e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
4582e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      TRACE_ERROR("static_readFile: out of memory");
4592e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      nResult = S_ERROR_OUT_OF_MEMORY;
4602e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      goto error;
4612e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
4622e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
4632e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   // read the file
4642e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if (fread(pBuff, sizeof(uint8_t), (size_t)nFilesize, pFile) != (size_t)nFilesize)
4652e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
4662e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      TRACE_ERROR("static_readFile: fread failed [%d]", GET_LAST_ERR);
4672e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      nResult = S_ERROR_UNDERLYING_OS;
4682e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      goto error;
4692e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
4702e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   ((char*)pBuff)[nFilesize] = 0;
4712e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
4722e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   *ppFile = pBuff;
4732e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   *pnFileLength = nFilesize;
4742e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   return S_SUCCESS;
4752e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
4762e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleyerror:
4772e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if (pBuff != NULL)
4782e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      free(pBuff);
4792e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   fclose(pFile);
4802e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
4812e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   *ppFile = NULL;
4822e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   *pnFileLength = 0;
4832e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   return nResult;
4842e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
4852e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
4862e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
4872e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
4882e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
4892e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
4902e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley/* ---------------------------------------------------------------------------------
4912e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   API functions.
4922e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   ---------------------------------------------------------------------------------*/
4932e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
4942e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleychar* SMCPropGetSystemProperty(CONF_FILE* pConfFile, char* pPropertyName)
4952e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
4962e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   PROPERTY* pProperty;
4972e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
4982e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   pProperty=(PROPERTY*)SMCPropListFindElement(
4992e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      &pConfFile->sSystemSectionPropertyList,
5002e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      pPropertyName,
5012e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      true);
5022e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if (pProperty!=NULL)
5032e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
5042e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      return pProperty->pValue;
5052e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
5062e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   return NULL;
5072e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
5082e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
5092e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleyuint32_t SMCPropGetSystemPropertyAsInt(CONF_FILE* pConfFile, char* pPropertyName)
5102e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
5112e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   uint32_t nValue;
5122e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   char* pValue=SMCPropGetSystemProperty(pConfFile,pPropertyName);
5132e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
5142e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if (libString2GetStringAsInt(pValue, &nValue) == S_SUCCESS)
5152e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
5162e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      return nValue;
5172e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
5182e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   return 0;
5192e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
5202e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
5212e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
5222e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan BuckleyS_RESULT SMCPropParseConfigFile(char* pConfigFilename,CONF_FILE* pConfFile)
5232e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
5242e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   S_RESULT nError=S_SUCCESS;
5252e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   void* pFile;
5262e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   uint32_t nFileLength;
5272e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   bool bReuseManifest;
5282e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
5292e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   assert(pConfFile!=NULL);
5302e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
5312e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   TRACE_INFO("Processing configuration file '%s'", pConfigFilename);
5322e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
5332e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if(pConfigFilename != NULL)
5342e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
5352e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      nError=static_readFile(pConfigFilename,&pFile,&nFileLength);
5362e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      if (nError!=S_SUCCESS)
5372e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
5382e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         goto error;
5392e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
5402e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      bReuseManifest = true;
5412e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
5422e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   else
5432e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
5442e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      assert(0);
5452e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
5462e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
5472e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   nError=SMCPropYacc(pFile,nFileLength,pConfFile);
5482e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
5492e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   if(pConfigFilename != NULL)
5502e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
5512e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      free(pFile);
5522e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
5532e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
5542e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleyerror:
5552e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   return nError;
5562e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
557