1 /** @file
2   Transformations between the EFI_TIME structure and struct tm or time_t.
3 
4   Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
5   This program and the accompanying materials are licensed and made available under
6   the terms and conditions of the BSD License that accompanies this distribution.
7   The full text of the license may be found at
8   http://opensource.org/licenses/bsd-license.php.
9 
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 #include  <Uefi.h>
15 
16 #include  <LibConfig.h>
17 
18 #include  <time.h>
19 #include  "tzfile.h"
20 #include  <MainData.h>
21 
22 /** Convert an EFI_TIME structure into a C Standard tm structure.
23 
24     @param[in]    ET    Pointer to the EFI_TIME structure to convert.
25     @param[out]   BT    Pointer to the tm structure to receive the converted time.
26 */
27 void
Efi2Tm(IN EFI_TIME * ET,OUT struct tm * BT)28 Efi2Tm(
29   IN      EFI_TIME  *ET,
30      OUT  struct tm *BT
31   )
32 {
33   // Convert EFI time to broken-down time.
34   BT->tm_year = ET->Year - TM_YEAR_BASE;
35   BT->tm_mon = ET->Month - 1;   // BD time is zero based, EFI is 1 based
36   BT->tm_mday = ET->Day;
37   BT->tm_hour = ET->Hour;
38   BT->tm_min = ET->Minute;
39   BT->tm_sec = ET->Second;
40   BT->tm_isdst = -1;
41   BT->tm_zoneoff = ET->TimeZone;
42   BT->tm_daylight = ET->Daylight;
43   BT->tm_Nano = ET->Nanosecond;
44 }
45 
46 /** Convert an EFI_TIME structure into a time_t value.
47 
48     @param[in]  EfiBDtime   Pointer to the EFI_TIME structure to convert.
49 
50     @return   The EFI_TIME converted into a time_t value.
51 */
52 time_t
Efi2Time(IN EFI_TIME * EfiBDtime)53 Efi2Time(
54   IN  EFI_TIME *EfiBDtime
55   )
56 {
57   Efi2Tm( EfiBDtime, &gMD->BDTime);
58 
59   return mktime( &gMD->BDTime);
60 }
61 
62 /** Convert a C Standard tm structure into an EFI_TIME structure.
63 
64     @param[in]    BT    Pointer to the tm structure to convert.
65     @param[out]   ET    Pointer to an EFI_TIME structure to receive the converted time.
66 */
67 void
Tm2Efi(IN struct tm * BT,OUT EFI_TIME * ET)68 Tm2Efi(
69   IN      struct tm *BT,
70      OUT  EFI_TIME  *ET
71   )
72 {
73   ET->Year        = (UINT16)BT->tm_year + TM_YEAR_BASE;
74   ET->Month       = (UINT8)BT->tm_mon + 1;
75   ET->Day         = (UINT8)BT->tm_mday;
76   ET->Hour        = (UINT8)BT->tm_hour;
77   ET->Minute      = (UINT8)BT->tm_min;
78   ET->Second      = (UINT8)BT->tm_sec;
79   ET->Nanosecond  = (UINT32)BT->tm_Nano;
80   ET->TimeZone    = (INT16)BT->tm_zoneoff;
81   ET->Daylight    = (UINT8)BT->tm_daylight;
82 }
83 
84 /** Convert a time_t value into an EFI_TIME structure.
85 
86     @param[in]    CalTime   Calendar time as a time_t value.
87 
88     @return   Returns a newly malloced EFI_TIME structure containing
89               the converted calendar time.
90 
91     @post     It is the responsibility of the caller to free the
92               returned structure before the application exits.
93 */
94 EFI_TIME*
Time2Efi(IN time_t CalTime)95 Time2Efi(
96   IN  time_t CalTime
97   )
98 {
99   struct tm *IT;
100   EFI_TIME  *ET   = NULL;
101 
102   IT = gmtime(&CalTime);
103   if(IT != NULL) {
104     ET = malloc(sizeof(EFI_TIME));
105     if(ET != NULL) {
106       Tm2Efi(IT, ET);
107     }
108   }
109   return ET;
110 }
111