1 /* $OpenBSD: stat_backend.c,v 1.12 2021/06/14 17:58:16 eric 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 "smtpd.h" 20 21 extern struct stat_backend stat_backend_ramstat; 22 23 struct stat_backend * 24 stat_backend_lookup(const char *name) 25 { 26 return &stat_backend_ramstat; 27 } 28 29 void 30 stat_increment(const char *key, size_t count) 31 { 32 struct stat_value *value; 33 34 if (count == 0) 35 return; 36 37 value = stat_counter(count); 38 39 m_create(p_control, IMSG_STAT_INCREMENT, 0, 0, -1); 40 m_add_string(p_control, key); 41 m_add_data(p_control, value, sizeof(*value)); 42 m_close(p_control); 43 } 44 45 void 46 stat_decrement(const char *key, size_t count) 47 { 48 struct stat_value *value; 49 50 if (count == 0) 51 return; 52 53 value = stat_counter(count); 54 55 m_create(p_control, IMSG_STAT_DECREMENT, 0, 0, -1); 56 m_add_string(p_control, key); 57 m_add_data(p_control, value, sizeof(*value)); 58 m_close(p_control); 59 } 60 61 void 62 stat_set(const char *key, const struct stat_value *value) 63 { 64 m_create(p_control, IMSG_STAT_SET, 0, 0, -1); 65 m_add_string(p_control, key); 66 m_add_data(p_control, value, sizeof(*value)); 67 m_close(p_control); 68 } 69 70 /* helpers */ 71 72 struct stat_value * 73 stat_counter(size_t counter) 74 { 75 static struct stat_value value; 76 77 value.type = STAT_COUNTER; 78 value.u.counter = counter; 79 return &value; 80 } 81 82 struct stat_value * 83 stat_timestamp(time_t timestamp) 84 { 85 static struct stat_value value; 86 87 value.type = STAT_TIMESTAMP; 88 value.u.timestamp = timestamp; 89 return &value; 90 } 91 92 struct stat_value * 93 stat_timeval(struct timeval *tv) 94 { 95 static struct stat_value value; 96 97 value.type = STAT_TIMEVAL; 98 value.u.tv = *tv; 99 return &value; 100 } 101 102 struct stat_value * 103 stat_timespec(struct timespec *ts) 104 { 105 static struct stat_value value; 106 107 value.type = STAT_TIMESPEC; 108 value.u.ts = *ts; 109 return &value; 110 } 111