1 /**
2  * Copyright(c) 2011 Trusted Logic.   All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  *  * Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  *  * Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in
12  *    the documentation and/or other materials provided with the
13  *    distribution.
14  *  * Neither the name Trusted Logic nor the names of its
15  *    contributors may be used to endorse or promote products derived
16  *    from this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 #include <stdlib.h>
32 #include <stdio.h>
33 #include <string.h>
34 
35 #include "s_type.h"
36 #include "s_version.h"
37 #include "smc_pa_ctrl_os.h"
38 
39 
40 /*---------------------------------------------------------------------------
41  * Utility Functions
42  *---------------------------------------------------------------------------*/
43 
printUsage(bool bSuccess)44 static void printUsage(bool bSuccess)
45 {
46 #ifdef BOOT_TIME_PA
47    printf("usage : smc_boot_pa_ctrl <options> [command]\n");
48    printf("   Options:\n");
49    printf("      -h, --help: Print this help\n");
50    printf("   Commands:\n");
51    printf("      -c <conf> : Configuration file path\n");
52    printf("      start <pa_file_path>: load and start the SMC PA\n");
53    printf("\n");
54 #else
55    printf("usage : smc_pa_ctrl <options> [command]\n");
56    printf("   Options:\n");
57    printf("      -h, --help: Print this help\n");
58    printf("   Commands:\n");
59    printf("      -c <conf> : Configuration file path\n");
60    printf("      start <pa_file_path>: load and start the SMC PA\n");
61    printf("      stop: stop the SMC PA\n");
62    printf("\n");
63 #endif
64 
65    exit(bSuccess ? 0 : 1);
66 }
67 
68 
69 
70 /*---------------------------------------------------------------------------
71  * Application Entry-Point
72  *---------------------------------------------------------------------------*/
73 
main(int argc,char * argv[])74 int main(int argc, char *argv[])
75 {
76    char* pPAFileName = NULL;
77    char* pConfFileName = NULL;
78    int   nCommand = SCX_SMC_PA_CTRL_NONE;
79    int   nStatus = 0;
80 
81 #ifdef BOOT_TIME_PA
82    printf("SMC BOOT PA Control\n");
83    printf(S_VERSION_STRING "\n");
84 #else
85    printf("SMC PA Control\n");
86    printf(S_VERSION_STRING "\n");
87 #endif
88 
89    /* Skip program name */
90    argv ++;
91    argc --;
92 
93    while (argc != 0)
94    {
95       if (argv[0][0] == '-')
96       {
97          /*
98           * This is an option
99           */
100 
101          if ((strcmp(argv[0], "--help") == 0) || (strcmp(argv[0], "-h") == 0))
102          {
103             printUsage(true);
104          }
105          else if (strcmp(argv[0], "-c") == 0)
106          {
107             /* Next argument */
108             argc --;
109             argv ++;
110 
111             if (argc <= 0)
112             {
113                printf("Missing argument for the option '-c'\n\n");
114                printUsage(false);
115             }
116 
117             pConfFileName = malloc(strlen(argv[0]) + 1);
118             if (pConfFileName == NULL)
119             {
120                printf("Out of memory\n");
121                exit(2);
122             }
123 
124             strcpy(pConfFileName, argv[0]);
125          }
126          else
127          {
128             printf("Invalid option [%s]\n\n", argv[0]);
129             printUsage(false);
130          }
131       }
132       else
133       {
134          /*
135           * This is a command
136           */
137          if (strcmp(argv[0], "start") == 0)
138          {
139             /* Next argument */
140             argc --;
141             argv ++;
142 
143             if (argc <= 0)
144             {
145                printf("Missing argument for the command 'start'\n\n");
146                printUsage(false);
147             }
148 
149             pPAFileName = malloc(strlen(argv[0]) + 1);
150             if (pPAFileName == NULL)
151             {
152                printf("Out of memory\n");
153                exit(2);
154             }
155 
156             strcpy(pPAFileName, argv[0]);
157 
158             nCommand = SCX_SMC_PA_CTRL_START;
159          }
160 #ifndef BOOT_TIME_PA
161          else if (strcmp(argv[0], "stop") == 0)
162          {
163             nCommand = SCX_SMC_PA_CTRL_STOP;
164          }
165 #endif
166          else
167          {
168             printf("Invalid command [%s]\n\n", argv[0]);
169             printUsage(false);
170          }
171       }
172 
173       argc --;
174       argv ++;
175    }
176 
177    switch (nCommand)
178    {
179       case SCX_SMC_PA_CTRL_START:
180          /*
181           * Load and execute the SMC PA
182           */
183 
184          if (pConfFileName == NULL)
185          {
186             printf("Configuration file path is missing !\n");
187             printUsage(false);
188          }
189 
190          nStatus = smcPAStart(pPAFileName, pConfFileName);
191          break;
192 
193 #ifndef BOOT_TIME_PA
194       case SCX_SMC_PA_CTRL_STOP:
195          /*
196           * Stop the SMC PA
197           */
198 
199          if (pConfFileName != NULL)
200          {
201             printf("Configuration file cannot be used with the 'stop' command\n\n");
202             printUsage(false);
203          }
204 
205          nStatus = smcPAStop();
206          break;
207 #endif
208 
209       default:
210          printf("No command specified\n\n");
211          printUsage(false);
212          break;
213    }
214 
215    free(pPAFileName);
216    free(pConfFileName);
217 
218    return nStatus;
219 }
220