On Wed, Nov 30, 2022 at 10:36:08AM +0100, Claudio Jeker wrote: > I want to use the bgpctl ometric.c code in rpki-client to implement a > metrics output. Currently ometric_output_all() just dumps to stdout but > that does not work for rpki-client. Instead pass a FILE pointer to > ometric_output_all() and also return -1 if an error occured. With this > ometric usage becomes more versatile.
The *printf functions are documented to return a value less than 0 on error. Your diff assumes that value is -1 which I believe to be correct on OpenBSD. Is it safe to assume that this is the case for -portable? Should we ensure -1 is returned in the ometric_foo() functions, should the ometric_foo() functions be error checked with if (ometric_foo() < 0) or should we leave the diff as-is because I'm overthinking this? Other than that, the diff reads fine to me. > -- > :wq Claudio > > Index: ometric.c > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpctl/ometric.c,v > retrieving revision 1.2 > diff -u -p -r1.2 ometric.c > --- ometric.c 1 Nov 2022 13:35:09 -0000 1.2 > +++ ometric.c 30 Nov 2022 08:56:26 -0000 > @@ -246,66 +246,77 @@ ometric_type(enum ometric_type type) > } > } > > -static void > -ometric_output_labels(const struct olabels *ol) > +static int > +ometric_output_labels(FILE *out, const struct olabels *ol) > { > struct olabel *l; > const char *comma = ""; > > - if (ol == NULL) { > - printf(" "); > - return; > - } > + if (ol == NULL) > + return fprintf(out, " "); > > - printf("{"); > + if (fprintf(out, "{") == -1) > + return -1; > > while (ol != NULL) { > STAILQ_FOREACH(l, &ol->labels, entry) { > - printf("%s%s=\"%s\"", comma, l->key, l->value); > + if (fprintf(out, "%s%s=\"%s\"", comma, l->key, > + l->value) == -1) > + return -1; > comma = ","; > } > ol = ol->next; > } > > - printf("} "); > + return fprintf(out, "} "); > } > > -static void > -ometric_output_value(const struct ovalue *ov) > +static int > +ometric_output_value(FILE *out, const struct ovalue *ov) > { > switch (ov->valtype) { > case OVT_INTEGER: > - printf("%llu", ov->value.i); > - return; > + return fprintf(out, "%llu", ov->value.i); > case OVT_DOUBLE: > - printf("%g", ov->value.f); > - return; > + return fprintf(out, "%g", ov->value.f); > } > + return -1; > } > > /* > * Output all metric values with TYPE and optional HELP strings. > */ > -void > -ometric_output_all(void) > +int > +ometric_output_all(FILE *out) > { > struct ometric *om; > struct ovalue *ov; > > STAILQ_FOREACH(om, &ometrics, entry) { > if (om->help) > - printf("# HELP %s %s\n", om->name, om->help); > - printf("# TYPE %s %s\n", om->name, ometric_type(om->type)); > + if (fprintf(out, "# HELP %s %s\n", om->name, > + om->help) == -1) > + return -1; > + > + if (fprintf(out, "# TYPE %s %s\n", om->name, > + ometric_type(om->type)) == -1) > + return -1; > > STAILQ_FOREACH(ov, &om->vals, entry) { > - printf("%s", om->name); > - ometric_output_labels(ov->labels); > - ometric_output_value(ov); > - printf("\n"); > + if (fprintf(out, "%s", om->name) == -1) > + return -1; > + if (ometric_output_labels(out, ov->labels) == -1) > + return -1; > + if (ometric_output_value(out, ov) == -1) > + return -1; > + if (fprintf(out, "\n") == -1) > + return -1; > } > } > > - printf("# EOF\n"); > + if (fprintf(out, "# EOF\n") == -1) > + return -1; > + return 0; > } > > /* > Index: ometric.h > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpctl/ometric.h,v > retrieving revision 1.1 > diff -u -p -r1.1 ometric.h > --- ometric.h 17 Oct 2022 12:01:19 -0000 1.1 > +++ ometric.h 30 Nov 2022 08:49:36 -0000 > @@ -36,9 +36,8 @@ void ometric_free_all(void); > struct olabels *olabels_new(const char * const *, const char **); > void olabels_free(struct olabels *); > > -void ometric_output_all(void); > +int ometric_output_all(FILE *); > > -/* XXX how to pass attributes */ > /* functions to set gauge and counter metrics */ > void ometric_set_int(struct ometric *, uint64_t, struct olabels *); > void ometric_set_float(struct ometric *, double, struct olabels *); > Index: output_ometric.c > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpctl/output_ometric.c,v > retrieving revision 1.3 > diff -u -p -r1.3 output_ometric.c > --- output_ometric.c 7 Nov 2022 11:33:24 -0000 1.3 > +++ output_ometric.c 30 Nov 2022 08:48:32 -0000 > @@ -75,9 +75,7 @@ ometric_head(struct parse_result *arg) > values[3] = NULL; > > ol = olabels_new(keys, values); > - > ometric_set_info(bgpd_info, NULL, NULL, ol); > - > olabels_free(ol); > > /* > @@ -324,7 +322,7 @@ ometric_tail(void) > (double)elapsed_time.tv_usec / 1000000; > > ometric_set_float(bgpd_scrape_time, scrape, NULL); > - ometric_output_all(); > + ometric_output_all(stdout); > > ometric_free_all(); > } >