X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_restore.c;h=864018fd76ff90130a155f766ec8587ee438fcad;hb=e8615c408aaed016d27e4d0a3c21513409b4d6cf;hp=fa5e412f856fb939f5f4a35cfabe36ac8ad96f74;hpb=d1d774b37f93718829addf71d7af43b295eba587;p=rrdtool.git diff --git a/src/rrd_restore.c b/src/rrd_restore.c index fa5e412..864018f 100644 --- a/src/rrd_restore.c +++ b/src/rrd_restore.c @@ -6,6 +6,7 @@ #include "rrd_tool.h" #include "rrd_rpncalc.h" +#include /* Prototypes */ @@ -14,7 +15,7 @@ int skip(char **); int eat_tag(char **, char *); int read_tag(char **, char *, char *, void *); int xml2rrd(char*, rrd_t*, char); -int rrd_write(char *, rrd_t *); +int rrd_write(char *, rrd_t *, char); void parse_patch1028_RRA_params(char **buf, rrd_t *rrd, int rra_index); void parse_patch1028_CDP_params(char **buf, rrd_t *rrd, int rra_index, int ds_index); void parse_FAILURES_history(char **buf, rrd_t *rrd, int rra_index, int ds_index); @@ -121,10 +122,16 @@ int xml2rrd(char* buf, rrd_t* rrd, char rc){ strcpy(rrd->stat_head->cookie,RRD_COOKIE); read_tag(&ptr,"version","%4[0-9]",rrd->stat_head->version); /* added primitive version checking */ - if (atoi(rrd -> stat_head -> version) != 2) + if (atoi(rrd -> stat_head -> version) > atoi(RRD_VERSION) ) { - rrd_set_error("Incompatible file version, detected version %s, required version %s\n", - rrd -> stat_head -> version, RRD_VERSION); + rrd_set_error("Incompatible file version, detected version %s is bigger than supported version %s\n", + rrd -> stat_head -> version, RRD_VERSION ); + free(rrd -> stat_head); + return -1; + } + if (atoi(rrd -> stat_head -> version) < 2) + { + rrd_set_error("Can only restore version >= 2 (Not %s). Dump your rrd using a current rrdtool dump.", rrd -> stat_head -> version ); free(rrd -> stat_head); return -1; } @@ -398,18 +405,23 @@ int xml2rrd(char* buf, rrd_t* rrd, char rc){ /* create and empty rrd file according to the specs given */ int -rrd_write(char *file_name, rrd_t *rrd) +rrd_write(char *file_name, rrd_t *rrd, char force_overwrite) { unsigned long i,ii,val_cnt; FILE *rrd_file=NULL; + int fdflags; + int fd; if (strcmp("-",file_name)==0){ - *rrd_file= *stdout; + rrd_file= stdout; } else { - int fd = open(file_name,O_RDWR|O_CREAT|O_EXCL); + fdflags = O_WRONLY|O_CREAT; + if (force_overwrite == 0) { + fdflags |= O_EXCL; + } + fd = open(file_name,fdflags,0666); if (fd == -1 || (rrd_file = fdopen(fd,"wb")) == NULL) { - rrd_set_error("creating '%s': %s",file_name,strerror(errno)); - rrd_free(rrd); + rrd_set_error("creating '%s': %s",file_name,rrd_strerror(errno)); if (fd != -1) close(fd); return(-1); @@ -423,8 +435,12 @@ rrd_write(char *file_name, rrd_t *rrd) fwrite(rrd->rra_def, sizeof(rra_def_t), rrd->stat_head->rra_cnt, rrd_file); - - fwrite(rrd->live_head, sizeof(live_head_t),1, rrd_file); + + /* maybe the xml hold an old formatted rrd */ + if (atoi(rrd->stat_head->version) < 3) + fwrite(&(rrd->live_head->last_up), sizeof(long),1, rrd_file); + else + fwrite(rrd->live_head, sizeof(live_head_t),1, rrd_file); fwrite( rrd->pdp_prep, sizeof(pdp_prep_t),rrd->stat_head->ds_cnt,rrd_file); @@ -459,11 +475,12 @@ rrd_restore(int argc, char **argv) rrd_t rrd; char *buf; char rc = 0; + char force_overwrite = 0; /* init rrd clean */ rrd_init(&rrd); if (argc<3) { - rrd_set_error("usage rrdtool %s [--range-check/-r] file.xml file.rrd",argv[0]); + rrd_set_error("usage rrdtool %s [--range-check/-r] [--force-overwrite/-f] file.xml file.rrd",argv[0]); return -1; } @@ -471,13 +488,14 @@ rrd_restore(int argc, char **argv) static struct option long_options[] = { {"range-check", required_argument, 0, 'r'}, + {"force-overwrite", required_argument, 0, 'f'}, {0,0,0,0} }; int option_index = 0; int opt; - opt = getopt_long(argc, argv, "r", long_options, &option_index); + opt = getopt_long(argc, argv, "r:f", long_options, &option_index); if (opt == EOF) break; @@ -486,6 +504,9 @@ rrd_restore(int argc, char **argv) case 'r': rc=1; break; + case 'f': + force_overwrite=1; + break; default: rrd_set_error("usage rrdtool %s [--range-check|-r] file.xml file.rrd",argv[0]); return -1; @@ -502,7 +523,7 @@ rrd_restore(int argc, char **argv) return -1; } free(buf); - if(rrd_write(argv[optind+1],&rrd)==-1){ + if(rrd_write(argv[optind+1],&rrd,force_overwrite)==-1){ rrd_free(&rrd); return -1; }; @@ -512,6 +533,7 @@ rrd_restore(int argc, char **argv) /* a backwards compatibility routine that will parse the RRA params section * generated by the aberrant patch to 1.0.28. */ + void parse_patch1028_RRA_params(char **buf, rrd_t *rrd, int rra_index) { @@ -556,7 +578,7 @@ parse_FAILURES_history(char **buf, rrd_t *rrd, int rra_index, int ds_index) { char history[MAX_FAILURES_WINDOW_LEN + 1]; char *violations_array; - short i; + unsigned short i; /* 28 = MAX_FAILURES_WINDOW_LEN */ read_tag(buf, "history", "%28[0-1]", history);