support config in node_or
[protos/libecoli.git] / lib / ecoli_node.c
index 46bd9d8..c02a8de 100644 (file)
@@ -111,6 +111,18 @@ struct ec_node *ec_node_from_type(const struct ec_node_type *type, const char *i
        return NULL;
 }
 
+const struct ec_config_schema *
+ec_node_type_schema(const struct ec_node_type *type)
+{
+       return type->schema;
+}
+
+const char *
+ec_node_type_name(const struct ec_node_type *type)
+{
+       return type->name;
+}
+
 struct ec_node *ec_node(const char *typename, const char *id)
 {
        const struct ec_node_type *type;
@@ -222,11 +234,17 @@ void ec_node_free(struct ec_node *node)
 
        if (node->free.state != EC_NODE_FREE_STATE_FREEING) {
                node->free.state = EC_NODE_FREE_STATE_FREEING;
+
+               /* children will be freed by config_free() and free_priv() */
+               ec_config_free(node->config);
+               node->config = NULL;
                n = ec_node_get_children_count(node);
-               /* children should be freed by free_priv() */
                assert(n == 0 || node->type->free_priv != NULL);
                if (node->type->free_priv != NULL)
                        node->type->free_priv(node);
+               ec_free(node->id);
+               ec_free(node->desc);
+               ec_keyval_free(node->attrs);
        }
 
        node->refcnt--;
@@ -236,10 +254,6 @@ void ec_node_free(struct ec_node *node)
        node->free.state = EC_NODE_FREE_STATE_NONE;
        node->free.refcnt = 0;
 
-       ec_free(node->id);
-       ec_free(node->desc);
-       ec_keyval_free(node->attrs);
-       ec_config_free(node->config);
        ec_free(node);
 }
 
@@ -368,6 +382,7 @@ static void __ec_node_dump(FILE *out,
        }
 }
 
+/* XXX this is too much debug-oriented, we should have a parameter or 2 funcs */
 void ec_node_dump(FILE *out, const struct ec_node *node)
 {
        struct ec_keyval *dict = NULL;