diff options
Diffstat (limited to 'security/smc_pa_ctrl/smc_pa_ctrl.c')
-rw-r--r-- | security/smc_pa_ctrl/smc_pa_ctrl.c | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/security/smc_pa_ctrl/smc_pa_ctrl.c b/security/smc_pa_ctrl/smc_pa_ctrl.c new file mode 100644 index 0000000..93db1a5 --- /dev/null +++ b/security/smc_pa_ctrl/smc_pa_ctrl.c @@ -0,0 +1,219 @@ +/** + * Copyright(c) 2011 Trusted Logic. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name Trusted Logic nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include "s_type.h" +#include "s_version.h" +#include "smc_pa_ctrl_os.h" + + +/*--------------------------------------------------------------------------- + * Utility Functions + *---------------------------------------------------------------------------*/ + +static void printUsage(bool bSuccess) +{ +#ifdef BOOT_TIME_PA + printf("usage : smc_boot_pa_ctrl <options> [command]\n"); + printf(" Options:\n"); + printf(" -h, --help: Print this help\n"); + printf(" Commands:\n"); + printf(" -c <conf> : Configuration file path\n"); + printf(" start <pa_file_path>: load and start the SMC PA\n"); + printf("\n"); +#else + printf("usage : smc_pa_ctrl <options> [command]\n"); + printf(" Options:\n"); + printf(" -h, --help: Print this help\n"); + printf(" Commands:\n"); + printf(" -c <conf> : Configuration file path\n"); + printf(" start <pa_file_path>: load and start the SMC PA\n"); + printf(" stop: stop the SMC PA\n"); + printf("\n"); +#endif + + exit(bSuccess ? 0 : 1); +} + + + +/*--------------------------------------------------------------------------- + * Application Entry-Point + *---------------------------------------------------------------------------*/ + +int main(int argc, char *argv[]) +{ + char* pPAFileName = NULL; + char* pConfFileName = NULL; + int nCommand = SCX_SMC_PA_CTRL_NONE; + int nStatus = 0; + +#ifdef BOOT_TIME_PA + printf("SMC BOOT PA Control\n"); + printf(S_VERSION_STRING "\n"); +#else + printf("SMC PA Control\n"); + printf(S_VERSION_STRING "\n"); +#endif + + /* Skip program name */ + argv ++; + argc --; + + while (argc != 0) + { + if (argv[0][0] == '-') + { + /* + * This is an option + */ + + if ((strcmp(argv[0], "--help") == 0) || (strcmp(argv[0], "-h") == 0)) + { + printUsage(true); + } + else if (strcmp(argv[0], "-c") == 0) + { + /* Next argument */ + argc --; + argv ++; + + if (argc <= 0) + { + printf("Missing argument for the option '-c'\n\n"); + printUsage(false); + } + + pConfFileName = malloc(strlen(argv[0]) + 1); + if (pConfFileName == NULL) + { + printf("Out of memory\n"); + exit(2); + } + + strcpy(pConfFileName, argv[0]); + } + else + { + printf("Invalid option [%s]\n\n", argv[0]); + printUsage(false); + } + } + else + { + /* + * This is a command + */ + if (strcmp(argv[0], "start") == 0) + { + /* Next argument */ + argc --; + argv ++; + + if (argc <= 0) + { + printf("Missing argument for the command 'start'\n\n"); + printUsage(false); + } + + pPAFileName = malloc(strlen(argv[0]) + 1); + if (pPAFileName == NULL) + { + printf("Out of memory\n"); + exit(2); + } + + strcpy(pPAFileName, argv[0]); + + nCommand = SCX_SMC_PA_CTRL_START; + } +#ifndef BOOT_TIME_PA + else if (strcmp(argv[0], "stop") == 0) + { + nCommand = SCX_SMC_PA_CTRL_STOP; + } +#endif + else + { + printf("Invalid command [%s]\n\n", argv[0]); + printUsage(false); + } + } + + argc --; + argv ++; + } + + switch (nCommand) + { + case SCX_SMC_PA_CTRL_START: + /* + * Load and execute the SMC PA + */ + + if (pConfFileName == NULL) + { + printf("Configuration file path is missing !\n"); + printUsage(false); + } + + nStatus = smcPAStart(pPAFileName, pConfFileName); + break; + +#ifndef BOOT_TIME_PA + case SCX_SMC_PA_CTRL_STOP: + /* + * Stop the SMC PA + */ + + if (pConfFileName != NULL) + { + printf("Configuration file cannot be used with the 'stop' command\n\n"); + printUsage(false); + } + + nStatus = smcPAStop(); + break; +#endif + + default: + printf("No command specified\n\n"); + printUsage(false); + break; + } + + free(pPAFileName); + free(pConfFileName); + + return nStatus; +} |