+static void rpc_free_fragment(struct rpc_fragment *fragment)
+{
+ if (fragment->data != NULL) {
+ free(fragment->data);
+ }
+ free(fragment);
+}
+
+void rpc_free_all_fragments(struct rpc_context *rpc)
+{
+ assert(rpc->magic == RPC_CONTEXT_MAGIC);
+
+ while (rpc->fragments != NULL) {
+ struct rpc_fragment *fragment = rpc->fragments;
+
+ SLIST_REMOVE(&rpc->fragments, fragment);
+ rpc_free_fragment(fragment);
+ }
+}
+
+int rpc_add_fragment(struct rpc_context *rpc, char *data, uint64_t size)
+{
+ struct rpc_fragment *fragment;
+
+ assert(rpc->magic == RPC_CONTEXT_MAGIC);
+
+ fragment = malloc(sizeof(struct rpc_fragment));
+ if (fragment == NULL) {
+ return -1;
+ }
+
+ fragment->size = size;
+ fragment->data = malloc(fragment->size);
+ if(fragment->data == NULL) {
+ free(fragment);
+ return -1;
+ }
+
+ memcpy(fragment->data, data, fragment->size);
+ SLIST_ADD_END(&rpc->fragments, fragment);
+ return 0;
+}