Code

make sure we use long long and long with time_t appropriately
[rrdtool.git] / src / rrd_restore.c
index 79f804266f0636a6d454c660507f469afc91a53b..ef524b2ed9fc663b296bc49e6346f4ff6da79045 100644 (file)
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * RRDtool 1.3.7  Copyright by Tobi Oetiker, 1997-2009
+ * RRDtool 1.3.8  Copyright by Tobi Oetiker, 1997-2009
  * This file:     Copyright 2008 Florian octo Forster
  * Distributed under the GPL
  *****************************************************************************
@@ -111,7 +111,7 @@ static int get_long_from_node(
     xmlFree(str_ptr);
 
     if (str_ptr == end_ptr) {
-        rrd_set_error("get_long_from_node: Cannot parse buffer as int: %s",
+        rrd_set_error("get_long_from_node: Cannot parse buffer as long: %s",
                       str_ptr);
         return (-1);
     }
@@ -132,7 +132,7 @@ static int get_ulong_from_node(
 
     str_ptr = (char *) xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
     if (str_ptr == NULL) {
-        rrd_set_error("get_long_from_node: xmlNodeListGetString failed.");
+        rrd_set_error("get_ulong_from_node: xmlNodeListGetString failed.");
         return (-1);
     }
 
@@ -141,7 +141,7 @@ static int get_ulong_from_node(
     xmlFree(str_ptr);
 
     if (str_ptr == end_ptr) {
-        rrd_set_error("get_long_from_node: Cannot parse buffer as int: %s",
+        rrd_set_error("get_ulong_from_node: Cannot parse buffer as unsigned long: %s",
                       str_ptr);
         return (-1);
     }
@@ -149,7 +149,37 @@ static int get_ulong_from_node(
     *value = temp;
 
     return (0);
-}                       /* int get_long_from_node */
+}                       /* int get_ulong_from_node */
+
+static int get_long_long_from_node(
+    xmlDoc * doc,
+    xmlNode * node,
+    long long *value)
+{
+    long long       temp;
+    char     *str_ptr;
+    char     *end_ptr;
+
+    str_ptr = (char *) xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
+    if (str_ptr == NULL) {
+        rrd_set_error("get_ulong_from_node: xmlNodeListGetString failed.");
+        return (-1);
+    }
+
+    end_ptr = NULL;
+    temp = strtoll(str_ptr, &end_ptr, 0);
+    xmlFree(str_ptr);
+
+    if (str_ptr == end_ptr) {
+        rrd_set_error("get_long_long_from_node: Cannot parse buffer as unsigned long long: %s",
+                      str_ptr);
+        return (-1);
+    }
+
+    *value = temp;
+
+    return (0);
+}                       /* int get_ulong_from_node */
 
 static int get_double_from_node(
     xmlDoc * doc,
@@ -918,8 +948,12 @@ static int parse_tag_rrd(
             status = get_ulong_from_node(doc, child,
                                         &rrd->stat_head->pdp_step);
         else if (xmlStrcmp(child->name, (const xmlChar *) "lastupdate") == 0)
-            status = get_long_from_node(doc, child,
-                                        &rrd->live_head->last_up);
+            if (sizeof(time_t) == sizeof(long)) {
+                    status = get_long_from_node(doc, child, (long *)&rrd->live_head->last_up);
+            }
+            else if (sizeof(time_t) == sizeof(long long)) {
+                    status = get_long_long_from_node(doc, child, (long long *)&rrd->live_head->last_up);
+            }
         else if (xmlStrcmp(child->name, (const xmlChar *) "ds") == 0)
             status = parse_tag_ds(doc, child, rrd);
         else if (xmlStrcmp(child->name, (const xmlChar *) "rra") == 0)