]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellLevel2CommandsLib/TimeDate.c
ShellPkg: Clean up source files
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / TimeDate.c
index 115013a1e30027d73b07a23598aa05b3466c768e..0e948e3b0a966d6eab0ac0e9314ce676e3fc7334 100644 (file)
@@ -1,7 +1,8 @@
 /** @file\r
   Main file for time, timezone, and date shell level 2 and shell level 3 functions.\r
 \r
-  Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  (C) Copyright 2012-2015 Hewlett-Packard Development Company, L.P.<BR>\r
+  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -27,7 +28,6 @@
   @retval FALSE   String is invalid.\r
 **/\r
 BOOLEAN\r
-EFIAPI\r
 InternalIsTimeLikeString (\r
   IN CONST CHAR16   *String,\r
   IN CONST CHAR16   Char,\r
@@ -76,7 +76,7 @@ InternalIsTimeLikeString (
 }\r
 \r
 /**\r
-  Verify that the DateString is valid and if so set that as the current \r
+  Verify that the DateString is valid and if so set that as the current\r
   date.\r
 \r
   @param[in] DateString     The pointer to a string representation of the date.\r
@@ -86,7 +86,6 @@ InternalIsTimeLikeString (
   @retval SHELL_SUCCESS             The operation was successful.\r
 **/\r
 SHELL_STATUS\r
-EFIAPI\r
 CheckAndSetDate (\r
   IN CONST CHAR16 *DateString\r
   )\r
@@ -102,7 +101,10 @@ CheckAndSetDate (
   }\r
 \r
   Status = gRT->GetTime(&TheTime, NULL);\r
-  ASSERT_EFI_ERROR(Status);\r
+  if (EFI_ERROR(Status)) {\r
+    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"date", L"gRT->GetTime", Status);\r
+    return (SHELL_DEVICE_ERROR);\r
+  }\r
 \r
   DateStringCopy = NULL;\r
   DateStringCopy = StrnCatGrow(&DateStringCopy, NULL, DateString, 0);\r
