1*7b5038d7SDag-Erling Smørgrav /* 2*7b5038d7SDag-Erling Smørgrav * buffer.h -- generic memory buffer. 3*7b5038d7SDag-Erling Smørgrav * 4*7b5038d7SDag-Erling Smørgrav * Copyright (c) 2005-2008, NLnet Labs. All rights reserved. 5*7b5038d7SDag-Erling Smørgrav * 6*7b5038d7SDag-Erling Smørgrav * See LICENSE for the license. 7*7b5038d7SDag-Erling Smørgrav * 8*7b5038d7SDag-Erling Smørgrav * 9*7b5038d7SDag-Erling Smørgrav * The buffer module implements a generic buffer. The API is based on 10*7b5038d7SDag-Erling Smørgrav * the java.nio.Buffer interface. 11*7b5038d7SDag-Erling Smørgrav */ 12*7b5038d7SDag-Erling Smørgrav 13*7b5038d7SDag-Erling Smørgrav #ifndef LDNS_BUFFER_H 14*7b5038d7SDag-Erling Smørgrav #define LDNS_BUFFER_H 15*7b5038d7SDag-Erling Smørgrav 16*7b5038d7SDag-Erling Smørgrav #include <assert.h> 17*7b5038d7SDag-Erling Smørgrav #include <stdarg.h> 18*7b5038d7SDag-Erling Smørgrav #include <string.h> 19*7b5038d7SDag-Erling Smørgrav 20*7b5038d7SDag-Erling Smørgrav #include <ldns/error.h> 21*7b5038d7SDag-Erling Smørgrav #include <ldns/common.h> 22*7b5038d7SDag-Erling Smørgrav 23*7b5038d7SDag-Erling Smørgrav #include "ldns/util.h" 24*7b5038d7SDag-Erling Smørgrav 25*7b5038d7SDag-Erling Smørgrav #ifdef __cplusplus 26*7b5038d7SDag-Erling Smørgrav extern "C" { 27*7b5038d7SDag-Erling Smørgrav #endif 28*7b5038d7SDag-Erling Smørgrav 29*7b5038d7SDag-Erling Smørgrav /** 30*7b5038d7SDag-Erling Smørgrav * number of initial bytes in buffer of 31*7b5038d7SDag-Erling Smørgrav * which we cannot tell the size before hand 32*7b5038d7SDag-Erling Smørgrav */ 33*7b5038d7SDag-Erling Smørgrav #define LDNS_MIN_BUFLEN 512 34*7b5038d7SDag-Erling Smørgrav 35*7b5038d7SDag-Erling Smørgrav /** 36*7b5038d7SDag-Erling Smørgrav * \file buffer.h 37*7b5038d7SDag-Erling Smørgrav * 38*7b5038d7SDag-Erling Smørgrav * This file contains the definition of ldns_buffer, and functions to manipulate those. 39*7b5038d7SDag-Erling Smørgrav */ 40*7b5038d7SDag-Erling Smørgrav 41*7b5038d7SDag-Erling Smørgrav /** 42*7b5038d7SDag-Erling Smørgrav * implementation of buffers to ease operations 43*7b5038d7SDag-Erling Smørgrav * 44*7b5038d7SDag-Erling Smørgrav * ldns_buffers can contain arbitrary information, per octet. You can write 45*7b5038d7SDag-Erling Smørgrav * to the current end of a buffer, read from the current position, and 46*7b5038d7SDag-Erling Smørgrav * access any data within it. 47*7b5038d7SDag-Erling Smørgrav * 48*7b5038d7SDag-Erling Smørgrav * Example use of buffers is in the source code of \ref host2str.c 49*7b5038d7SDag-Erling Smørgrav */ 50*7b5038d7SDag-Erling Smørgrav struct ldns_struct_buffer 51*7b5038d7SDag-Erling Smørgrav { 52*7b5038d7SDag-Erling Smørgrav /** The current position used for reading/writing */ 53*7b5038d7SDag-Erling Smørgrav size_t _position; 54*7b5038d7SDag-Erling Smørgrav 55*7b5038d7SDag-Erling Smørgrav /** The read/write limit */ 56*7b5038d7SDag-Erling Smørgrav size_t _limit; 57*7b5038d7SDag-Erling Smørgrav 58*7b5038d7SDag-Erling Smørgrav /** The amount of data the buffer can contain */ 59*7b5038d7SDag-Erling Smørgrav size_t _capacity; 60*7b5038d7SDag-Erling Smørgrav 61*7b5038d7SDag-Erling Smørgrav /** The data contained in the buffer */ 62*7b5038d7SDag-Erling Smørgrav uint8_t *_data; 63*7b5038d7SDag-Erling Smørgrav 64*7b5038d7SDag-Erling Smørgrav /** If the buffer is fixed it cannot be resized */ 65*7b5038d7SDag-Erling Smørgrav unsigned _fixed : 1; 66*7b5038d7SDag-Erling Smørgrav 67*7b5038d7SDag-Erling Smørgrav /** The current state of the buffer. If writing to the buffer fails 68*7b5038d7SDag-Erling Smørgrav * for any reason, this value is changed. This way, you can perform 69*7b5038d7SDag-Erling Smørgrav * multiple writes in sequence and check for success afterwards. */ 70*7b5038d7SDag-Erling Smørgrav ldns_status _status; 71*7b5038d7SDag-Erling Smørgrav }; 72*7b5038d7SDag-Erling Smørgrav typedef struct ldns_struct_buffer ldns_buffer; 73*7b5038d7SDag-Erling Smørgrav 74*7b5038d7SDag-Erling Smørgrav 75*7b5038d7SDag-Erling Smørgrav #ifdef NDEBUG 76*7b5038d7SDag-Erling Smørgrav INLINE void 77*7b5038d7SDag-Erling Smørgrav ldns_buffer_invariant(ldns_buffer *ATTR_UNUSED(buffer)) 78*7b5038d7SDag-Erling Smørgrav { 79*7b5038d7SDag-Erling Smørgrav } 80*7b5038d7SDag-Erling Smørgrav #else 81*7b5038d7SDag-Erling Smørgrav INLINE void 82*7b5038d7SDag-Erling Smørgrav ldns_buffer_invariant(ldns_buffer *buffer) 83*7b5038d7SDag-Erling Smørgrav { 84*7b5038d7SDag-Erling Smørgrav assert(buffer != NULL); 85*7b5038d7SDag-Erling Smørgrav assert(buffer->_position <= buffer->_limit); 86*7b5038d7SDag-Erling Smørgrav assert(buffer->_limit <= buffer->_capacity); 87*7b5038d7SDag-Erling Smørgrav assert(buffer->_data != NULL); 88*7b5038d7SDag-Erling Smørgrav } 89*7b5038d7SDag-Erling Smørgrav #endif 90*7b5038d7SDag-Erling Smørgrav 91*7b5038d7SDag-Erling Smørgrav /** 92*7b5038d7SDag-Erling Smørgrav * creates a new buffer with the specified capacity. 93*7b5038d7SDag-Erling Smørgrav * 94*7b5038d7SDag-Erling Smørgrav * \param[in] capacity the size (in bytes) to allocate for the buffer 95*7b5038d7SDag-Erling Smørgrav * \return the created buffer 96*7b5038d7SDag-Erling Smørgrav */ 97*7b5038d7SDag-Erling Smørgrav ldns_buffer *ldns_buffer_new(size_t capacity); 98*7b5038d7SDag-Erling Smørgrav 99*7b5038d7SDag-Erling Smørgrav /** 100*7b5038d7SDag-Erling Smørgrav * creates a buffer with the specified data. The data IS copied 101*7b5038d7SDag-Erling Smørgrav * and MEMORY allocations are done. The buffer is not fixed and can 102*7b5038d7SDag-Erling Smørgrav * be resized using buffer_reserve(). 103*7b5038d7SDag-Erling Smørgrav * 104*7b5038d7SDag-Erling Smørgrav * \param[in] buffer pointer to the buffer to put the data in 105*7b5038d7SDag-Erling Smørgrav * \param[in] data the data to encapsulate in the buffer 106*7b5038d7SDag-Erling Smørgrav * \param[in] size the size of the data 107*7b5038d7SDag-Erling Smørgrav */ 108*7b5038d7SDag-Erling Smørgrav void ldns_buffer_new_frm_data(ldns_buffer *buffer, void *data, size_t size); 109*7b5038d7SDag-Erling Smørgrav 110*7b5038d7SDag-Erling Smørgrav /** 111*7b5038d7SDag-Erling Smørgrav * clears the buffer and make it ready for writing. The buffer's limit 112*7b5038d7SDag-Erling Smørgrav * is set to the capacity and the position is set to 0. 113*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer to clear 114*7b5038d7SDag-Erling Smørgrav */ 115*7b5038d7SDag-Erling Smørgrav INLINE void ldns_buffer_clear(ldns_buffer *buffer) 116*7b5038d7SDag-Erling Smørgrav { 117*7b5038d7SDag-Erling Smørgrav ldns_buffer_invariant(buffer); 118*7b5038d7SDag-Erling Smørgrav 119*7b5038d7SDag-Erling Smørgrav /* reset status here? */ 120*7b5038d7SDag-Erling Smørgrav 121*7b5038d7SDag-Erling Smørgrav buffer->_position = 0; 122*7b5038d7SDag-Erling Smørgrav buffer->_limit = buffer->_capacity; 123*7b5038d7SDag-Erling Smørgrav } 124*7b5038d7SDag-Erling Smørgrav 125*7b5038d7SDag-Erling Smørgrav /** 126*7b5038d7SDag-Erling Smørgrav * makes the buffer ready for reading the data that has been written to 127*7b5038d7SDag-Erling Smørgrav * the buffer. The buffer's limit is set to the current position and 128*7b5038d7SDag-Erling Smørgrav * the position is set to 0. 129*7b5038d7SDag-Erling Smørgrav * 130*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer to flip 131*7b5038d7SDag-Erling Smørgrav * \return void 132*7b5038d7SDag-Erling Smørgrav */ 133*7b5038d7SDag-Erling Smørgrav INLINE void ldns_buffer_flip(ldns_buffer *buffer) 134*7b5038d7SDag-Erling Smørgrav { 135*7b5038d7SDag-Erling Smørgrav ldns_buffer_invariant(buffer); 136*7b5038d7SDag-Erling Smørgrav 137*7b5038d7SDag-Erling Smørgrav buffer->_limit = buffer->_position; 138*7b5038d7SDag-Erling Smørgrav buffer->_position = 0; 139*7b5038d7SDag-Erling Smørgrav } 140*7b5038d7SDag-Erling Smørgrav 141*7b5038d7SDag-Erling Smørgrav /** 142*7b5038d7SDag-Erling Smørgrav * make the buffer ready for re-reading the data. The buffer's 143*7b5038d7SDag-Erling Smørgrav * position is reset to 0. 144*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer to rewind 145*7b5038d7SDag-Erling Smørgrav */ 146*7b5038d7SDag-Erling Smørgrav INLINE void ldns_buffer_rewind(ldns_buffer *buffer) 147*7b5038d7SDag-Erling Smørgrav { 148*7b5038d7SDag-Erling Smørgrav ldns_buffer_invariant(buffer); 149*7b5038d7SDag-Erling Smørgrav 150*7b5038d7SDag-Erling Smørgrav buffer->_position = 0; 151*7b5038d7SDag-Erling Smørgrav } 152*7b5038d7SDag-Erling Smørgrav 153*7b5038d7SDag-Erling Smørgrav /** 154*7b5038d7SDag-Erling Smørgrav * returns the current position in the buffer (as a number of bytes) 155*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 156*7b5038d7SDag-Erling Smørgrav * \return the current position 157*7b5038d7SDag-Erling Smørgrav */ 158*7b5038d7SDag-Erling Smørgrav INLINE size_t 159*7b5038d7SDag-Erling Smørgrav ldns_buffer_position(ldns_buffer *buffer) 160*7b5038d7SDag-Erling Smørgrav { 161*7b5038d7SDag-Erling Smørgrav return buffer->_position; 162*7b5038d7SDag-Erling Smørgrav } 163*7b5038d7SDag-Erling Smørgrav 164*7b5038d7SDag-Erling Smørgrav /** 165*7b5038d7SDag-Erling Smørgrav * sets the buffer's position to MARK. The position must be less than 166*7b5038d7SDag-Erling Smørgrav * or equal to the buffer's limit. 167*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 168*7b5038d7SDag-Erling Smørgrav * \param[in] mark the mark to use 169*7b5038d7SDag-Erling Smørgrav */ 170*7b5038d7SDag-Erling Smørgrav INLINE void 171*7b5038d7SDag-Erling Smørgrav ldns_buffer_set_position(ldns_buffer *buffer, size_t mark) 172*7b5038d7SDag-Erling Smørgrav { 173*7b5038d7SDag-Erling Smørgrav assert(mark <= buffer->_limit); 174*7b5038d7SDag-Erling Smørgrav buffer->_position = mark; 175*7b5038d7SDag-Erling Smørgrav } 176*7b5038d7SDag-Erling Smørgrav 177*7b5038d7SDag-Erling Smørgrav /** 178*7b5038d7SDag-Erling Smørgrav * changes the buffer's position by COUNT bytes. The position must not 179*7b5038d7SDag-Erling Smørgrav * be moved behind the buffer's limit or before the beginning of the 180*7b5038d7SDag-Erling Smørgrav * buffer. 181*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 182*7b5038d7SDag-Erling Smørgrav * \param[in] count the count to use 183*7b5038d7SDag-Erling Smørgrav */ 184*7b5038d7SDag-Erling Smørgrav INLINE void 185*7b5038d7SDag-Erling Smørgrav ldns_buffer_skip(ldns_buffer *buffer, ssize_t count) 186*7b5038d7SDag-Erling Smørgrav { 187*7b5038d7SDag-Erling Smørgrav assert(buffer->_position + count <= buffer->_limit); 188*7b5038d7SDag-Erling Smørgrav buffer->_position += count; 189*7b5038d7SDag-Erling Smørgrav } 190*7b5038d7SDag-Erling Smørgrav 191*7b5038d7SDag-Erling Smørgrav /** 192*7b5038d7SDag-Erling Smørgrav * returns the maximum size of the buffer 193*7b5038d7SDag-Erling Smørgrav * \param[in] buffer 194*7b5038d7SDag-Erling Smørgrav * \return the size 195*7b5038d7SDag-Erling Smørgrav */ 196*7b5038d7SDag-Erling Smørgrav INLINE size_t 197*7b5038d7SDag-Erling Smørgrav ldns_buffer_limit(ldns_buffer *buffer) 198*7b5038d7SDag-Erling Smørgrav { 199*7b5038d7SDag-Erling Smørgrav return buffer->_limit; 200*7b5038d7SDag-Erling Smørgrav } 201*7b5038d7SDag-Erling Smørgrav 202*7b5038d7SDag-Erling Smørgrav /** 203*7b5038d7SDag-Erling Smørgrav * changes the buffer's limit. If the buffer's position is greater 204*7b5038d7SDag-Erling Smørgrav * than the new limit the position is set to the limit. 205*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 206*7b5038d7SDag-Erling Smørgrav * \param[in] limit the new limit 207*7b5038d7SDag-Erling Smørgrav */ 208*7b5038d7SDag-Erling Smørgrav INLINE void 209*7b5038d7SDag-Erling Smørgrav ldns_buffer_set_limit(ldns_buffer *buffer, size_t limit) 210*7b5038d7SDag-Erling Smørgrav { 211*7b5038d7SDag-Erling Smørgrav assert(limit <= buffer->_capacity); 212*7b5038d7SDag-Erling Smørgrav buffer->_limit = limit; 213*7b5038d7SDag-Erling Smørgrav if (buffer->_position > buffer->_limit) 214*7b5038d7SDag-Erling Smørgrav buffer->_position = buffer->_limit; 215*7b5038d7SDag-Erling Smørgrav } 216*7b5038d7SDag-Erling Smørgrav 217*7b5038d7SDag-Erling Smørgrav /** 218*7b5038d7SDag-Erling Smørgrav * returns the number of bytes the buffer can hold. 219*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 220*7b5038d7SDag-Erling Smørgrav * \return the number of bytes 221*7b5038d7SDag-Erling Smørgrav */ 222*7b5038d7SDag-Erling Smørgrav INLINE size_t 223*7b5038d7SDag-Erling Smørgrav ldns_buffer_capacity(ldns_buffer *buffer) 224*7b5038d7SDag-Erling Smørgrav { 225*7b5038d7SDag-Erling Smørgrav return buffer->_capacity; 226*7b5038d7SDag-Erling Smørgrav } 227*7b5038d7SDag-Erling Smørgrav 228*7b5038d7SDag-Erling Smørgrav /** 229*7b5038d7SDag-Erling Smørgrav * changes the buffer's capacity. The data is reallocated so any 230*7b5038d7SDag-Erling Smørgrav * pointers to the data may become invalid. The buffer's limit is set 231*7b5038d7SDag-Erling Smørgrav * to the buffer's new capacity. 232*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 233*7b5038d7SDag-Erling Smørgrav * \param[in] capacity the capacity to use 234*7b5038d7SDag-Erling Smørgrav * \return whether this failed or succeeded 235*7b5038d7SDag-Erling Smørgrav */ 236*7b5038d7SDag-Erling Smørgrav bool ldns_buffer_set_capacity(ldns_buffer *buffer, size_t capacity); 237*7b5038d7SDag-Erling Smørgrav 238*7b5038d7SDag-Erling Smørgrav /** 239*7b5038d7SDag-Erling Smørgrav * ensures BUFFER can contain at least AMOUNT more bytes. The buffer's 240*7b5038d7SDag-Erling Smørgrav * capacity is increased if necessary using buffer_set_capacity(). 241*7b5038d7SDag-Erling Smørgrav * 242*7b5038d7SDag-Erling Smørgrav * The buffer's limit is always set to the (possibly increased) 243*7b5038d7SDag-Erling Smørgrav * capacity. 244*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 245*7b5038d7SDag-Erling Smørgrav * \param[in] amount amount to use 246*7b5038d7SDag-Erling Smørgrav * \return whether this failed or succeeded 247*7b5038d7SDag-Erling Smørgrav */ 248*7b5038d7SDag-Erling Smørgrav bool ldns_buffer_reserve(ldns_buffer *buffer, size_t amount); 249*7b5038d7SDag-Erling Smørgrav 250*7b5038d7SDag-Erling Smørgrav /** 251*7b5038d7SDag-Erling Smørgrav * returns a pointer to the data at the indicated position. 252*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 253*7b5038d7SDag-Erling Smørgrav * \param[in] at position 254*7b5038d7SDag-Erling Smørgrav * \return the pointer to the data 255*7b5038d7SDag-Erling Smørgrav */ 256*7b5038d7SDag-Erling Smørgrav INLINE uint8_t * 257*7b5038d7SDag-Erling Smørgrav ldns_buffer_at(const ldns_buffer *buffer, size_t at) 258*7b5038d7SDag-Erling Smørgrav { 259*7b5038d7SDag-Erling Smørgrav assert(at <= buffer->_limit); 260*7b5038d7SDag-Erling Smørgrav return buffer->_data + at; 261*7b5038d7SDag-Erling Smørgrav } 262*7b5038d7SDag-Erling Smørgrav 263*7b5038d7SDag-Erling Smørgrav /** 264*7b5038d7SDag-Erling Smørgrav * returns a pointer to the beginning of the buffer (the data at 265*7b5038d7SDag-Erling Smørgrav * position 0). 266*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 267*7b5038d7SDag-Erling Smørgrav * \return the pointer 268*7b5038d7SDag-Erling Smørgrav */ 269*7b5038d7SDag-Erling Smørgrav INLINE uint8_t * 270*7b5038d7SDag-Erling Smørgrav ldns_buffer_begin(const ldns_buffer *buffer) 271*7b5038d7SDag-Erling Smørgrav { 272*7b5038d7SDag-Erling Smørgrav return ldns_buffer_at(buffer, 0); 273*7b5038d7SDag-Erling Smørgrav } 274*7b5038d7SDag-Erling Smørgrav 275*7b5038d7SDag-Erling Smørgrav /** 276*7b5038d7SDag-Erling Smørgrav * returns a pointer to the end of the buffer (the data at the buffer's 277*7b5038d7SDag-Erling Smørgrav * limit). 278*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 279*7b5038d7SDag-Erling Smørgrav * \return the pointer 280*7b5038d7SDag-Erling Smørgrav */ 281*7b5038d7SDag-Erling Smørgrav INLINE uint8_t * 282*7b5038d7SDag-Erling Smørgrav ldns_buffer_end(ldns_buffer *buffer) 283*7b5038d7SDag-Erling Smørgrav { 284*7b5038d7SDag-Erling Smørgrav return ldns_buffer_at(buffer, buffer->_limit); 285*7b5038d7SDag-Erling Smørgrav } 286*7b5038d7SDag-Erling Smørgrav 287*7b5038d7SDag-Erling Smørgrav /** 288*7b5038d7SDag-Erling Smørgrav * returns a pointer to the data at the buffer's current position. 289*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 290*7b5038d7SDag-Erling Smørgrav * \return the pointer 291*7b5038d7SDag-Erling Smørgrav */ 292*7b5038d7SDag-Erling Smørgrav INLINE uint8_t * 293*7b5038d7SDag-Erling Smørgrav ldns_buffer_current(ldns_buffer *buffer) 294*7b5038d7SDag-Erling Smørgrav { 295*7b5038d7SDag-Erling Smørgrav return ldns_buffer_at(buffer, buffer->_position); 296*7b5038d7SDag-Erling Smørgrav } 297*7b5038d7SDag-Erling Smørgrav 298*7b5038d7SDag-Erling Smørgrav /** 299*7b5038d7SDag-Erling Smørgrav * returns the number of bytes remaining between the indicated position and 300*7b5038d7SDag-Erling Smørgrav * the limit. 301*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 302*7b5038d7SDag-Erling Smørgrav * \param[in] at indicated position 303*7b5038d7SDag-Erling Smørgrav * \return number of bytes 304*7b5038d7SDag-Erling Smørgrav */ 305*7b5038d7SDag-Erling Smørgrav INLINE size_t 306*7b5038d7SDag-Erling Smørgrav ldns_buffer_remaining_at(ldns_buffer *buffer, size_t at) 307*7b5038d7SDag-Erling Smørgrav { 308*7b5038d7SDag-Erling Smørgrav ldns_buffer_invariant(buffer); 309*7b5038d7SDag-Erling Smørgrav assert(at <= buffer->_limit); 310*7b5038d7SDag-Erling Smørgrav return buffer->_limit - at; 311*7b5038d7SDag-Erling Smørgrav } 312*7b5038d7SDag-Erling Smørgrav 313*7b5038d7SDag-Erling Smørgrav /** 314*7b5038d7SDag-Erling Smørgrav * returns the number of bytes remaining between the buffer's position and 315*7b5038d7SDag-Erling Smørgrav * limit. 316*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 317*7b5038d7SDag-Erling Smørgrav * \return the number of bytes 318*7b5038d7SDag-Erling Smørgrav */ 319*7b5038d7SDag-Erling Smørgrav INLINE size_t 320*7b5038d7SDag-Erling Smørgrav ldns_buffer_remaining(ldns_buffer *buffer) 321*7b5038d7SDag-Erling Smørgrav { 322*7b5038d7SDag-Erling Smørgrav return ldns_buffer_remaining_at(buffer, buffer->_position); 323*7b5038d7SDag-Erling Smørgrav } 324*7b5038d7SDag-Erling Smørgrav 325*7b5038d7SDag-Erling Smørgrav /** 326*7b5038d7SDag-Erling Smørgrav * checks if the buffer has at least COUNT more bytes available. 327*7b5038d7SDag-Erling Smørgrav * Before reading or writing the caller needs to ensure enough space 328*7b5038d7SDag-Erling Smørgrav * is available! 329*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 330*7b5038d7SDag-Erling Smørgrav * \param[in] at indicated position 331*7b5038d7SDag-Erling Smørgrav * \param[in] count how much is available 332*7b5038d7SDag-Erling Smørgrav * \return true or false (as int?) 333*7b5038d7SDag-Erling Smørgrav */ 334*7b5038d7SDag-Erling Smørgrav INLINE int 335*7b5038d7SDag-Erling Smørgrav ldns_buffer_available_at(ldns_buffer *buffer, size_t at, size_t count) 336*7b5038d7SDag-Erling Smørgrav { 337*7b5038d7SDag-Erling Smørgrav return count <= ldns_buffer_remaining_at(buffer, at); 338*7b5038d7SDag-Erling Smørgrav } 339*7b5038d7SDag-Erling Smørgrav 340*7b5038d7SDag-Erling Smørgrav /** 341*7b5038d7SDag-Erling Smørgrav * checks if the buffer has count bytes available at the current position 342*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 343*7b5038d7SDag-Erling Smørgrav * \param[in] count how much is available 344*7b5038d7SDag-Erling Smørgrav * \return true or false (as int?) 345*7b5038d7SDag-Erling Smørgrav */ 346*7b5038d7SDag-Erling Smørgrav INLINE int 347*7b5038d7SDag-Erling Smørgrav ldns_buffer_available(ldns_buffer *buffer, size_t count) 348*7b5038d7SDag-Erling Smørgrav { 349*7b5038d7SDag-Erling Smørgrav return ldns_buffer_available_at(buffer, buffer->_position, count); 350*7b5038d7SDag-Erling Smørgrav } 351*7b5038d7SDag-Erling Smørgrav 352*7b5038d7SDag-Erling Smørgrav /** 353*7b5038d7SDag-Erling Smørgrav * writes the given data to the buffer at the specified position 354*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 355*7b5038d7SDag-Erling Smørgrav * \param[in] at the position (in number of bytes) to write the data at 356*7b5038d7SDag-Erling Smørgrav * \param[in] data pointer to the data to write to the buffer 357*7b5038d7SDag-Erling Smørgrav * \param[in] count the number of bytes of data to write 358*7b5038d7SDag-Erling Smørgrav */ 359*7b5038d7SDag-Erling Smørgrav INLINE void 360*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_at(ldns_buffer *buffer, size_t at, const void *data, size_t count) 361*7b5038d7SDag-Erling Smørgrav { 362*7b5038d7SDag-Erling Smørgrav assert(ldns_buffer_available_at(buffer, at, count)); 363*7b5038d7SDag-Erling Smørgrav memcpy(buffer->_data + at, data, count); 364*7b5038d7SDag-Erling Smørgrav } 365*7b5038d7SDag-Erling Smørgrav 366*7b5038d7SDag-Erling Smørgrav /** 367*7b5038d7SDag-Erling Smørgrav * writes count bytes of data to the current position of the buffer 368*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 369*7b5038d7SDag-Erling Smørgrav * \param[in] data the data to write 370*7b5038d7SDag-Erling Smørgrav * \param[in] count the lenght of the data to write 371*7b5038d7SDag-Erling Smørgrav */ 372*7b5038d7SDag-Erling Smørgrav INLINE void 373*7b5038d7SDag-Erling Smørgrav ldns_buffer_write(ldns_buffer *buffer, const void *data, size_t count) 374*7b5038d7SDag-Erling Smørgrav { 375*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_at(buffer, buffer->_position, data, count); 376*7b5038d7SDag-Erling Smørgrav buffer->_position += count; 377*7b5038d7SDag-Erling Smørgrav } 378*7b5038d7SDag-Erling Smørgrav 379*7b5038d7SDag-Erling Smørgrav /** 380*7b5038d7SDag-Erling Smørgrav * copies the given (null-delimited) string to the specified position at the buffer 381*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 382*7b5038d7SDag-Erling Smørgrav * \param[in] at the position in the buffer 383*7b5038d7SDag-Erling Smørgrav * \param[in] str the string to write 384*7b5038d7SDag-Erling Smørgrav */ 385*7b5038d7SDag-Erling Smørgrav INLINE void 386*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_string_at(ldns_buffer *buffer, size_t at, const char *str) 387*7b5038d7SDag-Erling Smørgrav { 388*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_at(buffer, at, str, strlen(str)); 389*7b5038d7SDag-Erling Smørgrav } 390*7b5038d7SDag-Erling Smørgrav 391*7b5038d7SDag-Erling Smørgrav /** 392*7b5038d7SDag-Erling Smørgrav * copies the given (null-delimited) string to the current position at the buffer 393*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 394*7b5038d7SDag-Erling Smørgrav * \param[in] str the string to write 395*7b5038d7SDag-Erling Smørgrav */ 396*7b5038d7SDag-Erling Smørgrav INLINE void 397*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_string(ldns_buffer *buffer, const char *str) 398*7b5038d7SDag-Erling Smørgrav { 399*7b5038d7SDag-Erling Smørgrav ldns_buffer_write(buffer, str, strlen(str)); 400*7b5038d7SDag-Erling Smørgrav } 401*7b5038d7SDag-Erling Smørgrav 402*7b5038d7SDag-Erling Smørgrav /** 403*7b5038d7SDag-Erling Smørgrav * writes the given byte of data at the given position in the buffer 404*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 405*7b5038d7SDag-Erling Smørgrav * \param[in] at the position in the buffer 406*7b5038d7SDag-Erling Smørgrav * \param[in] data the 8 bits to write 407*7b5038d7SDag-Erling Smørgrav */ 408*7b5038d7SDag-Erling Smørgrav INLINE void 409*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_u8_at(ldns_buffer *buffer, size_t at, uint8_t data) 410*7b5038d7SDag-Erling Smørgrav { 411*7b5038d7SDag-Erling Smørgrav assert(ldns_buffer_available_at(buffer, at, sizeof(data))); 412*7b5038d7SDag-Erling Smørgrav buffer->_data[at] = data; 413*7b5038d7SDag-Erling Smørgrav } 414*7b5038d7SDag-Erling Smørgrav 415*7b5038d7SDag-Erling Smørgrav /** 416*7b5038d7SDag-Erling Smørgrav * writes the given byte of data at the current position in the buffer 417*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 418*7b5038d7SDag-Erling Smørgrav * \param[in] data the 8 bits to write 419*7b5038d7SDag-Erling Smørgrav */ 420*7b5038d7SDag-Erling Smørgrav INLINE void 421*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_u8(ldns_buffer *buffer, uint8_t data) 422*7b5038d7SDag-Erling Smørgrav { 423*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_u8_at(buffer, buffer->_position, data); 424*7b5038d7SDag-Erling Smørgrav buffer->_position += sizeof(data); 425*7b5038d7SDag-Erling Smørgrav } 426*7b5038d7SDag-Erling Smørgrav 427*7b5038d7SDag-Erling Smørgrav /** 428*7b5038d7SDag-Erling Smørgrav * writes the given 2 byte integer at the given position in the buffer 429*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 430*7b5038d7SDag-Erling Smørgrav * \param[in] at the position in the buffer 431*7b5038d7SDag-Erling Smørgrav * \param[in] data the 16 bits to write 432*7b5038d7SDag-Erling Smørgrav */ 433*7b5038d7SDag-Erling Smørgrav INLINE void 434*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_u16_at(ldns_buffer *buffer, size_t at, uint16_t data) 435*7b5038d7SDag-Erling Smørgrav { 436*7b5038d7SDag-Erling Smørgrav assert(ldns_buffer_available_at(buffer, at, sizeof(data))); 437*7b5038d7SDag-Erling Smørgrav ldns_write_uint16(buffer->_data + at, data); 438*7b5038d7SDag-Erling Smørgrav } 439*7b5038d7SDag-Erling Smørgrav 440*7b5038d7SDag-Erling Smørgrav /** 441*7b5038d7SDag-Erling Smørgrav * writes the given 2 byte integer at the current position in the buffer 442*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 443*7b5038d7SDag-Erling Smørgrav * \param[in] data the 16 bits to write 444*7b5038d7SDag-Erling Smørgrav */ 445*7b5038d7SDag-Erling Smørgrav INLINE void 446*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_u16(ldns_buffer *buffer, uint16_t data) 447*7b5038d7SDag-Erling Smørgrav { 448*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_u16_at(buffer, buffer->_position, data); 449*7b5038d7SDag-Erling Smørgrav buffer->_position += sizeof(data); 450*7b5038d7SDag-Erling Smørgrav } 451*7b5038d7SDag-Erling Smørgrav 452*7b5038d7SDag-Erling Smørgrav /** 453*7b5038d7SDag-Erling Smørgrav * writes the given 4 byte integer at the given position in the buffer 454*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 455*7b5038d7SDag-Erling Smørgrav * \param[in] at the position in the buffer 456*7b5038d7SDag-Erling Smørgrav * \param[in] data the 32 bits to write 457*7b5038d7SDag-Erling Smørgrav */ 458*7b5038d7SDag-Erling Smørgrav INLINE void 459*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_u32_at(ldns_buffer *buffer, size_t at, uint32_t data) 460*7b5038d7SDag-Erling Smørgrav { 461*7b5038d7SDag-Erling Smørgrav assert(ldns_buffer_available_at(buffer, at, sizeof(data))); 462*7b5038d7SDag-Erling Smørgrav ldns_write_uint32(buffer->_data + at, data); 463*7b5038d7SDag-Erling Smørgrav } 464*7b5038d7SDag-Erling Smørgrav 465*7b5038d7SDag-Erling Smørgrav /** 466*7b5038d7SDag-Erling Smørgrav * writes the given 4 byte integer at the current position in the buffer 467*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 468*7b5038d7SDag-Erling Smørgrav * \param[in] data the 32 bits to write 469*7b5038d7SDag-Erling Smørgrav */ 470*7b5038d7SDag-Erling Smørgrav INLINE void 471*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_u32(ldns_buffer *buffer, uint32_t data) 472*7b5038d7SDag-Erling Smørgrav { 473*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_u32_at(buffer, buffer->_position, data); 474*7b5038d7SDag-Erling Smørgrav buffer->_position += sizeof(data); 475*7b5038d7SDag-Erling Smørgrav } 476*7b5038d7SDag-Erling Smørgrav 477*7b5038d7SDag-Erling Smørgrav /** 478*7b5038d7SDag-Erling Smørgrav * copies count bytes of data at the given position to the given data-array 479*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 480*7b5038d7SDag-Erling Smørgrav * \param[in] at the position in the buffer to start 481*7b5038d7SDag-Erling Smørgrav * \param[out] data buffer to copy to 482*7b5038d7SDag-Erling Smørgrav * \param[in] count the length of the data to copy 483*7b5038d7SDag-Erling Smørgrav */ 484*7b5038d7SDag-Erling Smørgrav INLINE void 485*7b5038d7SDag-Erling Smørgrav ldns_buffer_read_at(ldns_buffer *buffer, size_t at, void *data, size_t count) 486*7b5038d7SDag-Erling Smørgrav { 487*7b5038d7SDag-Erling Smørgrav assert(ldns_buffer_available_at(buffer, at, count)); 488*7b5038d7SDag-Erling Smørgrav memcpy(data, buffer->_data + at, count); 489*7b5038d7SDag-Erling Smørgrav } 490*7b5038d7SDag-Erling Smørgrav 491*7b5038d7SDag-Erling Smørgrav /** 492*7b5038d7SDag-Erling Smørgrav * copies count bytes of data at the current position to the given data-array 493*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 494*7b5038d7SDag-Erling Smørgrav * \param[out] data buffer to copy to 495*7b5038d7SDag-Erling Smørgrav * \param[in] count the length of the data to copy 496*7b5038d7SDag-Erling Smørgrav */ 497*7b5038d7SDag-Erling Smørgrav INLINE void 498*7b5038d7SDag-Erling Smørgrav ldns_buffer_read(ldns_buffer *buffer, void *data, size_t count) 499*7b5038d7SDag-Erling Smørgrav { 500*7b5038d7SDag-Erling Smørgrav ldns_buffer_read_at(buffer, buffer->_position, data, count); 501*7b5038d7SDag-Erling Smørgrav buffer->_position += count; 502*7b5038d7SDag-Erling Smørgrav } 503*7b5038d7SDag-Erling Smørgrav 504*7b5038d7SDag-Erling Smørgrav /** 505*7b5038d7SDag-Erling Smørgrav * returns the byte value at the given position in the buffer 506*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 507*7b5038d7SDag-Erling Smørgrav * \param[in] at the position in the buffer 508*7b5038d7SDag-Erling Smørgrav * \return 1 byte integer 509*7b5038d7SDag-Erling Smørgrav */ 510*7b5038d7SDag-Erling Smørgrav INLINE uint8_t 511*7b5038d7SDag-Erling Smørgrav ldns_buffer_read_u8_at(ldns_buffer *buffer, size_t at) 512*7b5038d7SDag-Erling Smørgrav { 513*7b5038d7SDag-Erling Smørgrav assert(ldns_buffer_available_at(buffer, at, sizeof(uint8_t))); 514*7b5038d7SDag-Erling Smørgrav return buffer->_data[at]; 515*7b5038d7SDag-Erling Smørgrav } 516*7b5038d7SDag-Erling Smørgrav 517*7b5038d7SDag-Erling Smørgrav /** 518*7b5038d7SDag-Erling Smørgrav * returns the byte value at the current position in the buffer 519*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 520*7b5038d7SDag-Erling Smørgrav * \return 1 byte integer 521*7b5038d7SDag-Erling Smørgrav */ 522*7b5038d7SDag-Erling Smørgrav INLINE uint8_t 523*7b5038d7SDag-Erling Smørgrav ldns_buffer_read_u8(ldns_buffer *buffer) 524*7b5038d7SDag-Erling Smørgrav { 525*7b5038d7SDag-Erling Smørgrav uint8_t result = ldns_buffer_read_u8_at(buffer, buffer->_position); 526*7b5038d7SDag-Erling Smørgrav buffer->_position += sizeof(uint8_t); 527*7b5038d7SDag-Erling Smørgrav return result; 528*7b5038d7SDag-Erling Smørgrav } 529*7b5038d7SDag-Erling Smørgrav 530*7b5038d7SDag-Erling Smørgrav /** 531*7b5038d7SDag-Erling Smørgrav * returns the 2-byte integer value at the given position in the buffer 532*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 533*7b5038d7SDag-Erling Smørgrav * \param[in] at position in the buffer 534*7b5038d7SDag-Erling Smørgrav * \return 2 byte integer 535*7b5038d7SDag-Erling Smørgrav */ 536*7b5038d7SDag-Erling Smørgrav INLINE uint16_t 537*7b5038d7SDag-Erling Smørgrav ldns_buffer_read_u16_at(ldns_buffer *buffer, size_t at) 538*7b5038d7SDag-Erling Smørgrav { 539*7b5038d7SDag-Erling Smørgrav assert(ldns_buffer_available_at(buffer, at, sizeof(uint16_t))); 540*7b5038d7SDag-Erling Smørgrav return ldns_read_uint16(buffer->_data + at); 541*7b5038d7SDag-Erling Smørgrav } 542*7b5038d7SDag-Erling Smørgrav 543*7b5038d7SDag-Erling Smørgrav /** 544*7b5038d7SDag-Erling Smørgrav * returns the 2-byte integer value at the current position in the buffer 545*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 546*7b5038d7SDag-Erling Smørgrav * \return 2 byte integer 547*7b5038d7SDag-Erling Smørgrav */ 548*7b5038d7SDag-Erling Smørgrav INLINE uint16_t 549*7b5038d7SDag-Erling Smørgrav ldns_buffer_read_u16(ldns_buffer *buffer) 550*7b5038d7SDag-Erling Smørgrav { 551*7b5038d7SDag-Erling Smørgrav uint16_t result = ldns_buffer_read_u16_at(buffer, buffer->_position); 552*7b5038d7SDag-Erling Smørgrav buffer->_position += sizeof(uint16_t); 553*7b5038d7SDag-Erling Smørgrav return result; 554*7b5038d7SDag-Erling Smørgrav } 555*7b5038d7SDag-Erling Smørgrav 556*7b5038d7SDag-Erling Smørgrav /** 557*7b5038d7SDag-Erling Smørgrav * returns the 4-byte integer value at the given position in the buffer 558*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 559*7b5038d7SDag-Erling Smørgrav * \param[in] at position in the buffer 560*7b5038d7SDag-Erling Smørgrav * \return 4 byte integer 561*7b5038d7SDag-Erling Smørgrav */ 562*7b5038d7SDag-Erling Smørgrav INLINE uint32_t 563*7b5038d7SDag-Erling Smørgrav ldns_buffer_read_u32_at(ldns_buffer *buffer, size_t at) 564*7b5038d7SDag-Erling Smørgrav { 565*7b5038d7SDag-Erling Smørgrav assert(ldns_buffer_available_at(buffer, at, sizeof(uint32_t))); 566*7b5038d7SDag-Erling Smørgrav return ldns_read_uint32(buffer->_data + at); 567*7b5038d7SDag-Erling Smørgrav } 568*7b5038d7SDag-Erling Smørgrav 569*7b5038d7SDag-Erling Smørgrav /** 570*7b5038d7SDag-Erling Smørgrav * returns the 4-byte integer value at the current position in the buffer 571*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 572*7b5038d7SDag-Erling Smørgrav * \return 4 byte integer 573*7b5038d7SDag-Erling Smørgrav */ 574*7b5038d7SDag-Erling Smørgrav INLINE uint32_t 575*7b5038d7SDag-Erling Smørgrav ldns_buffer_read_u32(ldns_buffer *buffer) 576*7b5038d7SDag-Erling Smørgrav { 577*7b5038d7SDag-Erling Smørgrav uint32_t result = ldns_buffer_read_u32_at(buffer, buffer->_position); 578*7b5038d7SDag-Erling Smørgrav buffer->_position += sizeof(uint32_t); 579*7b5038d7SDag-Erling Smørgrav return result; 580*7b5038d7SDag-Erling Smørgrav } 581*7b5038d7SDag-Erling Smørgrav 582*7b5038d7SDag-Erling Smørgrav /** 583*7b5038d7SDag-Erling Smørgrav * returns the status of the buffer 584*7b5038d7SDag-Erling Smørgrav * \param[in] buffer 585*7b5038d7SDag-Erling Smørgrav * \return the status 586*7b5038d7SDag-Erling Smørgrav */ 587*7b5038d7SDag-Erling Smørgrav INLINE ldns_status 588*7b5038d7SDag-Erling Smørgrav ldns_buffer_status(ldns_buffer *buffer) 589*7b5038d7SDag-Erling Smørgrav { 590*7b5038d7SDag-Erling Smørgrav return buffer->_status; 591*7b5038d7SDag-Erling Smørgrav } 592*7b5038d7SDag-Erling Smørgrav 593*7b5038d7SDag-Erling Smørgrav /** 594*7b5038d7SDag-Erling Smørgrav * returns true if the status of the buffer is LDNS_STATUS_OK, false otherwise 595*7b5038d7SDag-Erling Smørgrav * \param[in] buffer the buffer 596*7b5038d7SDag-Erling Smørgrav * \return true or false 597*7b5038d7SDag-Erling Smørgrav */ 598*7b5038d7SDag-Erling Smørgrav INLINE bool 599*7b5038d7SDag-Erling Smørgrav ldns_buffer_status_ok(ldns_buffer *buffer) 600*7b5038d7SDag-Erling Smørgrav { 601*7b5038d7SDag-Erling Smørgrav if (buffer) { 602*7b5038d7SDag-Erling Smørgrav return ldns_buffer_status(buffer) == LDNS_STATUS_OK; 603*7b5038d7SDag-Erling Smørgrav } else { 604*7b5038d7SDag-Erling Smørgrav return false; 605*7b5038d7SDag-Erling Smørgrav } 606*7b5038d7SDag-Erling Smørgrav } 607*7b5038d7SDag-Erling Smørgrav 608*7b5038d7SDag-Erling Smørgrav /** 609*7b5038d7SDag-Erling Smørgrav * prints to the buffer, increasing the capacity if required using 610*7b5038d7SDag-Erling Smørgrav * buffer_reserve(). The buffer's position is set to the terminating '\\0' 611*7b5038d7SDag-Erling Smørgrav * Returns the number of characters written (not including the 612*7b5038d7SDag-Erling Smørgrav * terminating '\\0') or -1 on failure. 613*7b5038d7SDag-Erling Smørgrav */ 614*7b5038d7SDag-Erling Smørgrav int ldns_buffer_printf(ldns_buffer *buffer, const char *format, ...); 615*7b5038d7SDag-Erling Smørgrav /* ATTR_FORMAT(printf, 2, 3);*/ 616*7b5038d7SDag-Erling Smørgrav 617*7b5038d7SDag-Erling Smørgrav /** 618*7b5038d7SDag-Erling Smørgrav * frees the buffer. 619*7b5038d7SDag-Erling Smørgrav * \param[in] *buffer the buffer to be freed 620*7b5038d7SDag-Erling Smørgrav * \return void 621*7b5038d7SDag-Erling Smørgrav */ 622*7b5038d7SDag-Erling Smørgrav void ldns_buffer_free(ldns_buffer *buffer); 623*7b5038d7SDag-Erling Smørgrav 624*7b5038d7SDag-Erling Smørgrav /** 625*7b5038d7SDag-Erling Smørgrav * Makes the buffer fixed and returns a pointer to the data. The 626*7b5038d7SDag-Erling Smørgrav * caller is responsible for free'ing the result. 627*7b5038d7SDag-Erling Smørgrav * \param[in] *buffer the buffer to be exported 628*7b5038d7SDag-Erling Smørgrav * \return void 629*7b5038d7SDag-Erling Smørgrav */ 630*7b5038d7SDag-Erling Smørgrav void *ldns_buffer_export(ldns_buffer *buffer); 631*7b5038d7SDag-Erling Smørgrav 632*7b5038d7SDag-Erling Smørgrav /** 633*7b5038d7SDag-Erling Smørgrav * Copy contents of the other buffer to this buffer. Silently truncated 634*7b5038d7SDag-Erling Smørgrav * if this buffer is too small. 635*7b5038d7SDag-Erling Smørgrav * \param[out] *result resulting buffer which is copied to. 636*7b5038d7SDag-Erling Smørgrav * \param[in] *from what to copy to result. 637*7b5038d7SDag-Erling Smørgrav */ 638*7b5038d7SDag-Erling Smørgrav void ldns_buffer_copy(ldns_buffer* result, ldns_buffer* from); 639*7b5038d7SDag-Erling Smørgrav 640*7b5038d7SDag-Erling Smørgrav #ifdef __cplusplus 641*7b5038d7SDag-Erling Smørgrav } 642*7b5038d7SDag-Erling Smørgrav #endif 643*7b5038d7SDag-Erling Smørgrav 644*7b5038d7SDag-Erling Smørgrav #endif /* LDNS_BUFFER_H */ 645