/*
- * Copyright (c) 2008, 2009, 2010 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
return b;
}
+/* Creates and returns a new ofpbuf that initially contains a copy of the
+ * 'buffer->size' bytes of data starting at 'buffer->data' with no headroom or
+ * tailroom. */
struct ofpbuf *
ofpbuf_clone(const struct ofpbuf *buffer)
{
struct ofpbuf *
ofpbuf_clone_with_headroom(const struct ofpbuf *buffer, size_t headroom)
{
- struct ofpbuf *b = ofpbuf_new_with_headroom(buffer->size, headroom);
- ofpbuf_put(b, buffer->data, buffer->size);
- return b;
+ return ofpbuf_clone_data_with_headroom(buffer->data, buffer->size,
+ headroom);
}
+/* Creates and returns a new ofpbuf that initially contains a copy of the
+ * 'size' bytes of data starting at 'data' with no headroom or tailroom. */
struct ofpbuf *
ofpbuf_clone_data(const void *data, size_t size)
{
- struct ofpbuf *b = ofpbuf_new(size);
+ return ofpbuf_clone_data_with_headroom(data, size, 0);
+}
+
+/* Creates and returns a new ofpbuf that initially contains 'headroom' bytes of
+ * headroom followed by a copy of the 'size' bytes of data starting at
+ * 'data'. */
+struct ofpbuf *
+ofpbuf_clone_data_with_headroom(const void *data, size_t size, size_t headroom)
+{
+ struct ofpbuf *b = ofpbuf_new_with_headroom(size, headroom);
ofpbuf_put(b, data, size);
return b;
}
return b->size >= size ? ofpbuf_pull(b, size) : NULL;
}
+/* Returns the data in 'b' as a block of malloc()'d memory and frees the buffer
+ * within 'b'. (If 'b' itself was dynamically allocated, e.g. with
+ * ofpbuf_new(), then it should still be freed with, e.g., ofpbuf_delete().) */
+void *
+ofpbuf_steal_data(struct ofpbuf *b)
+{
+ void *p;
+ if (b->source == OFPBUF_MALLOC && b->data == b->base) {
+ p = b->data;
+ } else {
+ p = xmemdup(b->data, b->size);
+ if (b->source == OFPBUF_MALLOC) {
+ free(b->base);
+ }
+ }
+ b->base = b->data = NULL;
+ return p;
+}
+
/* Returns a string that describes some of 'b''s metadata plus a hex dump of up
* to 'maxbytes' from the start of the buffer. */
char *