Add dynamic loading of backends.
[onak.git] / keydb_dynamic.h
diff --git a/keydb_dynamic.h b/keydb_dynamic.h
new file mode 100644 (file)
index 0000000..a739db1
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * keydb_dynamic.h - declarations for the dynamic backend
+ *
+ * Brett Parker <iDunno@sommitrealweird.co.uk>
+ *
+ * Copyright 2005 Project Purple
+ */
+#include <stdlib.h>
+#include <dlfcn.h>
+#include <string.h>
+#include <inttypes.h>
+
+#include "charfuncs.h"
+#include "onak-conf.h"
+#include "keystructs.h"
+#include "ll.h"
+#include "log.h"
+
+#ifndef __KEYDB_DYNAMIC_H__
+#define __KEYDB_DYNAMIC_H__
+
+/*
+ * Hide the ugly function definitions in typedefs that we use elsewhere
+ */
+typedef void (*initdbfunc_t)(bool);
+typedef void (*cleanupdbfunc_t)(void);
+typedef bool (*starttransfunc_t)(void);
+typedef bool (*endtransfunc_t)(void);
+typedef int (*fetch_keyfunc_t)(uint64_t keyid,
+               struct openpgp_publickey **publickey, bool intrans);
+typedef int (*store_keyfunc_t)(struct openpgp_publickey *publickey,
+               bool intrans, bool update);
+typedef int (*delete_keyfunc_t)(uint64_t keyid, bool intrans);
+typedef int (*fetch_key_textfunc_t)(const char *search,
+               struct openpgp_publickey **publickey);
+typedef int (*update_keysfunc_t)(struct openpgp_publickey **keys,
+               bool sendsync);
+typedef char *(*keyid2uidfunc_t)(uint64_t keyid);
+typedef struct ll *(*getkeysigsfunc_t)(uint64_t keyid, bool *revoked);
+typedef struct ll *(*cached_getkeysigsfunc_t)(uint64_t keyid);
+typedef uint64_t (*getfullkeyidfunc_t)(uint64_t keyid);
+typedef int (*iterate_keysfunc_t)(
+               void (*iterfunc) (void *ctx, struct openpgp_publickey *key),
+               void *ctx);
+
+
+/*
+ * Define a nice struct to hold pointers to the functions, once the backend
+ * is loaded
+ */
+struct dynamic_backend {
+       initdbfunc_t initdb;
+       cleanupdbfunc_t cleanupdb;
+       starttransfunc_t starttrans;
+       endtransfunc_t endtrans;
+       fetch_keyfunc_t fetch_key;
+       store_keyfunc_t store_key;
+       delete_keyfunc_t delete_key;
+       fetch_key_textfunc_t fetch_key_text;
+       update_keysfunc_t update_keys;
+       keyid2uidfunc_t keyid2uid;
+       getkeysigsfunc_t getkeysigs;
+       cached_getkeysigsfunc_t cached_getkeysigs;
+       getfullkeyidfunc_t getfullkeyid;
+       iterate_keysfunc_t iterate_keys;
+       char *backendsoname;
+       void *handle;
+       bool loaded;
+};
+
+struct dynamic_backend __dynamicdb_backend__ = {
+       NULL,   /* initdb */
+       NULL,   /* cleanupdb */
+       NULL,   /* starttrans */
+       NULL,   /* endtrans */
+       NULL,   /* fetch_key */
+       NULL,   /* store_key */
+       NULL,   /* delete_key */
+       NULL,   /* fetch_key_text */
+       NULL,   /* update_keys */
+       NULL,   /* keyid2uid */
+       NULL,   /* getkeysigs */
+       NULL,   /* cached_getkeysigs */
+       NULL,   /* getfullkeyid */
+       NULL,   /* iteratekeys */
+       NULL,   /* backendsoname */
+       NULL,   /* handle */
+       0       /* loaded */
+};
+
+bool load_backend(void);
+bool close_backend(void);
+bool backend_loaded(void);
+struct dynamic_backend *get_backend(void);
+
+#endif /* __KEYDB_DYNAMIC_H__ */