summaryrefslogtreecommitdiff
path: root/libedsio/edsio.h
diff options
context:
space:
mode:
Diffstat (limited to 'libedsio/edsio.h')
-rwxr-xr-xlibedsio/edsio.h531
1 files changed, 531 insertions, 0 deletions
diff --git a/libedsio/edsio.h b/libedsio/edsio.h
new file mode 100755
index 0000000..daee82d
--- /dev/null
+++ b/libedsio/edsio.h
@@ -0,0 +1,531 @@
+/* -*-Mode: C;-*-
+ * $Id: edsio.h 1.2 Sun, 28 Jan 2007 12:21:11 -0800 jmacd $
+ *
+ * Copyright (C) 1998, 1999, Josh MacDonald.
+ * All Rights Reserved.
+ *
+ * Author: Josh MacDonald <jmacd@CS.Berkeley.EDU>
+ */
+
+#ifndef _EDSIO_H_
+#define _EDSIO_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <glib.h>
+
+typedef struct _SerialSource SerialSource;
+typedef struct _SerialSink SerialSink;
+typedef gint32 SerialType;
+typedef struct _HandleFuncTable HandleFuncTable;
+typedef struct _PropTest PropTest;
+typedef struct _FileHandle FileHandle;
+typedef struct _AllocList AllocList;
+
+struct _FileHandle {
+ const HandleFuncTable* table;
+
+ /* This is an opaque type, feel free to define your own, just make
+ * sure that the first field of yours is one of these, and that you
+ * supply a table. */
+};
+
+#define EDSIO_LIBRARY_OFFSET_BITS 8
+#define EDSIO_LIBRARY_OFFSET_MASK 0xff
+
+#include "edsio_edsio.h"
+
+#define ST_Error -1
+#define ST_IncorrectType -2
+#define ST_NotFound -3
+
+#define ALIGN_8(v) if (((v) % 8) != 0) { (v) += 8; (v) &= ~7; }
+
+/* This serves as a virtual table for I/O to the FileHandle */
+struct _HandleFuncTable
+{
+ gssize (* table_handle_length) (FileHandle *fh);
+ gssize (* table_handle_pages) (FileHandle *fh);
+ gssize (* table_handle_pagesize) (FileHandle *fh);
+ gssize (* table_handle_map_page) (FileHandle *fh, guint pgno, const guint8** mem);
+ gboolean (* table_handle_unmap_page) (FileHandle *fh, guint pgno, const guint8** mem);
+ const guint8* (* table_handle_checksum_md5) (FileHandle *fh);
+ gboolean (* table_handle_close) (FileHandle *fh, gint flags);
+ gboolean (* table_handle_write) (FileHandle *fh, const guint8 *buf, gsize nbyte);
+ gboolean (* table_handle_copy) (FileHandle *from, FileHandle *to, guint off, guint len);
+ gboolean (* table_handle_getui) (FileHandle *fh, guint32* i);
+ gboolean (* table_handle_putui) (FileHandle *fh, guint32 i);
+ gssize (* table_handle_read) (FileHandle *fh, guint8 *buf, gsize nbyte);
+ const gchar* (* table_handle_name) (FileHandle *fh); /* user must free */
+};
+
+struct _AllocList {
+ AllocList *next;
+ void *ptr;
+};
+
+struct _SerialSource {
+ /* Internal variables: don't touch. */
+ AllocList *alloc_list;
+
+ /* These are setup by init.
+ */
+ SerialType (* source_type) (SerialSource* source, gboolean set_allocation);
+ gboolean (* source_close) (SerialSource* source);
+ gboolean (* source_read) (SerialSource* source, guint8 *ptr, guint32 len);
+ void (* source_free) (SerialSource* source);
+
+ /* These may be NULL
+ */
+ void* (* salloc_func) (SerialSource* source,
+ guint32 len);
+ void (* sfree_func) (SerialSource* source,
+ void* ptr);
+
+ /* Public functions, defaulted, but may be over-ridden
+ * before calls to unserialize.
+ */
+ gboolean (* next_bytes_known) (SerialSource* source, guint8 *ptr, guint32 len);
+ gboolean (* next_bytes) (SerialSource* source, const guint8 **ptr, guint32 *len);
+ gboolean (* next_uint) (SerialSource* source, guint32 *ptr);
+ gboolean (* next_uint32) (SerialSource* source, guint32 *ptr);
+ gboolean (* next_uint16) (SerialSource* source, guint16 *ptr);
+ gboolean (* next_uint8) (SerialSource* source, guint8 *ptr);
+ gboolean (* next_bool) (SerialSource* source, gboolean *ptr);
+ gboolean (* next_string) (SerialSource* source, const char **ptr);
+};
+
+struct _SerialSink {
+
+ /* These are setup by init.
+ */
+ gboolean (* sink_type) (SerialSink* sink, SerialType type, guint32 mem_size, gboolean set_allocation);
+ gboolean (* sink_close) (SerialSink* sink);
+ gboolean (* sink_write) (SerialSink* sink, const guint8 *ptr, guint32 len);
+ void (* sink_free) (SerialSink* sink);
+
+ /* This may be null, called after each object is serialized. */
+ gboolean (* sink_quantum) (SerialSink* sink);
+
+ /* Public functions, defaulted, but may be over-ridden
+ * before calls to serialize.
+ */
+ gboolean (* next_bytes_known) (SerialSink* sink, const guint8 *ptr, guint32 len);
+ gboolean (* next_bytes) (SerialSink* sink, const guint8 *ptr, guint32 len);
+ gboolean (* next_uint) (SerialSink* sink, guint32 ptr);
+ gboolean (* next_uint32) (SerialSink* sink, guint32 ptr);
+ gboolean (* next_uint16) (SerialSink* sink, guint16 ptr);
+ gboolean (* next_uint8) (SerialSink* sink, guint8 ptr);
+ gboolean (* next_bool) (SerialSink* sink, gboolean ptr);
+ gboolean (* next_string) (SerialSink* sink, const char *ptr);
+};
+
+void serializeio_initialize_type (const char* name,
+ guint32 val,
+ gboolean (*unserialize_func) (),
+ gboolean (*serialize_func) (),
+ guint (*count_func) (),
+ void (*print_func) ());
+
+const char* serializeio_generic_type_to_string (SerialType type);
+void serializeio_generic_print (SerialType type, void* object, guint indent_spaces);
+
+gboolean serializeio_serialize_generic (SerialSink *sink,
+ SerialType object_type,
+ void *object);
+
+gboolean serializeio_serialize_generic_internal (SerialSink *sink,
+ SerialType object_type,
+ void *object,
+ gboolean set_allocation);
+
+guint serializeio_generic_count (SerialType object_type,
+ void *object);
+
+gboolean serializeio_unserialize_generic (SerialSource *source,
+ SerialType *object_type,
+ void **object);
+
+gboolean serializeio_unserialize_generic_internal (SerialSource *source,
+ SerialType *object_type,
+ void **object,
+ gboolean set_allocation);
+
+gboolean serializeio_unserialize_generic_acceptable (SerialSource* source,
+ guint32 acceptable,
+ SerialType *object_type,
+ void **object);
+
+void serializeio_sink_init (SerialSink* sink,
+ gboolean (* sink_type) (SerialSink* sink,
+ SerialType type,
+ guint32 mem_size,
+ gboolean set_allocation),
+ gboolean (* sink_close) (SerialSink* sink),
+ gboolean (* sink_write) (SerialSink* sink,
+ const guint8 *ptr,
+ guint32 len),
+ void (* sink_free) (SerialSink* sink),
+ gboolean (* sink_quantum) (SerialSink* sink));
+
+void serializeio_source_init (SerialSource* source,
+ SerialType (* source_type) (SerialSource* source,
+ gboolean set_allocation),
+ gboolean (* source_close) (SerialSource* source),
+ gboolean (* source_read) (SerialSource* source,
+ guint8 *ptr,
+ guint32 len),
+ void (* source_free) (SerialSource* source),
+ void* (* salloc_func) (SerialSource* source,
+ guint32 len),
+ void (* sfree_func) (SerialSource* source,
+ void* ptr));
+
+/* This function is internal, don't use. */
+void* serializeio_source_alloc (SerialSource* source,
+ guint32 len);
+
+SerialSink* serializeio_gzip_sink (SerialSink* sink);
+SerialSource* serializeio_gzip_source (SerialSource* source);
+
+SerialSink* serializeio_checksum_sink (SerialSink* sink);
+SerialSource* serializeio_checksum_source (SerialSource* source);
+
+SerialSink* serializeio_base64_sink (SerialSink* sink);
+SerialSource* serializeio_base64_source (SerialSource* source);
+
+SerialSource* handle_source (FileHandle *fh);
+SerialSink* handle_sink (FileHandle *fh,
+ gpointer data1,
+ gpointer data2,
+ gpointer data3,
+ gboolean (* cont_onclose) (gpointer data1, gpointer data2, gpointer data3));
+
+gboolean unserialize_uint (SerialSource *source, guint32** x);
+gboolean serialize_uint_obj (SerialSink *sink, guint32* x);
+
+gboolean unserialize_string (SerialSource *source, const char** x);
+gboolean serialize_string_obj (SerialSink *sink, const char* x);
+
+/* These are a bit odd, and edsio_property_bytes_{g,s}etter account for it.
+ * Try not to use yourself. */
+gboolean unserialize_bytes (SerialSource *source, SerialEdsioBytes** x);
+gboolean serialize_bytes_obj (SerialSink *sink, SerialEdsioBytes *x);
+
+/* Event delivery
+ */
+
+enum _EventLevel
+{
+ EL_Information = 1<<0,
+ EL_Warning = 1<<5,
+ EL_Error = 1<<10,
+ EL_InternalError = 1<<15,
+ EL_FatalError = 1<<20
+};
+
+typedef enum _EventLevel EventLevel;
+
+enum _EventFlags
+{
+ EF_None = 1<<0,
+ EF_OpenSSL = 1<<1
+};
+
+typedef enum _EventFlags EventFlags;
+
+const char* eventdelivery_int_to_string (int x);
+const char* eventdelivery_string_to_string (const char* x);
+const char* eventdelivery_source_to_string (SerialSource* x);
+const char* eventdelivery_sink_to_string (SerialSink* x);
+const char* eventdelivery_handle_to_string (FileHandle* x);
+
+void serializeio_print_bytes (const guint8* buf, guint len);
+
+/* Event delivery privates
+ */
+
+typedef struct _GenericEventDef GenericEventDef;
+typedef struct _GenericEvent GenericEvent;
+
+struct _GenericEvent
+{
+ gint code;
+ const char* srcfile;
+ guint srcline;
+};
+
+GenericEventDef* eventdelivery_event_lookup (gint code);
+
+void eventdelivery_event_deliver (GenericEvent* e);
+
+typedef gboolean (* ErrorDeliveryFunc) (GenericEvent* ev, GenericEventDef* def, const char* message);
+
+void eventdelivery_event_watch_all (ErrorDeliveryFunc func);
+
+void eventdelivery_initialize_event_def (gint code,
+ gint level,
+ gint flags,
+ const char* name,
+ const char* oneline,
+ const char * (* field_to_string) (GenericEvent* ev, gint field));
+
+const char* eventdelivery_ssl_errors_to_string (void);
+
+struct _GenericEventDef
+{
+ gint code;
+ gint level;
+ gint flags;
+ const char *name;
+ const char *oneline;
+
+ const char * (* field_to_string) (GenericEvent* ev, gint field);
+};
+
+/* MD5.H - header file for MD5C.C */
+
+/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+ rights reserved.
+
+ License to copy and use this software is granted provided that it
+ is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+ Algorithm" in all material mentioning or referencing this software
+ or this function.
+
+ License is also granted to make and use derivative works provided
+ that such works are identified as "derived from the RSA Data
+ Security, Inc. MD5 Message-Digest Algorithm" in all material
+ mentioning or referencing the derived work.
+
+ RSA Data Security, Inc. makes no representations concerning either
+ the merchantability of this software or the suitability of this
+ software for any particular purpose. It is provided "as is"
+ without express or implied warranty of any kind.
+
+ These notices must be retained in any copies of any part of this
+ documentation and/or software.
+ */
+
+/* MD5 context. */
+typedef struct {
+ guint32 state[4]; /* state (ABCD) */
+ guint32 count[2]; /* number of bits, modulo 2^64 (lsb first) */
+ guint8 buffer[64]; /* input buffer */
+} EdsioMD5Ctx;
+
+void edsio_md5_init (EdsioMD5Ctx *);
+void edsio_md5_update (EdsioMD5Ctx *, const guint8 *, guint);
+void edsio_md5_final (guint8*, EdsioMD5Ctx *);
+
+gint edsio_md5_equal (gconstpointer v,
+ gconstpointer v2);
+guint edsio_md5_hash (gconstpointer v);
+
+void edsio_md5_to_string (const guint8* md5, char buf[33]);
+gboolean edsio_md5_from_string (guint8* md5, const char buf[33]);
+
+/* NIST Secure Hash Algorithm */
+/* heavily modified from Peter C. Gutmann's implementation */
+/* then taken from from Uwe Hollerbach, */
+/* and then modified a little by Josh MacDonald. */
+
+/* This code is in the public domain */
+
+typedef struct {
+ guint32 digest[5]; /* message digest */
+ guint32 count_lo, count_hi; /* 64-bit bit count */
+ guint32 data[16]; /* SHA data buffer */
+ int local; /* unprocessed amount in data */
+} EdsioSHACtx;
+
+void edsio_sha_init (EdsioSHACtx *);
+void edsio_sha_update (EdsioSHACtx *, const guint8 *, guint);
+void edsio_sha_final (guint8 *, EdsioSHACtx *);
+
+gint edsio_sha_equal (gconstpointer v,
+ gconstpointer v2);
+guint edsio_sha_hash (gconstpointer v);
+
+/* Misc stuff.
+ */
+
+/* These raise an error if errmsg is non-null. The errmsg should
+ * be something like "Invalid port number". See edsio.ser for the
+ * format.
+ */
+gboolean strtosi_checked (const char* str, gint32* i, const char* errmsg);
+gboolean strtoss_checked (const char* str, gint16* s, const char* errmsg);
+
+gboolean strtoui_checked (const char* str, guint32* i, const char* errmsg);
+gboolean strtous_checked (const char* str, guint16* i, const char* errmsg);
+
+const char* edsio_intern_string (const char* str);
+
+GByteArray* edsio_base64_encode_region (const guint8* data, guint data_len);
+GByteArray* edsio_base64_decode_region (const guint8* data, guint data_len);
+gboolean edsio_base64_encode_region_into (const guint8* data, guint data_len, guint8* out, guint *out_len);
+gboolean edsio_base64_decode_region_into (const guint8* data, guint data_len, guint8* out, guint *out_len);
+
+gchar* edsio_time_to_iso8601 (SerialGenericTime* time);
+gchar* edsio_time_t_to_iso8601 (GTime time);
+gboolean edsio_time_of_day (SerialGenericTime* time);
+
+enum _SimpleBufferFlags {
+ SBF_None = 0,
+ SBF_Compress = 1 << 0,
+ SBF_Checksum = 1 << 1,
+ SBF_Base64 = 1 << 2
+};
+
+typedef enum _SimpleBufferFlags SimpleBufferFlags;
+
+SerialSource* edsio_simple_source (const guint8* data, guint len, guint flags);
+SerialSink* edsio_simple_sink (gpointer data,
+ guint flags,
+ gboolean free_result,
+ void (* success) (gpointer data, GByteArray* result),
+ GByteArray **result);
+
+gboolean edsio_library_check (guint32 number);
+void edsio_library_register (guint32 number, const char*name);
+
+/* (Persistent) Property stuff.
+ */
+
+enum _PropertyFlags {
+ PF_None = 0,
+ PF_Persistent = 1
+};
+
+typedef enum _PropertyFlags PropertyFlags;
+
+typedef struct _EdsioProperty EdsioProperty;
+typedef union _EdsioPropertyEntry EdsioPropertyEntry;
+typedef struct _EdsioGenericProperty EdsioGenericProperty;
+
+typedef void (* PropFreeFunc) (gpointer obj);
+typedef gboolean (* PropGSFunc) (/*gpointer obj, GHashTable** obj_table, EdsioProperty* prop, ... */);
+typedef gboolean (* PropSerialize) (/*SerialSink* sink, ... */);
+typedef gboolean (* PropUnserialize) (/*SerialSource* source, ... */);
+
+typedef GHashTable** (* PropertyTableFunc) (gpointer obj);
+typedef SerialSource* (* PersistSourceFunc) (gpointer obj, const char* prop_name);
+typedef SerialSink* (* PersistSinkFunc) (gpointer obj, const char* prop_name);
+typedef gboolean (* PersistIssetFunc) (gpointer obj, const char* prop_name);
+typedef gboolean (* PersistUnsetFunc) (gpointer obj, const char* prop_name);
+
+void edsio_initialize_property_type (const char* t, PropFreeFunc freer, PropGSFunc getter, PropGSFunc setter, PropSerialize ser, PropUnserialize unser);
+void edsio_initialize_host_type (const char* ph,
+ PropertyTableFunc ptable,
+ PersistSourceFunc source,
+ PersistSinkFunc sink,
+ PersistIssetFunc isset,
+ PersistUnsetFunc unset);
+
+gboolean edsio_property_isset (const char* ph, const char* t, guint32 code, gpointer obj);
+gboolean edsio_property_unset (const char* ph, const char* t, guint32 code, gpointer obj);
+
+PropGSFunc edsio_property_getter (const char* ph, const char* t, guint32 code, EdsioProperty** prop);
+PropGSFunc edsio_property_setter (const char* ph, const char* t, guint32 code, EdsioProperty** prop);
+
+void edsio_property_uint_free (gpointer obj);
+gboolean edsio_property_uint_getter (gpointer obj, EdsioProperty* ep, guint32* get);
+gboolean edsio_property_uint_setter (gpointer obj, EdsioProperty* ep, guint32 set);
+
+void edsio_property_string_free (gpointer obj);
+gboolean edsio_property_string_getter (gpointer obj, EdsioProperty* ep, const char** get);
+gboolean edsio_property_string_setter (gpointer obj, EdsioProperty* ep, const char* set);
+
+void edsio_property_bytes_free (gpointer obj);
+gboolean edsio_property_bytes_getter (gpointer obj, EdsioProperty* ep, guint8** get, guint32 *get_len);
+gboolean edsio_property_bytes_setter (gpointer obj, EdsioProperty* ep, guint8* set, guint32 set_len);
+
+void edsio_property_vptr_free (gpointer obj);
+gboolean edsio_property_vptr_getter (gpointer obj, EdsioProperty* ep, void** get);
+gboolean edsio_property_vptr_setter (gpointer obj, EdsioProperty* ep, void* set);
+
+EdsioPropertyEntry* edsio_property_get (gpointer obj, EdsioProperty* ep);
+gboolean edsio_property_set (gpointer obj, EdsioProperty* ep, EdsioPropertyEntry* set);
+
+gboolean edsio_new_property (const char* name, const char* ph, const char* t, guint32 flags, EdsioGenericProperty* prop);
+
+/* Testing...
+ */
+
+#define DEBUG_LIBEDSIO
+
+#ifdef DEBUG_LIBEDSIO
+struct _PropTest
+{
+ GHashTable* _edsio_property_table;
+
+ GHashTable* ptable;
+
+ const char* kludge;
+};
+
+GHashTable** edsio_proptest_property_table (PropTest *pt);
+SerialSource* edsio_persist_proptest_source (PropTest *pt, const char* prop_name);
+SerialSink* edsio_persist_proptest_sink (PropTest *pt, const char* prop_name);
+gboolean edsio_persist_proptest_isset (PropTest *pt, const char* prop_name);
+gboolean edsio_persist_proptest_unset (PropTest *pt, const char* prop_name);
+
+#endif
+
+/* Missing glib stuff
+ */
+
+typedef struct _GQueue GQueue;
+
+struct _GQueue
+{
+ GList *list;
+ GList *list_end;
+ guint list_size;
+};
+
+/* Queues
+ */
+
+GQueue * g_queue_new (void);
+void g_queue_free (GQueue *q);
+guint g_queue_get_size (GQueue *q);
+void g_queue_push_front (GQueue *q, gpointer data);
+void g_queue_push_back (GQueue *q, gpointer data);
+gpointer g_queue_pop_front (GQueue *q);
+gpointer g_queue_pop_back (GQueue *q);
+
+#define g_queue_empty(queue) \
+ ((((GQueue *)(queue)) && ((GQueue *)(queue))->list) ? FALSE : TRUE)
+
+#define g_queue_peek_front(queue) \
+ ((((GQueue *)(queue)) && ((GQueue *)(queue))->list) ? \
+ ((GQueue *)(queue))->list->data : NULL)
+
+#define g_queue_peek_back(queue) \
+ ((((GQueue *)(queue)) && ((GQueue *)(queue))->list_end) ? \
+ ((GQueue *)(queue))->list_end->data : NULL)
+
+#define g_queue_index(queue,ptr) \
+ ((((GQueue *)(queue)) && ((GQueue *)(queue))->list) ? \
+ g_list_index (((GQueue *)(queue))->list, (ptr)) : -1)
+
+#define g_queue_push g_queue_push_back
+#define g_queue_pop g_queue_pop_front
+#define g_queue_peek g_queue_peek_front
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _EDSIO_H_ */