@@ -124,7 +126,7 @@ CheckAndSetDate (
   if (Walker1 != NULL) {\r
     Walker = Walker1 + 1;\r
   }\r
-  Walker1 = StrStr(Walker, L"/");\r
+  Walker1 = Walker!=NULL?StrStr(Walker, L"/"):NULL;\r
   if (Walker1 != NULL && *Walker1 == L'/') {\r
     *Walker1 = CHAR_NULL;\r
   }\r
@@ -133,7 +135,7 @@ CheckAndSetDate (
     if (Walker1 != NULL) {\r
       Walker = Walker1 + 1;\r
     }\r
-    Walker1 = StrStr(Walker, L"/");\r
+    Walker1 = Walker!=NULL?StrStr(Walker, L"/"):NULL;\r
     if (Walker1 != NULL && *Walker1 == L'/') {\r
       *Walker1 = CHAR_NULL;\r
     }\r
@@ -176,6 +178,7 @@ ShellCommandRunDate (
   EFI_TIME      TheTime;\r
   CHAR16        *ProblemParam;\r
   SHELL_STATUS  ShellStatus;\r
+  CONST CHAR16  *Param1;\r
 \r
   ShellStatus  = SHELL_SUCCESS;\r
   ProblemParam = NULL;\r
@@ -192,7 +195,7 @@ ShellCommandRunDate (
   Status = ShellCommandLineParse (SfoParamList, &Package, &ProblemParam, TRUE);\r
   if (EFI_ERROR(Status)) {\r
     if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"date", ProblemParam);\r
       FreePool(ProblemParam);\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
@@ -205,7 +208,7 @@ ShellCommandRunDate (
     if (ShellCommandLineGetFlag(Package, L"-?")) {\r
       ASSERT(FALSE);\r
     } else if (ShellCommandLineGetRawValue(Package, 2) != NULL) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"date");\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
       //\r
@@ -217,27 +220,41 @@ ShellCommandRunDate (
         // get the current date\r
         //\r
         Status = gRT->GetTime(&TheTime, NULL);\r
-        ASSERT_EFI_ERROR(Status);\r
+        if (EFI_ERROR(Status)) {\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"date", L"gRT->GetTime", Status);\r
+          return (SHELL_DEVICE_ERROR);\r
+        }\r
 \r
         //\r
         // ShellPrintEx the date in SFO or regular format\r
         //\r
         if (ShellCommandLineGetFlag(Package, L"-sfo")) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DATE_SFO_FORMAT), gShellLevel2HiiHandle, TheTime.Month, TheTime.Day, TheTime.Year);\r
+          //\r
+          // Match UEFI Shell spec:\r
+          // ShellCommand,"date"\r
+          // Date,"DD","MM","YYYY"\r
+          //\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_SFO_HEADER), gShellLevel2HiiHandle, L"date");\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DATE_SFO_FORMAT), gShellLevel2HiiHandle, TheTime.Day, TheTime.Month, TheTime.Year);\r
         } else {\r
           ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DATE_FORMAT), gShellLevel2HiiHandle, TheTime.Month, TheTime.Day, TheTime.Year);\r
         }\r
       } else {\r
         if (PcdGet8(PcdShellSupportLevel) == 2) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"date");\r
           ShellStatus = SHELL_INVALID_PARAMETER;\r
         } else {\r
           //\r
           // perform level 3 operation here.\r
           //\r
-          ShellStatus = CheckAndSetDate(ShellCommandLineGetRawValue(Package, 1));\r
+          Param1 = ShellCommandLineGetRawValue(Package, 1);\r
+          if (Param1 == NULL) {\r
+            ShellStatus = SHELL_INVALID_PARAMETER;\r
+          } else {\r
+            ShellStatus = CheckAndSetDate(Param1);\r
+          }\r
           if (ShellStatus != SHELL_SUCCESS) {\r
-            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, 1));\r
+            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"date", Param1);\r
             ShellStatus = SHELL_INVALID_PARAMETER;\r
           }\r
         }\r
@@ -270,7 +287,7 @@ STATIC CONST SHELL_PARAM_ITEM TimeParamList3[] = {
   };\r
 \r
 /**\r
-  Verify that the TimeString is valid and if so set that as the current \r
+  Verify that the TimeString is valid and if so set that as the current\r
   time.\r
 \r
   @param[in] TimeString     The pointer to a string representation of the time.\r
@@ -282,7 +299,6 @@ STATIC CONST SHELL_PARAM_ITEM TimeParamList3[] = {
   @retval SHELL_SUCCESS             The operation was successful.\r
 **/\r
 SHELL_STATUS\r
