aboutsummaryrefslogtreecommitdiff
path: root/src/core/iobuf.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/iobuf.c')
-rw-r--r--src/core/iobuf.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/core/iobuf.c b/src/core/iobuf.c
index afc91d1..6dae0c1 100644
--- a/src/core/iobuf.c
+++ b/src/core/iobuf.c
@@ -200,3 +200,33 @@ struct io_buffer * iob_concatenate ( struct list_head *list ) {
return concatenated;
}
+
+/**
+ * Split I/O buffer
+ *
+ * @v iobuf I/O buffer
+ * @v len Length to split into a new I/O buffer
+ * @ret split New I/O buffer, or NULL on allocation failure
+ *
+ * Split the first @c len bytes of the existing I/O buffer into a
+ * separate I/O buffer. The resulting buffers are likely to have no
+ * headroom or tailroom.
+ *
+ * If this call fails, then the original buffer will be unmodified.
+ */
+struct io_buffer * iob_split ( struct io_buffer *iobuf, size_t len ) {
+ struct io_buffer *split;
+
+ /* Sanity checks */
+ assert ( len <= iob_len ( iobuf ) );
+
+ /* Allocate new I/O buffer */
+ split = alloc_iob ( len );
+ if ( ! split )
+ return NULL;
+
+ /* Copy in data */
+ memcpy ( iob_put ( split, len ), iobuf->data, len );
+ iob_pull ( iobuf, len );
+ return split;
+}