typedef void *(*map_alloc_f)(void *, size_t);
typedef void (*map_free_f)(void *baton, void *ptr);
+typedef void (*trace_log_f) (const struct kr_query *, const char *, const char *);
typedef enum {KNOT_ANSWER, KNOT_AUTHORITY, KNOT_ADDITIONAL} knot_section_t;
typedef struct {
uint16_t pos;
_Bool auth_validated;
struct kr_rplan rplan;
int has_tls;
+ trace_log_f trace_log;
knot_mm_t pool;
};
enum kr_rank {KR_RANK_INITIAL, KR_RANK_OMIT, KR_RANK_TRY, KR_RANK_INDET = 4, KR_RANK_BOGUS, KR_RANK_MISMATCH, KR_RANK_MISSING, KR_RANK_INSECURE, KR_RANK_AUTH = 16, KR_RANK_SECURE = 32};
typedef void *(*map_alloc_f)(void *, size_t);
typedef void (*map_free_f)(void *baton, void *ptr);
+typedef void (*trace_log_f) (const struct kr_query *, const char *, const char *);
"
./scripts/gen-cdefs.sh libkres types <<-EOF
array_init(request->auth_selected);
request->answ_validated = false;
request->auth_validated = false;
+ request->trace_log = NULL;
/* Expect first query */
kr_rplan_init(&request->rplan, request, &request->pool);
bool auth_validated; /**< see answ_validated ^^ ; TODO */
struct kr_rplan rplan;
int has_tls;
+ trace_log_f trace_log; /**< Logging tracepoint */
knot_mm_t pool;
};
#include <arpa/inet.h>
#include <sys/time.h>
#include <contrib/cleanup.h>
+#include <contrib/ccan/asprintf/asprintf.h>
#include <ccan/isaac/isaac.h>
#include <gnutls/gnutls.h>
#include <libknot/descriptor.h>
}
}
+bool kr_log_trace(const struct kr_query *query, const char *source, const char *fmt, ...)
+{
+ if (!kr_log_trace_enabled(query)) {
+ return false;
+ }
+
+ auto_free char *msg = NULL;
+
+ va_list args;
+ va_start(args, fmt);
+ int len = vasprintf(&msg, fmt, args);
+ va_end(args);
+
+ /* Check formatting result before logging */
+ if (len < 0) {
+ return false;
+ }
+
+ query->request->trace_log(query, source, msg);
+ return true;
+}
+
char* kr_strcatdup(unsigned n, ...)
{
/* Calculate total length */
/*
* Logging and debugging.
*/
+
+/** @brief Callback for request logging handler. */
+typedef void *(*trace_log_f)(const struct kr_query *query, const char *source, const char *msg);
+
#define kr_log_info(fmt, ...) do { printf((fmt), ## __VA_ARGS__); fflush(stdout); } while(0)
#define kr_log_error(fmt, ...) fprintf(stderr, (fmt), ## __VA_ARGS__)
/** Log a message if in --verbose mode. */
KR_EXPORT void kr_log_verbose(const char *fmt, ...);
+/**
+ * @brief Return true if the query has request log handler installed.
+ */
+#define kr_log_trace_enabled(query) ((query) && (query)->request && (query)->request->trace_log)
+
+/**
+ * Log a message through the request log handler.
+ * @param query current query
+ * @param source message source
+ * @param fmt message format
+ * @return true if the message was logged
+ */
+KR_EXPORT bool kr_log_trace(const struct kr_query *query, const char *source, const char *fmt, ...);
+
#ifdef NOVERBOSELOG
/* Efficient compile-time disabling of verbose messages. */
#define kr_verbose_status false