X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_restore.c;h=39148e89e80dc490bfd2ab946b91029d02448fba;hp=32bfdebc47a8c4d60617643e60ca81e3a75fc0e0;hb=HEAD;hpb=1dc3aa28e1aaf15d1efdfa04a570f301fe29bfbc diff --git a/src/rrd_restore.c b/src/rrd_restore.c index 32bfdeb..39148e8 100644 --- a/src/rrd_restore.c +++ b/src/rrd_restore.c @@ -1,5 +1,5 @@ /***************************************************************************** - * RRDtool 1.3.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: @@ -9,12 +9,15 @@ * $Id$ *************************************************************************** */ +#include "rrd_tool.h" +#include "rrd_rpncalc.h" + #include #include #include #include #include - +#include #ifndef WIN32 # include /* for off_t */ @@ -30,8 +33,6 @@ # define close _close #endif -#include "rrd_tool.h" -#include "rrd_rpncalc.h" #define ARRAY_LENGTH(a) (sizeof (a) / sizeof ((a)[0])) @@ -118,7 +119,19 @@ static int expect_element_end ( char *exp_name) { xmlChar *name; - name = get_xml_element(reader); + /* maybe we are already on the end element ... lets see */ + if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT){ + xmlChar *temp; + xmlChar *temp2; + temp = xmlTextReaderName(reader); + temp2 = (xmlChar*)sprintf_alloc("/%s", temp); + name = xmlStrdup(temp2); + xmlFree(temp); + free(temp2); + } else { + name = get_xml_element(reader); + } + if (name == NULL) return -1; if (xmlStrcasecmp(name+1,(xmlChar *)exp_name) != 0 || name[0] != '/'){ @@ -146,14 +159,24 @@ static xmlChar* get_xml_text ( if (type == XML_READER_TYPE_ELEMENT){ xmlChar *name; name = xmlTextReaderName(reader); - rrd_set_error("line %d: expected a value but found an <%s> element", + rrd_set_error("line %d: expected a value but found a <%s> element", xmlTextReaderGetParserLineNumber(reader), name); xmlFree(name); return NULL; } + + /* trying to read text from we end up here + lets return an empty string insead. This is a tad optimistic + since we do not check if it is actually and not + we got, but first we do not know if we expect and second + we the whole implementation is on the optimistic side. */ + if (type == XML_READER_TYPE_END_ELEMENT){ + return xmlStrdup(BAD_CAST ""); + } + /* skip all other non-text */ - if (xmlTextReaderNodeType(reader) != XML_READER_TYPE_TEXT) + if (type != XML_READER_TYPE_TEXT) continue; text = xmlTextReaderValue(reader); @@ -196,17 +219,29 @@ static int get_xml_string( } -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); @@ -217,7 +252,7 @@ static int get_xml_long( return 0; } return -1; -} /* get_xml_long */ +} /* get_xml_time_t */ static int get_xml_ulong( xmlTextReaderPtr reader, @@ -243,53 +278,26 @@ static int get_xml_ulong( 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) { - char *text; + xmlChar *text; double temp; - if ((text = (char *)get_xml_text(reader))!= NULL){ - if (strcasestr(text,"nan")){ + if ((text = get_xml_text(reader))!= NULL){ + if (xmlStrcasestr(text,(xmlChar *)"nan")){ *value = DNAN; xmlFree(text); return 0; } - else if (strcasestr(text,"-inf")){ + else if (xmlStrcasestr(text,(xmlChar *)"-inf")){ *value = -DINF; xmlFree(text); return 0; } - else if (strcasestr(text,"+inf") - || strcasestr(text,"inf")){ + else if (xmlStrcasestr(text,(xmlChar *)"+inf") + || xmlStrcasestr(text,(xmlChar *)"inf")){ *value = DINF; xmlFree(text); return 0; @@ -780,7 +788,7 @@ static int parse_tag_rra( /* 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) @@ -819,7 +827,7 @@ static int parse_tag_rra( return status; } else if (xmlStrcasecmp(element,(const xmlChar *) "/rra") == 0){ - xmlFree(element); + xmlFree(element); return status; } /* }}} */ else { @@ -1017,22 +1025,7 @@ static int parse_tag_rrd( 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); @@ -1187,15 +1180,16 @@ static int write_file( 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 */ @@ -1214,7 +1208,7 @@ int rrd_restore( char **argv) { rrd_t *rrd; - + char *old_locale; /* init rrd clean */ optind = 0; opterr = 0; /* initialize getopt */ @@ -1256,7 +1250,12 @@ int rrd_restore( return (-1); } + old_locale = setlocale(LC_NUMERIC, "C"); + rrd = parse_file(argv[optind]); + + setlocale(LC_NUMERIC, old_locale); + if (rrd == NULL) return (-1);