Use TR_LIST for TR_GSS_NAMES
authorJennifer Richards <jennifer@painless-security.com>
Wed, 25 Apr 2018 16:47:19 +0000 (12:47 -0400)
committerJennifer Richards <jennifer@painless-security.com>
Wed, 25 Apr 2018 16:47:19 +0000 (12:47 -0400)
Makefile.am
common/tests/cfg_test.c
common/tr_gss_names.c
common/tr_list.c
include/tr_gss_names.h
include/tr_list.h

index 60efb3b..42179a0 100644 (file)
@@ -157,6 +157,7 @@ common/tr_name.c \
 common/tr_gss_names.c \
 common/tr_debug.c \
 common/tr_util.c \
+common/tr_list.c \
 trp/trp_route.c \
 trp/trp_route_encoders.c \
 trp/trp_rtable.c \
@@ -278,6 +279,7 @@ noinst_HEADERS = include/gsscon.h include/tr_config.h \
        include/tr_cfgwatch.h include/tr_event.h \
        include/tr_mq.h include/trp_peer.h include/trp_ptable.h \
        include/trp_rtable.h include/tr_util.h \
+       include/tr_list.h \
        include/tr_name_internal.h include/tr_gss.h
 
 pkgdata_DATA=schema.sql
index cfc1ed2..29a949d 100644 (file)
@@ -41,6 +41,7 @@
 #include <tr_idp.h>
 #include <tr_config.h>
 #include <tr_debug.h>
+#include <tr_gss_names.h>
 
 static void tr_talloc_log(const char *msg)
 {
@@ -106,9 +107,9 @@ static int verify_rp_cfg(TR_CFG *cfg)
   assert(cfg->rp_clients->comm_next==NULL);
 
   assert(cfg->rp_clients->gss_names!=NULL);
-  assert(cfg->rp_clients->gss_names->names->len == 1);
+  assert(tr_gss_names_length(cfg->rp_clients->gss_names) == 1);
   name=tr_new_name("gss@example.com");
-  assert(tr_name_cmp(name, g_ptr_array_index(cfg->rp_clients->gss_names->names, 0))==0);
+  assert(tr_name_cmp(name, tr_gss_names_index(cfg->rp_clients->gss_names, 0))==0);
   return 0;
 }
 
index 249a8b9..416ba8c 100644 (file)
 #include <tr_gss_names.h>
 #include <tr_debug.h>
 
