On Wed, Nov 30, 2022 at 11:01:01AM +0100, Theo Buehler wrote: > 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.
Ah shit, I wanted to use the same idiom that we use in rpki-client but did not pay attention to the < 0 checks. I will replace all == -1 checks with < 0. For the ometric_output_* functions I think checking against < 0 is better since we can directly return fprintf(). > > -- > > :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(); > > } > > > -- :wq Claudio