summaryrefslogtreecommitdiffstats
path: root/pigeonhole/src/lib-sieve/sieve-error.h
diff options
context:
space:
mode:
Diffstat (limited to 'pigeonhole/src/lib-sieve/sieve-error.h')
-rw-r--r--pigeonhole/src/lib-sieve/sieve-error.h235
1 files changed, 235 insertions, 0 deletions
diff --git a/pigeonhole/src/lib-sieve/sieve-error.h b/pigeonhole/src/lib-sieve/sieve-error.h
new file mode 100644
index 0000000..83b26b7
--- /dev/null
+++ b/pigeonhole/src/lib-sieve/sieve-error.h
@@ -0,0 +1,235 @@
+#ifndef SIEVE_ERROR_H
+#define SIEVE_ERROR_H
+
+#include "lib.h"
+#include "compat.h"
+
+#include <stdarg.h>
+
+/*
+ * Forward declarations
+ */
+
+struct var_expand_table;
+
+struct sieve_instance;
+struct sieve_script;
+struct sieve_error_handler;
+
+/*
+ * Types
+ */
+
+enum sieve_error_flags {
+ SIEVE_ERROR_FLAG_GLOBAL = (1 << 0),
+ SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO = (1 << 1),
+};
+
+struct sieve_error_params {
+ enum log_type log_type;
+ struct event *event;
+
+ /* Location log command in C source code */
+ struct {
+ const char *filename;
+ unsigned int linenum;
+ } csrc;
+
+ /* Location in Sieve source script */
+ const char *location;
+};
+
+/*
+ * Utility
+ */
+
+/* Converts external messages to a style that better matches Sieve user errors
+ */
+const char *sieve_error_from_external(const char *msg);
+
+/*
+ * Global (user+system) errors
+ */
+
+void sieve_global_logv(struct sieve_instance *svinst,
+ struct sieve_error_handler *ehandler,
+ const struct sieve_error_params *params,
+ const char *fmt, va_list args) ATTR_FORMAT(4, 0);
+void sieve_global_info_logv(struct sieve_instance *svinst,
+ struct sieve_error_handler *ehandler,
+ const struct sieve_error_params *params,
+ const char *fmt, va_list args) ATTR_FORMAT(4, 0);
+
+void sieve_global_error(struct sieve_instance *svinst,
+ struct sieve_error_handler *ehandler,
+ const char *csrc_filename,
+ unsigned int csrc_linenum,
+ const char *location, const char *fmt, ...)
+ ATTR_FORMAT(6, 7);
+#define sieve_global_error(svinst, ehandler, ...) \
+ sieve_global_error(svinst, ehandler, __FILE__, __LINE__, __VA_ARGS__)
+void sieve_global_warning(struct sieve_instance *svinst,
+ struct sieve_error_handler *ehandler,
+ const char *csrc_filename,
+ unsigned int csrc_linenum,
+ const char *location, const char *fmt, ...)
+ ATTR_FORMAT(6, 7);
+#define sieve_global_warning(svinst, ehandler, ...) \
+ sieve_global_warning(svinst, ehandler, __FILE__, __LINE__, __VA_ARGS__)
+void sieve_global_info(struct sieve_instance *svinst,
+ struct sieve_error_handler *ehandler,
+ const char *csrc_filename,
+ unsigned int csrc_linenum,
+ const char *location, const char *fmt, ...)
+ ATTR_FORMAT(6, 7);
+#define sieve_global_info(svinst, ehandler, ...) \
+ sieve_global_info(svinst, ehandler, __FILE__, __LINE__, __VA_ARGS__)
+void sieve_global_info_error(struct sieve_instance *svinst,
+ struct sieve_error_handler *ehandler,
+ const char *csrc_filename,
+ unsigned int csrc_linenum,
+ const char *location, const char *fmt, ...)
+ ATTR_FORMAT(6, 7);
+#define sieve_global_info_error(svinst, ehandler, ...) \
+ sieve_global_info_error(svinst, ehandler, __FILE__, __LINE__, \
+ __VA_ARGS__)
+void sieve_global_info_warning(struct sieve_instance *svinst,
+ struct sieve_error_handler *ehandler,
+ const char *csrc_filename,
+ unsigned int csrc_linenum,
+ const char *location, const char *fmt, ...)
+ ATTR_FORMAT(6, 7);
+#define sieve_global_info_warning(svinst, ehandler, ...) \
+ sieve_global_info_warning(svinst, ehandler, __FILE__, __LINE__, \
+ __VA_ARGS__)
+
+/*
+ * Main (user) error functions
+ */
+
+/* For these functions it is the responsibility of the caller to
+ * manage the datastack.
+ */
+
+const char *
+sieve_error_script_location(const struct sieve_script *script,
+ unsigned int source_line);
+
+void sieve_logv(struct sieve_error_handler *ehandler,
+ const struct sieve_error_params *params,
+ const char *fmt, va_list args) ATTR_FORMAT(3, 0);
+
+void sieve_event_logv(struct sieve_instance *svinst,
+ struct sieve_error_handler *ehandler,
+ struct event *event, enum log_type log_type,
+ const char *csrc_filename, unsigned int csrc_linenum,
+ const char *location, enum sieve_error_flags flags,
+ const char *fmt, va_list args) ATTR_FORMAT(9, 0);
+void sieve_event_log(struct sieve_instance *svinst,
+ struct sieve_error_handler *ehandler,
+ struct event *event, enum log_type log_type,
+ const char *csrc_filename, unsigned int csrc_linenum,
+ const char *location, enum sieve_error_flags flags,
+ const char *fmt, ...) ATTR_FORMAT(9, 10);
+#define sieve_event_log(svinst, ehandler, event, log_type, ...) \
+ sieve_event_log(svinst, ehandler, event, log_type, __FILE__, __LINE__, \
+ __VA_ARGS__)
+
+void sieve_criticalv(struct sieve_instance *svinst,
+ struct sieve_error_handler *ehandler,
+ const struct sieve_error_params *params,
+ const char *user_prefix, const char *fmt, va_list args)
+ ATTR_FORMAT(5, 0);
+
+void sieve_error(struct sieve_error_handler *ehandler,
+ const char *csrc_filename, unsigned int csrc_linenum,
+ const char *location, const char *fmt, ...) ATTR_FORMAT(5, 6);
+#define sieve_error(ehandler, ...) \
+ sieve_error(ehandler, __FILE__, __LINE__, __VA_ARGS__)
+void sieve_warning(struct sieve_error_handler *ehandler,
+ const char *csrc_filename, unsigned int csrc_linenum,
+ const char *location, const char *fmt, ...)
+ ATTR_FORMAT(5, 6);
+#define sieve_warning(ehandler, ...) \
+ sieve_warning(ehandler, __FILE__, __LINE__, __VA_ARGS__)
+void sieve_info(struct sieve_error_handler *ehandler,
+ const char *csrc_filename, unsigned int csrc_linenum,
+ const char *location, const char *fmt, ...) ATTR_FORMAT(5, 6);
+#define sieve_info(ehandler, ...) \
+ sieve_info(ehandler, __FILE__, __LINE__, __VA_ARGS__)
+void sieve_debug(struct sieve_error_handler *ehandler,
+ const char *csrc_filename, unsigned int csrc_linenum,
+ const char *location, const char *fmt, ...) ATTR_FORMAT(5, 6);
+#define sieve_debug(ehandler, ...) \
+ sieve_debug(ehandler, __FILE__, __LINE__, __VA_ARGS__)
+void sieve_critical(struct sieve_instance *svinst,
+ struct sieve_error_handler *ehandler,
+ const char *csrc_filename, unsigned int csrc_linenum,
+ const char *location, const char *user_prefix,
+ const char *fmt, ...) ATTR_FORMAT(7, 8);
+#define sieve_critical(svinst, ehandler, ...) \
+ sieve_critical(svinst, ehandler, __FILE__, __LINE__, __VA_ARGS__)
+
+
+void sieve_internal_error_params(struct sieve_error_handler *ehandler,
+ const struct sieve_error_params *params,
+ const char *user_prefix);
+void sieve_internal_error(struct sieve_error_handler *ehandler,
+ const char *csrc_filename, unsigned int csrc_linenum,
+ const char *location, const char *user_prefix)
+ ATTR_NULL(1, 4, 5);
+#define sieve_internal_error(ehandler, ...) \
+ sieve_internal_error(ehandler, __FILE__, __LINE__, __VA_ARGS__)
+
+/*
+ * Error handler configuration
+ */
+
+void sieve_error_handler_accept_infolog(struct sieve_error_handler *ehandler,
+ bool enable);
+void sieve_error_handler_accept_debuglog(struct sieve_error_handler *ehandler,
+ bool enable);
+
+/*
+ * Error handler statistics
+ */
+
+unsigned int sieve_get_errors(struct sieve_error_handler *ehandler);
+unsigned int sieve_get_warnings(struct sieve_error_handler *ehandler);
+
+bool sieve_errors_more_allowed(struct sieve_error_handler *ehandler);
+
+/*
+ * Error handler object
+ */
+
+void sieve_error_handler_ref(struct sieve_error_handler *ehandler);
+void sieve_error_handler_unref(struct sieve_error_handler **ehandler);
+
+void sieve_error_handler_reset(struct sieve_error_handler *ehandler);
+
+/*
+ * Error handlers
+ */
+
+/* Write errors to dovecot master log */
+struct sieve_error_handler *
+sieve_master_ehandler_create(struct sieve_instance *svinst,
+ unsigned int max_errors);
+
+/* Write errors to stderr */
+struct sieve_error_handler *
+sieve_stderr_ehandler_create(struct sieve_instance *svinst,
+ unsigned int max_errors);
+
+/* Write errors into a string buffer */
+struct sieve_error_handler *
+sieve_strbuf_ehandler_create(struct sieve_instance *svinst, string_t *strbuf,
+ bool crlf, unsigned int max_errors);
+
+/* Write errors to a logfile */
+struct sieve_error_handler *
+sieve_logfile_ehandler_create(struct sieve_instance *svinst,
+ const char *logfile, unsigned int max_errors);
+
+#endif