/*****************************************************************************
- * RRDtool 1.2.13 Copyright by Tobi Oetiker, 1997-2006
+ * RRDtool 1.2.23 Copyright by Tobi Oetiker, 1997-2007
*****************************************************************************
* rrd_restore.c creates new rrd from data dumped by rrd_dump.c
*****************************************************************************/
void xml_lc(char*);
int skip(char **);
+int skipxml(char **);
int eat_tag(char **, char *);
int read_tag(char **, char *, char *, void *);
int xml2rrd(char*, rrd_t*, char);
}
}
-int skip(char **buf){
+int skipxml(char **buf){
char *ptr;
ptr=(*buf);
do {
(*buf)=ptr;
while((*(ptr+1)) && ((*ptr)==' ' || (*ptr)=='\r' || (*ptr)=='\n' || (*ptr)=='\t')) ptr++;
+ if (strncmp(ptr,"<?xml",4) == 0) {
+ ptr= strstr(ptr,"?>");
+ if (ptr) ptr+=2; else {
+ rrd_set_error("Dangling XML header");
+ (*buf) = NULL;
+ return -1;
+ }
+ }
+ } while ((*buf)!=ptr);
+ return 1;
+}
+
+int skip(char **buf){
+ char *ptr;
+ if ((buf == NULL) || (*buf == NULL))
+ return -1;
+ ptr=(*buf);
+ do {
+ (*buf)=ptr;
+ while((*(ptr+1)) && ((*ptr)==' ' || (*ptr)=='\r' || (*ptr)=='\n' || (*ptr)=='\t')) ptr++;
if (strncmp(ptr,"<!--",4) == 0) {
ptr= strstr(ptr,"-->");
if (ptr) ptr+=3; else {
ptr2=buf;
ptr3=buf;
/* start with an RRD tag */
+
+ skipxml(&ptr);
eat_tag(&ptr,"rrd");
/* allocate static header */
read_tag(&ptr2,"max","%lf",&(rrd->ds_def[rrd->stat_head->ds_cnt-1].par[DS_max_val].u_val));
} else { /* DST_CDEF */
char buffer[1024];
- read_tag(&ptr2,"cdef","%s",buffer);
+ read_tag(&ptr2,"cdef","%1000s",buffer);
parseCDEF_DS(buffer,rrd,rrd -> stat_head -> ds_cnt - 1);
+ if (rrd_test_error()) return -1;
}
read_tag(&ptr2,"last_ds","%30s",rrd->pdp_prep[rrd->stat_head->ds_cnt-1].last_ds);
if((rrd->cdp_prep = rrd_realloc(rrd->cdp_prep,
rrd->stat_head->rra_cnt
*rrd->stat_head->ds_cnt*sizeof(cdp_prep_t)))==NULL){
- rrd_set_error("allocating cdp_prep"); return -1; }
+ rrd_set_error("allocating cdp_prep"); return -1; }
memset(&(rrd->cdp_prep[rrd->stat_head->ds_cnt*(rrd->stat_head->rra_cnt-1)]),
0, rrd->stat_head->ds_cnt*sizeof(cdp_prep_t));
read_tag(&ptr2, "xff","%lf",
&(rrd->rra_def[rra_index].par[RRA_cdp_xff_val].u_val));
} else {
- eat_tag(&ptr2, "params");
+ if (eat_tag(&ptr2, "params") != 1) {
+ rrd_set_error("could not find params tag to eat and skip");
+ return -1;
+ }
skip(&ptr2);
/* backwards compatibility w/ old patch */
if (strncmp(ptr2, "<value>",7) == 0) {