]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c
ShellPkg: Fix ARM build errors.
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / TimeDate.c
CommitLineData
a405b86d 1/** @file\r
2 Main file for time, timezone, and date shell level 2 and shell level 3 functions.\r
3\r
b54fd049 4 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
a405b86d 5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "UefiShellLevel2CommandsLib.h"\r
16\r
b54fd049 17/**\r
18 Determine if String is a valid representation for a time or date.\r
19\r
20 @param[in] String The pointer to the string to test.\r
21 @param[in] Char The delimeter character.\r
22 @param[in] Min The minimum value allowed.\r
23 @param[in] Max The maximum value allowed.\r
24 @param[in] MinusOk Whether negative numbers are permitted.\r
a405b86d 25\r
b54fd049 26 @retval TRUE String is a valid representation.\r
27 @retval FALSE String is invalid.\r
28**/\r
a405b86d 29BOOLEAN\r
30EFIAPI\r
31InternalIsTimeLikeString (\r
32 IN CONST CHAR16 *String,\r
33 IN CONST CHAR16 Char,\r
34 IN CONST UINTN Min,\r
35 IN CONST UINTN Max,\r
36 IN CONST BOOLEAN MinusOk\r
37 )\r
38{\r
39 UINTN Count;\r
40 Count = 0;\r
41\r
42 if (MinusOk) {\r
43 //\r
44 // A single minus is ok.\r
45 //\r
46 if (*String == L'-') {\r
47 String++;\r
48 }\r
49 }\r
50\r
51 //\r
52 // the first char must be numeric.\r
53 //\r
54 if (!ShellIsDecimalDigitCharacter(*String)) {\r
55 return (FALSE);\r
56 }\r
57 //\r
58 // loop through the characters and use the lib function\r
59 //\r
60 for ( ; String != NULL && *String != CHAR_NULL ; String++){\r
61 if (*String == Char) {\r
62 Count++;\r
63 if (Count > Max) {\r
64 return (FALSE);\r
65 }\r
66 continue;\r
67 }\r
68 if (!ShellIsDecimalDigitCharacter(*String)) {\r
69 return (FALSE);\r
70 }\r
71 }\r
72 if (Count < Min) {\r
73 return (FALSE);\r
74 }\r
75 return (TRUE);\r
76}\r
77\r
b54fd049 78/**\r
79 Verify that the DateString is valid and if so set that as the current \r
80 date.\r
81\r
82 @param[in] DateString The pointer to a string representation of the date.\r
83\r
84 @retval SHELL_INVALID_PARAMETER DateString was NULL.\r
85 @retval SHELL_INVALID_PARAMETER DateString was mis-formatted.\r
86 @retval SHELL_SUCCESS The operation was successful.\r
87**/\r
a405b86d 88SHELL_STATUS\r
89EFIAPI\r
90CheckAndSetDate (\r
91 IN CONST CHAR16 *DateString\r
92 )\r
93{\r
94 EFI_TIME TheTime;\r
95 EFI_STATUS Status;\r
b54fd049 96 CHAR16 *DateStringCopy;\r
97 CHAR16 *Walker;\r
98 CHAR16 *Walker1;\r
a405b86d 99\r
100 if (!InternalIsTimeLikeString(DateString, L'/', 2, 2, FALSE)) {\r
101 return (SHELL_INVALID_PARAMETER);\r
102 }\r
103\r
104 Status = gRT->GetTime(&TheTime, NULL);\r
35f26e73 105 if (EFI_ERROR(Status)) {\r
106 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"gRT->GetTime", Status);\r
107 return (SHELL_DEVICE_ERROR);\r
108 }\r
a405b86d 109\r
b54fd049 110 DateStringCopy = NULL;\r
111 DateStringCopy = StrnCatGrow(&DateStringCopy, NULL, DateString, 0);\r
112 if (DateStringCopy == NULL) {\r
113 return (SHELL_OUT_OF_RESOURCES);\r
114 }\r
115 Walker = DateStringCopy;\r
a405b86d 116\r
117 TheTime.Month = 0xFF;\r
118 TheTime.Day = 0xFF;\r
119 TheTime.Year = 0xFFFF;\r
120\r
b54fd049 121 Walker1 = StrStr(Walker, L"/");\r
122 if (Walker1 != NULL && *Walker1 == L'/') {\r
123 *Walker1 = CHAR_NULL;\r
124 }\r
125\r
126 TheTime.Month = (UINT8)ShellStrToUintn (Walker);\r
127 if (Walker1 != NULL) {\r
128 Walker = Walker1 + 1;\r
129 }\r
33c031ee 130 Walker1 = Walker!=NULL?StrStr(Walker, L"/"):NULL;\r
b54fd049 131 if (Walker1 != NULL && *Walker1 == L'/') {\r
132 *Walker1 = CHAR_NULL;\r
a405b86d 133 }\r
134 if (Walker != NULL && Walker[0] != CHAR_NULL) {\r
b54fd049 135 TheTime.Day = (UINT8)ShellStrToUintn (Walker);\r
136 if (Walker1 != NULL) {\r
137 Walker = Walker1 + 1;\r
138 }\r
33c031ee 139 Walker1 = Walker!=NULL?StrStr(Walker, L"/"):NULL;\r
b54fd049 140 if (Walker1 != NULL && *Walker1 == L'/') {\r
141 *Walker1 = CHAR_NULL;\r
a405b86d 142 }\r
143 if (Walker != NULL && Walker[0] != CHAR_NULL) {\r
b54fd049 144 TheTime.Year = (UINT16)ShellStrToUintn (Walker);\r
a405b86d 145 }\r
146 }\r
147\r
148 if (TheTime.Year < 100) {\r
149 if (TheTime.Year >= 98) {\r
150 TheTime.Year = (UINT16)(1900 + TheTime.Year);\r
151 } else {\r
152 TheTime.Year = (UINT16)(2000 + TheTime.Year);\r
153 }\r
154 }\r
155\r
156 Status = gRT->SetTime(&TheTime);\r
157\r
158 if (!EFI_ERROR(Status)){\r
159 return (SHELL_SUCCESS);\r
160 }\r
161 return (SHELL_INVALID_PARAMETER);\r
162}\r
163\r
164/**\r
165 Function for 'date' command.\r
166\r
167 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
168 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
169**/\r
170SHELL_STATUS\r
171EFIAPI\r
172ShellCommandRunDate (\r
173 IN EFI_HANDLE ImageHandle,\r
174 IN EFI_SYSTEM_TABLE *SystemTable\r
175 )\r
176{\r
177 EFI_STATUS Status;\r
178 LIST_ENTRY *Package;\r
179 EFI_TIME TheTime;\r
180 CHAR16 *ProblemParam;\r
181 SHELL_STATUS ShellStatus;\r
beab0fc5 182 CONST CHAR16 *Param1;\r
a405b86d 183\r
184 ShellStatus = SHELL_SUCCESS;\r
185 ProblemParam = NULL;\r
186\r
187 //\r
188 // initialize the shell lib (we must be in non-auto-init...)\r
189 //\r
190 Status = ShellInitialize();\r
191 ASSERT_EFI_ERROR(Status);\r
192\r
193 //\r
194 // parse the command line\r
195 //\r
196 Status = ShellCommandLineParse (SfoParamList, &Package, &ProblemParam, TRUE);\r
197 if (EFI_ERROR(Status)) {\r
198 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
199 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
200 FreePool(ProblemParam);\r
201 ShellStatus = SHELL_INVALID_PARAMETER;\r
202 } else {\r
203 ASSERT(FALSE);\r
204 }\r
205 } else {\r
206 //\r
207 // check for "-?"\r
208 //\r
209 if (ShellCommandLineGetFlag(Package, L"-?")) {\r
210 ASSERT(FALSE);\r
211 } else if (ShellCommandLineGetRawValue(Package, 2) != NULL) {\r
212 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
213 ShellStatus = SHELL_INVALID_PARAMETER;\r
214 } else {\r
215 //\r
216 // If there are 0 value parameters, then print the current date\r
217 // else If there are any value paramerers, then print error\r
218 //\r
219 if (ShellCommandLineGetRawValue(Package, 1) == NULL) {\r
220 //\r
221 // get the current date\r
222 //\r
223 Status = gRT->GetTime(&TheTime, NULL);\r
391206e7 224 if (EFI_ERROR(Status)) {\r
225 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"gRT->GetTime", Status);\r
226 return (SHELL_DEVICE_ERROR);\r
227 }\r
a405b86d 228\r
229 //\r
230 // ShellPrintEx the date in SFO or regular format\r
231 //\r
232 if (ShellCommandLineGetFlag(Package, L"-sfo")) {\r
233 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DATE_SFO_FORMAT), gShellLevel2HiiHandle, TheTime.Month, TheTime.Day, TheTime.Year);\r
234 } else {\r
235 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DATE_FORMAT), gShellLevel2HiiHandle, TheTime.Month, TheTime.Day, TheTime.Year);\r
236 }\r
237 } else {\r
238 if (PcdGet8(PcdShellSupportLevel) == 2) {\r
239 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
240 ShellStatus = SHELL_INVALID_PARAMETER;\r
241 } else {\r
242 //\r
243 // perform level 3 operation here.\r
244 //\r
beab0fc5 245 Param1 = ShellCommandLineGetRawValue(Package, 1);\r
246 if (Param1 == NULL) {\r
247 ShellStatus = SHELL_INVALID_PARAMETER;\r
248 } else {\r
249 ShellStatus = CheckAndSetDate(Param1);\r
250 }\r
a405b86d 251 if (ShellStatus != SHELL_SUCCESS) {\r
beab0fc5 252 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, Param1);\r
a405b86d 253 ShellStatus = SHELL_INVALID_PARAMETER;\r
254 }\r
255 }\r
256 }\r
257 }\r
258 }\r
259 //\r
260 // free the command line package\r
261 //\r
262 ShellCommandLineFreeVarList (Package);\r
263\r
264 //\r
265 // return the status\r
266 //\r
267 return (ShellStatus);\r
268}\r
269\r
270//\r
271// Note "-tz" is invalid for this (non-interactive) version of 'time'.\r
272//\r
273STATIC CONST SHELL_PARAM_ITEM TimeParamList2[] = {\r
274 {L"-d", TypeValue},\r
275 {NULL, TypeMax}\r
276 };\r
277\r
278STATIC CONST SHELL_PARAM_ITEM TimeParamList3[] = {\r
279 {L"-d", TypeValue},\r
280 {L"-tz", TypeValue},\r
281 {NULL, TypeMax}\r
282 };\r
283\r
b54fd049 284/**\r
285 Verify that the TimeString is valid and if so set that as the current \r
286 time.\r
287\r
288 @param[in] TimeString The pointer to a string representation of the time.\r
289 @param[in] Tz The value to set for TimeZone.\r
290 @param[in] Daylight The value to set for Daylight.\r
291\r
292 @retval SHELL_INVALID_PARAMETER TimeString was NULL.\r
293 @retval SHELL_INVALID_PARAMETER TimeString was mis-formatted.\r
294 @retval SHELL_SUCCESS The operation was successful.\r
295**/\r
a405b86d 296SHELL_STATUS\r
297EFIAPI\r
298CheckAndSetTime (\r
299 IN CONST CHAR16 *TimeString,\r
300 IN CONST INT16 Tz,\r
301 IN CONST UINT8 Daylight\r
302 )\r
303{\r
304 EFI_TIME TheTime;\r
305 EFI_STATUS Status;\r
b54fd049 306 CHAR16 *TimeStringCopy;\r
307 CHAR16 *Walker1;\r
308 CHAR16 *Walker2;\r
a405b86d 309\r
310 if (TimeString != NULL && !InternalIsTimeLikeString(TimeString, L':', 1, 2, FALSE)) {\r
311 return (SHELL_INVALID_PARAMETER);\r
312 }\r
f20076da 313 if (Daylight != 0xFF &&((Daylight & (EFI_TIME_IN_DAYLIGHT|EFI_TIME_ADJUST_DAYLIGHT)) != Daylight)) {\r
0841f3af 314 return (SHELL_INVALID_PARAMETER);\r
315 }\r
a405b86d 316\r
317 Status = gRT->GetTime(&TheTime, NULL);\r
391206e7 318 if (EFI_ERROR(Status)) {\r
319 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"gRT->GetTime", Status);\r
320 return (SHELL_DEVICE_ERROR);\r
321 }\r
a405b86d 322\r
323 if (TimeString != NULL) {\r
0841f3af 324 TimeStringCopy = NULL;\r
325 TimeStringCopy = StrnCatGrow(&TimeStringCopy, NULL, TimeString, 0);\r
b54fd049 326 Walker1 = TimeStringCopy;\r
a405b86d 327 TheTime.Hour = 0xFF;\r
328 TheTime.Minute = 0xFF;\r
329\r
33c031ee 330 Walker2 = Walker1!=NULL?StrStr(Walker1, L":"):NULL;\r
b54fd049 331 if (Walker2 != NULL && *Walker2 == L':') {\r
332 *Walker2 = CHAR_NULL;\r
a405b86d 333 }\r
b54fd049 334 TheTime.Hour = (UINT8)ShellStrToUintn (Walker1);\r
335 if (Walker2 != NULL) {\r
336 Walker1 = Walker2 + 1;\r
337 }\r
33c031ee 338 Walker2 = Walker1!=NULL?StrStr(Walker1, L":"):NULL;\r
b54fd049 339 if (Walker2 != NULL && *Walker2 == L':') {\r
340 *Walker2 = CHAR_NULL;\r
341 }\r
342 if (Walker1 != NULL && Walker1[0] != CHAR_NULL) {\r
343 TheTime.Minute = (UINT8)ShellStrToUintn (Walker1);\r
344 if (Walker2 != NULL) {\r
345 Walker1 = Walker2 + 1;\r
a405b86d 346 }\r
b54fd049 347 if (Walker1 != NULL && Walker1[0] != CHAR_NULL) {\r
348 TheTime.Second = (UINT8)ShellStrToUintn (Walker1);\r
a405b86d 349 }\r
350 }\r
0841f3af 351 SHELL_FREE_NON_NULL(TimeStringCopy);\r
a405b86d 352 }\r
353\r
b54fd049 354\r
355 if ((Tz >= -1440 && Tz <= 1440)||(Tz == 0x7FF)) {\r
a405b86d 356 TheTime.TimeZone = Tz;\r
357 }\r
0841f3af 358\r
f20076da 359 if (Daylight != 0xFF) {\r
360 TheTime.Daylight = Daylight;\r
361 }\r
0841f3af 362\r
a405b86d 363 Status = gRT->SetTime(&TheTime);\r
364\r
365 if (!EFI_ERROR(Status)){\r
366 return (SHELL_SUCCESS);\r
367 }\r
368\r
369 return (SHELL_INVALID_PARAMETER);\r
370}\r
371\r
372/**\r
373 Function for 'time' command.\r
374\r
375 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
376 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
377**/\r
378SHELL_STATUS\r
379EFIAPI\r
380ShellCommandRunTime (\r
381 IN EFI_HANDLE ImageHandle,\r
382 IN EFI_SYSTEM_TABLE *SystemTable\r
383 )\r
384{\r
385 EFI_STATUS Status;\r
386 LIST_ENTRY *Package;\r
a405b86d 387 EFI_TIME TheTime;\r
388 CHAR16 *ProblemParam;\r
389 SHELL_STATUS ShellStatus;\r
390 INT16 Tz;\r
391 UINT8 Daylight;\r
392 CONST CHAR16 *TempLocation;\r
393 UINTN TzMinutes;\r
394\r
a405b86d 395 //\r
396 // Initialize variables\r
397 //\r
e755a4ca 398 ShellStatus = SHELL_SUCCESS;\r
399 ProblemParam = NULL;\r
a405b86d 400\r
401 //\r
402 // initialize the shell lib (we must be in non-auto-init...)\r
403 //\r
404 Status = ShellInitialize();\r
405 ASSERT_EFI_ERROR(Status);\r
406\r
407 //\r
408 // parse the command line\r
409 //\r
410 if (PcdGet8(PcdShellSupportLevel) == 2) {\r
411 Status = ShellCommandLineParseEx (TimeParamList2, &Package, &ProblemParam, TRUE, TRUE);\r
412 } else {\r
413 ASSERT(PcdGet8(PcdShellSupportLevel) == 3);\r
414 Status = ShellCommandLineParseEx (TimeParamList3, &Package, &ProblemParam, TRUE, TRUE);\r
415 }\r
416 if (EFI_ERROR(Status)) {\r
417 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
418 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
419 FreePool(ProblemParam);\r
420 ShellStatus = SHELL_INVALID_PARAMETER;\r
421 } else {\r
422 ASSERT(FALSE);\r
423 }\r
424 } else {\r
425 //\r
426 // check for "-?"\r
427 //\r
428 Status = gRT->GetTime(&TheTime, NULL);\r
391206e7 429 if (EFI_ERROR(Status)) {\r
430 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"gRT->GetTime", Status);\r
431 return (SHELL_DEVICE_ERROR);\r
432 }\r
433\r
a405b86d 434 if (ShellCommandLineGetFlag(Package, L"-?")) {\r
435 ASSERT(FALSE);\r
436 } else if (ShellCommandLineGetRawValue(Package, 2) != NULL) {\r
437 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
438 ShellStatus = SHELL_INVALID_PARAMETER;\r
439 } else {\r
440 //\r
441 // If there are no parameters, then print the current time\r
442 //\r
443 if (ShellCommandLineGetRawValue(Package, 1) == NULL\r
444 && !ShellCommandLineGetFlag(Package, L"-d")\r
445 && !ShellCommandLineGetFlag(Package, L"-tz")) {\r
446 //\r
447 // ShellPrintEx the current time\r
448 //\r
2e8e9ed5 449 if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) {\r
a405b86d 450 TzMinutes = 0;\r
451 } else {\r
b54fd049 452 TzMinutes = (ABS(TheTime.TimeZone)) % 60;\r
a405b86d 453 }\r
454\r
455 ShellPrintHiiEx (\r
456 -1,\r
457 -1,\r
458 NULL,\r
459 STRING_TOKEN (STR_TIME_FORMAT),\r
460 gShellLevel2HiiHandle,\r
461 TheTime.Hour,\r
462 TheTime.Minute,\r
463 TheTime.Second,\r
2e8e9ed5 464 TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?L" ":(TheTime.TimeZone > 0?L"-":L"+"),\r
465 TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?0:(ABS(TheTime.TimeZone)) / 60,\r
a405b86d 466 TzMinutes\r
467 );\r
468 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_CRLF), gShellLevel2HiiHandle);\r
469 } else if (ShellCommandLineGetFlag(Package, L"-d") && ShellCommandLineGetValue(Package, L"-d") == NULL) {\r
2e8e9ed5 470 if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) {\r
a405b86d 471 TzMinutes = 0;\r
472 } else {\r
b54fd049 473 TzMinutes = (ABS(TheTime.TimeZone)) % 60;\r
a405b86d 474 }\r
475\r
476 ShellPrintHiiEx (\r
477 -1,\r
478 -1,\r
479 NULL,\r
480 STRING_TOKEN (STR_TIME_FORMAT),\r
481 gShellLevel2HiiHandle,\r
482 TheTime.Hour,\r
483 TheTime.Minute,\r
484 TheTime.Second,\r
2e8e9ed5 485 TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?L" ":(TheTime.TimeZone > 0?L"-":L"+"),\r
486 TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?0:(ABS(TheTime.TimeZone)) / 60,\r
a405b86d 487 TzMinutes\r
488 );\r
489 switch (TheTime.Daylight) {\r
0841f3af 490 case 0:\r
491 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_TIME_DST0), gShellLevel2HiiHandle);\r
492 break;\r
a405b86d 493 case EFI_TIME_ADJUST_DAYLIGHT:\r
b54fd049 494 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_TIME_DST1), gShellLevel2HiiHandle);\r
a405b86d 495 break;\r
496 case EFI_TIME_IN_DAYLIGHT:\r
b54fd049 497 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_TIME_DST2), gShellLevel2HiiHandle);\r
498 break;\r
499 case EFI_TIME_IN_DAYLIGHT|EFI_TIME_ADJUST_DAYLIGHT:\r
500 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_TIME_DST3), gShellLevel2HiiHandle);\r
a405b86d 501 break;\r
502 default:\r
503 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_ERROR), gShellLevel2HiiHandle, L"gRT->GetTime", L"TheTime.Daylight", TheTime.Daylight);\r
504 }\r
505 } else {\r
506 if (PcdGet8(PcdShellSupportLevel) == 2) {\r
507 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
508 ShellStatus = SHELL_INVALID_PARAMETER;\r
509 } else {\r
510 //\r
511 // perform level 3 operation here.\r
512 //\r
513 if ((TempLocation = ShellCommandLineGetValue(Package, L"-tz")) != NULL) {\r
514 if (TempLocation[0] == L'-') {\r
b54fd049 515 Tz = (INT16)(0 - ShellStrToUintn(++TempLocation));\r
a405b86d 516 } else {\r
b54fd049 517 Tz = (INT16)ShellStrToUintn(TempLocation);\r
a405b86d 518 }\r
2e8e9ed5 519 if (!(Tz >= -1440 && Tz <= 1440) && Tz != EFI_UNSPECIFIED_TIMEZONE) {\r
0841f3af 520 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"-tz");\r
a405b86d 521 ShellStatus = SHELL_INVALID_PARAMETER;\r
522 }\r
523 } else {\r
524 //\r
525 // intentionally out of bounds value will prevent changing it...\r
526 //\r
527 Tz = 1441;\r
528 }\r
529 TempLocation = ShellCommandLineGetValue(Package, L"-d");\r
530 if (TempLocation != NULL) {\r
b54fd049 531 Daylight = (UINT8)ShellStrToUintn(TempLocation);\r
a405b86d 532 if (Daylight != 0 && Daylight != 1 && Daylight != 3) {\r
0841f3af 533 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"-d");\r
a405b86d 534 ShellStatus = SHELL_INVALID_PARAMETER;\r
535 }\r
536 } else {\r
537 //\r
538 // invalid = will not use\r
539 //\r
540 Daylight = 0xFF;\r
541 }\r
542 if (ShellStatus == SHELL_SUCCESS) {\r
543 ShellStatus = CheckAndSetTime(ShellCommandLineGetRawValue(Package, 1), Tz, Daylight);\r
544 if (ShellStatus != SHELL_SUCCESS) {\r
545 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, 1));\r
546 ShellStatus = SHELL_INVALID_PARAMETER;\r
547 }\r
548 }\r
549 }\r
550 }\r
551 }\r
552 }\r
553\r
554 //\r
555 // free the command line package\r
556 //\r
557 ShellCommandLineFreeVarList (Package);\r
558\r
559 //\r
560 // return the status\r
561 //\r
562 return (ShellStatus);\r
563}\r
564\r
565typedef struct {\r
566 INT16 TimeZone;\r
567 EFI_STRING_ID StringId;\r
568} TIME_ZONE_ITEM;\r
569\r
570STATIC CONST SHELL_PARAM_ITEM TimeZoneParamList2[] = {\r
571 {L"-l", TypeFlag},\r
572 {L"-f", TypeFlag},\r
573 {NULL, TypeMax}\r
574 };\r
575STATIC CONST SHELL_PARAM_ITEM TimeZoneParamList3[] = {\r
576 {L"-l", TypeFlag},\r
577 {L"-f", TypeFlag},\r
578 {L"-s", TypeValue},\r
579 {NULL, TypeMax}\r
580 };\r
581\r
582 STATIC CONST TIME_ZONE_ITEM TimeZoneList[] = {\r
583 {720, STRING_TOKEN (STR_TIMEZONE_M12)},\r
584 {660, STRING_TOKEN (STR_TIMEZONE_M11)},\r
585 {600, STRING_TOKEN (STR_TIMEZONE_M10)},\r
586 {540, STRING_TOKEN (STR_TIMEZONE_M9)},\r
587 {480, STRING_TOKEN (STR_TIMEZONE_M8)},\r
588 {420, STRING_TOKEN (STR_TIMEZONE_M7)},\r
589 {360, STRING_TOKEN (STR_TIMEZONE_M6)},\r
590 {300, STRING_TOKEN (STR_TIMEZONE_M5)},\r
591 {270, STRING_TOKEN (STR_TIMEZONE_M430)},\r
592 {240, STRING_TOKEN (STR_TIMEZONE_M4)},\r
593 {210, STRING_TOKEN (STR_TIMEZONE_M330)},\r
594 {180, STRING_TOKEN (STR_TIMEZONE_M3)},\r
595 {120, STRING_TOKEN (STR_TIMEZONE_M2)},\r
596 {60 , STRING_TOKEN (STR_TIMEZONE_M1)},\r
597 {0 , STRING_TOKEN (STR_TIMEZONE_0)},\r
598 {-60 , STRING_TOKEN (STR_TIMEZONE_P1)},\r
599 {-120 , STRING_TOKEN (STR_TIMEZONE_P2)},\r
600 {-180 , STRING_TOKEN (STR_TIMEZONE_P3)},\r
601 {-210 , STRING_TOKEN (STR_TIMEZONE_P330)},\r
602 {-240 , STRING_TOKEN (STR_TIMEZONE_P4)},\r
603 {-270 , STRING_TOKEN (STR_TIMEZONE_P430)},\r
604 {-300 , STRING_TOKEN (STR_TIMEZONE_P5)},\r
605 {-330 , STRING_TOKEN (STR_TIMEZONE_P530)},\r
606 {-345 , STRING_TOKEN (STR_TIMEZONE_P545)},\r
607 {-360 , STRING_TOKEN (STR_TIMEZONE_P6)},\r
608 {-390 , STRING_TOKEN (STR_TIMEZONE_P630)},\r
609 {-420 , STRING_TOKEN (STR_TIMEZONE_P7)},\r
610 {-480 , STRING_TOKEN (STR_TIMEZONE_P8)},\r
611 {-540 , STRING_TOKEN (STR_TIMEZONE_P9)},\r
612 {-570 , STRING_TOKEN (STR_TIMEZONE_P930)},\r
613 {-600 , STRING_TOKEN (STR_TIMEZONE_P10)},\r
614 {-660 , STRING_TOKEN (STR_TIMEZONE_P11)},\r
615 {-720 , STRING_TOKEN (STR_TIMEZONE_P12)},\r
616 {-780 , STRING_TOKEN (STR_TIMEZONE_P13)},\r
617 {-840 , STRING_TOKEN (STR_TIMEZONE_P14)}\r
b54fd049 618};\r
619\r
620/**\r
621 Verify that the TimeZoneString is valid and if so set that as the current \r
622 timezone.\r
a405b86d 623\r
b54fd049 624 @param[in] TimeZoneString The pointer to a string representation of the timezone.\r
625\r
626 @retval SHELL_INVALID_PARAMETER TimeZoneString was NULL.\r
627 @retval SHELL_INVALID_PARAMETER TimeZoneString was mis-formatted.\r
628 @retval SHELL_SUCCESS The operation was successful.\r
629**/\r
a405b86d 630SHELL_STATUS\r
631EFIAPI\r
632CheckAndSetTimeZone (\r
633 IN CONST CHAR16 *TimeZoneString\r
634 )\r
635{\r
636 EFI_TIME TheTime;\r
637 EFI_STATUS Status;\r
b54fd049 638 CHAR16 *TimeZoneCopy;\r
639 CHAR16 *Walker;\r
640 CHAR16 *Walker2;\r
a405b86d 641 UINTN LoopVar;\r
642\r
643 if (TimeZoneString == NULL) {\r
644 return (SHELL_INVALID_PARAMETER);\r
645 }\r
646\r
647 if (TimeZoneString != NULL && !InternalIsTimeLikeString(TimeZoneString, L':', 1, 1, TRUE)) {\r
648 return (SHELL_INVALID_PARAMETER);\r
649 }\r
650\r
651 Status = gRT->GetTime(&TheTime, NULL);\r
532691c8 652 if (EFI_ERROR(Status)) {\r
391206e7 653 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"gRT->GetTime", Status);\r
532691c8 654 return (SHELL_DEVICE_ERROR);\r
655 }\r
a405b86d 656\r
b54fd049 657 TimeZoneCopy = NULL;\r
658 TimeZoneCopy = StrnCatGrow(&TimeZoneCopy, NULL, TimeZoneString, 0);\r
532691c8 659 if (TimeZoneCopy == NULL) {\r
660 return (SHELL_OUT_OF_RESOURCES);\r
661 }\r
b54fd049 662 Walker = TimeZoneCopy;\r
663 Walker2 = StrStr(Walker, L":");\r
664 if (Walker2 != NULL && *Walker2 == L':') {\r
665 *Walker2 = CHAR_NULL;\r
666 }\r
a405b86d 667 if (*Walker == L'-') {\r
b54fd049 668 TheTime.TimeZone = (INT16)((ShellStrToUintn (++Walker)) * 60);\r
a405b86d 669 } else {\r
28981267 670 TheTime.TimeZone = (INT16)((INT16)(ShellStrToUintn (Walker)) * -60);\r
a405b86d 671 }\r
b54fd049 672 if (Walker2 != NULL) {\r
673 Walker = Walker2 + 1;\r
a405b86d 674 }\r
675 if (Walker != NULL && Walker[0] != CHAR_NULL) {\r
676 if (TheTime.TimeZone < 0) {\r
b54fd049 677 TheTime.TimeZone = (INT16)(TheTime.TimeZone - (UINT8)ShellStrToUintn (Walker));\r
a405b86d 678 } else {\r
b54fd049 679 TheTime.TimeZone = (INT16)(TheTime.TimeZone + (UINT8)ShellStrToUintn (Walker));\r
a405b86d 680 }\r
681 }\r
682\r
683 Status = EFI_INVALID_PARAMETER;\r
684\r
685 for ( LoopVar = 0\r
686 ; LoopVar < sizeof(TimeZoneList) / sizeof(TimeZoneList[0])\r
687 ; LoopVar++\r
688 ){\r
689 if (TheTime.TimeZone == TimeZoneList[LoopVar].TimeZone) {\r
690 Status = gRT->SetTime(&TheTime);\r
691 break;\r
692 }\r
693 }\r
694\r
b54fd049 695 FreePool(TimeZoneCopy);\r
696\r
a405b86d 697 if (!EFI_ERROR(Status)){\r
698 return (SHELL_SUCCESS);\r
699 }\r
700 return (SHELL_INVALID_PARAMETER);\r
701}\r
702\r
703\r
704/**\r
705 Function for 'timezone' command.\r
706\r
707 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
708 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
709**/\r
710SHELL_STATUS\r
711EFIAPI\r
712ShellCommandRunTimeZone (\r
713 IN EFI_HANDLE ImageHandle,\r
714 IN EFI_SYSTEM_TABLE *SystemTable\r
715 )\r
716{\r
717 //\r
718 // non interactive\r
719 //\r
720 EFI_STATUS Status;\r
721 LIST_ENTRY *Package;\r
722 CHAR16 *ProblemParam;\r
723 SHELL_STATUS ShellStatus;\r
724 UINT8 LoopVar;\r
725 EFI_TIME TheTime;\r
726 BOOLEAN Found;\r
727 UINTN TzMinutes;\r
728\r
729 ShellStatus = SHELL_SUCCESS;\r
730 ProblemParam = NULL;\r
731\r
732 //\r
733 // initialize the shell lib (we must be in non-auto-init...)\r
734 //\r
735 Status = ShellInitialize();\r
736 ASSERT_EFI_ERROR(Status);\r
737\r
738 //\r
739 // parse the command line\r
740 //\r
741 if (PcdGet8(PcdShellSupportLevel) == 2) {\r
8f04ca1a 742 Status = ShellCommandLineParse (TimeZoneParamList2, &Package, &ProblemParam, TRUE);\r
a405b86d 743 } else {\r
744 ASSERT(PcdGet8(PcdShellSupportLevel) == 3);\r
8f04ca1a 745 Status = ShellCommandLineParseEx (TimeZoneParamList3, &Package, &ProblemParam, TRUE, TRUE);\r
a405b86d 746 }\r
747 if (EFI_ERROR(Status)) {\r
748 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
749 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
750 FreePool(ProblemParam);\r
751 ShellStatus = SHELL_INVALID_PARAMETER;\r
752 } else {\r
753 ASSERT(FALSE);\r
754 }\r
755 } else {\r
756 //\r
757 // check for "-?"\r
758 //\r
759 if (ShellCommandLineGetCount(Package) > 1) {\r
760 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
761 ShellStatus = SHELL_INVALID_PARAMETER;\r
762 } else if (ShellCommandLineGetFlag(Package, L"-?")) {\r
763 ASSERT(FALSE);\r
764 } else if (ShellCommandLineGetFlag(Package, L"-s")) {\r
765 if ((ShellCommandLineGetFlag(Package, L"-l")) || (ShellCommandLineGetFlag(Package, L"-f"))) {\r
766 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"-l or -f");\r
767 ShellStatus = SHELL_INVALID_PARAMETER;\r
768 } else {\r
769 ASSERT(PcdGet8(PcdShellSupportLevel) == 3);\r
770 if (ShellCommandLineGetValue(Package, L"-s") == NULL) {\r
771 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"-s");\r
772 ShellStatus = SHELL_INVALID_PARAMETER;\r
773 } else {\r
774 //\r
775 // Set the time zone\r
776 //\r
777 ShellStatus = CheckAndSetTimeZone(ShellCommandLineGetValue(Package, L"-s"));\r
778 if (ShellStatus != SHELL_SUCCESS) {\r
779 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ShellCommandLineGetValue(Package, L"-s"));\r
780 ShellStatus = SHELL_INVALID_PARAMETER;\r
781 }\r
782 }\r
783 }\r
784 } else if (ShellCommandLineGetFlag(Package, L"-l")) {\r
785 //\r
786 // Print a list of all time zones\r
787 //\r
788 for ( LoopVar = 0\r
789 ; LoopVar < sizeof(TimeZoneList) / sizeof(TimeZoneList[0])\r
790 ; LoopVar++\r
791 ){\r
792 ShellPrintHiiEx (-1, -1, NULL, TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle);\r
793 }\r
794 } else {\r
795 //\r
796 // Get Current Time Zone Info\r
797 //\r
798 Status = gRT->GetTime(&TheTime, NULL);\r
391206e7 799 if (EFI_ERROR(Status)) {\r
800 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"gRT->GetTime", Status);\r
801 return (SHELL_DEVICE_ERROR);\r
802 }\r
a405b86d 803\r
2e8e9ed5 804 if (TheTime.TimeZone != EFI_UNSPECIFIED_TIMEZONE) {\r
a405b86d 805 Found = FALSE;\r
806 for ( LoopVar = 0\r
807 ; LoopVar < sizeof(TimeZoneList) / sizeof(TimeZoneList[0])\r
808 ; LoopVar++\r
809 ){\r
810 if (TheTime.TimeZone == TimeZoneList[LoopVar].TimeZone) {\r
811 if (ShellCommandLineGetFlag(Package, L"-f")) {\r
812 //\r
813 // Print all info about current time zone\r
814 //\r
815 ShellPrintHiiEx (-1, -1, NULL, TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle);\r
816 } else {\r
817 //\r
818 // Print basic info only\r
819 //\r
2e8e9ed5 820 if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) {\r
a405b86d 821 TzMinutes = 0;\r
822 } else {\r
b54fd049 823 TzMinutes = (ABS(TheTime.TimeZone)) % 60;\r
a405b86d 824 }\r
825\r
826 ShellPrintHiiEx (\r
827 -1,\r
828 -1,\r
829 NULL,\r
830 STRING_TOKEN(STR_TIMEZONE_SIMPLE),\r
831 gShellLevel2HiiHandle,\r
2e8e9ed5 832 TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?0:(TheTime.TimeZone > 0?L"-":L"+"),\r
833 TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?0:(ABS(TheTime.TimeZone)) / 60,\r
a405b86d 834 TzMinutes);\r
835 }\r
836 Found = TRUE;\r
837 break;\r
838 }\r
839 }\r
840 if (!Found) {\r
841 //\r
842 // Print basic info only\r
843 //\r
2e8e9ed5 844 if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) {\r
a405b86d 845 TzMinutes = 0;\r
846 } else {\r
b54fd049 847 TzMinutes = (ABS(TheTime.TimeZone)) % 60;\r
a405b86d 848 }\r
849 ShellPrintHiiEx (\r
850 -1,\r
851 -1,\r
852 NULL,\r
853 STRING_TOKEN(STR_TIMEZONE_SIMPLE),\r
854 gShellLevel2HiiHandle,\r
2e8e9ed5 855 TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?0:(TheTime.TimeZone > 0?L"-":L"+"),\r
856 TheTime.TimeZone==EFI_UNSPECIFIED_TIMEZONE?0:(ABS(TheTime.TimeZone)) / 60,\r
a405b86d 857 TzMinutes);\r
858 if (ShellCommandLineGetFlag(Package, L"-f")) {\r
859 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN(STR_TIMEZONE_NI), gShellLevel2HiiHandle);\r
860 }\r
861 }\r
862 } else {\r
863 //\r
2e8e9ed5 864 // TimeZone was EFI_UNSPECIFIED_TIMEZONE (unknown) from GetTime()\r
a405b86d 865 //\r
866 }\r
867 }\r
868 }\r
869\r
870 //\r
871 // free the command line package\r
872 //\r
873 ShellCommandLineFreeVarList (Package);\r
874\r
875 return (ShellStatus);\r
876}\r