Print community table as a debug message
authorJennifer Richards <jennifer@painless-security.com>
Fri, 16 Jun 2017 17:52:23 +0000 (13:52 -0400)
committerJennifer Richards <jennifer@painless-security.com>
Fri, 16 Jun 2017 17:52:23 +0000 (13:52 -0400)
 * Add function to create string representation of comm table
 * Add calls to print the community table after route table
 * TODO: clean up the output so it only shows up when debugging

common/tr_comm.c
include/tr_comm.h
tr/tr_trp.c

index 73c8023..3b177bb 100644 (file)
@@ -1411,40 +1411,76 @@ TR_REALM_ROLE tr_realm_role_from_str(const char *s)
   return TR_ROLE_UNKNOWN;
 }
 
-static void tr_comm_table_print_provenance(FILE *f, json_t *prov)
+static char *tr_comm_table_append_provenance(char *ctable_s, json_t *prov)
 {
   const char *s=NULL;
+  char *tmp=NULL;
   size_t ii=0;
 
   for (ii=0; ii<json_array_size(prov); ii++) {
     s=json_string_value(json_array_get(prov, ii));
-    if (s!=NULL)
-      fprintf(f, "%s%s", s, ((ii+1)==json_array_size(prov))?"":", ");
+    if (s!=NULL) {
+      tmp=talloc_asprintf_append(ctable_s, "%s%s", s, ((ii + 1) == json_array_size(prov)) ? "" : ", ");
+      if (tmp==NULL)
+        return NULL;
+      ctable_s=tmp;
+    }
   }
+  return ctable_s;
 }
 
-void tr_comm_table_print(FILE *f, TR_COMM_TABLE *ctab)
+char *tr_comm_table_to_str(TALLOC_CTX *mem_ctx, TR_COMM_TABLE *ctab)
 {
+  TALLOC_CTX *tmp_ctx=talloc_new(NULL);
+  char *ctable_s=NULL;
+  char *tmp=NULL;
+#define append_on_success_helper(tab,tmp,expr) if(NULL==((tmp)=(expr))){(tab)=NULL;goto cleanup;}(tab)=(tmp)
+
   TR_COMM_MEMB *p1=NULL; /* for walking the main list */
   TR_COMM_MEMB *p2=NULL; /* for walking the same-origin lists */
 
-  fprintf(f, ">> Membership table start <<\n");
+  ctable_s=talloc_asprintf(tmp_ctx, ">> Membership table start <<\n");
+  if (ctable_s==NULL)
+    goto cleanup;
+
   for (p1=ctab->memberships; p1!=NULL; p1=p1->next) {
-    fprintf(f, "* %s %s/%s\n  %s (%p) - prov: ",
-            tr_realm_role_to_str(tr_comm_memb_get_role(p1)),
-            tr_comm_memb_get_realm_id(p1)->buf,
-            tr_comm_get_id(tr_comm_memb_get_comm(p1))->buf,
-            (tr_comm_memb_get_origin(p1)==NULL)?"null origin":(tr_comm_memb_get_origin(p1)->buf),
-            p1);
-    tr_comm_table_print_provenance(f, p1->provenance);
-    fprintf(f, "\n");
+    append_on_success_helper(
+        ctable_s, tmp,
+        talloc_asprintf_append(ctable_s, "* %s %s/%s\n  %s (%p) - prov: ",
+                               tr_realm_role_to_str(tr_comm_memb_get_role(p1)),
+                               tr_comm_memb_get_realm_id(p1)->buf,
+                               tr_comm_get_id(tr_comm_memb_get_comm(p1))->buf,
+                               (tr_comm_memb_get_origin(p1)==NULL)?"null origin":(tr_comm_memb_get_origin(p1)->buf),
+                               p1));
+
+    append_on_success_helper(ctable_s, tmp, tr_comm_table_append_provenance(ctable_s, p1->provenance));
+
+    append_on_success_helper(ctable_s, tmp, talloc_strdup_append_buffer(ctable_s, "\n"));
+
     for (p2=p1->origin_next; p2!=NULL; p2=p2->origin_next) {
-      fprintf(f, "  %s (%p) - prov: ",
-              (tr_comm_memb_get_origin(p2)==NULL)?"null origin":(tr_comm_memb_get_origin(p2)->buf),
-              p2);
-      tr_comm_table_print_provenance(f, p2->provenance);
-      fprintf(f, "\n");
+      append_on_success_helper(
+          ctable_s, tmp,
+          talloc_asprintf_append(ctable_s, "  %s (%p) - prov: ",
+          (tr_comm_memb_get_origin(p2)==NULL)?"null origin":(tr_comm_memb_get_origin(p2)->buf),
+              p2));
+      append_on_success_helper(ctable_s, tmp, tr_comm_table_append_provenance(ctable_s, p2->provenance));
+      append_on_success_helper(ctable_s, tmp, talloc_strdup_append_buffer(ctable_s, "\n"));
     }
-    fprintf(f, "\n");
+    append_on_success_helper(ctable_s, tmp, talloc_strdup_append_buffer(ctable_s, "\n"));
   }
+
+cleanup:
+  if (ctable_s!=NULL)
+    talloc_steal(mem_ctx, ctable_s);
+
+  talloc_free(tmp_ctx);
+  return ctable_s;
 }
