diff options
Diffstat (limited to 'src/auth/auth-stats.c')
-rw-r--r-- | src/auth/auth-stats.c | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/src/auth/auth-stats.c b/src/auth/auth-stats.c new file mode 100644 index 0000000..71264a4 --- /dev/null +++ b/src/auth/auth-stats.c @@ -0,0 +1,116 @@ +/* Copyright (c) 2016-2018 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "buffer.h" +#include "stats.h" +#include "stats-parser.h" +#include "auth-stats.h" + +static struct stats_parser_field auth_stats_fields[] = { +#define E(parsename, name, type) { parsename, offsetof(struct auth_stats, name), sizeof(((struct auth_stats *)0)->name), type } +#define EN(parsename, name) E(parsename, name, STATS_PARSER_TYPE_UINT) + EN("auth_successes", auth_success_count), + EN("auth_master_successes", auth_master_success_count), + EN("auth_failures", auth_failure_count), + EN("auth_db_tempfails", auth_db_tempfail_count), + + EN("auth_cache_hits", auth_cache_hit_count), + EN("auth_cache_misses", auth_cache_miss_count) +}; + +static size_t auth_stats_alloc_size(void) +{ + return sizeof(struct auth_stats); +} + +static unsigned int auth_stats_field_count(void) +{ + return N_ELEMENTS(auth_stats_fields); +} + +static const char *auth_stats_field_name(unsigned int n) +{ + i_assert(n < N_ELEMENTS(auth_stats_fields)); + + return auth_stats_fields[n].name; +} + +static void +auth_stats_field_value(string_t *str, const struct stats *stats, + unsigned int n) +{ + i_assert(n < N_ELEMENTS(auth_stats_fields)); + + stats_parser_value(str, &auth_stats_fields[n], stats); +} + +static bool +auth_stats_diff(const struct stats *stats1, const struct stats *stats2, + struct stats *diff_stats_r, const char **error_r) +{ + return stats_parser_diff(auth_stats_fields, N_ELEMENTS(auth_stats_fields), + stats1, stats2, diff_stats_r, error_r); +} + +static void auth_stats_add(struct stats *dest, const struct stats *src) +{ + stats_parser_add(auth_stats_fields, N_ELEMENTS(auth_stats_fields), + dest, src); +} + +static bool +auth_stats_have_changed(const struct stats *_prev, const struct stats *_cur) +{ + return memcmp(_prev, _cur, sizeof(struct auth_stats)) != 0; +} + +static void auth_stats_export(buffer_t *buf, const struct stats *_stats) +{ + const struct auth_stats *stats = (const struct auth_stats *)_stats; + + buffer_append(buf, stats, sizeof(*stats)); +} + +static bool +auth_stats_import(const unsigned char *data, size_t size, size_t *pos_r, + struct stats *_stats, const char **error_r) +{ + struct auth_stats *stats = (struct auth_stats *)_stats; + + if (size < sizeof(*stats)) { + *error_r = "auth_stats too small"; + return FALSE; + } + memcpy(stats, data, sizeof(*stats)); + *pos_r = sizeof(*stats); + return TRUE; +} + +const struct stats_vfuncs auth_stats_vfuncs = { + "auth", + auth_stats_alloc_size, + auth_stats_field_count, + auth_stats_field_name, + auth_stats_field_value, + auth_stats_diff, + auth_stats_add, + auth_stats_have_changed, + auth_stats_export, + auth_stats_import +}; + +/* for the stats_auth plugin: */ +void stats_auth_init(void); +void stats_auth_deinit(void); + +static struct stats_item *auth_stats_item; + +void stats_auth_init(void) +{ + auth_stats_item = stats_register(&auth_stats_vfuncs); +} + +void stats_auth_deinit(void) +{ + stats_unregister(&auth_stats_item); +} |