/usr/include/dovecot/buffer.h is in dovecot-dev 1:2.2.9-1ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | #ifndef BUFFER_H
#define BUFFER_H
struct buffer {
const void *data;
const size_t used;
void *priv[5];
};
/* WARNING: Be careful with functions that return pointers to data.
With dynamic buffers they are valid only as long as buffer is not
realloc()ed. You shouldn't rely on it being valid if you have modified
buffer in any way. */
/* Create a modifiable buffer from given data. Writes past this size will
i_panic(). */
void buffer_create_from_data(buffer_t *buffer, void *data, size_t size);
/* Create a non-modifiable buffer from given data. */
void buffer_create_from_const_data(buffer_t *buffer,
const void *data, size_t size);
/* Creates a dynamically growing buffer. Whenever write would exceed the
current size it's grown. */
buffer_t *buffer_create_dynamic(pool_t pool, size_t init_size);
/* Free the memory used by buffer. Not needed if the memory is free'd
directly from the memory pool. */
void buffer_free(buffer_t **buf);
/* Free the memory used by buffer structure, but return the buffer data
unfree'd. */
void *buffer_free_without_data(buffer_t **buf);
/* Returns the pool buffer was created with. */
pool_t buffer_get_pool(const buffer_t *buf) ATTR_PURE;
/* Reset the buffer. used size and it's contents are zeroed. */
void buffer_reset(buffer_t *buf);
/* Write data to buffer at specified position. */
void buffer_write(buffer_t *buf, size_t pos,
const void *data, size_t data_size);
/* Append data to buffer. */
void buffer_append(buffer_t *buf, const void *data, size_t data_size);
/* Append character to buffer. */
void buffer_append_c(buffer_t *buf, unsigned char chr);
/* Insert data to buffer. */
void buffer_insert(buffer_t *buf, size_t pos,
const void *data, size_t data_size);
/* Delete data from buffer. */
void buffer_delete(buffer_t *buf, size_t pos, size_t size);
/* Fill buffer with zero bytes. */
void buffer_write_zero(buffer_t *buf, size_t pos, size_t data_size);
void buffer_append_zero(buffer_t *buf, size_t data_size);
void buffer_insert_zero(buffer_t *buf, size_t pos, size_t data_size);
/* Copy data from buffer to another. The buffers may be same in which case
it's internal copying, possibly with overlapping positions (ie. memmove()
like functionality). copy_size may be set to (size_t)-1 to copy the rest of
the used data in buffer. */
void buffer_copy(buffer_t *dest, size_t dest_pos,
const buffer_t *src, size_t src_pos, size_t copy_size);
/* Append data to buffer from another. copy_size may be set to (size_t)-1 to
copy the rest of the used data in buffer. */
void buffer_append_buf(buffer_t *dest, const buffer_t *src,
size_t src_pos, size_t copy_size);
/* Returns pointer to specified position in buffer. WARNING: The returned
address may become invalid if you add more data to buffer. */
void *buffer_get_space_unsafe(buffer_t *buf, size_t pos, size_t size);
/* Increase the buffer usage by given size, and return a pointer to beginning
of it. */
void *buffer_append_space_unsafe(buffer_t *buf, size_t size);
/* Like buffer_get_data(), but don't return it as const. Returns NULL if the
buffer is non-modifiable. WARNING: The returned address may become invalid
if you add more data to buffer. */
void *buffer_get_modifiable_data(const buffer_t *buf, size_t *used_size_r)
ATTR_NULL(2);
/* Set the "used size" of buffer, ie. 0 would set the buffer empty.
Must not be used to grow buffer. */
void buffer_set_used_size(buffer_t *buf, size_t used_size);
/* Returns the current buffer size. */
size_t buffer_get_size(const buffer_t *buf) ATTR_PURE;
/* Returns TRUE if buffer contents are identical. */
bool buffer_cmp(const buffer_t *buf1, const buffer_t *buf2);
/* Returns pointer to beginning of buffer data. Current used size of buffer is
stored in used_size if it's non-NULL. */
static inline const void * ATTR_NULL(2)
buffer_get_data(const buffer_t *buf, size_t *used_size_r)
{
if (used_size_r != NULL)
*used_size_r = buf->used;
return buf->data;
}
/* Returns the current used buffer size. */
static inline size_t ATTR_PURE
buffer_get_used_size(const buffer_t *buf)
{
return buf->used;
}
/* Crash if buffer was allocated from data stack and stack frame has changed.
This can be used as an assert-like check to verify that it's valid to
increase the buffer size here, instead of crashing only randomly when the
buffer needs to be increased. */
void buffer_verify_pool(buffer_t *buf);
#endif
|