-EFIAPI\r
 CheckAndSetTime (\r
   IN CONST CHAR16 *TimeString,\r
   IN CONST INT16  Tz,\r
@@ -298,12 +314,15 @@ CheckAndSetTime (
   if (TimeString != NULL && !InternalIsTimeLikeString(TimeString, L':', 1, 2, FALSE)) {\r
     return (SHELL_INVALID_PARAMETER);\r
   }\r
-  if (((Daylight & (EFI_TIME_IN_DAYLIGHT|EFI_TIME_ADJUST_DAYLIGHT)) != Daylight)) {\r
+  if (Daylight != 0xFF &&((Daylight & (EFI_TIME_IN_DAYLIGHT|EFI_TIME_ADJUST_DAYLIGHT)) != Daylight)) {\r
     return (SHELL_INVALID_PARAMETER);\r
   }\r
 \r
   Status = gRT->GetTime(&TheTime, NULL);\r
-  ASSERT_EFI_ERROR(Status);\r
+  if (EFI_ERROR(Status)) {\r
+    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"time", L"gRT->GetTime", Status);\r
+    return (SHELL_DEVICE_ERROR);\r
+  }\r
 \r
   if (TimeString != NULL) {\r
     TimeStringCopy = NULL;\r
@@ -312,7 +331,7 @@ CheckAndSetTime (
     TheTime.Hour    = 0xFF;\r
     TheTime.Minute  = 0xFF;\r
 \r
-    Walker2          = StrStr(Walker1, L":");\r
+    Walker2          = Walker1!=NULL?StrStr(Walker1, L":"):NULL;\r
     if (Walker2 != NULL && *Walker2 == L':') {\r
       *Walker2 = CHAR_NULL;\r
     }\r
@@ -320,28 +339,44 @@ CheckAndSetTime (
     if (Walker2 != NULL) {\r
       Walker1 = Walker2 + 1;\r
     }\r
-    Walker2          = StrStr(Walker1, L":");\r
+    Walker2          = Walker1!=NULL?StrStr(Walker1, L":"):NULL;\r
     if (Walker2 != NULL && *Walker2 == L':') {\r
       *Walker2 = CHAR_NULL;\r
+      TheTime.Second = (UINT8)0;\r
+    }\r
+    else if (Walker2 == NULL) {\r
+      TheTime.Second = (UINT8)0;\r
     }\r
     if (Walker1 != NULL && Walker1[0] != CHAR_NULL) {\r
       TheTime.Minute = (UINT8)ShellStrToUintn (Walker1);\r
       if (Walker2 != NULL) {\r
         Walker1 = Walker2 + 1;\r
-      }\r
-      if (Walker1 != NULL && Walker1[0] != CHAR_NULL) {\r
-        TheTime.Second = (UINT8)ShellStrToUintn (Walker1);\r
+        if (Walker1 != NULL && Walker1[0] != CHAR_NULL) {\r
+          TheTime.Second = (UINT8)ShellStrToUintn (Walker1);\r
+        }\r
       }\r
     }\r
     SHELL_FREE_NON_NULL(TimeStringCopy);\r
   }\r
 \r
 \r
-  if ((Tz >= -1440 && Tz <= 1440)||(Tz == 0x7FF)) {\r
+  if (Tz >= -1440 && Tz <= 1440) {\r
+    //\r
+    // EFI_TIME TimeZone is stored to meet the following calculation (see UEFI Spec):\r
+    // Localtime = UTC - TimeZone\r
+    // This means the sign must be changed for the user provided Tz.\r
+    // EX: User wants to set TimeZone to Pacific Standard Time, so runs\r
+    // time -tz -480 # set to UTC-08:00\r
+    // To meet the calculation, the sign must be changed.\r
+    //\r
+    TheTime.TimeZone = -Tz;\r
+  } else if (Tz == EFI_UNSPECIFIED_TIMEZONE) {\r
     TheTime.TimeZone = Tz;\r
   }\r
 \r
-  TheTime.Daylight = Daylight;\r
+  if (Daylight != 0xFF) {\r
+    TheTime.Daylight = Daylight;\r
+  }\r
 \r
   Status = gRT->SetTime(&TheTime);\r
 \r
@@ -367,7 +402,6 @@ ShellCommandRunTime (
 {\r
   EFI_STATUS    Status;\r
   LIST_ENTRY    *Package;\r
-  CHAR16        *Message;\r
   EFI_TIME      TheTime;\r
   CHAR16        *ProblemParam;\r
   SHELL_STATUS  ShellStatus;\r
@@ -376,13 +410,11 @@ ShellCommandRunTime (
   CONST CHAR16  *TempLocation;\r
   UINTN         TzMinutes;\r
 \r
-  ShellStatus  = SHELL_SUCCESS;\r
-  ProblemParam = NULL;\r
-\r
   //\r
   // Initialize variables\r
   //\r
-  Message = NULL;\r
+  ShellStatus  = SHELL_SUCCESS;\r
+  ProblemParam = NULL;\r
 \r
   //\r
   // initialize the shell lib (we must be in non-auto-init...)\r
@@ -401,7 +433,7 @@ ShellCommandRunTime (
   }\r
   if (EFI_ERROR(Status)) {\r
     if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"time", ProblemParam);\r
       FreePool(ProblemParam);\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
@@ -412,11 +444,15 @@ ShellCommandRunTime (
     // check for "-?"\r
     //\r
     Status = gRT->GetTime(&TheTime, NULL);\r
-    ASSERT_EFI_ERROR(Status);\r
+    if (EFI_ERROR(Status)) {\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"time", L"gRT->GetTime", Status);\r
+      return (SHELL_DEVICE_ERROR);\r
+    }\r
+\r
     if (ShellCommandLineGetFlag(Package, L"-?")) {\r
       ASSERT(FALSE);\r
     } else if (ShellCommandLineGetRawValue(Package, 2) != NULL) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"time");\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
       //\r
@@ -428,46 +464,67 @@ ShellCommandRunTime (
         //\r
         // ShellPrintEx the current time\r
         //\r
-        if (TheTime.TimeZone == 2047) {\r
+        if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) {\r
           TzMinutes = 0;\r
         } else {\r
           TzMinutes = (ABS(TheTime.TimeZone)) % 60;\r
         }\r
 \r
-        ShellPrintHiiEx (\r
-          -1,\r
-          -1,\r
-          NULL,\r
-          STRING_TOKEN (STR_TIME_FORMAT),\r
-          gShellLevel2HiiHandle,\r
-          TheTime.Hour,\r
-          TheTime.Minute,\r
-          TheTime.Second,\r
-          TheTime.TimeZone==2047?L" ":(TheTime.TimeZone > 0?L"-":L"+"),\r
-          TheTime.TimeZone==2047?0:(ABS(TheTime.TimeZone)) / 60,\r
-          TzMinutes\r
-         );\r
-         ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_CRLF), gShellLevel2HiiHandle);\r
+        if (TheTime.TimeZone != EFI_UNSPECIFIED_TIMEZONE) {\r
+          ShellPrintHiiEx (\r
+            -1,\r
+            -1,\r
+            NULL,\r
+            STRING_TOKEN (STR_TIME_FORMAT),\r
+            gShellLevel2HiiHandle,\r
+            TheTime.Hour,\r
+            TheTime.Minute,\r
+            TheTime.Second,\r
+            (TheTime.TimeZone > 0?L"-":L"+"),\r
+            ((ABS(TheTime.TimeZone)) / 60),\r
+            TzMinutes\r
+            );\r
+        } else {\r
+          ShellPrintHiiEx (\r
+            -1,\r
+            -1,\r
+            NULL,\r
+            STRING_TOKEN (STR_TIME_FORMAT_LOCAL),\r
+            gShellLevel2HiiHandle,\r
+            TheTime.Hour,\r
+            TheTime.Minute,\r
+            TheTime.Second\r
+            );\r
+        }\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_CRLF), gShellLevel2HiiHandle);\r
       } else if (ShellCommandLineGetFlag(Package, L"-d") && ShellCommandLineGetValue(Package, L"-d") == NULL) {\r
-        if (TheTime.TimeZone == 2047) {\r
-          TzMinutes = 0;\r
+        if (TheTime.TimeZone == EFI_UNSPECIFIED_TIMEZONE) {\r
+          ShellPrintHiiEx (\r
+            -1,\r
+            -1,\r
+            NULL,\r
+            STRING_TOKEN (STR_TIME_FORMAT_LOCAL),\r
+            gShellLevel2HiiHandle,\r
+            TheTime.Hour,\r
+            TheTime.Minute,\r
+            TheTime.Second\r
+            );\r
         } else {\r
           TzMinutes = (ABS(TheTime.TimeZone)) % 60;\r
+          ShellPrintHiiEx (\r
+            -1,\r
+            -1,\r
+            NULL,\r
+            STRING_TOKEN (STR_TIME_FORMAT),\r
+            gShellLevel2HiiHandle,\r
+            TheTime.Hour,\r
+            TheTime.Minute,\r
+            TheTime.Second,\r
+            (TheTime.TimeZone > 0?L"-":L"+"),\r
+            ((ABS(TheTime.TimeZone)) / 60),\r
+            TzMinutes\r
+           );\r
         }\r
-\r
-        ShellPrintHiiEx (\r
-          -1,\r
-          -1,\r
-          NULL,\r
-          STRING_TOKEN (STR_TIME_FORMAT),\r
-          gShellLevel2HiiHandle,\r
-          TheTime.Hour,\r
-          TheTime.Minute,\r
-          TheTime.Second,\r
-          TheTime.TimeZone==2047?L" ":(TheTime.TimeZone > 0?L"-":L"+"),\r
-          TheTime.TimeZone==2047?0:(ABS(TheTime.TimeZone)) / 60,\r
-          TzMinutes\r
-         );\r
           switch (TheTime.Daylight) {\r
             case 0:\r
               ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_TIME_DST0), gShellLevel2HiiHandle);\r
@@ -482,24 +539,46 @@ ShellCommandRunTime (
               ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_TIME_DST3), gShellLevel2HiiHandle);\r
               break;\r
             default:\r
-              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_ERROR), gShellLevel2HiiHandle, L"gRT->GetTime", L"TheTime.Daylight", TheTime.Daylight);\r
+              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_ERROR), gShellLevel2HiiHandle, L"time", L"gRT->GetTime", L"TheTime.Daylight", TheTime.Daylight);\r
           }\r
       } else {\r
         if (PcdGet8(PcdShellSupportLevel) == 2) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"time");\r
           ShellStatus = SHELL_INVALID_PARAMETER;\r
         } else {\r
           //\r
           // perform level 3 operation here.\r
           //\r
           if ((TempLocation = ShellCommandLineGetValue(Package, L"-tz")) != NULL) {\r
-            if (TempLocation[0] == L'-') {\r
-              Tz = (INT16)(0 - ShellStrToUintn(++TempLocation));\r
+            if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16 *)TempLocation, L"_local") == 0) {\r
+              Tz = EFI_UNSPECIFIED_TIMEZONE;\r
+            } else if (TempLocation[0] == L'-') {\r
+\r
+              Tz = (INT16) ShellStrToUintn (++TempLocation);\r
+              //\r
+              // When the argument of "time [-tz tz]" is not numeric, ShellStrToUintn() returns "-1".\r
+              // Here we can detect the argument error by checking the return of ShellStrToUintn().\r
+              //\r
+              if (Tz == -1) {\r
+                Tz = 1441; //make it to be out of bounds value\r
+              } else {\r
+                Tz *= (-1); //sign convert\r
+              }\r
             } else {\r
-              Tz = (INT16)ShellStrToUintn(TempLocation);\r
+              if (TempLocation[0] == L'+') {\r
+                Tz = (INT16)ShellStrToUintn (++TempLocation);\r
+              } else {\r
+                Tz = (INT16)ShellStrToUintn (TempLocation);\r
+              }\r
+              //\r
+              // Detect the return of ShellStrToUintn() to make sure the argument is valid.\r
+              //\r
+              if (Tz == -1) {\r
+                Tz = 1441; //make it to be out of bounds value\r
+              }\r
             }\r
