X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fofpbuf.c;h=7e9653600c2c881bbc67e657fe08fb6ac494733a;hb=15df7ea8d9a338113fc0bd8d2a0a841ec7ce4b6c;hp=34aad93825126943d4ffbaaaf9be9a8aa2d2b677;hpb=a46c577af5c5855939ca3192a56396e15bebf0f8;p=openvswitch diff --git a/lib/ofpbuf.c b/lib/ofpbuf.c index 34aad938..7e965360 100644 --- a/lib/ofpbuf.c +++ b/lib/ofpbuf.c @@ -1,5 +1,5 @@ /* - * 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. @@ -462,6 +462,25 @@ ofpbuf_try_pull(struct ofpbuf *b, size_t size) 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 *