/*****************************************************************************
- * RRDtool 1.4.2 Copyright by Tobi Oetiker, 1997-2009
+ * RRDtool 1.4.3 Copyright by Tobi Oetiker, 1997-2010
*****************************************************************************
* rrd_restore.c Contains logic to parse XML input and create an RRD file
* This file:
}
-static int get_xml_long(
+static int get_xml_time_t(
xmlTextReaderPtr reader,
- long *value)
+ time_t *value)
{
xmlChar *text;
- long temp;
+ time_t temp;
if ((text = get_xml_text(reader)) != NULL){
errno = 0;
+#ifdef TIME_T_IS_32BIT
temp = strtol((char *)text,NULL, 0);
+#else
+#ifdef TIME_T_IS_64BIT
+ temp = strtoll((char *)text,NULL, 0);
+#else
+ if (sizeof(time_t) == 4){
+ temp = strtol((char *)text,NULL, 0);
+ } else {
+ temp = strtoll((char *)text,NULL, 0);
+ }
+#endif
+#endif
if (errno>0){
- rrd_set_error("ling %d: get_xml_long from '%s' %s",
+ rrd_set_error("ling %d: get_xml_time_t from '%s' %s",
xmlTextReaderGetParserLineNumber(reader),
text,rrd_strerror(errno));
xmlFree(text);
return 0;
}
return -1;
-} /* get_xml_long */
+} /* get_xml_time_t */
static int get_xml_ulong(
xmlTextReaderPtr reader,
return -1;
} /* get_xml_ulong */
-#ifndef TIME_T_IS_LONG
-static int get_xml_llong(
- xmlTextReaderPtr reader,
- long long *value)
-{
-
- xmlChar *text;
- long long temp;
- if ((text = get_xml_text(reader)) != NULL){
- errno = 0;
- temp = strtoll((char *)text,NULL, 0);
- if (errno>0){
- rrd_set_error("ling %d: get_xml_llong from '%s' %s",
- xmlTextReaderGetParserLineNumber(reader),
- text,rrd_strerror(errno));
- xmlFree(text);
- return -1;
- }
- xmlFree(text);
- *value = temp;
- return 0;
- }
- return -1;
-} /* get_xml_llong */
-
-#endif
-
static int get_xml_double(
xmlTextReaderPtr reader,
double *value)
/* All space successfully allocated, increment number of RRAs. */
rrd->stat_head->rra_cnt++;
-
+
status = 0;
while ((element = get_xml_element(reader)) != NULL){
if (xmlStrcasecmp(element, (const xmlChar *) "cf") == 0)
return status;
}
else if (xmlStrcasecmp(element,(const xmlChar *) "/rra") == 0){
- xmlFree(element);
+ xmlFree(element);
return status;
} /* }}} */
else {
status = get_xml_ulong(reader,
&rrd->stat_head->pdp_step);
else if (xmlStrcasecmp(element, (const xmlChar *) "lastupdate") == 0) {
-#ifdef TIME_T_IS_LONG
- status = get_xml_long(reader, &rrd->live_head->last_up);
-#else
-#ifdef TIME_T_IS_LONG_LONG
- status = get_xml_llong(reader, &rrd->live_head->last_up);
-#else
- if (sizeof(time_t) == sizeof(long)) {
- status = get_xml_long(reader,
- (long *)&rrd->live_head->last_up);
- }
- else if (sizeof(time_t) == sizeof(long long)) {
- status = get_xml_llong(reader,
- (long long *)&rrd->live_head->last_up);
- }
-#endif
-#endif
+ status = get_xml_time_t(reader, &rrd->live_head->last_up);
}
else if (xmlStrcasecmp(element, (const xmlChar *) "ds") == 0){
xmlFree(element);
unsigned long num_rows = rrd->rra_def[i].row_cnt;
unsigned long cur_row = rrd->rra_ptr[i].cur_row;
unsigned long ds_cnt = rrd->stat_head->ds_cnt;
+ if (num_rows > 0){
+ fwrite(rrd->rrd_value +
+ (rra_offset + num_rows - 1 - cur_row) * ds_cnt,
+ sizeof(rrd_value_t), (cur_row + 1) * ds_cnt, fh);
- fwrite(rrd->rrd_value +
- (rra_offset + num_rows - 1 - cur_row) * ds_cnt,
- sizeof(rrd_value_t), (cur_row + 1) * ds_cnt, fh);
+ fwrite(rrd->rrd_value + rra_offset * ds_cnt,
+ sizeof(rrd_value_t), (num_rows - 1 - cur_row) * ds_cnt, fh);
- fwrite(rrd->rrd_value + rra_offset * ds_cnt,
- sizeof(rrd_value_t), (num_rows - 1 - cur_row) * ds_cnt, fh);
-
- rra_offset += num_rows;
+ rra_offset += num_rows;
+ }
}
/* lets see if we had an error */