+
+void tr_comm_table_print(FILE *f, TR_COMM_TABLE *ctab)
+{
+  char *s=tr_comm_table_to_str(NULL, ctab);
+  if (s!=NULL)
+    fprintf(f, "%s", s);
+  talloc_free(s);
+}
\ No newline at end of file
index 5f4b4ae..5a770b8 100644 (file)
@@ -131,6 +131,7 @@ TR_COMM_MEMB *tr_comm_table_find_idp_memb_origin(TR_COMM_TABLE *ctab, TR_NAME *i
 TR_COMM_MEMB *tr_comm_table_find_idp_memb(TR_COMM_TABLE *ctab, TR_NAME *idp_realm, TR_NAME *comm);
 TR_COMM *tr_comm_table_find_comm(TR_COMM_TABLE *ctab, TR_NAME *comm_id);
 size_t tr_comm_table_size(TR_COMM_TABLE *ctab);
+char *tr_comm_table_to_str(TALLOC_CTX *mem_ctx, TR_COMM_TABLE *ctab);
 void tr_comm_table_print(FILE *f, TR_COMM_TABLE *ctab);
 
 TR_COMM_MEMB *tr_comm_memb_new(TALLOC_CTX *mem_ctx);
index 5ad734d..2ee5a45 100644 (file)
@@ -237,6 +237,17 @@ static void tr_trps_print_route_table(TRPS_INSTANCE *trps, FILE *f)
   }
 }
 
+static void tr_trps_print_comm_table(TRPS_INSTANCE *trps, FILE *f)
+{
+  char *table=tr_comm_table_to_str(NULL, trps->ctable);
+  if (table==NULL)
+    fprintf(f, "Unable to print community table.\n");
+  else {
+    fprintf(f, "%s\n", table);
+    talloc_free(table);
+  }
+}
+
 /**
  * Event handler to process TRP messages from connection threads. These
  * are added to the message queue (mq) in tr_trps_msg_handler(), which
@@ -307,6 +318,7 @@ static void tr_trps_process_mq(int socket, short event, void *arg)
         tr_notice("tr_trps_process_mq: error handling message.");
       else {
         tr_trps_print_route_table(trps, stderr);
+        tr_trps_print_comm_table(trps, stderr);
       }
     }
     else
@@ -340,6 +352,7 @@ static void tr_trps_sweep(int listener, short event, void *arg)
   tr_debug("tr_trps_sweep: sweeping communities.");
   trps_sweep_ctable(trps);
   tr_trps_print_route_table(trps, stderr);
+  tr_trps_print_comm_table(trps, stderr);
   /* schedule the event to run again */
   event_add(ev, &(trps->sweep_interval));
 }
@@ -858,5 +871,6 @@ void tr_config_changed(TR_CFG *new_cfg, void *cookie)
   trps_update(trps, TRP_UPDATE_TRIGGERED); /* send any triggered routes */
   tr_print_config(new_cfg);
   tr_trps_print_route_table(trps, stderr);
+  tr_trps_print_comm_table(trps, stderr);
 }