Sendmail 8.1c -> 8.3 (From NetBSD with hacked Makefiles)
[unix-history] / usr.sbin / sendmail / src / stats.c
CommitLineData
15637ed4
RG
1/*
2 * Copyright (c) 1983 Eric P. Allman
6f14531a
RG
3 * Copyright (c) 1988, 1993
4 * The Regents of the University of California. All rights reserved.
15637ed4
RG
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 * must display the following acknowledgement:
16 * This product includes software developed by the University of
17 * California, Berkeley and its contributors.
18 * 4. Neither the name of the University nor the names of its contributors
19 * may be used to endorse or promote products derived from this software
20 * without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 */
34
35#ifndef lint
3a363396 36static char sccsid[] = "@(#)stats.c 8.2 (Berkeley) 7/11/93";
15637ed4
RG
37#endif /* not lint */
38
39# include "sendmail.h"
40# include "mailstats.h"
41
42struct statistics Stat;
43
3a363396
NW
44bool GotStats = FALSE; /* set when we have stats to merge */
45
15637ed4
RG
46#define ONE_K 1000 /* one thousand (twenty-four?) */
47#define KBYTES(x) (((x) + (ONE_K - 1)) / ONE_K)
48\f/*
49** MARKSTATS -- mark statistics
50*/
51
52markstats(e, to)
53 register ENVELOPE *e;
54 register ADDRESS *to;
55{
56 if (to == NULL)
57 {
58 if (e->e_from.q_mailer != NULL)
59 {
60 Stat.stat_nf[e->e_from.q_mailer->m_mno]++;
61 Stat.stat_bf[e->e_from.q_mailer->m_mno] +=
6f14531a 62 KBYTES(e->e_msgsize);
15637ed4
RG
63 }
64 }
65 else
66 {
67 Stat.stat_nt[to->q_mailer->m_mno]++;
6f14531a 68 Stat.stat_bt[to->q_mailer->m_mno] += KBYTES(e->e_msgsize);
15637ed4 69 }
3a363396 70 GotStats = TRUE;
15637ed4
RG
71}
72\f/*
73** POSTSTATS -- post statistics in the statistics file
74**
75** Parameters:
76** sfile -- the name of the statistics file.
77**
78** Returns:
79** none.
80**
81** Side Effects:
82** merges the Stat structure with the sfile file.
83*/
84
85poststats(sfile)
86 char *sfile;
87{
88 register int fd;
89 struct statistics stat;
90 extern off_t lseek();
91
3a363396 92 if (sfile == NULL || !GotStats)
15637ed4
RG
93 return;
94
95 (void) time(&Stat.stat_itime);
96 Stat.stat_size = sizeof Stat;
97
98 fd = open(sfile, 2);
99 if (fd < 0)
100 {
101 errno = 0;
102 return;
103 }
104 if (read(fd, (char *) &stat, sizeof stat) == sizeof stat &&
105 stat.stat_size == sizeof stat)
106 {
107 /* merge current statistics into statfile */
108 register int i;
109
110 for (i = 0; i < MAXMAILERS; i++)
111 {
112 stat.stat_nf[i] += Stat.stat_nf[i];
113 stat.stat_bf[i] += Stat.stat_bf[i];
114 stat.stat_nt[i] += Stat.stat_nt[i];
115 stat.stat_bt[i] += Stat.stat_bt[i];
116 }
117 }
118 else
119 bcopy((char *) &Stat, (char *) &stat, sizeof stat);
120
121 /* write out results */
122 (void) lseek(fd, (off_t) 0, 0);
123 (void) write(fd, (char *) &stat, sizeof stat);
124 (void) close(fd);
3a363396
NW
125
126 /* clear the structure to avoid future disappointment */
127 bzero(&Stat, sizeof stat);
128 GotStats = FALSE;
15637ed4 129}