From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 3718121D28FF5 for ; Tue, 25 Jul 2017 02:58:45 -0700 (PDT) Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 Jul 2017 03:00:46 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.40,411,1496127600"; d="scan'208";a="111708192" Received: from ray-dev.ccr.corp.intel.com ([10.239.9.7]) by orsmga004.jf.intel.com with ESMTP; 25 Jul 2017 03:00:45 -0700 From: Ruiyu Ni To: edk2-devel@lists.01.org Cc: Li Huajing Date: Tue, 25 Jul 2017 18:00:29 +0800 Message-Id: <20170725100029.31284-3-ruiyu.ni@intel.com> X-Mailer: git-send-email 2.12.2.windows.2 In-Reply-To: <20170725100029.31284-1-ruiyu.ni@intel.com> References: <20170725100029.31284-1-ruiyu.ni@intel.com> Subject: [PATCH 2/2] ShellPkg/ls: Display the file time in local time. X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 25 Jul 2017 09:58:45 -0000 From: Li Huajing Signed-off-by: Li Huajing Reviewed-by: Ruiyu Ni --- ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c | 111 ++++++++++++++++++++++- 1 file changed, 110 insertions(+), 1 deletion(-) diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c index 52ae18f19b..687f65b914 100644 --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Ls.c @@ -2,7 +2,7 @@ Main file for ls shell level 2 function. (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.
- Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.
+ Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.
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 +UINTN mDayOfMonth[] = {31, 28, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30}; + /** print out the standard format output volume entry. @@ -319,6 +321,89 @@ 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->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) / mDayOfMonth[Time->Month - 1]; + MonthRecord = (INTN)(Time->Month) ; + if(TempDay - 1 < 0){ + MonthNumberOfTempDay -- ; + MonthRecord -- ; + } + TempMonth = Time->Month + MonthNumberOfTempDay; + Time->Day = (UINT8)(TempDay - 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 @param[in] Rec TRUE to automatically recurse into each found directory @@ -357,6 +442,7 @@ PrintLsOutput( CHAR16 *CorrectedPath; BOOLEAN FoundOne; BOOLEAN HeaderPrinted; + EFI_TIME LocalTime; HeaderPrinted = FALSE; FileCount = 0; @@ -408,6 +494,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); } -- 2.12.2.windows.2