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:
@ -2,7 +2,7 @@
|
|||||||
Main file for ls shell level 2 function.
|
Main file for ls shell level 2 function.
|
||||||
|
|
||||||
(C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
|
(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
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -16,6 +16,8 @@
|
|||||||
#include "UefiShellLevel2CommandsLib.h"
|
#include "UefiShellLevel2CommandsLib.h"
|
||||||
#include <Guid/FileSystemInfo.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.
|
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
|
print out the list of files and directories from the LS command
|
||||||
|
|
||||||
@ -357,6 +449,7 @@ PrintLsOutput(
|
|||||||
CHAR16 *CorrectedPath;
|
CHAR16 *CorrectedPath;
|
||||||
BOOLEAN FoundOne;
|
BOOLEAN FoundOne;
|
||||||
BOOLEAN HeaderPrinted;
|
BOOLEAN HeaderPrinted;
|
||||||
|
EFI_TIME LocalTime;
|
||||||
|
|
||||||
HeaderPrinted = FALSE;
|
HeaderPrinted = FALSE;
|
||||||
FileCount = 0;
|
FileCount = 0;
|
||||||
@ -408,6 +501,29 @@ PrintLsOutput(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ASSERT(Node != NULL);
|
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)) {
|
if (LongestPath < StrSize(Node->FullName)) {
|
||||||
LongestPath = StrSize(Node->FullName);
|
LongestPath = StrSize(Node->FullName);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user