summaryrefslogtreecommitdiffstats
path: root/pigeonhole/src/lib-sieve/sieve-extensions.h
diff options
context:
space:
mode:
Diffstat (limited to 'pigeonhole/src/lib-sieve/sieve-extensions.h')
-rw-r--r--pigeonhole/src/lib-sieve/sieve-extensions.h191
1 files changed, 191 insertions, 0 deletions
diff --git a/pigeonhole/src/lib-sieve/sieve-extensions.h b/pigeonhole/src/lib-sieve/sieve-extensions.h
new file mode 100644
index 0000000..961cf41
--- /dev/null
+++ b/pigeonhole/src/lib-sieve/sieve-extensions.h
@@ -0,0 +1,191 @@
+#ifndef SIEVE_EXTENSIONS_H
+#define SIEVE_EXTENSIONS_H
+
+#include "lib.h"
+#include "sieve-common.h"
+
+/*
+ * Per-extension object registry
+ */
+
+struct sieve_extension_objects {
+ const void *objects;
+ unsigned int count;
+};
+
+/*
+ * Extension definition
+ */
+
+struct sieve_extension_def {
+ const char *name;
+
+ /* Version */
+ unsigned int version;
+
+ /* Registration */
+ bool (*load)(const struct sieve_extension *ext, void **context);
+ void (*unload)(const struct sieve_extension *ext);
+
+ /* Compilation */
+ bool (*validator_load)
+ (const struct sieve_extension *ext, struct sieve_validator *validator);
+ bool (*generator_load)
+ (const struct sieve_extension *ext, const struct sieve_codegen_env *cgenv);
+ bool (*interpreter_load)
+ (const struct sieve_extension *ext, const struct sieve_runtime_env *renv,
+ sieve_size_t *address);
+ bool (*binary_load)
+ (const struct sieve_extension *ext, struct sieve_binary *binary);
+
+ /* Code dump */
+ bool (*binary_dump)
+ (const struct sieve_extension *ext, struct sieve_dumptime_env *denv);
+ bool (*code_dump)
+ (const struct sieve_extension *ext, const struct sieve_dumptime_env *denv,
+ sieve_size_t *address);
+
+ /* Objects */
+ struct sieve_extension_objects operations;
+ struct sieve_extension_objects operands;
+};
+
+/* Defining opcodes and operands */
+
+#define SIEVE_EXT_DEFINE_NO_OBJECTS \
+ { NULL, 0 }
+#define SIEVE_EXT_DEFINE_OBJECT(OBJ) \
+ { &OBJ, 1 }
+#define SIEVE_EXT_DEFINE_OBJECTS(OBJS) \
+ { OBJS, N_ELEMENTS(OBJS) }
+
+#define SIEVE_EXT_GET_OBJECTS_COUNT(ext, field) \
+ ext->field->count;
+
+#define SIEVE_EXT_DEFINE_NO_OPERATIONS \
+ .operations = SIEVE_EXT_DEFINE_NO_OBJECTS
+#define SIEVE_EXT_DEFINE_OPERATION(OP) \
+ .operations = SIEVE_EXT_DEFINE_OBJECT(OP)
+#define SIEVE_EXT_DEFINE_OPERATIONS(OPS) \
+ .operations = SIEVE_EXT_DEFINE_OBJECTS(OPS)
+
+#define SIEVE_EXT_DEFINE_NO_OPERANDS \
+ .operands = SIEVE_EXT_DEFINE_NO_OBJECTS
+#define SIEVE_EXT_DEFINE_OPERAND(OP) \
+ .operands = SIEVE_EXT_DEFINE_OBJECT(OP)
+#define SIEVE_EXT_DEFINE_OPERANDS(OPS) \
+ .operands = SIEVE_EXT_DEFINE_OBJECTS(OPS)
+
+/*
+ * Extension instance
+ */
+
+struct sieve_extension {
+ const struct sieve_extension_def *def;
+ int id;
+
+ struct sieve_instance *svinst;
+ void *context;
+
+ bool required:1;
+ bool loaded:1;
+ bool enabled:1;
+ bool dummy:1;
+ bool global:1;
+ bool implicit:1;
+ bool overridden:1;
+};
+
+#define sieve_extension_is(ext, definition) \
+ ( (ext)->def == &(definition) )
+#define sieve_extension_name(ext) \
+ ((ext)->def->name)
+#define sieve_extension_name_is(ext, _name) \
+ ( strcmp((ext)->def->name, (_name)) == 0 )
+#define sieve_extension_version(ext) \
+ ((ext)->def->version)
+#define sieve_extension_version_is(ext, _version) \
+ ((ext)->def->version == (_version))
+
+/*
+ * Extensions init/deinit
+ */
+
+bool sieve_extensions_init(struct sieve_instance *svinst);
+void sieve_extensions_configure(struct sieve_instance *svinst);
+void sieve_extensions_deinit(struct sieve_instance *svinst);
+
+/*
+ * Pre-loaded extensions
+ */
+
+const struct sieve_extension *const *sieve_extensions_get_preloaded
+ (struct sieve_instance *svinst, unsigned int *count_r);
+
+/*
+ * Extension registry
+ */
+
+const struct sieve_extension *sieve_extension_register
+ (struct sieve_instance *svinst, const struct sieve_extension_def *extension,
+ bool load);
+const struct sieve_extension *sieve_extension_require
+ (struct sieve_instance *svinst, const struct sieve_extension_def *extension,
+ bool load);
+bool sieve_extension_reload(const struct sieve_extension *ext);
+
+void sieve_extension_unregister(const struct sieve_extension *ext);
+
+const struct sieve_extension *sieve_extension_replace
+ (struct sieve_instance *svinst,
+ const struct sieve_extension_def *extdef,
+ bool load);
+void sieve_extension_override
+ (struct sieve_instance *svinst, const char *name,
+ const struct sieve_extension *ext);
+
+unsigned int sieve_extensions_get_count(struct sieve_instance *svinst);
+const struct sieve_extension *const *
+sieve_extensions_get_all(struct sieve_instance *svinst,
+ unsigned int *count_r);
+
+const struct sieve_extension *sieve_extension_get_by_id
+ (struct sieve_instance *svinst, unsigned int ext_id);
+const struct sieve_extension *sieve_extension_get_by_name
+ (struct sieve_instance *svinst, const char *name);
+
+const char *sieve_extensions_get_string
+ (struct sieve_instance *svinst);
+void sieve_extensions_set_string
+ (struct sieve_instance *svinst, const char *ext_string,
+ bool global, bool implicit);
+
+const struct sieve_extension *sieve_get_match_type_extension
+ (struct sieve_instance *svinst);
+const struct sieve_extension *sieve_get_comparator_extension
+ (struct sieve_instance *svinst);
+const struct sieve_extension *sieve_get_address_part_extension
+ (struct sieve_instance *svinst);
+
+void sieve_enable_debug_extension(struct sieve_instance *svinst);
+
+/*
+ * Capability registries
+ */
+
+struct sieve_extension_capabilities {
+ const char *name;
+
+ const char *(*get_string)(const struct sieve_extension *ext);
+};
+
+void sieve_extension_capabilities_register
+ (const struct sieve_extension *ext,
+ const struct sieve_extension_capabilities *cap);
+void sieve_extension_capabilities_unregister
+ (const struct sieve_extension *ext);
+
+const char *sieve_extension_capabilities_get_string
+ (struct sieve_instance *svinst, const char *cap_name);
+
+#endif