summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2007-01-18 16:13:41 +0100
committerMichael Brown2007-01-18 16:13:41 +0100
commitc8b3e969a0b5da1697efe74d835b53085daabed4 (patch)
tree15b5e1c112c0682c8ab7aa00b136b6d388b8d89a
parentPresize the download buffer when we see the Content-Length header; (diff)
downloadipxe-c8b3e969a0b5da1697efe74d835b53085daabed4.tar.gz
ipxe-c8b3e969a0b5da1697efe74d835b53085daabed4.tar.xz
ipxe-c8b3e969a0b5da1697efe74d835b53085daabed4.zip
Allow buffers to be pre-expanded on demand.
-rw-r--r--src/core/buffer.c6
-rw-r--r--src/include/gpxe/buffer.h21
2 files changed, 22 insertions, 5 deletions
diff --git a/src/core/buffer.c b/src/core/buffer.c
index c382b5fe2..ff1c6fcae 100644
--- a/src/core/buffer.c
+++ b/src/core/buffer.c
@@ -167,11 +167,7 @@ int fill_buffer ( struct buffer *buffer, const void *data,
/* Check that block fits within buffer, expand if necessary */
if ( data_end > buffer->len ) {
- if ( ! buffer->expand ) {
- DBGC ( buffer, "BUFFER %p not expandable\n", buffer );
- return -ENOBUFS;
- }
- if ( ( rc = buffer->expand ( buffer, data_end ) ) != 0 ) {
+ if ( ( rc = expand_buffer ( buffer, data_end ) ) != 0 ) {
DBGC ( buffer, "BUFFER %p could not expand :%s\n",
buffer, strerror ( rc ) );
return rc;
diff --git a/src/include/gpxe/buffer.h b/src/include/gpxe/buffer.h
index b366955c9..72c0846ac 100644
--- a/src/include/gpxe/buffer.h
+++ b/src/include/gpxe/buffer.h
@@ -2,6 +2,7 @@
#define _GPXE_BUFFER_H
#include <stdint.h>
+#include <errno.h>
#include <gpxe/uaccess.h>
/** @file
@@ -101,4 +102,24 @@ struct buffer {
extern int fill_buffer ( struct buffer *buffer, const void *data,
size_t offset, size_t len );
+/** Expand data buffer
+ *
+ * @v buffer Data buffer
+ * @v new_len New length
+ * @ret rc Return status code
+ *
+ * Expand the data buffer to accommodate more data. Some buffers may
+ * not support being expanded.
+ */
+static inline int expand_buffer ( struct buffer *buffer, size_t new_len ) {
+
+ if ( new_len <= buffer->len )
+ return 0;
+
+ if ( ! buffer->expand )
+ return -ENOBUFS;
+
+ return buffer->expand ( buffer, new_len );
+}
+
#endif /* _GPXE_BUFFER_H */