smc_properties_parser.c revision 2e9e9eca83c3dee85b7815573a8cf1e6d1780741
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