mirror of https://github.com/acidanthera/audk.git
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:
parent
c46aeceaf6
commit
99849a906e
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue