Blame egg/egg-buffer.h

Packit b00eeb
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
Packit b00eeb
/* egg-buffer.h - Generic data buffer, used by openssh, gnome-keyring
Packit b00eeb
Packit b00eeb
   Copyright (C) 2007, Stefan Walter
Packit b00eeb
Packit b00eeb
   The Gnome Keyring Library is free software; you can redistribute it and/or
Packit b00eeb
   modify it under the terms of the GNU Library General Public License as
Packit b00eeb
   published by the Free Software Foundation; either version 2 of the
Packit b00eeb
   License, or (at your option) any later version.
Packit b00eeb
Packit b00eeb
   The Gnome Keyring Library is distributed in the hope that it will be useful,
Packit b00eeb
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit b00eeb
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit b00eeb
   Library General Public License for more details.
Packit b00eeb
Packit b00eeb
   You should have received a copy of the GNU Library General Public
Packit b00eeb
   License along with the Gnome Library; see the file COPYING.LIB.  If not,
Packit b00eeb
   see <http://www.gnu.org/licenses/>.
Packit b00eeb
Packit b00eeb
   Author: Stef Walter <stef@memberwebs.com>
Packit b00eeb
*/
Packit b00eeb
Packit b00eeb
#ifndef EGG_BUFFER_H
Packit b00eeb
#define EGG_BUFFER_H
Packit b00eeb
Packit b00eeb
#include <stdlib.h>
Packit b00eeb
#include <stdint.h>
Packit b00eeb
Packit b00eeb
/* -------------------------------------------------------------------
Packit b00eeb
 * EggBuffer
Packit b00eeb
 *
Packit b00eeb
 * IMPORTANT: This is pure vanila standard C, no glib. We need this
Packit b00eeb
 * because certain consumers of this protocol need to be built
Packit b00eeb
 * without linking in any special libraries. ie: the PKCS#11 module.
Packit b00eeb
 *
Packit b00eeb
 * Memory Allocation
Packit b00eeb
 *
Packit b00eeb
 * Callers can set their own allocator. If NULL is used then standard
Packit b00eeb
 * C library heap memory is used and failures will not be fatal. Memory
Packit b00eeb
 * failures will instead result in a zero return value or
Packit b00eeb
 * egg_buffer_has_error() returning one.
Packit b00eeb
 *
Packit b00eeb
 * If you use something like g_realloc as the allocator, then memory
Packit b00eeb
 * failures become fatal just like in a standard GTK program.
Packit b00eeb
 *
Packit b00eeb
 * Don't change the allocator manually in the EggBuffer structure. The
Packit b00eeb
 * egg_buffer_set_allocator() func will reallocate and handle things
Packit b00eeb
 * properly.
Packit b00eeb
 *
Packit b00eeb
 * Pointers into the Buffer
Packit b00eeb
 *
Packit b00eeb
 * Any write operation has the posibility of reallocating memory
Packit b00eeb
 * and invalidating any direct pointers into the buffer.
Packit b00eeb
 */
Packit b00eeb
Packit b00eeb
/* The allocator for the EggBuffer. This follows the realloc() syntax and logic */
Packit b00eeb
typedef void* (*EggBufferAllocator) (void* p, size_t len);
Packit b00eeb
Packit b00eeb
typedef struct _EggBuffer {
Packit b00eeb
	unsigned char *buf;
Packit b00eeb
	size_t len;
Packit b00eeb
	size_t allocated_len;
Packit b00eeb
	int failures;
Packit b00eeb
	EggBufferAllocator allocator;
Packit b00eeb
} EggBuffer;
Packit b00eeb
Packit b00eeb
#define 	EGG_BUFFER_EMPTY		{ NULL, 0, 0, 0, NULL }
Packit b00eeb
Packit b00eeb
int             egg_buffer_init                 (EggBuffer *buffer, size_t reserve);
Packit b00eeb
Packit b00eeb
int             egg_buffer_init_full            (EggBuffer *buffer,
Packit b00eeb
                                                 size_t reserve,
Packit b00eeb
                                                 EggBufferAllocator allocator);
Packit b00eeb
Packit b00eeb
void            egg_buffer_init_static          (EggBuffer *buffer,
Packit b00eeb
                                                 const unsigned char *buf,
Packit b00eeb
                                                 size_t len);
Packit b00eeb
Packit b00eeb
void            egg_buffer_init_allocated       (EggBuffer *buffer,
Packit b00eeb
                                                 unsigned char *buf,
Packit b00eeb
                                                 size_t len,
Packit b00eeb
                                                 EggBufferAllocator allocator);
Packit b00eeb
Packit b00eeb
void            egg_buffer_uninit               (EggBuffer *buffer);
Packit b00eeb
Packit b00eeb
unsigned char*  egg_buffer_uninit_steal         (EggBuffer *buffer,
Packit b00eeb
                                                 size_t *n_result);
Packit b00eeb
Packit b00eeb
int             egg_buffer_set_allocator        (EggBuffer *buffer,
Packit b00eeb
                                                 EggBufferAllocator allocator);
Packit b00eeb
Packit b00eeb
void 		egg_buffer_reset		(EggBuffer *buffer);
Packit b00eeb
Packit b00eeb
int		egg_buffer_equal		(EggBuffer *b1,
Packit b00eeb
						 EggBuffer *b2);
Packit b00eeb
Packit b00eeb
int             egg_buffer_reserve              (EggBuffer *buffer,
Packit b00eeb
                                                 size_t len);
Packit b00eeb
Packit b00eeb
int             egg_buffer_resize               (EggBuffer *buffer,
Packit b00eeb
                                                 size_t len);
Packit b00eeb
Packit b00eeb
int		egg_buffer_append 		(EggBuffer *buffer,
Packit b00eeb
						 const unsigned char *val,
Packit b00eeb
						 size_t len);
Packit b00eeb
Packit b00eeb
unsigned char*  egg_buffer_add_empty            (EggBuffer *buffer,
Packit b00eeb
                                                 size_t len);
Packit b00eeb
Packit b00eeb
int 		egg_buffer_add_byte		(EggBuffer *buffer,
Packit b00eeb
						 unsigned char val);
Packit b00eeb
Packit b00eeb
int 		egg_buffer_get_byte		(EggBuffer *buffer,
Packit b00eeb
						 size_t offset,
Packit b00eeb
						 size_t *next_offset,
Packit b00eeb
						 unsigned char *val);
Packit b00eeb
Packit b00eeb
void 		egg_buffer_encode_uint32	(unsigned char* buf,
Packit b00eeb
						 uint32_t val);
Packit b00eeb
Packit b00eeb
uint32_t	egg_buffer_decode_uint32	(unsigned char* buf);
Packit b00eeb
Packit b00eeb
int 		egg_buffer_add_uint32		(EggBuffer *buffer,
Packit b00eeb
						 uint32_t val);
Packit b00eeb
Packit b00eeb
int		egg_buffer_set_uint32		(EggBuffer *buffer,
Packit b00eeb
						 size_t offset,
Packit b00eeb
						 uint32_t val);
Packit b00eeb
Packit b00eeb
int		egg_buffer_get_uint32		(EggBuffer *buffer,
Packit b00eeb
						 size_t offset,
Packit b00eeb
						 size_t *next_offset,
Packit b00eeb
						 uint32_t *val);
Packit b00eeb
Packit b00eeb
void 		egg_buffer_encode_uint16	(unsigned char* buf,
Packit b00eeb
						 uint16_t val);
Packit b00eeb
Packit b00eeb
uint16_t	egg_buffer_decode_uint16	(unsigned char* buf);
Packit b00eeb
Packit b00eeb
int 		egg_buffer_add_uint16		(EggBuffer *buffer,
Packit b00eeb
						 uint16_t val);
Packit b00eeb
Packit b00eeb
int		egg_buffer_set_uint16		(EggBuffer *buffer,
Packit b00eeb
						 size_t offset,
Packit b00eeb
						 uint16_t val);
Packit b00eeb
Packit b00eeb
int		egg_buffer_get_uint16		(EggBuffer *buffer,
Packit b00eeb
						 size_t offset,
Packit b00eeb
						 size_t *next_offset,
Packit b00eeb
						 uint16_t *val);
Packit b00eeb
Packit b00eeb
int		egg_buffer_add_byte_array	(EggBuffer *buffer,
Packit b00eeb
						 const unsigned char *val,
Packit b00eeb
						 size_t len);
Packit b00eeb
Packit b00eeb
int		egg_buffer_get_byte_array	(EggBuffer *buffer,
Packit b00eeb
						 size_t offset,
Packit b00eeb
						 size_t *next_offset,
Packit b00eeb
						 const unsigned char **val,
Packit b00eeb
						 size_t *vlen);
Packit b00eeb
Packit b00eeb
unsigned char*  egg_buffer_add_byte_array_empty (EggBuffer *buffer,
Packit b00eeb
                                                 size_t vlen);
Packit b00eeb
Packit b00eeb
int             egg_buffer_add_string           (EggBuffer *buffer,
Packit b00eeb
                                                 const char *str);
Packit b00eeb
Packit b00eeb
int             egg_buffer_get_string           (EggBuffer *buffer,
Packit b00eeb
                                                 size_t offset,
Packit b00eeb
                                                 size_t *next_offset,
Packit b00eeb
                                                 char **str_ret,
Packit b00eeb
                                                 EggBufferAllocator allocator);
Packit b00eeb
Packit b00eeb
int             egg_buffer_add_stringv          (EggBuffer *buffer,
Packit b00eeb
                                                 const char** strv);
Packit b00eeb
Packit b00eeb
int             egg_buffer_get_stringv          (EggBuffer *buffer,
Packit b00eeb
                                                 size_t offset,
Packit b00eeb
                                                 size_t *next_offset,
Packit b00eeb
                                                 char ***strv_ret,
Packit b00eeb
                                                 EggBufferAllocator allocator);
Packit b00eeb
Packit b00eeb
int		egg_buffer_add_uint64		(EggBuffer *buffer,
Packit b00eeb
						 uint64_t val);
Packit b00eeb
Packit b00eeb
int		egg_buffer_get_uint64		(EggBuffer *buffer,
Packit b00eeb
						 size_t offset,
Packit b00eeb
						 size_t *next_offset,
Packit b00eeb
						 uint64_t *val);
Packit b00eeb
Packit b00eeb
#define		egg_buffer_length(b)		((b)->len)
Packit b00eeb
Packit b00eeb
#define 	egg_buffer_has_error(b)		((b)->failures > 0)
Packit b00eeb
Packit b00eeb
#endif /* EGG_BUFFER_H */
Packit b00eeb