-            if (!(Tz >= -1440 && Tz <= 1440) && Tz != 2047) {\r
-              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"-tz");\r
+            if (!(Tz >= -1440 && Tz <= 1440) && Tz != EFI_UNSPECIFIED_TIMEZONE) {\r
+              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"time", TempLocation, L"-tz");\r
               ShellStatus = SHELL_INVALID_PARAMETER;\r
             }\r
           } else {\r
@@ -511,8 +590,16 @@ ShellCommandRunTime (
           TempLocation = ShellCommandLineGetValue(Package, L"-d");\r
           if (TempLocation != NULL) {\r
             Daylight = (UINT8)ShellStrToUintn(TempLocation);\r
+            //\r
+            // The argument of "time [-d dl]" is unsigned, if the first character is '-',\r
+            // the argument is incorrect.  That's because ShellStrToUintn() will skip past\r
+            // any '-' sign and convert what's next, forgetting the sign is here.\r
+            //\r
+            if (TempLocation[0] == '-') {\r
+              Daylight = 0xff; //make it invalid = will not use\r
+            }\r
             if (Daylight != 0 && Daylight != 1 && Daylight != 3) {\r
-              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"-d");\r
+              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"time", TempLocation, L"-d");\r
               ShellStatus = SHELL_INVALID_PARAMETER;\r
             }\r
           } else {\r
@@ -524,7 +611,7 @@ ShellCommandRunTime (
           if (ShellStatus == SHELL_SUCCESS) {\r
             ShellStatus = CheckAndSetTime(ShellCommandLineGetRawValue(Package, 1), Tz, Daylight);\r
             if (ShellStatus != SHELL_SUCCESS) {\r
-              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, 1));\r
+              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"time", ShellCommandLineGetRawValue(Package, 1));\r
               ShellStatus = SHELL_INVALID_PARAMETER;\r
             }\r
           }\r
