X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_update.c;h=de708df7564ff9fab0f6c30f6e4686c0b71d3f2a;hb=0e35f35b43f96e2a805b2c4d73c0b5ccf5361975;hp=9e8063e35733388295d9223a8df704092a3eccaf;hpb=bf7d0302ab2ff46038f7002a9eab76f4105c3cee;p=rrdtool.git diff --git a/src/rrd_update.c b/src/rrd_update.c index 9e8063e..de708df 100644 --- a/src/rrd_update.c +++ b/src/rrd_update.c @@ -5,6 +5,23 @@ ***************************************************************************** * $Id$ * $Log$ + * Revision 1.14 2003/11/11 19:46:21 oetiker + * replaced time_value with rrd_time_value as MacOS X introduced a struct of that name in their standard headers + * + * Revision 1.13 2003/11/11 19:38:03 oetiker + * rrd files should NOT change size ever ... bulk update code wa buggy. + * -- David M. Grimes + * + * Revision 1.12 2003/09/04 13:16:12 oetiker + * should not assigne but compare ... grrrrr + * + * Revision 1.11 2003/09/02 21:58:35 oetiker + * be pickier about what we accept in rrd_update. Complain if things do not work out + * + * Revision 1.10 2003/04/29 19:14:12 jake + * Change updatev RRA return from index_number to cf_nam, pdp_cnt. + * Also revert accidental addition of -I to aclocal MakeMakefile. + * * Revision 1.9 2003/04/25 18:35:08 jake * Alternate update interface, updatev. Returns info about CDPs written to disk as result of update. Output format is similar to rrd_info, a hash of key-values. * @@ -311,6 +328,7 @@ _rrd_update(char *filename, char *template, int argc, char **argv, /* numeric id of the current consolidation function */ rpnstack_t rpnstack; /* used for COMPUTE DS */ int version; /* rrd version */ + char *endptr; /* used in the conversion */ rpnstack_init(&rpnstack); @@ -451,7 +469,7 @@ _rrd_update(char *filename, char *template, int argc, char **argv, char *p; char *parsetime_error = NULL; enum {atstyle, normal} timesyntax; - struct time_value ds_tv; + struct rrd_time_value ds_tv; if (stepper == NULL){ rrd_set_error("failed duplication argv entry"); free(updvals); @@ -615,6 +633,15 @@ _rrd_update(char *filename, char *template, int argc, char **argv, case DST_COUNTER: case DST_DERIVE: if(rrd.pdp_prep[i].last_ds[0] != 'U'){ + for(ii=0;updvals[i+1][ii] != '\0';ii++){ + if(updvals[i+1][ii] < '0' || updvals[i+1][ii] > '9' || (ii==0 && updvals[i+1][ii] == '-')){ + rrd_set_error("not a simple integer: '%s'",updvals[i+1]); + break; + } + } + if (rrd_test_error()){ + break; + } pdp_new[i]= rrd_diff(updvals[i+1],rrd.pdp_prep[i].last_ds); if(dst_idx == DST_COUNTER) { /* simple overflow catcher sugestet by andres kroonmaa */ @@ -632,11 +659,29 @@ _rrd_update(char *filename, char *template, int argc, char **argv, } break; case DST_ABSOLUTE: - pdp_new[i]= atof(updvals[i+1]); + errno = 0; + pdp_new[i] = strtod(updvals[i+1],&endptr); + if (errno > 0){ + rrd_set_error("converting '%s' to float: %s",updvals[i+1],rrd_strerror(errno)); + break; + }; + if (endptr[0] != '\0'){ + rrd_set_error("conversion of '%s' to float not complete: tail '%s'",updvals[i+1],endptr); + break; + } rate = pdp_new[i] / interval; break; case DST_GAUGE: - pdp_new[i] = atof(updvals[i+1]) * interval; + errno = 0; + pdp_new[i] = strtod(updvals[i+1],&endptr) * interval; + if (errno > 0){ + rrd_set_error("converting '%s' to float: %s",updvals[i+1],rrd_strerror(errno)); + break; + }; + if (endptr[0] != '\0'){ + rrd_set_error("conversion of '%s' to float not complete: tail '%s'",updvals[i+1],endptr); + break; + } rate = pdp_new[i] / interval; break; default: @@ -1181,10 +1226,9 @@ _rrd_update(char *filename, char *template, int argc, char **argv, /* write other rows of the bulk update, if any */ scratch_idx = CDP_secondary_val; - for ( ; rra_step_cnt[i] > 1; - rra_step_cnt[i]--, rrd.rra_ptr[i].cur_row++) + for ( ; rra_step_cnt[i] > 1; rra_step_cnt[i]--) { - if (rrd.rra_ptr[i].cur_row == rrd.rra_def[i].row_cnt) + if (++rrd.rra_ptr[i].cur_row == rrd.rra_def[i].row_cnt) { #ifdef DEBUG fprintf(stderr,"Wraparound for RRA %s, %lu updates left\n", @@ -1441,15 +1485,16 @@ info_t iv.u_val = rrd -> cdp_prep[cdp_idx].scratch[CDP_scratch_idx].u_val; /* append info to the return hash */ pcdp_summary = info_push(pcdp_summary, - sprintf_alloc("[%d]RRA[%lu]DS[%s]", - *rra_time, rra_idx, rrd->ds_def[ds_idx].ds_nam), + sprintf_alloc("[%d]RRA[%s][%lu]DS[%s]", + *rra_time, rrd->rra_def[rra_idx].cf_nam, + rrd->rra_def[rra_idx].pdp_cnt, rrd->ds_def[ds_idx].ds_nam), RD_I_VAL, iv); } if(fwrite(&(rrd -> cdp_prep[cdp_idx].scratch[CDP_scratch_idx].u_val), sizeof(rrd_value_t),1,rrd_file) != 1) { rrd_set_error("writing rrd"); - return; + return 0; } *rra_current += sizeof(rrd_value_t); }