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

Reply via email to