summaryrefslogtreecommitdiffstats
path: root/server/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'server/tree.c')
-rw-r--r--server/tree.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/server/tree.c b/server/tree.c
new file mode 100644
index 0000000..3daf6df
--- /dev/null
+++ b/server/tree.c
@@ -0,0 +1,67 @@
+/*
+ * server/tree.c
+ */
+
+
+#include <search.h>
+#include <stdlib.h>
+#include <inttypes.h>
+#include "dnbd2.h"
+#include "tree.h"
+
+
+int compare_node(const void *node1, const void *node2)
+{
+
+ dataset_t *ds1 = ((node_t *) node1)->ds;
+ dataset_t *ds2 = ((node_t *) node2)->ds;
+
+ int diff = ds1->vid - ds2->vid;
+ if (diff != 0)
+ return diff;
+
+ return ds1->rid - ds2->rid;
+}
+
+
+void destroy_node(void *node)
+{
+ free(((node_t *) node)->ds);
+ free((node_t *) node);
+}
+
+
+int tree_insert(node_t *data, void **tree)
+{
+ void *tmp = tsearch((void *)data, tree, compare_node);
+ if (!tmp)
+ return -1;
+
+ node_t *ret = *(node_t **) tmp;
+
+ /* Check if there is another item
+ in the tree with the same key. */
+ if (ret != data)
+ return -1;
+
+ return 0;
+}
+
+
+node_t *tree_find(node_t *data, void **tree)
+{
+ void *tmp = tfind((void *)data, tree, compare_node);
+
+ if (!tmp)
+ return NULL;
+
+ node_t *ret = *(node_t **) tmp;
+
+ return ret;
+}
+
+
+void tree_destroy(void **tree)
+{
+ tdestroy(tree, &destroy_node);
+}