vici: Add a destroy method to builder, allowing cancellation without error
authorMartin Willi <martin@revosec.ch>
Fri, 12 Dec 2014 09:06:39 +0000 (10:06 +0100)
committerMartin Willi <martin@revosec.ch>
Fri, 12 Dec 2014 09:23:59 +0000 (10:23 +0100)
When cancelling a builder, finalize throws an error which we might prefer
to avoid.

src/libcharon/plugins/vici/vici_builder.c
src/libcharon/plugins/vici/vici_builder.h

index 5616320..62d1763 100644 (file)
@@ -206,6 +206,13 @@ METHOD(vici_builder_t, end_list, void,
        add(this, VICI_LIST_END);
 }
 
+METHOD(vici_builder_t, destroy, void,
+       private_vici_builder_t *this)
+{
+       this->writer->destroy(this->writer);
+       free(this);
+}
+
 METHOD(vici_builder_t, finalize, vici_message_t*,
        private_vici_builder_t *this)
 {
@@ -215,14 +222,12 @@ METHOD(vici_builder_t, finalize, vici_message_t*,
        {
                DBG1(DBG_ENC, "vici builder error: %u errors (section: %u, list %u)",
                         this->error, this->section, this->list);
-               this->writer->destroy(this->writer);
-               free(this);
+               destroy(this);
                return NULL;
        }
        product = vici_message_create_from_data(
                                                                this->writer->extract_buf(this->writer), TRUE);
-       this->writer->destroy(this->writer);
-       free(this);
+       destroy(this);
        return product;
 }
 
@@ -245,6 +250,7 @@ vici_builder_t *vici_builder_create()
                        .begin_list = _begin_list,
                        .end_list = _end_list,
                        .finalize = _finalize,
+                       .destroy = _destroy,
                },
                .writer = bio_writer_create(0),
        );
index 5a5cc8a..f7d21eb 100644 (file)
@@ -119,6 +119,14 @@ struct vici_builder_t {
         * @return              vici message, NULL on error
         */
        vici_message_t* (*finalize)(vici_builder_t *this);
+
+       /**
+        * Destroy a vici builder without finalization.
+        *
+        * Note that finalize() already destroys the message, and calling destroy()
+        * is required only if the message does not get finalize()d.
+        */
+       void (*destroy)(vici_builder_t *this);
 };
 
 /**