GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.sbin/smtpd/smtpd/../stat_backend.c Lines: 0 35 0.0 %
Date: 2017-11-07 Branches: 0 8 0.0 %

Line Branch Exec Source
1
/*	$OpenBSD: stat_backend.c,v 1.10 2015/01/20 17:37:54 deraadt Exp $	*/
2
3
/*
4
 * Copyright (c) 2012 Gilles Chehade <gilles@poolp.org>
5
 *
6
 * Permission to use, copy, modify, and distribute this software for any
7
 * purpose with or without fee is hereby granted, provided that the above
8
 * copyright notice and this permission notice appear in all copies.
9
 *
10
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
 */
18
19
#include <sys/types.h>
20
#include <sys/socket.h>
21
#include <sys/queue.h>
22
#include <sys/tree.h>
23
24
#include <event.h>
25
#include <imsg.h>
26
#include <stdio.h>
27
#include <string.h>
28
#include <limits.h>
29
30
#include "log.h"
31
#include "smtpd.h"
32
33
struct stat_backend	stat_backend_ramstat;
34
struct stat_backend	stat_backend_sqlite;
35
36
struct stat_backend *
37
stat_backend_lookup(const char *name)
38
{
39
	if (!strcmp(name, "ram"))
40
		return &stat_backend_ramstat;
41
42
	if (!strcmp(name, "sqlite"))
43
		return &stat_backend_sqlite;
44
45
	return (NULL);
46
}
47
48
void
49
stat_increment(const char *key, size_t count)
50
{
51
	struct stat_value	*value;
52
53
	if (count == 0)
54
		return;
55
56
	value = stat_counter(count);
57
58
	m_create(p_control, IMSG_STAT_INCREMENT, 0, 0, -1);
59
	m_add_string(p_control, key);
60
	m_add_data(p_control, value, sizeof(*value));
61
	m_close(p_control);
62
}
63
64
void
65
stat_decrement(const char *key, size_t count)
66
{
67
	struct stat_value	*value;
68
69
	if (count == 0)
70
		return;
71
72
	value = stat_counter(count);
73
74
	m_create(p_control, IMSG_STAT_DECREMENT, 0, 0, -1);
75
	m_add_string(p_control, key);
76
	m_add_data(p_control, value, sizeof(*value));
77
	m_close(p_control);
78
}
79
80
void
81
stat_set(const char *key, const struct stat_value *value)
82
{
83
	m_create(p_control, IMSG_STAT_SET, 0, 0, -1);
84
	m_add_string(p_control, key);
85
	m_add_data(p_control, value, sizeof(*value));
86
	m_close(p_control);
87
}
88
89
/* helpers */
90
91
struct stat_value *
92
stat_counter(size_t counter)
93
{
94
	static struct stat_value value;
95
96
	value.type = STAT_COUNTER;
97
	value.u.counter = counter;
98
	return &value;
99
}
100
101
struct stat_value *
102
stat_timestamp(time_t timestamp)
103
{
104
	static struct stat_value value;
105
106
	value.type = STAT_TIMESTAMP;
107
	value.u.timestamp = timestamp;
108
	return &value;
109
}
110
111
struct stat_value *
112
stat_timeval(struct timeval *tv)
113
{
114
	static struct stat_value value;
115
116
	value.type = STAT_TIMEVAL;
117
	value.u.tv = *tv;
118
	return &value;
119
}
120
121
struct stat_value *
122
stat_timespec(struct timespec *ts)
123
{
124
	static struct stat_value value;
125
126
	value.type = STAT_TIMESPEC;
127
	value.u.ts = *ts;
128
	return &value;
129
}