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
|
---|
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
|
---|
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
|
---|
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*
|
---|
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 | }
|
---|