On Wed, Nov 30, 2022 at 07:05:25PM +0100, Claudio Jeker wrote: > Change ometric_set_int_with_label() to ometric_set_int_with_labels(). > In rpki-client I need to add more than one extra label and extending this > interface seems to be the least ugly solution. > I use C99 compound literals to make this less ugly and wrapped that magic > into the macro EV(). IMO this is a compromise to keep the code short.
What does EV stand for? > Am I abusing to much C99 magic here? I don't think so. snmp and snmpd use similar constructs. I don't currently have access to a gcc arch, so I can't check if old gcc is happy. If you have such a machine running, it might be worth checking it is before commit. ok two small nits below > -- > :wq Claudio > > Index: ometric.c > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpctl/ometric.c,v > retrieving revision 1.3 > diff -u -p -r1.3 ometric.c > --- ometric.c 30 Nov 2022 10:15:01 -0000 1.3 > +++ ometric.c 30 Nov 2022 17:55:09 -0000 > @@ -209,15 +209,10 @@ olabels_free(struct olabels *ol) > * value needs to be freed with olabels_free(). > */ > static struct olabels * > -olabels_add_extra(struct olabels *ol, const char *key, const char *value) > +olabels_add_extras(struct olabels *ol, const char **keys, const char > **values) > { > - const char *keys[2] = { key, NULL }; > - const char *values[2] = { value, NULL }; > struct olabels *new; > > - if (value == NULL || *value == '\0') > - return ol; > - > new = olabels_new(keys, values); > new->next = olabels_ref(ol); > > @@ -382,10 +377,8 @@ ometric_set_info(struct ometric *om, con > if (om->type != OMT_INFO) > errx(1, "%s incorrect ometric type", __func__); > > - if (keys != NULL) { > - extra = olabels_new(keys, values); > - extra->next = olabels_ref(ol); > - } > + if (keys != NULL) > + extra = olabels_add_extras(ol, keys, values); > > ometric_set_int_value(om, 1, extra != NULL ? extra : ol); > olabels_free(extra); > @@ -397,7 +390,6 @@ ometric_set_info(struct ometric *om, con > void > ometric_set_state(struct ometric *om, const char *state, struct olabels *ol) > { > - struct olabels *extra; > size_t i; > int val; > > @@ -410,9 +402,8 @@ ometric_set_state(struct ometric *om, co > else > val = 0; > > - extra = olabels_add_extra(ol, om->name, om->stateset[i]); > - ometric_set_int_value(om, val, extra); > - olabels_free(extra); > + ometric_set_int_with_labels(om, val, EV(om->name), > + EV(om->stateset[i]), ol); > } > } > > @@ -421,12 +412,12 @@ ometric_set_state(struct ometric *om, co > * the value is copied into the extra label. > */ > void > -ometric_set_int_with_label(struct ometric *om, uint64_t val, const char *key, > - const char *value, struct olabels *ol) > +ometric_set_int_with_labels(struct ometric *om, uint64_t val, > + const char **keys, const char **values, struct olabels *ol) > { > struct olabels *extra; > > - extra = olabels_add_extra(ol, key, value); > + extra = olabels_add_extras(ol, keys, values); > ometric_set_int(om, val, extra); > olabels_free(extra); > } > Index: ometric.h > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpctl/ometric.h,v > retrieving revision 1.2 > diff -u -p -r1.2 ometric.h > --- ometric.h 30 Nov 2022 10:15:01 -0000 1.2 > +++ ometric.h 30 Nov 2022 17:47:47 -0000 > @@ -44,5 +44,6 @@ void ometric_set_float(struct ometric *, > void ometric_set_info(struct ometric *, const char **, const char **, > struct olabels *); > void ometric_set_state(struct ometric *, const char *, struct olabels *); > -void ometric_set_int_with_label(struct ometric *, uint64_t, const char *, > - const char *, struct olabels *); > +void ometric_set_int_with_labels(struct ometric *, uint64_t, const char **, > + const char **, struct olabels *); > +#define EV(...) (const char *[]){ __VA_ARGS__, NULL } > Index: output_ometric.c > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpctl/output_ometric.c,v > retrieving revision 1.4 > diff -u -p -r1.4 output_ometric.c > --- output_ometric.c 30 Nov 2022 10:15:01 -0000 1.4 > +++ output_ometric.c 30 Nov 2022 17:51:28 -0000 > @@ -203,27 +203,31 @@ ometric_neighbor_stats(struct peer *p, s > ometric_set_int(peer_prefixes_transmit, p->stats.prefix_out_cnt, ol); > ometric_set_int(peer_prefixes_receive, p->stats.prefix_cnt, ol); > > - ometric_set_int_with_label(peer_message_transmit, > - p->stats.msg_sent_open, "message", "open", ol); > - ometric_set_int_with_label(peer_message_transmit, > - p->stats.msg_sent_notification, "message", "notification", ol); > - ometric_set_int_with_label(peer_message_transmit, > - p->stats.msg_sent_update, "message", "update", ol); > - ometric_set_int_with_label(peer_message_transmit, > - p->stats.msg_sent_keepalive, "message", "keepalive", ol); > - ometric_set_int_with_label(peer_message_transmit, > - p->stats.msg_sent_rrefresh, "message", "route_refresh", ol); > - > - ometric_set_int_with_label(peer_message_recieve, > - p->stats.msg_rcvd_open, "message", "open", ol); > - ometric_set_int_with_label(peer_message_recieve, > - p->stats.msg_rcvd_notification, "message", "notification", ol); > - ometric_set_int_with_label(peer_message_recieve, > - p->stats.msg_rcvd_update, "message", "update", ol); > - ometric_set_int_with_label(peer_message_recieve, > - p->stats.msg_rcvd_keepalive, "message", "keepalive", ol); > - ometric_set_int_with_label(peer_message_recieve, > - p->stats.msg_rcvd_rrefresh, "message", "route_refresh", ol); > + ometric_set_int_with_labels(peer_message_transmit, > + p->stats.msg_sent_open, EV("messages"), EV("open"), ol); > + ometric_set_int_with_labels(peer_message_transmit, > + p->stats.msg_sent_notification, EV("messages"), EV("notification"), > + ol); > + ometric_set_int_with_labels(peer_message_transmit, > + p->stats.msg_sent_update, EV("messages"), EV("update"), ol); > + ometric_set_int_with_labels(peer_message_transmit, > + p->stats.msg_sent_keepalive, EV("messages"), EV("keepalive"), ol); > + ometric_set_int_with_labels(peer_message_transmit, > + p->stats.msg_sent_rrefresh, EV("messages"), EV("route_refresh"), > + ol); > + > + ometric_set_int_with_labels(peer_message_recieve, Could you fix the typo? receive, not recieve. Perhaps a separate commit. > + p->stats.msg_rcvd_open, EV("messages"), EV("open"), ol); > + ometric_set_int_with_labels(peer_message_recieve, > + p->stats.msg_rcvd_notification, EV("messages"), EV("notification"), > + ol); > + ometric_set_int_with_labels(peer_message_recieve, > + p->stats.msg_rcvd_update, EV("messages"), EV("update"), ol); > + ometric_set_int_with_labels(peer_message_recieve, > + p->stats.msg_rcvd_keepalive, EV("messages"), EV("keepalive"), ol); > + ometric_set_int_with_labels(peer_message_recieve, > + p->stats.msg_rcvd_rrefresh, EV("messages"), EV("route_refresh"), > + ol); > > ometric_set_int(peer_update_transmit, p->stats.prefix_sent_update, ol); > ometric_set_int(peer_update_pending, p->stats.pending_update, ol); > @@ -249,13 +253,14 @@ ometric_rib_mem_element(const char *v, u > uint64_t refs) > { > if (count != UINT64_MAX) > - ometric_set_int_with_label(rde_mem_count, count, "type", v, > - NULL); > + ometric_set_int_with_labels(rde_mem_count, count, > + EV("type"), EV(v), NULL); > if (size != UINT64_MAX) > - ometric_set_int_with_label(rde_mem_size, size, "type", v, NULL); > + ometric_set_int_with_labels(rde_mem_size, size, > + EV("type"), EV(v), NULL); > if (refs != UINT64_MAX) > - ometric_set_int_with_label(rde_mem_ref_count, refs, "type", v, > - NULL); > + ometric_set_int_with_labels(rde_mem_ref_count, refs, > + EV("type"), EV(v), NULL); > } > > static void > @@ -297,14 +302,15 @@ ometric_rib_mem(struct rde_memstats *sta > stats->attr_data, UINT64_MAX); > > ometric_set_int(rde_table_count, stats->aset_cnt, NULL); > - ometric_set_int_with_label(rde_set_size, stats->aset_size, > - "type", "as_set", NULL); > - ometric_set_int_with_label(rde_set_count, stats->aset_nmemb, > - "type", "as_set", NULL); > - ometric_set_int_with_label(rde_set_size, stats->pset_size, > - "type", "prefix_set", NULL); > - ometric_set_int_with_label(rde_set_count, stats->pset_cnt, > - "type", "prefix_set", NULL); > + > + ometric_set_int_with_labels(rde_set_size, stats->aset_size, > + EV("type"), EV("as_set"), NULL); please fix indent: four spaces indent before EV("type"), not three (also in the lines below). > + ometric_set_int_with_labels(rde_set_count, stats->aset_nmemb, > + EV("type"), EV("as_set"), NULL); > + ometric_set_int_with_labels(rde_set_size, stats->pset_size, > + EV("type"), EV("prefix_set"), NULL); > + ometric_set_int_with_labels(rde_set_count, stats->pset_cnt, > + EV("type"), EV("prefix_set"), NULL); > ometric_rib_mem_element("set_total", UINT64_MAX, > stats->aset_size + stats->pset_size, UINT64_MAX); > } >