+/**
+ * Helper for tr_gss_names_destructor - calls tr_free_name on its first argument
+ *
+ * @param item void pointer to a TR_NAME
+ * @param cookie ignored
+ */
+static void gss_names_destruct_helper(void *item, void *cookie)
+{
+  TR_NAME *name = (TR_NAME *) item;
+  tr_free_name(name);
+}
 static int tr_gss_names_destructor(void *obj)
 {
   TR_GSS_NAMES *gss_names=talloc_get_type_abort(obj, TR_GSS_NAMES);
   if (gss_names->names)
-    g_ptr_array_unref(gss_names->names);
+    tr_list_foreach(gss_names->names, gss_names_destruct_helper, NULL);
   return 0;
 }
 TR_GSS_NAMES *tr_gss_names_new(TALLOC_CTX *mem_ctx)
 {
-  TR_GSS_NAMES *gn=talloc(mem_ctx, TR_GSS_NAMES);
-
+  TR_GSS_NAMES *gn = talloc(mem_ctx, TR_GSS_NAMES);
   if (gn != NULL) {
-    gn->names = g_ptr_array_new_with_free_func((GDestroyNotify) tr_free_name);
+    gn->names = tr_list_new(gn);
     if (gn->names == NULL) {
       talloc_free(gn);
       return NULL;
@@ -68,9 +78,7 @@ void tr_gss_names_free(TR_GSS_NAMES *gn)
 /* returns 0 on success */
 int tr_gss_names_add(TR_GSS_NAMES *gn, TR_NAME *new)
 {
-  guint old_len = gn->names->len;
-  g_ptr_array_add(gn->names, new);
-  return (gn->names->len == old_len); /* nonzero if the add failed */
+  return (NULL == tr_list_add(gn->names, new, 0)); /* nonzero if the add failed */
 }
 
 /**
@@ -104,50 +112,21 @@ TR_GSS_NAMES *tr_gss_names_dup(TALLOC_CTX *mem_ctx, TR_GSS_NAMES *orig)
   return new;
 }
 
-static gboolean names_equal_helper(gconstpointer a, gconstpointer b)
-{
-  return (tr_name_cmp(a, b) == 0);
-}
-
 int tr_gss_names_matches(TR_GSS_NAMES *gn, TR_NAME *name)
 {
-  if (!gn)
-    return 0;
+  TR_GSS_NAMES_ITER iter={0};
+  TR_NAME *this = NULL;
 
-  return(TRUE == g_ptr_array_find_with_equal_func(gn->names,
-                                                  name,
-                                                  names_equal_helper,
-                                                  NULL));
-}
+  if ((!gn) || (!name))
+    return 0;
 
-/* iterators */
-TR_GSS_NAMES_ITER *tr_gss_names_iter_new(TALLOC_CTX *mem_ctx)
-{
-  TR_GSS_NAMES_ITER *iter=talloc(mem_ctx, TR_GSS_NAMES_ITER);
-  if (iter!=NULL) {
-    iter->gn=NULL;
-    iter->ii=0;
+  for (this = tr_gss_names_iter_first(&iter, gn);
+      this != NULL;
+      this = tr_gss_names_iter_next(&iter)) {
+    if (tr_name_cmp(name, this) == 0)
+      return 1;
   }
-  return iter;
-}
-
-TR_NAME *tr_gss_names_iter_first(TR_GSS_NAMES_ITER *iter, TR_GSS_NAMES *gn)
-{
-  iter->gn=gn;
-  iter->ii=0;
-  return tr_gss_names_iter_next(iter);
-}
-
-TR_NAME *tr_gss_names_iter_next(TR_GSS_NAMES_ITER *iter)
-{
-  if (iter->ii < iter->gn->names->len)
-    return g_ptr_array_index(iter->gn->names, iter->ii++);
-  return NULL;
-}
-
-void tr_gss_names_iter_free(TR_GSS_NAMES_ITER *iter)
-{
-  talloc_free(iter);
+  return 0;
 }
 
 json_t *tr_gss_names_to_json_array(TR_GSS_NAMES *gss_names)
index 2dbd07b..e3269f4 100644 (file)
@@ -92,11 +92,6 @@ void *tr_list_add(TR_LIST *list, void *item, int steal)
   return item;
 }
 
-size_t tr_list_length(TR_LIST *list)
-{
-  return (size_t) (*list)->len;
-}
-
 /**
  * Call func(item, cookie) on each item in the list.
  *
index 607c5d5..c6192be 100644 (file)
 #define __TR_GSS_H__
 
 #include <talloc.h>
-#include <glib.h>
+#include <tr_list.h>
 
 #include <tr_name_internal.h>
 
 typedef struct tr_gss_names {
-  GPtrArray *names;
+  TR_LIST *names;
 } TR_GSS_NAMES;
 
-typedef struct tr_gss_names_iter {
-  TR_GSS_NAMES *gn;
-  guint ii;
-} TR_GSS_NAMES_ITER;
+typedef TR_LIST_ITER TR_GSS_NAMES_ITER;
+
+/* Iterator for TR_FILTER lines */
+#define tr_gss_names_iter_new(CTX) (tr_list_iter_new(CTX))
+#define tr_gss_names_iter_free(ITER) (tr_list_iter_free(ITER))
+#define tr_gss_names_iter_first(ITER, GSSN) ((TR_NAME *) tr_list_iter_first((ITER), (GSSN)->names))
+#define tr_gss_names_iter_next(ITER) ((TR_NAME *) tr_list_iter_next(ITER))
 
 TR_GSS_NAMES *tr_gss_names_new(TALLOC_CTX *mem_ctx);
 void tr_gss_names_free(TR_GSS_NAMES *gn);
 int tr_gss_names_add(TR_GSS_NAMES *gn, TR_NAME *new);
 TR_GSS_NAMES *tr_gss_names_dup(TALLOC_CTX *mem_ctx, TR_GSS_NAMES *orig);
 int tr_gss_names_matches(TR_GSS_NAMES *gn, TR_NAME *name);
-
-TR_GSS_NAMES_ITER *tr_gss_names_iter_new(TALLOC_CTX *mem_ctx);
-TR_NAME *tr_gss_names_iter_first(TR_GSS_NAMES_ITER *iter, TR_GSS_NAMES *gn);
-TR_NAME *tr_gss_names_iter_next(TR_GSS_NAMES_ITER *iter);
-void tr_gss_names_iter_free(TR_GSS_NAMES_ITER *iter);
+#define tr_gss_names_length(GSSN) (tr_list_length((GSSN)->names))
+#define tr_gss_names_index(GSSN, INDEX) (tr_list_index((GSSN)->names, (INDEX)))
 
 json_t *tr_gss_names_to_json_array(TR_GSS_NAMES *gss_names);
 
index 2634cc6..8bfca38 100644 (file)
@@ -47,11 +47,12 @@ typedef struct tr_list_iter{
   guint index;
 } TR_LIST_ITER;
 
+#define tr_list_index(LIST, INDEX) (g_ptr_array_index(*(LIST),(INDEX)))
+#define tr_list_length(LIST) ((size_t)((*(LIST))->len))
+
 TR_LIST *tr_list_new(TALLOC_CTX *mem_ctx);
 void tr_list_free(TR_LIST *list);
 void *tr_list_add(TR_LIST *list, void *item, int steal);
-void *tr_list_index(TR_LIST *list, size_t index);
-size_t tr_list_length(TR_LIST *list);
 
 TR_LIST_ITER *tr_list_iter_new(TALLOC_CTX *mem_ctx);
 void tr_list_iter_free(TR_LIST_ITER *iter);