/** Verify that the DateString is valid and if so set that as the current date. @param[in] DateString The pointer to a string representation of the date. @retval SHELL_INVALID_PARAMETER DateString was NULL. @retval SHELL_INVALID_PARAMETER DateString was mis-formatted. @retval SHELL_SUCCESS The operation was successful. **/ SHELL_STATUS EFIAPI CheckAndSetDate ( IN CONST CHAR16 *DateString ) { EFI_TIME TheTime; EFI_STATUS Status; CHAR16 *DateStringCopy; CHAR16 *Walker; CHAR16 *Walker1; if (!InternalIsTimeLikeString(DateString, L'/', 2, 2, FALSE)) { return (SHELL_INVALID_PARAMETER); } Status = gRT->GetTime(&TheTime, NULL); if (EFI_ERROR(Status)) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"gRT->GetTime", Status); return (SHELL_DEVICE_ERROR); } DateStringCopy = NULL; DateStringCopy = StrnCatGrow(&DateStringCopy, NULL, DateString, 0); if (DateStringCopy == NULL) { return (SHELL_OUT_OF_RESOURCES); } Walker = DateStringCopy; TheTime.Month = 0xFF; TheTime.Day = 0xFF; TheTime.Year = 0xFFFF; Walker1 = StrStr(Walker, L"/"); if (Walker1 != NULL && *Walker1 == L'/') { *Walker1 = CHAR_NULL; } TheTime.Month = (UINT8)ShellStrToUintn (Walker); if (Walker1 != NULL) { Walker = Walker1 + 1; } Walker1 = Walker!=NULL?StrStr(Walker, L"/"):NULL; if (Walker1 != NULL && *Walker1 == L'/') { *Walker1 = CHAR_NULL; } if (Walker != NULL && Walker[0] != CHAR_NULL) { TheTime.Day = (UINT8)ShellStrToUintn (Walker); if (Walker1 != NULL) { Walker = Walker1 + 1; } Walker1 = Walker!=NULL?StrStr(Walker, L"/"):NULL; if (Walker1 != NULL && *Walker1 == L'/') { *Walker1 = CHAR_NULL; } if (Walker != NULL && Walker[0] != CHAR_NULL) { TheTime.Year = (UINT16)ShellStrToUintn (Walker); } } if (TheTime.Year < 100) { if (TheTime.Year >= 98) { TheTime.Year = (UINT16)(1900 + TheTime.Year); } else { TheTime.Year = (UINT16)(2000 + TheTime.Year); } } Status = gRT->SetTime(&TheTime); if (!EFI_ERROR(Status)){ return (SHELL_SUCCESS); } return (SHELL_INVALID_PARAMETER); }
/** Verify that the TimeZoneString is valid and if so set that as the current timezone. @param[in] TimeZoneString The pointer to a string representation of the timezone. @retval SHELL_INVALID_PARAMETER TimeZoneString was NULL. @retval SHELL_INVALID_PARAMETER TimeZoneString was mis-formatted. @retval SHELL_SUCCESS The operation was successful. **/ SHELL_STATUS EFIAPI CheckAndSetTimeZone ( IN CONST CHAR16 *TimeZoneString ) { EFI_TIME TheTime; EFI_STATUS Status; CHAR16 *TimeZoneCopy; CHAR16 *Walker; CHAR16 *Walker2; UINTN LoopVar; if (TimeZoneString == NULL) { return (SHELL_INVALID_PARAMETER); } if (TimeZoneString != NULL && !InternalIsTimeLikeString(TimeZoneString, L':', 1, 1, TRUE)) { return (SHELL_INVALID_PARAMETER); } Status = gRT->GetTime(&TheTime, NULL); if (EFI_ERROR(Status)) { return (SHELL_DEVICE_ERROR); } TimeZoneCopy = NULL; TimeZoneCopy = StrnCatGrow(&TimeZoneCopy, NULL, TimeZoneString, 0); if (TimeZoneCopy == NULL) { return (SHELL_OUT_OF_RESOURCES); } Walker = TimeZoneCopy; Walker2 = StrStr(Walker, L":"); if (Walker2 != NULL && *Walker2 == L':') { *Walker2 = CHAR_NULL; } if (*Walker == L'-') { TheTime.TimeZone = (INT16)((ShellStrToUintn (++Walker)) * 60); } else { TheTime.TimeZone = (INT16)((ShellStrToUintn (Walker)) * -60); } if (Walker2 != NULL) { Walker = Walker2 + 1; } if (Walker != NULL && Walker[0] != CHAR_NULL) { if (TheTime.TimeZone < 0) { TheTime.TimeZone = (INT16)(TheTime.TimeZone - (UINT8)ShellStrToUintn (Walker)); } else { TheTime.TimeZone = (INT16)(TheTime.TimeZone + (UINT8)ShellStrToUintn (Walker)); } } Status = EFI_INVALID_PARAMETER; for ( LoopVar = 0 ; LoopVar < sizeof(TimeZoneList) / sizeof(TimeZoneList[0]) ; LoopVar++ ){ if (TheTime.TimeZone == TimeZoneList[LoopVar].TimeZone) { Status = gRT->SetTime(&TheTime); break; } } FreePool(TimeZoneCopy); if (!EFI_ERROR(Status)){ return (SHELL_SUCCESS); } return (SHELL_INVALID_PARAMETER); }
/** Verify that the TimeZoneString is valid and if so set that as the current timezone. @param[in] TimeZoneString The pointer to a string representation of the timezone. @retval SHELL_INVALID_PARAMETER TimeZoneString was NULL. @retval SHELL_INVALID_PARAMETER TimeZoneString was mis-formatted. @retval SHELL_SUCCESS The operation was successful. **/ SHELL_STATUS CheckAndSetTimeZone ( IN CONST CHAR16 *TimeZoneString ) { EFI_TIME TheTime; EFI_STATUS Status; CHAR16 *TimeZoneCopy; CHAR16 *Walker; CHAR16 *Walker2; UINTN LoopVar; if (TimeZoneString == NULL) { return (SHELL_INVALID_PARAMETER); } if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16 *)TimeZoneString, L"_local") == 0) { Status = gRT->GetTime (&TheTime, NULL); if (EFI_ERROR (Status)) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"gRT->GetTime", Status); return (SHELL_DEVICE_ERROR); } TheTime.TimeZone = EFI_UNSPECIFIED_TIMEZONE; Status = gRT->SetTime (&TheTime); if (!EFI_ERROR(Status)){ return (SHELL_SUCCESS); } return (SHELL_INVALID_PARAMETER); } if (TimeZoneString != NULL && !InternalIsTimeLikeString(TimeZoneString, L':', 1, 1, TRUE)) { return (SHELL_INVALID_PARAMETER); } Status = gRT->GetTime(&TheTime, NULL); if (EFI_ERROR(Status)) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"timezone", L"gRT->GetTime", Status); return (SHELL_DEVICE_ERROR); } TimeZoneCopy = NULL; TimeZoneCopy = StrnCatGrow(&TimeZoneCopy, NULL, TimeZoneString, 0); if (TimeZoneCopy == NULL) { return (SHELL_OUT_OF_RESOURCES); } Walker = TimeZoneCopy; Walker2 = StrStr(Walker, L":"); if (Walker2 != NULL && *Walker2 == L':') { *Walker2 = CHAR_NULL; } if (*Walker == L'-') { TheTime.TimeZone = (INT16)((ShellStrToUintn (++Walker)) * 60); } else { TheTime.TimeZone = (INT16)((INT16)(ShellStrToUintn (Walker)) * -60); } if (Walker2 != NULL) { Walker = Walker2 + 1; } if (Walker != NULL && Walker[0] != CHAR_NULL) { if (TheTime.TimeZone < 0) { TheTime.TimeZone = (INT16)(TheTime.TimeZone - (UINT8)ShellStrToUintn (Walker)); } else { TheTime.TimeZone = (INT16)(TheTime.TimeZone + (UINT8)ShellStrToUintn (Walker)); } } Status = EFI_INVALID_PARAMETER; for ( LoopVar = 0 ; LoopVar < sizeof(TimeZoneList) / sizeof(TimeZoneList[0]) ; LoopVar++ ){ if (TheTime.TimeZone == TimeZoneList[LoopVar].TimeZone) { Status = gRT->SetTime(&TheTime); break; } } FreePool(TimeZoneCopy); if (!EFI_ERROR(Status)){ return (SHELL_SUCCESS); } return (SHELL_INVALID_PARAMETER); }
/** Verify that the TimeString is valid and if so set that as the current time. @param[in] TimeString The pointer to a string representation of the time. @param[in] Tz The value to set for TimeZone. @param[in] Daylight The value to set for Daylight. @retval SHELL_INVALID_PARAMETER TimeString was NULL. @retval SHELL_INVALID_PARAMETER TimeString was mis-formatted. @retval SHELL_SUCCESS The operation was successful. **/ SHELL_STATUS EFIAPI CheckAndSetTime ( IN CONST CHAR16 *TimeString, IN CONST INT16 Tz, IN CONST UINT8 Daylight ) { EFI_TIME TheTime; EFI_STATUS Status; CHAR16 *TimeStringCopy; CHAR16 *Walker1; CHAR16 *Walker2; if (TimeString != NULL && !InternalIsTimeLikeString(TimeString, L':', 1, 2, FALSE)) { return (SHELL_INVALID_PARAMETER); } if (Daylight != 0xFF &&((Daylight & (EFI_TIME_IN_DAYLIGHT|EFI_TIME_ADJUST_DAYLIGHT)) != Daylight)) { return (SHELL_INVALID_PARAMETER); } Status = gRT->GetTime(&TheTime, NULL); ASSERT_EFI_ERROR(Status); if (TimeString != NULL) { TimeStringCopy = NULL; TimeStringCopy = StrnCatGrow(&TimeStringCopy, NULL, TimeString, 0); Walker1 = TimeStringCopy; TheTime.Hour = 0xFF; TheTime.Minute = 0xFF; Walker2 = Walker1!=NULL?StrStr(Walker1, L":"):NULL; if (Walker2 != NULL && *Walker2 == L':') { *Walker2 = CHAR_NULL; } TheTime.Hour = (UINT8)ShellStrToUintn (Walker1); if (Walker2 != NULL) { Walker1 = Walker2 + 1; } Walker2 = Walker1!=NULL?StrStr(Walker1, L":"):NULL; if (Walker2 != NULL && *Walker2 == L':') { *Walker2 = CHAR_NULL; } if (Walker1 != NULL && Walker1[0] != CHAR_NULL) { TheTime.Minute = (UINT8)ShellStrToUintn (Walker1); if (Walker2 != NULL) { Walker1 = Walker2 + 1; } if (Walker1 != NULL && Walker1[0] != CHAR_NULL) { TheTime.Second = (UINT8)ShellStrToUintn (Walker1); } } SHELL_FREE_NON_NULL(TimeStringCopy); } if ((Tz >= -1440 && Tz <= 1440)||(Tz == 0x7FF)) { TheTime.TimeZone = Tz; } if (Daylight != 0xFF) { TheTime.Daylight = Daylight; } Status = gRT->SetTime(&TheTime); if (!EFI_ERROR(Status)){ return (SHELL_SUCCESS); } return (SHELL_INVALID_PARAMETER); }
/** Verify that the TimeString is valid and if so set that as the current time. @param[in] TimeString The pointer to a string representation of the time. @param[in] Tz The value to set for TimeZone. @param[in] Daylight The value to set for Daylight. @retval SHELL_INVALID_PARAMETER TimeString was NULL. @retval SHELL_INVALID_PARAMETER TimeString was mis-formatted. @retval SHELL_SUCCESS The operation was successful. **/ SHELL_STATUS CheckAndSetTime ( IN CONST CHAR16 *TimeString, IN CONST INT16 Tz, IN CONST UINT8 Daylight ) { EFI_TIME TheTime; EFI_STATUS Status; CHAR16 *TimeStringCopy; CHAR16 *Walker1; CHAR16 *Walker2; if (TimeString != NULL && !InternalIsTimeLikeString(TimeString, L':', 1, 2, FALSE)) { return (SHELL_INVALID_PARAMETER); } if (Daylight != 0xFF &&((Daylight & (EFI_TIME_IN_DAYLIGHT|EFI_TIME_ADJUST_DAYLIGHT)) != Daylight)) { return (SHELL_INVALID_PARAMETER); } Status = gRT->GetTime(&TheTime, NULL); if (EFI_ERROR(Status)) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN), gShellLevel2HiiHandle, L"time", L"gRT->GetTime", Status); return (SHELL_DEVICE_ERROR); } if (TimeString != NULL) { TimeStringCopy = NULL; TimeStringCopy = StrnCatGrow(&TimeStringCopy, NULL, TimeString, 0); Walker1 = TimeStringCopy; TheTime.Hour = 0xFF; TheTime.Minute = 0xFF; Walker2 = Walker1!=NULL?StrStr(Walker1, L":"):NULL; if (Walker2 != NULL && *Walker2 == L':') { *Walker2 = CHAR_NULL; } TheTime.Hour = (UINT8)ShellStrToUintn (Walker1); if (Walker2 != NULL) { Walker1 = Walker2 + 1; } Walker2 = Walker1!=NULL?StrStr(Walker1, L":"):NULL; if (Walker2 != NULL && *Walker2 == L':') { *Walker2 = CHAR_NULL; TheTime.Second = (UINT8)0; } else if (Walker2 == NULL) { TheTime.Second = (UINT8)0; } if (Walker1 != NULL && Walker1[0] != CHAR_NULL) { TheTime.Minute = (UINT8)ShellStrToUintn (Walker1); if (Walker2 != NULL) { Walker1 = Walker2 + 1; if (Walker1 != NULL && Walker1[0] != CHAR_NULL) { TheTime.Second = (UINT8)ShellStrToUintn (Walker1); } } } SHELL_FREE_NON_NULL(TimeStringCopy); } if (Tz >= -1440 && Tz <= 1440) { // // EFI_TIME TimeZone is stored to meet the following calculation (see UEFI Spec): // Localtime = UTC - TimeZone // This means the sign must be changed for the user provided Tz. // EX: User wants to set TimeZone to Pacific Standard Time, so runs // time -tz -480 # set to UTC-08:00 // To meet the calculation, the sign must be changed. // TheTime.TimeZone = -Tz; } else if (Tz == EFI_UNSPECIFIED_TIMEZONE) { TheTime.TimeZone = Tz; } if (Daylight != 0xFF) { TheTime.Daylight = Daylight; } Status = gRT->SetTime(&TheTime); if (!EFI_ERROR(Status)){ return (SHELL_SUCCESS); } return (SHELL_INVALID_PARAMETER); }