Allow buffers to be pre-expanded on demand.
authorMichael Brown <mcb30@etherboot.org>
Thu, 18 Jan 2007 15:13:41 +0000 (15:13 +0000)
committerMichael Brown <mcb30@etherboot.org>
Thu, 18 Jan 2007 15:13:41 +0000 (15:13 +0000)
src/core/buffer.c
src/include/gpxe/buffer.h

index c382b5f..ff1c6fc 100644 (file)
@@ -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;
index b366955..72c0846 100644 (file)
@@ -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 */