diff options
author | Wei Liu <wei.liu2@citrix.com> | 2013-08-30 12:33:33 +0100 |
---|---|---|
committer | Ian Campbell <ian.campbell@citrix.com> | 2013-09-03 17:00:31 +0100 |
commit | 3fc8cabb8ab704324b4739b6772fcaaa69bbc3b9 (patch) | |
tree | cf2424982e151b8b7de57291f9e9d04d126cfccc /tools/blktap2/vhd | |
parent | 0166217103e18368424fbd5ffff01c1ea50d0b17 (diff) | |
download | xen-3fc8cabb8ab704324b4739b6772fcaaa69bbc3b9.tar.gz xen-3fc8cabb8ab704324b4739b6772fcaaa69bbc3b9.tar.bz2 xen-3fc8cabb8ab704324b4739b6772fcaaa69bbc3b9.zip |
libvhd: use UTC for VHD timestamp
[ported from xapi-project/blktap a79ac2c05f9 ("XOP-289: use UTC for VHD
timestamps")]
Currently, the local timezone is factored into VHD timestamps due to the
use of mktime(). This breaks "vhd-util check" for VHDs created in one
timezone and then moved westward, which results in "primary footer
invalid: creation time in future" errors.
Signed-off-by: Andrei Lifchits <andrei.lifchits@citrix.com>
Andrei no longer works for Citrix but Germano Percossi (ex-colleague of
Andrei) contacted Andrei and confirmed that
1) this work was written on Citrix time,
2) it is OK to have Andrei's SoB.
Remove unused variable "tm".
Signed-off-by: Germano Percossi <germano.percossi@citrix.com>
Signed-off-by: Wei Liu <wei.liu2@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Diffstat (limited to 'tools/blktap2/vhd')
-rw-r--r-- | tools/blktap2/vhd/lib/libvhd.c | 33 |
1 files changed, 9 insertions, 24 deletions
diff --git a/tools/blktap2/vhd/lib/libvhd.c b/tools/blktap2/vhd/lib/libvhd.c index 3511cb4f80..95eb5d6690 100644 --- a/tools/blktap2/vhd/lib/libvhd.c +++ b/tools/blktap2/vhd/lib/libvhd.c @@ -41,6 +41,10 @@ #include "libvhd.h" #include "relative-path.h" +/* VHD uses an epoch of 12:00AM, Jan 1, 2000. This is the Unix timestamp for + * the start of the VHD epoch. */ +#define VHD_EPOCH_START 946684800 + static int libvhd_dbg = 0; void @@ -694,19 +698,10 @@ vhd_end_of_data(vhd_context_t *ctx, off_t *end) return 0; } -uint32_t +uint32_t inline vhd_time(time_t time) { - struct tm tm; - time_t micro_epoch; - - memset(&tm, 0, sizeof(struct tm)); - tm.tm_year = 100; - tm.tm_mon = 0; - tm.tm_mday = 1; - micro_epoch = mktime(&tm); - - return (uint32_t)(time - micro_epoch); + return (uint32_t)(time - VHD_EPOCH_START); } /* @@ -717,20 +712,10 @@ size_t vhd_time_to_string(uint32_t timestamp, char *target) { char *cr; - struct tm tm; - time_t t1, t2; - - memset(&tm, 0, sizeof(struct tm)); - - /* VHD uses an epoch of 12:00AM, Jan 1, 2000. */ - /* Need to adjust this to the expected epoch of 1970. */ - tm.tm_year = 100; - tm.tm_mon = 0; - tm.tm_mday = 1; + time_t unix_timestamp; - t1 = mktime(&tm); - t2 = t1 + (time_t)timestamp; - ctime_r(&t2, target); + unix_timestamp = (time_t)timestamp + VHD_EPOCH_START; + ctime_r(&unix_timestamp, target); /* handle mad ctime_r newline appending. */ if ((cr = strchr(target, '\n')) != NULL) |