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