@@ -557,7 +644,7 @@ STATIC CONST SHELL_PARAM_ITEM TimeZoneParamList2[] = {
 STATIC CONST SHELL_PARAM_ITEM TimeZoneParamList3[] = {\r
   {L"-l", TypeFlag},\r
   {L"-f", TypeFlag},\r
-  {L"-s", TypeValue},\r
+  {L"-s", TypeTimeValue},\r
   {NULL, TypeMax}\r
   };\r
 \r
@@ -596,11 +683,12 @@ STATIC CONST SHELL_PARAM_ITEM TimeZoneParamList3[] = {
     {-660 , STRING_TOKEN (STR_TIMEZONE_P11)},\r
     {-720 , STRING_TOKEN (STR_TIMEZONE_P12)},\r
     {-780 , STRING_TOKEN (STR_TIMEZONE_P13)},\r
-    {-840 , STRING_TOKEN (STR_TIMEZONE_P14)}\r
+    {-840 , STRING_TOKEN (STR_TIMEZONE_P14)},\r
+    {EFI_UNSPECIFIED_TIMEZONE, STRING_TOKEN (STR_TIMEZONE_LOCAL)}\r
 };\r
 \r
 /**\r
-  Verify that the TimeZoneString is valid and if so set that as the current \r
+  Verify that the TimeZoneString is valid and if so set that as the current\r
   timezone.\r
 \r
   @param[in] TimeZoneString     The pointer to a string representation of the timezone.\r
@@ -610,7 +698,6 @@ STATIC CONST SHELL_PARAM_ITEM TimeZoneParamList3[] = {
   @retval SHELL_SUCCESS             The operation was successful.\r
 **/\r
 SHELL_STATUS\r
-EFIAPI\r
 CheckAndSetTimeZone (\r
   IN CONST CHAR16 *TimeZoneString\r
   )\r
@@ -626,15 +713,35 @@ CheckAndSetTimeZone (
     return (SHELL_INVALID_PARAMETER);\r
   }\r
 \r
+  if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16 *)TimeZoneString, L"_local") == 0) {\r
+    Status = gRT->GetTime (&TheTime, NULL);\r
+    if (EFI_ERROR (Status)) {\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"gRT->GetTime", Status);\r
+      return (SHELL_DEVICE_ERROR);\r
+    }\r
+\r
+    TheTime.TimeZone = EFI_UNSPECIFIED_TIMEZONE;\r
+    Status = gRT->SetTime (&TheTime);\r
+    if (!EFI_ERROR(Status)){\r
+      return (SHELL_SUCCESS);\r
+    }\r
+    return (SHELL_INVALID_PARAMETER);\r
+  }\r
   if (TimeZoneString != NULL && !InternalIsTimeLikeString(TimeZoneString, L':', 1, 1, TRUE)) {\r
     return (SHELL_INVALID_PARAMETER);\r
   }\r
 \r
   Status = gRT->GetTime(&TheTime, NULL);\r
