+ if (rrd_parse_make_vname(line,eaten,gdp,im)) return 1;
+ i=scan_for_col(&line[*eaten],254,gdp->rrd);
+ if (line[*eaten+i]!=':') {
+ rrd_set_error("Problems reading database name");
+ return 1;
+ }
+ (*eaten)+=++i;
+ dprintf("- using file '%s'\n",gdp->rrd);
+
+ i=0;
+ sscanf(&line[*eaten], DS_NAM_FMT ":%n", gdp->ds_nam,&i);
+ if (!i) {
+ rrd_set_error("Cannot parse DS in '%s'",line);
+ return 1;
+ }
+ (*eaten)+=i;
+ dprintf("- using DS '%s'\n",gdp->ds_nam);
+
+ if (rrd_parse_CF(line,eaten,gdp,&gdp->cf)) return 1;
+ gdp->cf_reduce = gdp->cf;
+
+ if (line[*eaten]=='\0') return 0;
+
+ while (1) {
+ dprintf("- optional parameter follows: %s\n", &line[*eaten]);
+ i=0;
+ sscanf(&line[*eaten], "%6[a-z]=%n", command, &i);
+ if (!i) {
+ rrd_set_error("Parse error in '%s'",line);
+ return 1;
+ }
+ (*eaten)+=i;
+ dprintf("- processing '%s'\n",command);
+ if (!strcmp("reduce",command)) {
+ if (rrd_parse_CF(line,eaten,gdp,&gdp->cf_reduce)) return 1;
+ if (line[*eaten] != '\0')
+ (*eaten)--;
+ } else if (!strcmp("step",command)) {
+ i=0;
+ sscanf(&line[*eaten],"%lu%n",&gdp->step,&i);
+ gdp->step_orig = gdp->step;
+ (*eaten)+=i;
+ dprintf("- using step %lu\n",gdp->step);
+ } else if (!strcmp("start",command)) {
+ i=scan_for_col(&line[*eaten],255,tmpstr);
+ (*eaten)+=i;
+ if ((parsetime_error = parsetime(tmpstr, &start_tv))) {
+ rrd_set_error( "start time: %s", parsetime_error );
+ return 1;
+ }
+ dprintf("- done parsing: '%s'\n",&line[*eaten]);
+ } else if (!strcmp("end",command)) {
+ i=scan_for_col(&line[*eaten],255,tmpstr);
+ (*eaten)+=i;
+ if ((parsetime_error = parsetime(tmpstr, &end_tv))) {
+ rrd_set_error( "end time: %s", parsetime_error );
+ return 1;
+ }
+ dprintf("- done parsing: '%s'\n",&line[*eaten]);
+ } else {
+ rrd_set_error("Parse error in '%s'",line);
+ return 1;
+ }
+ if (line[*eaten]=='\0') break;
+ if (line[*eaten]!=':') {
+ dprintf("- Expected to see end of string but got '%s'\n",\
+ &line[*eaten]);
+ rrd_set_error("Parse error in '%s'",line);
+ return 1;
+ }
+ (*eaten)++;
+ }
+ if (proc_start_end(&start_tv,&end_tv,&start_tmp,&end_tmp) == -1){
+ /* error string is set in parsetime.c */
+ return 1;
+ }
+ if (start_tmp < 3600*24*365*10) {
+ rrd_set_error("the first entry to fetch should be "
+ "after 1980 (%ld)",start_tmp);
+ return 1;
+ }
+
+ if (end_tmp < start_tmp) {
+ rrd_set_error("start (%ld) should be less than end (%ld)",
+ start_tmp, end_tmp);
+ return 1;
+ }
+
+ gdp->start = start_tmp;
+ gdp->end = end_tmp;
+ gdp->start_orig = start_tmp;
+ gdp->end_orig = end_tmp;
+
+ dprintf("- start time %lu\n",gdp->start);
+ dprintf("- end time %lu\n",gdp->end);
+
+ return 0;
+}
+
+int
+rrd_parse_vdef(const char *const line, unsigned int *const eaten, graph_desc_t *const gdp, image_desc_t *const im) {
+ char tmpstr[MAX_VNAME_LEN+1]; /* vname\0 */
+ int i=0;
+
+ dprintf("- parsing '%s'\n",&line[*eaten]);
+ if (rrd_parse_make_vname(line,eaten,gdp,im)) return 1;
+
+ sscanf(&line[*eaten], DEF_NAM_FMT ",%n", tmpstr,&i);
+ if (!i) {
+ rrd_set_error("Cannot parse line '%s'",line);
+ return 1;
+ }
+ if ((gdp->vidx=find_var(im,tmpstr))<0) {
+ rrd_set_error("Not a valid vname: %s in line %s",tmpstr,line);
+ return 1;
+ }
+ if ( im->gdes[gdp->vidx].gf != GF_DEF
+ && im->gdes[gdp->vidx].gf != GF_CDEF) {
+ rrd_set_error("variable '%s' not DEF nor "
+ "CDEF in VDEF '%s'", tmpstr,gdp->vname);
+ return 1;
+ }
+ dprintf("- found vname: '%s' vidx %li\n",tmpstr,gdp->vidx);
+ (*eaten)+=i;
+
+ dprintf("- calling vdef_parse with param '%s'\n",&line[*eaten]);
+ vdef_parse(gdp,&line[*eaten]);
+ while (line[*eaten]!='\0'&&line[*eaten]!=':')
+ (*eaten)++;
+
+ return 0;
+}
+
+int
+rrd_parse_cdef(const char *const line, unsigned int *const eaten, graph_desc_t *const gdp, image_desc_t *const im) {
+ dprintf("- parsing '%s'\n",&line[*eaten]);
+ if (rrd_parse_make_vname(line,eaten,gdp,im)) return 1;
+ if ((gdp->rpnp = rpn_parse(
+ (void *)im,
+ &line[*eaten],
+ &find_var_wrapper)
+ )==NULL) {
+ rrd_set_error("invalid rpn expression in: %s",&line[*eaten]);
+ return 1;
+ };
+ while (line[*eaten]!='\0'&&line[*eaten]!=':')
+ (*eaten)++;
+ return 0;