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 <stdio.h>
332e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include <string.h>
342e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
352e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include "s_type.h"
362e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include "s_version.h"
372e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#include "smc_pa_ctrl_os.h"
382e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
392e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
402e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley/*---------------------------------------------------------------------------
412e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * Utility Functions
422e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *---------------------------------------------------------------------------*/
432e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
442e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleystatic void printUsage(bool bSuccess)
452e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
462e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#ifdef BOOT_TIME_PA
472e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf("usage : smc_boot_pa_ctrl <options> [command]\n");
482e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf("   Options:\n");
492e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf("      -h, --help: Print this help\n");
502e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf("   Commands:\n");
512e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf("      -c <conf> : Configuration file path\n");
522e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf("      start <pa_file_path>: load and start the SMC PA\n");
532e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf("\n");
542e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#else
552e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf("usage : smc_pa_ctrl <options> [command]\n");
562e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf("   Options:\n");
572e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf("      -h, --help: Print this help\n");
582e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf("   Commands:\n");
592e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf("      -c <conf> : Configuration file path\n");
602e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf("      start <pa_file_path>: load and start the SMC PA\n");
612e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf("      stop: stop the SMC PA\n");
622e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf("\n");
632e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#endif
642e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
652e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   exit(bSuccess ? 0 : 1);
662e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
672e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
682e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
692e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
702e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley/*---------------------------------------------------------------------------
712e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley * Application Entry-Point
722e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley *---------------------------------------------------------------------------*/
732e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
742e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckleyint main(int argc, char *argv[])
752e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley{
762e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   char* pPAFileName = NULL;
772e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   char* pConfFileName = NULL;
782e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   int   nCommand = SCX_SMC_PA_CTRL_NONE;
792e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   int   nStatus = 0;
802e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
812e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#ifdef BOOT_TIME_PA
822e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf("SMC BOOT PA Control\n");
832e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf(S_VERSION_STRING "\n");
842e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#else
852e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf("SMC PA Control\n");
862e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   printf(S_VERSION_STRING "\n");
872e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#endif
882e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
892e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   /* Skip program name */
902e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   argv ++;
912e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   argc --;
922e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
932e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   while (argc != 0)
942e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
952e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      if (argv[0][0] == '-')
962e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
972e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         /*
982e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley          * This is an option
992e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley          */
1002e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1012e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         if ((strcmp(argv[0], "--help") == 0) || (strcmp(argv[0], "-h") == 0))
1022e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         {
1032e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            printUsage(true);
1042e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
1052e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         else if (strcmp(argv[0], "-c") == 0)
1062e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         {
1072e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            /* Next argument */
1082e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            argc --;
1092e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            argv ++;
1102e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1112e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            if (argc <= 0)
1122e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            {
1132e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               printf("Missing argument for the option '-c'\n\n");
1142e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               printUsage(false);
1152e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            }
1162e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1172e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            pConfFileName = malloc(strlen(argv[0]) + 1);
1182e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            if (pConfFileName == NULL)
1192e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            {
1202e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               printf("Out of memory\n");
1212e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               exit(2);
1222e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            }
1232e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1242e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            strcpy(pConfFileName, argv[0]);
1252e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
1262e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         else
1272e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         {
1282e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            printf("Invalid option [%s]\n\n", argv[0]);
1292e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            printUsage(false);
1302e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
1312e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
1322e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      else
1332e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      {
1342e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         /*
1352e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley          * This is a command
1362e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley          */
1372e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         if (strcmp(argv[0], "start") == 0)
1382e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         {
1392e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            /* Next argument */
1402e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            argc --;
1412e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            argv ++;
1422e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1432e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            if (argc <= 0)
1442e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            {
1452e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               printf("Missing argument for the command 'start'\n\n");
1462e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               printUsage(false);
1472e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            }
1482e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1492e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            pPAFileName = malloc(strlen(argv[0]) + 1);
1502e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            if (pPAFileName == NULL)
1512e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            {
1522e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               printf("Out of memory\n");
1532e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley               exit(2);
1542e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            }
1552e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1562e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            strcpy(pPAFileName, argv[0]);
1572e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1582e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            nCommand = SCX_SMC_PA_CTRL_START;
1592e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
1602e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#ifndef BOOT_TIME_PA
1612e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         else if (strcmp(argv[0], "stop") == 0)
1622e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         {
1632e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            nCommand = SCX_SMC_PA_CTRL_STOP;
1642e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
1652e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#endif
1662e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         else
1672e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         {
1682e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            printf("Invalid command [%s]\n\n", argv[0]);
1692e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            printUsage(false);
1702e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
1712e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      }
1722e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1732e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      argc --;
1742e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      argv ++;
1752e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
1762e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1772e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   switch (nCommand)
1782e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   {
1792e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      case SCX_SMC_PA_CTRL_START:
1802e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         /*
1812e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley          * Load and execute the SMC PA
1822e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley          */
1832e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1842e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         if (pConfFileName == NULL)
1852e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         {
1862e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            printf("Configuration file path is missing !\n");
1872e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            printUsage(false);
1882e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
1892e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1902e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         nStatus = smcPAStart(pPAFileName, pConfFileName);
1912e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         break;
1922e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1932e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#ifndef BOOT_TIME_PA
1942e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      case SCX_SMC_PA_CTRL_STOP:
1952e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         /*
1962e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley          * Stop the SMC PA
1972e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley          */
1982e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
1992e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         if (pConfFileName != NULL)
2002e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         {
2012e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            printf("Configuration file cannot be used with the 'stop' command\n\n");
2022e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley            printUsage(false);
2032e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         }
2042e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2052e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         nStatus = smcPAStop();
2062e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         break;
2072e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley#endif
2082e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2092e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley      default:
2102e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         printf("No command specified\n\n");
2112e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         printUsage(false);
2122e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley         break;
2132e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   }
2142e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2152e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   free(pPAFileName);
2162e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   free(pConfFileName);
2172e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley
2182e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley   return nStatus;
2192e9e9eca83c3dee85b7815573a8cf1e6d1780741Bryan Buckley}
220