From aeb1012997acabdd280557487d006a73c29cd5eb Mon Sep 17 00:00:00 2001 From: Přemysl Janouch Date: Sun, 21 Sep 2014 03:06:17 +0200 Subject: Group the output properly Somehow I must have forgotten about transports at some point. --- ponymap.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/ponymap.c b/ponymap.c index a4cae9f..1dc1792 100644 --- a/ponymap.c +++ b/ponymap.c @@ -1299,11 +1299,12 @@ target_dump_json (struct target *self, struct target_dump_data *data) json_object_set_new (o, "services", services); struct service *last_service = NULL; + struct transport *last_transport = NULL; json_t *service, *ports; for (size_t i = 0; i < data->results_len; i++) { struct unit *u = data->results[i]; - if (u->service != last_service) + if (u->service != last_service || u->transport != last_transport) { service = json_object (); ports = json_array (); @@ -1316,6 +1317,7 @@ target_dump_json (struct target *self, struct target_dump_data *data) json_object_set_new (service, "ports", ports); last_service = u->service; + last_transport = u->transport; } json_t *port = json_object (); @@ -1346,11 +1348,12 @@ target_dump_terminal (struct target *self, struct target_dump_data *data) root->bold = true; struct service *last_service = NULL; + struct transport *last_transport = NULL; struct node *service, **s_tail = &root->children, *port, **p_tail; for (size_t i = 0; i < data->results_len; i++) { struct unit *u = data->results[i]; - if (u->service != last_service) + if (u->service != last_service || u->transport != last_transport) { *s_tail = service = node_new (xstrdup_printf ("%s (%s)", u->service->name, u->transport->name)); @@ -1358,6 +1361,7 @@ target_dump_terminal (struct target *self, struct target_dump_data *data) p_tail = &service->children; last_service = u->service; + last_transport = u->transport; } port = *p_tail = node_new (xstrdup_printf ("port %" PRIu16, u->port)); @@ -1379,10 +1383,12 @@ target_dump_terminal (struct target *self, struct target_dump_data *data) } static int -unit_cmp_by_service (const void *ax, const void *bx) +unit_cmp_by_group (const void *ax, const void *bx) { - const struct unit **a = (void *) ax, **b = (void *) bx; - return strcmp ((*a)->service->name, (*b)->service->name); + const struct unit **ay = (void *) ax, **by = (void *) bx; + const struct unit *a = *ay, *b = *by; + int x = strcmp (a->service->name, b->service->name); + return x ? x : strcmp (a->transport->name, b->transport->name); } static void @@ -1403,7 +1409,7 @@ target_dump_results (struct target *self) sorted[--len] = iter; // Sort them by service name so that they can be grouped - qsort (sorted, N_ELEMENTS (sorted), sizeof *sorted, unit_cmp_by_service); + qsort (sorted, N_ELEMENTS (sorted), sizeof *sorted, unit_cmp_by_group); if (ctx->json_results) target_dump_json (self, &data); -- cgit v1.2.3-70-g09d2