ShellPkg/ls: Display the file time in local time.

Signed-off-by: Li Huajing <huajing.li@intel.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
This commit is contained in:
Li Huajing 2017-07-24 15:46:03 +08:00 committed by Ruiyu Ni
parent c46aeceaf6
commit 99849a906e
1 changed files with 117 additions and 1 deletions

View File

@ -2,7 +2,7 @@
Main file for ls shell level 2 function.
(C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@ -16,6 +16,8 @@
#include "UefiShellLevel2CommandsLib.h"
#include <Guid/FileSystemInfo.h>
UINTN mDayOfMonth[] = {31, 28, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30};
/**
print out the standard format output volume entry.
@ -318,6 +320,96 @@ PrintNonSfoFooter(
);
}
/**
Change the file time to local time based on the timezone.
@param[in] Time The file time.
@param[in] LocalTimeZone Local time zone.
**/
VOID
FileTimeToLocalTime (
IN EFI_TIME *Time,
IN INT16 LocalTimeZone
)
{
INTN MinuteDiff;
INTN TempMinute;
INTN HourNumberOfTempMinute;
INTN TempHour;
INTN DayNumberOfTempHour;
INTN TempDay;
INTN MonthNumberOfTempDay;
INTN TempMonth;
INTN YearNumberOfTempMonth;
INTN MonthRecord;
ASSERT ((Time->TimeZone >= -1440) && (Time->TimeZone <=1440));
ASSERT ((LocalTimeZone >= -1440) && (LocalTimeZone <=1440));
ASSERT ((Time->Month >= 1) && (Time->Month <= 12));
if(Time->TimeZone == LocalTimeZone) {
//
//if the file timezone is equal to the local timezone, there is no need to adjust the file time.
//
return;
}
if((Time->Year % 4 == 0 && Time->Year / 100 != 0)||(Time->Year % 400 == 0)) {
//
// Day in February of leap year is 29.
//
mDayOfMonth[1] = 29;
}
MinuteDiff = Time->TimeZone - LocalTimeZone;
TempMinute = Time->Minute + MinuteDiff;
//
// Calculate Time->Minute
// TempHour will be used to calculate Time->Hour
//
HourNumberOfTempMinute = TempMinute / 60;
if(TempMinute < 0) {
HourNumberOfTempMinute --;
}
TempHour = Time->Hour + HourNumberOfTempMinute;
Time->Minute = (UINT8)(TempMinute - 60 * HourNumberOfTempMinute);
//
// Calculate Time->Hour
// TempDay will be used to calculate Time->Day
//
DayNumberOfTempHour = TempHour / 24 ;
if(TempHour < 0){
DayNumberOfTempHour--;
}
TempDay = Time->Day + DayNumberOfTempHour;
Time->Hour = (UINT8)(TempHour - 24 * DayNumberOfTempHour);
//
// Calculate Time->Day
// TempMonth will be used to calculate Time->Month
//
MonthNumberOfTempDay = (TempDay - 1) / (INTN)mDayOfMonth[Time->Month - 1];
MonthRecord = (INTN)(Time->Month) ;
if(TempDay - 1 < 0){
MonthNumberOfTempDay -- ;
MonthRecord -- ;
}
TempMonth = Time->Month + MonthNumberOfTempDay;
Time->Day = (UINT8)(TempDay - (INTN)mDayOfMonth[(MonthRecord - 1 + 12) % 12] * MonthNumberOfTempDay);
//
// Calculate Time->Month, Time->Year
//
YearNumberOfTempMonth = (TempMonth - 1) / 12;
if(TempMonth - 1 < 0){
YearNumberOfTempMonth --;
}
Time->Month = (UINT8)(TempMonth - 12 * (YearNumberOfTempMonth));
Time->Year = (UINT16)(Time->Year + YearNumberOfTempMonth);
}
/**
print out the list of files and directories from the LS command
@ -357,6 +449,7 @@ PrintLsOutput(
CHAR16 *CorrectedPath;
BOOLEAN FoundOne;
BOOLEAN HeaderPrinted;
EFI_TIME LocalTime;
HeaderPrinted = FALSE;
FileCount = 0;
@ -408,6 +501,29 @@ PrintLsOutput(
break;
}
ASSERT(Node != NULL);
//
// Change the file time to local time.
//
Status = gRT->GetTime(&LocalTime, NULL);
if (!EFI_ERROR (Status)) {
if ((Node->Info->CreateTime.TimeZone != EFI_UNSPECIFIED_TIMEZONE) &&
(Node->Info->CreateTime.Month >= 1 && Node->Info->CreateTime.Month <= 12)) {
//
// FileTimeToLocalTime () requires Month is in a valid range, other buffer out-of-band access happens.
//
FileTimeToLocalTime (&Node->Info->CreateTime, LocalTime.TimeZone);
}
if ((Node->Info->LastAccessTime.TimeZone != EFI_UNSPECIFIED_TIMEZONE) &&
(Node->Info->LastAccessTime.Month >= 1 && Node->Info->LastAccessTime.Month <= 12)) {
FileTimeToLocalTime (&Node->Info->LastAccessTime, LocalTime.TimeZone);
}
if ((Node->Info->ModificationTime.TimeZone != EFI_UNSPECIFIED_TIMEZONE) &&
(Node->Info->ModificationTime.Month >= 1 && Node->Info->ModificationTime.Month <= 12)) {
FileTimeToLocalTime (&Node->Info->ModificationTime, LocalTime.TimeZone);
}
}
if (LongestPath < StrSize(Node->FullName)) {
LongestPath = StrSize(Node->FullName);
}