-  ASSERT_EFI_ERROR(Status);\r
+  if (EFI_ERROR(Status)) {\r
+    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"timezone", L"gRT->GetTime", Status);\r
+    return (SHELL_DEVICE_ERROR);\r
+  }\r
 \r
   TimeZoneCopy = NULL;\r
   TimeZoneCopy = StrnCatGrow(&TimeZoneCopy, NULL, TimeZoneString, 0);\r
+  if (TimeZoneCopy == NULL) {\r
+    return (SHELL_OUT_OF_RESOURCES);\r
+  }\r
   Walker = TimeZoneCopy;\r
   Walker2 = StrStr(Walker, L":");\r
   if (Walker2 != NULL && *Walker2 == L':') {\r
@@ -643,7 +750,7 @@ CheckAndSetTimeZone (
   if (*Walker == L'-') {\r
     TheTime.TimeZone = (INT16)((ShellStrToUintn (++Walker)) * 60);\r
   } else {\r
-    TheTime.TimeZone = (INT16)((ShellStrToUintn (Walker)) * -60);\r
+    TheTime.TimeZone = (INT16)((INT16)(ShellStrToUintn (Walker)) * -60);\r
   }\r
   if (Walker2 != NULL) {\r
     Walker = Walker2 + 1;\r
@@ -715,14 +822,14 @@ ShellCommandRunTimeZone (
   // parse the command line\r
   //\r
   if (PcdGet8(PcdShellSupportLevel) == 2) {\r
-    Status = ShellCommandLineParse (TimeZoneParamList2, &Package, &ProblemParam, FALSE);\r
+    Status = ShellCommandLineParse (TimeZoneParamList2, &Package, &ProblemParam, TRUE);\r
   } else {\r
     ASSERT(PcdGet8(PcdShellSupportLevel) == 3);\r
-    Status = ShellCommandLineParseEx (TimeZoneParamList3, &Package, &ProblemParam, FALSE, TRUE);\r
+    Status = ShellCommandLineParseEx (TimeZoneParamList3, &Package, &ProblemParam, TRUE, TRUE);\r
   }\r
   if (EFI_ERROR(Status)) {\r
     if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"timezone", ProblemParam);\r
       FreePool(ProblemParam);\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
@@ -733,18 +840,18 @@ ShellCommandRunTimeZone (
     // check for "-?"\r
     //\r
     if (ShellCommandLineGetCount(Package) > 1) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
+      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"timezone");\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else if (ShellCommandLineGetFlag(Package, L"-?")) {\r
       ASSERT(FALSE);\r
     } else if (ShellCommandLineGetFlag(Package, L"-s")) {\r
       if ((ShellCommandLineGetFlag(Package, L"-l")) || (ShellCommandLineGetFlag(Package, L"-f"))) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"-l or -f");\r
+        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"timezone", L"-l or -f");\r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
       } else {\r
         ASSERT(PcdGet8(PcdShellSupportLevel) == 3);\r
         if (ShellCommandLineGetValue(Package, L"-s") == NULL) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"-s");\r
+          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"timezone", L"-s");\r
           ShellStatus = SHELL_INVALID_PARAMETER;\r
         } else {\r
           //\r
@@ -752,7 +859,7 @@ ShellCommandRunTimeZone (
           //\r
           ShellStatus = CheckAndSetTimeZone(ShellCommandLineGetValue(Package, L"-s"));\r
           if (ShellStatus != SHELL_SUCCESS) {\r
-            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ShellCommandLineGetValue(Package, L"-s"));\r
+            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"timezone", ShellCommandLineGetValue(Package, L"-s"));\r
             ShellStatus = SHELL_INVALID_PARAMETER;\r
           }\r
         }\r
