summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2014-05-22 20:25:30 +0200
committerGravatar Nikias Bassen2014-05-22 20:25:30 +0200
commitd5e1de67fc641a1b85c9185e504d1488820ca02c (patch)
tree750d8d2da5604ff608dc805b41fd6f8dc61230be
parent1317925ffc18a1fd669e8d008de404a8429ea3cf (diff)
downloadlibplist-d5e1de67fc641a1b85c9185e504d1488820ca02c.tar.gz
libplist-d5e1de67fc641a1b85c9185e504d1488820ca02c.tar.bz2
xplist: Fix PLIST_DATE handling to respect the Mac epoch
-rw-r--r--src/xplist.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/xplist.c b/src/xplist.c
index 200d942..a21ae7f 100644
--- a/src/xplist.c
+++ b/src/xplist.c
@@ -51,6 +51,8 @@
51#define XPLIST_ARRAY BAD_CAST("array") 51#define XPLIST_ARRAY BAD_CAST("array")
52#define XPLIST_DICT BAD_CAST("dict") 52#define XPLIST_DICT BAD_CAST("dict")
53 53
54#define MAC_EPOCH 978307200
55
54static const char *plist_base = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\ 56static const char *plist_base = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\
55<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n\ 57<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n\
56<plist version=\"1.0\">\n\ 58<plist version=\"1.0\">\n\
@@ -222,7 +224,7 @@ static void node_to_xml(node_t* node, void *xml_struct)
222 case PLIST_DATE: 224 case PLIST_DATE:
223 tag = XPLIST_DATE; 225 tag = XPLIST_DATE;
224 { 226 {
225 time_t timev = (time_t)node_data->timeval.tv_sec; 227 time_t timev = (time_t)node_data->timeval.tv_sec + MAC_EPOCH;
226 struct tm *btime = gmtime(&timev); 228 struct tm *btime = gmtime(&timev);
227 if (btime) { 229 if (btime) {
228 val = (char*)malloc(24); 230 val = (char*)malloc(24);
@@ -404,7 +406,7 @@ static void xml_to_node(xmlNodePtr xml_node, plist_t * plist_node)
404 tm_utc = gmtime(&timev); 406 tm_utc = gmtime(&timev);
405 timev -= (mktime(tm_utc) - timev); 407 timev -= (mktime(tm_utc) - timev);
406 } 408 }
407 data->timeval.tv_sec = (long)timev; 409 data->timeval.tv_sec = (long)(timev - MAC_EPOCH);
408 data->timeval.tv_usec = 0; 410 data->timeval.tv_usec = 0;
409 data->type = PLIST_DATE; 411 data->type = PLIST_DATE;
410 data->length = sizeof(struct timeval); 412 data->length = sizeof(struct timeval);