@@ -772,9 +879,12 @@ ShellCommandRunTimeZone (
       // Get Current Time Zone Info\r
       //\r
       Status = gRT->GetTime(&TheTime, NULL);\r
-      ASSERT_EFI_ERROR(Status);\r
+      if (EFI_ERROR(Status)) {\r
+        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"timezone", L"gRT->GetTime", Status);\r
+        return (SHELL_DEVICE_ERROR);\r
+      }\r
 \r
-      if (TheTime.TimeZone != 2047) {\r
+      if (TheTime.TimeZone != EFI_UNSPECIFIED_TIMEZONE) {\r
         Found = FALSE;\r
         for ( LoopVar = 0\r
             ; LoopVar < sizeof(TimeZoneList) / sizeof(TimeZoneList[0])\r
@@ -790,11 +900,7 @@ ShellCommandRunTimeZone (
               //\r
               // Print basic info only\r
               //\r
-              if (TheTime.TimeZone == 2047) {\r
-                TzMinutes = 0;\r
-              } else {\r
-                TzMinutes = (ABS(TheTime.TimeZone)) % 60;\r
-              }\r
+              TzMinutes = (ABS(TheTime.TimeZone)) % 60;\r
 \r
               ShellPrintHiiEx (\r
                 -1,\r
@@ -802,8 +908,8 @@ ShellCommandRunTimeZone (
                 NULL,\r
                 STRING_TOKEN(STR_TIMEZONE_SIMPLE),\r
                 gShellLevel2HiiHandle,\r
-                TheTime.TimeZone==2047?0:(TheTime.TimeZone > 0?L"-":L"+"),\r
-                TheTime.TimeZone==2047?0:(ABS(TheTime.TimeZone)) / 60,\r
+                (TheTime.TimeZone > 0?L"-":L"+"),\r
+                (ABS(TheTime.TimeZone)) / 60,\r
                 TzMinutes);\r
             }\r
             Found = TRUE;\r
@@ -814,28 +920,45 @@ ShellCommandRunTimeZone (
           //\r
           // Print basic info only\r
           //\r
-          if (TheTime.TimeZone == 2047) {\r
-            TzMinutes = 0;\r
-          } else {\r
-            TzMinutes = (ABS(TheTime.TimeZone)) % 60;\r
-          }\r
+          TzMinutes = (ABS(TheTime.TimeZone)) % 60;\r
+\r
           ShellPrintHiiEx (\r
             -1,\r
             -1,\r
             NULL,\r
             STRING_TOKEN(STR_TIMEZONE_SIMPLE),\r
             gShellLevel2HiiHandle,\r
-            TheTime.TimeZone==2047?0:(TheTime.TimeZone > 0?L"-":L"+"),\r
-            TheTime.TimeZone==2047?0:(ABS(TheTime.TimeZone)) / 60,\r
+            (TheTime.TimeZone > 0?L"-":L"+"),\r
+            (ABS(TheTime.TimeZone)) / 60,\r
             TzMinutes);\r
+\r
           if (ShellCommandLineGetFlag(Package, L"-f")) {\r
             ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN(STR_TIMEZONE_NI), gShellLevel2HiiHandle);\r
           }\r
         }\r
       } else {\r
         //\r
-        // TimeZone was 2047 (unknown) from GetTime()\r
+        // TimeZone was EFI_UNSPECIFIED_TIMEZONE (local) from GetTime()\r
         //\r
+        if (ShellCommandLineGetFlag (Package, L"-f")) {\r
+          for ( LoopVar = 0\r
+              ; LoopVar < ARRAY_SIZE (TimeZoneList)\r
+              ; LoopVar++\r
+             ){\r
+            if (TheTime.TimeZone == TimeZoneList[LoopVar].TimeZone) {\r
+              //\r
+              //  Print all info about current time zone\r
+              //\r
+              ShellPrintHiiEx (-1, -1, NULL, TimeZoneList[LoopVar].StringId, gShellLevel2HiiHandle);\r
+              break;\r
+            }\r
+          }\r
+        } else {\r
+          //\r
+          // Print basic info only\r
+          //\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_TIMEZONE_SIMPLE_LOCAL), gShellLevel2HiiHandle);\r
+        }\r
       }\r
     }\r
   }\r