1c2aa98e2SPeter Wemm /*
288ad41d4SGregory Neil Shapiro  * Copyright (c) 1998-2002, 2013 Proofpoint, Inc. and its suppliers.
33299c2f1SGregory Neil Shapiro  *	All rights reserved.
4c2aa98e2SPeter Wemm  * Copyright (c) 1983 Eric P. Allman.  All rights reserved.
5c2aa98e2SPeter Wemm  * Copyright (c) 1988, 1993
6c2aa98e2SPeter Wemm  *	The Regents of the University of California.  All rights reserved.
7c2aa98e2SPeter Wemm  *
8c2aa98e2SPeter Wemm  * By using this file, you agree to the terms and conditions set
9c2aa98e2SPeter Wemm  * forth in the LICENSE file which can be found at the top level of
10c2aa98e2SPeter Wemm  * the sendmail distribution.
11c2aa98e2SPeter Wemm  *
12c2aa98e2SPeter Wemm  *
13c2aa98e2SPeter Wemm  */
14c2aa98e2SPeter Wemm 
1512ed1c7cSGregory Neil Shapiro #include <sm/gen.h>
1612ed1c7cSGregory Neil Shapiro 
1712ed1c7cSGregory Neil Shapiro SM_IDSTR(copyright,
18bfb62e91SGregory Neil Shapiro "@(#) Copyright (c) 1998-2002 Proofpoint, Inc. and its suppliers.\n\
193299c2f1SGregory Neil Shapiro 	All rights reserved.\n\
203299c2f1SGregory Neil Shapiro      Copyright (c) 1988, 1993\n\
2112ed1c7cSGregory Neil Shapiro 	The Regents of the University of California.  All rights reserved.\n")
22c2aa98e2SPeter Wemm 
23bfb62e91SGregory Neil Shapiro SM_IDSTR(id, "@(#)$Id: mailstats.c,v 8.103 2013-11-22 20:51:51 ca Exp $")
24c2aa98e2SPeter Wemm 
253299c2f1SGregory Neil Shapiro #include <unistd.h>
263299c2f1SGregory Neil Shapiro #include <stddef.h>
273299c2f1SGregory Neil Shapiro #include <stdlib.h>
283299c2f1SGregory Neil Shapiro #include <ctype.h>
293299c2f1SGregory Neil Shapiro #include <string.h>
303299c2f1SGregory Neil Shapiro #include <time.h>
313299c2f1SGregory Neil Shapiro #ifdef EX_OK
323299c2f1SGregory Neil Shapiro # undef EX_OK		/* unistd.h may have another use for this */
333299c2f1SGregory Neil Shapiro #endif
343299c2f1SGregory Neil Shapiro #include <sysexits.h>
353299c2f1SGregory Neil Shapiro 
3612ed1c7cSGregory Neil Shapiro #include <sm/errstring.h>
3712ed1c7cSGregory Neil Shapiro #include <sm/limits.h>
383299c2f1SGregory Neil Shapiro #include <sendmail/sendmail.h>
393299c2f1SGregory Neil Shapiro #include <sendmail/mailstats.h>
403299c2f1SGregory Neil Shapiro #include <sendmail/pathnames.h>
413299c2f1SGregory Neil Shapiro 
42c2aa98e2SPeter Wemm 
43c2aa98e2SPeter Wemm #define MNAMELEN	20	/* max length of mailer name */
44c2aa98e2SPeter Wemm 
45c2aa98e2SPeter Wemm int
46c2aa98e2SPeter Wemm main(argc, argv)
47c2aa98e2SPeter Wemm 	int argc;
48c2aa98e2SPeter Wemm 	char **argv;
49c2aa98e2SPeter Wemm {
50c2aa98e2SPeter Wemm 	register int i;
51c2aa98e2SPeter Wemm 	int mno;
523299c2f1SGregory Neil Shapiro 	int save_errno;
53c2aa98e2SPeter Wemm 	int ch, fd;
54c2aa98e2SPeter Wemm 	char *sfile;
55c2aa98e2SPeter Wemm 	char *cfile;
5612ed1c7cSGregory Neil Shapiro 	SM_FILE_T *cfp;
57c2aa98e2SPeter Wemm 	bool mnames;
5876b7bf71SPeter Wemm 	bool progmode;
5912ed1c7cSGregory Neil Shapiro 	bool trunc;
60c2aa98e2SPeter Wemm 	long frmsgs = 0, frbytes = 0, tomsgs = 0, tobytes = 0, rejmsgs = 0;
61c2aa98e2SPeter Wemm 	long dismsgs = 0;
6212ed1c7cSGregory Neil Shapiro 	long quarmsgs = 0;
633299c2f1SGregory Neil Shapiro 	time_t now;
64c2aa98e2SPeter Wemm 	char mtable[MAXMAILERS][MNAMELEN + 1];
6588ad41d4SGregory Neil Shapiro 	char sfilebuf[MAXPATHLEN];
66c2aa98e2SPeter Wemm 	char buf[MAXLINE];
673299c2f1SGregory Neil Shapiro 	struct statistics stats;
68c2aa98e2SPeter Wemm 	extern char *ctime();
693299c2f1SGregory Neil Shapiro 	extern char *optarg;
703299c2f1SGregory Neil Shapiro 	extern int optind;
713299c2f1SGregory Neil Shapiro # define MSOPTS "cC:f:opP"
7212ed1c7cSGregory Neil Shapiro 
73c2aa98e2SPeter Wemm 	cfile = getcfname(0, 0, SM_GET_SENDMAIL_CF, NULL);
7412ed1c7cSGregory Neil Shapiro 	sfile = NULL;
7512ed1c7cSGregory Neil Shapiro 	mnames = true;
7612ed1c7cSGregory Neil Shapiro 	progmode = false;
7712ed1c7cSGregory Neil Shapiro 	trunc = false;
78c2aa98e2SPeter Wemm 	while ((ch = getopt(argc, argv, MSOPTS)) != -1)
79c2aa98e2SPeter Wemm 	{
80c2aa98e2SPeter Wemm 		switch (ch)
8112ed1c7cSGregory Neil Shapiro 		{
8212ed1c7cSGregory Neil Shapiro 		  case 'c':
8312ed1c7cSGregory Neil Shapiro 			cfile = getcfname(0, 0, SM_GET_SUBMIT_CF, NULL);
8412ed1c7cSGregory Neil Shapiro 			break;
85c2aa98e2SPeter Wemm 
86c2aa98e2SPeter Wemm 		  case 'C':
87c2aa98e2SPeter Wemm 			cfile = optarg;
88c2aa98e2SPeter Wemm 			break;
89c2aa98e2SPeter Wemm 
90c2aa98e2SPeter Wemm 		  case 'f':
91c2aa98e2SPeter Wemm 			sfile = optarg;
92c2aa98e2SPeter Wemm 			break;
93c2aa98e2SPeter Wemm 
9412ed1c7cSGregory Neil Shapiro 
95c2aa98e2SPeter Wemm 		  case 'o':
96c2aa98e2SPeter Wemm 			mnames = false;
9776b7bf71SPeter Wemm 			break;
9812ed1c7cSGregory Neil Shapiro 
9912ed1c7cSGregory Neil Shapiro 		  case 'p':
10012ed1c7cSGregory Neil Shapiro 			trunc = true;
10112ed1c7cSGregory Neil Shapiro 			/* FALLTHROUGH */
10212ed1c7cSGregory Neil Shapiro 
10376b7bf71SPeter Wemm 		  case 'P':
10476b7bf71SPeter Wemm 			progmode = true;
105c2aa98e2SPeter Wemm 			break;
106c2aa98e2SPeter Wemm 
107c2aa98e2SPeter Wemm 
10812ed1c7cSGregory Neil Shapiro 		  case '?':
10988ad41d4SGregory Neil Shapiro 		  default:
110c2aa98e2SPeter Wemm   usage:
111c2aa98e2SPeter Wemm 			(void) sm_io_fputs(smioerr, SM_TIME_DEFAULT,
112c2aa98e2SPeter Wemm 			    "usage: mailstats [-C cffile] [-c] [-P] [-f stfile] [-o] [-p]\n");
113c2aa98e2SPeter Wemm 			exit(EX_USAGE);
114c2aa98e2SPeter Wemm 		}
115c2aa98e2SPeter Wemm 	}
116c2aa98e2SPeter Wemm 	argc -= optind;
117c2aa98e2SPeter Wemm 	argv += optind;
118c2aa98e2SPeter Wemm 
11912ed1c7cSGregory Neil Shapiro 	if (argc != 0)
12012ed1c7cSGregory Neil Shapiro 		goto usage;
121c2aa98e2SPeter Wemm 
1223299c2f1SGregory Neil Shapiro 	if ((cfp = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, cfile, SM_IO_RDONLY,
12312ed1c7cSGregory Neil Shapiro 			      NULL)) == NULL)
1243299c2f1SGregory Neil Shapiro 	{
12512ed1c7cSGregory Neil Shapiro 		save_errno = errno;
126c2aa98e2SPeter Wemm 		(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, "mailstats: ");
127c2aa98e2SPeter Wemm 		errno = save_errno;
128c2aa98e2SPeter Wemm 		sm_perror(cfile);
129c2aa98e2SPeter Wemm 		exit(EX_NOINPUT);
13012ed1c7cSGregory Neil Shapiro 	}
13112ed1c7cSGregory Neil Shapiro 
13212ed1c7cSGregory Neil Shapiro 	mno = 0;
133c2aa98e2SPeter Wemm 	(void) sm_strlcpy(mtable[mno++], "prog", MNAMELEN + 1);
13412ed1c7cSGregory Neil Shapiro 	(void) sm_strlcpy(mtable[mno++], "*file*", MNAMELEN + 1);
135c2aa98e2SPeter Wemm 	(void) sm_strlcpy(mtable[mno++], "*include*", MNAMELEN + 1);
136c2aa98e2SPeter Wemm 
137c2aa98e2SPeter Wemm 	while (sm_io_fgets(cfp, SM_TIME_DEFAULT, buf, sizeof(buf)) >= 0)
138c2aa98e2SPeter Wemm 	{
139c2aa98e2SPeter Wemm 		register char *b;
14088ad41d4SGregory Neil Shapiro 		char *s;
14188ad41d4SGregory Neil Shapiro 		register char *m;
14288ad41d4SGregory Neil Shapiro 
14388ad41d4SGregory Neil Shapiro 		b = strchr(buf, '#');
14488ad41d4SGregory Neil Shapiro 		if (b == NULL)
14588ad41d4SGregory Neil Shapiro 			b = strchr(buf, '\n');
14688ad41d4SGregory Neil Shapiro 		if (b == NULL)
14788ad41d4SGregory Neil Shapiro 			b = &buf[strlen(buf)];
14888ad41d4SGregory Neil Shapiro 		while (isascii(*--b) && isspace(*b))
149c2aa98e2SPeter Wemm 			continue;
150c2aa98e2SPeter Wemm 		*++b = '\0';
151c2aa98e2SPeter Wemm 
152c2aa98e2SPeter Wemm 		b = buf;
153c2aa98e2SPeter Wemm 		switch (*b++)
154c2aa98e2SPeter Wemm 		{
155c2aa98e2SPeter Wemm 		  case 'M':		/* mailer definition */
15612ed1c7cSGregory Neil Shapiro 			break;
157c2aa98e2SPeter Wemm 
158c2aa98e2SPeter Wemm 		  case 'O':		/* option -- see if .st file */
159c2aa98e2SPeter Wemm 			if (sm_strncasecmp(b, " StatusFile", 11) == 0 &&
160c2aa98e2SPeter Wemm 			    !(isascii(b[11]) && isalnum(b[11])))
161c2aa98e2SPeter Wemm 			{
162c2aa98e2SPeter Wemm 				/* new form -- find value */
163c2aa98e2SPeter Wemm 				b = strchr(b, '=');
164c2aa98e2SPeter Wemm 				if (b == NULL)
165c2aa98e2SPeter Wemm 					continue;
166c2aa98e2SPeter Wemm 				while (isascii(*++b) && isspace(*b))
167c2aa98e2SPeter Wemm 					continue;
168c2aa98e2SPeter Wemm 			}
169c2aa98e2SPeter Wemm 			else if (*b++ != 'S')
170c2aa98e2SPeter Wemm 			{
171c2aa98e2SPeter Wemm 				/* something else boring */
172c2aa98e2SPeter Wemm 				continue;
17312ed1c7cSGregory Neil Shapiro 			}
1743299c2f1SGregory Neil Shapiro 
175c2aa98e2SPeter Wemm 			/* this is the S or StatusFile option -- save it */
17612ed1c7cSGregory Neil Shapiro 			if (sm_strlcpy(sfilebuf, b, sizeof sfilebuf) >=
177c2aa98e2SPeter Wemm 			    sizeof sfilebuf)
178c2aa98e2SPeter Wemm 			{
179c2aa98e2SPeter Wemm 				(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
180c2aa98e2SPeter Wemm 						     "StatusFile filename too long: %.30s...\n",
181c2aa98e2SPeter Wemm 						     b);
182c2aa98e2SPeter Wemm 				exit(EX_CONFIG);
183c2aa98e2SPeter Wemm 			}
184c2aa98e2SPeter Wemm 			if (sfile == NULL)
185c2aa98e2SPeter Wemm 				sfile = sfilebuf;
186c2aa98e2SPeter Wemm 
187c2aa98e2SPeter Wemm 		  default:
188c2aa98e2SPeter Wemm 			continue;
189c2aa98e2SPeter Wemm 		}
19012ed1c7cSGregory Neil Shapiro 
191c2aa98e2SPeter Wemm 		if (mno >= MAXMAILERS)
192c2aa98e2SPeter Wemm 		{
193c2aa98e2SPeter Wemm 			(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
194c2aa98e2SPeter Wemm 					     "Too many mailers defined, %d max.\n",
195c2aa98e2SPeter Wemm 					     MAXMAILERS);
196c2aa98e2SPeter Wemm 			exit(EX_SOFTWARE);
197c2aa98e2SPeter Wemm 		}
198c2aa98e2SPeter Wemm 		m = mtable[mno];
199c2aa98e2SPeter Wemm 		s = m + MNAMELEN;		/* is [MNAMELEN + 1] */
200c2aa98e2SPeter Wemm 		while (*b != ',' && !(isascii(*b) && isspace(*b)) &&
201c2aa98e2SPeter Wemm 		       *b != '\0' && m < s)
202c2aa98e2SPeter Wemm 			*m++ = *b++;
203c2aa98e2SPeter Wemm 		*m = '\0';
204c2aa98e2SPeter Wemm 		for (i = 0; i < mno; i++)
205c2aa98e2SPeter Wemm 		{
206c2aa98e2SPeter Wemm 			if (strcmp(mtable[i], mtable[mno]) == 0)
207c2aa98e2SPeter Wemm 				break;
208c2aa98e2SPeter Wemm 		}
20912ed1c7cSGregory Neil Shapiro 		if (i == mno)
210c2aa98e2SPeter Wemm 			mno++;
211c2aa98e2SPeter Wemm 	}
212c2aa98e2SPeter Wemm 	(void) sm_io_close(cfp, SM_TIME_DEFAULT);
213c2aa98e2SPeter Wemm 	for (; mno < MAXMAILERS; mno++)
214c2aa98e2SPeter Wemm 		mtable[mno][0] = '\0';
21512ed1c7cSGregory Neil Shapiro 
21612ed1c7cSGregory Neil Shapiro 	if (sfile == NULL)
217c2aa98e2SPeter Wemm 	{
218c2aa98e2SPeter Wemm 		(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
219c2aa98e2SPeter Wemm 				     "mailstats: no statistics file located\n");
22088ad41d4SGregory Neil Shapiro 		exit(EX_OSFILE);
2213299c2f1SGregory Neil Shapiro 	}
222c2aa98e2SPeter Wemm 
2233299c2f1SGregory Neil Shapiro 	fd = open(sfile, O_RDONLY, 0600);
22412ed1c7cSGregory Neil Shapiro 	if ((fd < 0) || (i = read(fd, &stats, sizeof stats)) < 0)
2253299c2f1SGregory Neil Shapiro 	{
22612ed1c7cSGregory Neil Shapiro 		save_errno = errno;
227c2aa98e2SPeter Wemm 		(void) sm_io_fputs(smioerr, SM_TIME_DEFAULT, "mailstats: ");
228c2aa98e2SPeter Wemm 		errno = save_errno;
229c2aa98e2SPeter Wemm 		sm_perror(sfile);
230c2aa98e2SPeter Wemm 		exit(EX_NOINPUT);
2313299c2f1SGregory Neil Shapiro 	}
2323299c2f1SGregory Neil Shapiro 	if (i == 0)
233c2aa98e2SPeter Wemm 	{
2343299c2f1SGregory Neil Shapiro 		(void) sleep(1);
23512ed1c7cSGregory Neil Shapiro 		if ((i = read(fd, &stats, sizeof stats)) < 0)
23612ed1c7cSGregory Neil Shapiro 		{
2373299c2f1SGregory Neil Shapiro 			save_errno = errno;
23812ed1c7cSGregory Neil Shapiro 			(void) sm_io_fputs(smioerr, SM_TIME_DEFAULT,
239c2aa98e2SPeter Wemm 					   "mailstats: ");
240c2aa98e2SPeter Wemm 			errno = save_errno;
241c2aa98e2SPeter Wemm 			sm_perror(sfile);
242c2aa98e2SPeter Wemm 			exit(EX_NOINPUT);
2433299c2f1SGregory Neil Shapiro 		}
2443299c2f1SGregory Neil Shapiro 		else if (i == 0)
245c2aa98e2SPeter Wemm 		{
246c2aa98e2SPeter Wemm 			memset((ARBPTR_T) &stats, '\0', sizeof stats);
247c2aa98e2SPeter Wemm 			(void) time(&stats.stat_itime);
248c2aa98e2SPeter Wemm 		}
2493299c2f1SGregory Neil Shapiro 	}
250c2aa98e2SPeter Wemm 	if (i != 0)
25112ed1c7cSGregory Neil Shapiro 	{
252c2aa98e2SPeter Wemm 		if (stats.stat_magic != STAT_MAGIC)
253c2aa98e2SPeter Wemm 		{
254c2aa98e2SPeter Wemm 			(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
255c2aa98e2SPeter Wemm 					     "mailstats: incorrect magic number in %s\n",
2563299c2f1SGregory Neil Shapiro 					     sfile);
257c2aa98e2SPeter Wemm 			exit(EX_OSERR);
25812ed1c7cSGregory Neil Shapiro 		}
259c2aa98e2SPeter Wemm 		else if (stats.stat_version != STAT_VERSION)
26012ed1c7cSGregory Neil Shapiro 		{
26112ed1c7cSGregory Neil Shapiro 			(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
26212ed1c7cSGregory Neil Shapiro 					     "mailstats version (%d) incompatible with %s version (%d)\n",
263c2aa98e2SPeter Wemm 					     STAT_VERSION, sfile,
264c2aa98e2SPeter Wemm 					     stats.stat_version);
2653299c2f1SGregory Neil Shapiro 
266c2aa98e2SPeter Wemm 			exit(EX_OSERR);
26712ed1c7cSGregory Neil Shapiro 		}
26812ed1c7cSGregory Neil Shapiro 		else if (i != sizeof stats || stats.stat_size != sizeof(stats))
269c2aa98e2SPeter Wemm 		{
270c2aa98e2SPeter Wemm 			(void) sm_io_fputs(smioerr, SM_TIME_DEFAULT,
271c2aa98e2SPeter Wemm 					   "mailstats: file size changed.\n");
272c2aa98e2SPeter Wemm 			exit(EX_OSERR);
27376b7bf71SPeter Wemm 		}
27476b7bf71SPeter Wemm 	}
2753299c2f1SGregory Neil Shapiro 
27612ed1c7cSGregory Neil Shapiro 
27712ed1c7cSGregory Neil Shapiro 	if (progmode)
27876b7bf71SPeter Wemm 	{
27976b7bf71SPeter Wemm 		(void) time(&now);
28076b7bf71SPeter Wemm 		(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "%ld %ld\n",
28112ed1c7cSGregory Neil Shapiro 				     (long) stats.stat_itime, (long) now);
28212ed1c7cSGregory Neil Shapiro 	}
28312ed1c7cSGregory Neil Shapiro 	else
28412ed1c7cSGregory Neil Shapiro 	{
28512ed1c7cSGregory Neil Shapiro 		(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
28612ed1c7cSGregory Neil Shapiro 				     "Statistics from %s",
28712ed1c7cSGregory Neil Shapiro 				     ctime(&stats.stat_itime));
288c2aa98e2SPeter Wemm 		(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
28976b7bf71SPeter Wemm 				     " M   msgsfr  bytes_from   msgsto    bytes_to  msgsrej msgsdis");
290c2aa98e2SPeter Wemm 		(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, " msgsqur");
291c2aa98e2SPeter Wemm 		(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "%s\n",
2923299c2f1SGregory Neil Shapiro 				     mnames ? "  Mailer" : "");
29312ed1c7cSGregory Neil Shapiro 	}
2943299c2f1SGregory Neil Shapiro 	for (i = 0; i < MAXMAILERS; i++)
295c2aa98e2SPeter Wemm 	{
29676b7bf71SPeter Wemm 		if (stats.stat_nf[i] || stats.stat_nt[i] ||
29776b7bf71SPeter Wemm 		    stats.stat_nq[i] ||
29876b7bf71SPeter Wemm 		    stats.stat_nr[i] || stats.stat_nd[i])
29976b7bf71SPeter Wemm 		{
30076b7bf71SPeter Wemm 			char *format;
30176b7bf71SPeter Wemm 
30212ed1c7cSGregory Neil Shapiro 			if (progmode)
30312ed1c7cSGregory Neil Shapiro 				format = "%2d %8ld %10ld %8ld %10ld   %6ld  %6ld";
30412ed1c7cSGregory Neil Shapiro 			else
30512ed1c7cSGregory Neil Shapiro 				format = "%2d %8ld %10ldK %8ld %10ldK   %6ld  %6ld";
30612ed1c7cSGregory Neil Shapiro 			(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
30712ed1c7cSGregory Neil Shapiro 					     format, i,
30812ed1c7cSGregory Neil Shapiro 					     stats.stat_nf[i],
30912ed1c7cSGregory Neil Shapiro 					     stats.stat_bf[i],
31012ed1c7cSGregory Neil Shapiro 					     stats.stat_nt[i],
31112ed1c7cSGregory Neil Shapiro 					     stats.stat_bt[i],
312c2aa98e2SPeter Wemm 					     stats.stat_nr[i],
31312ed1c7cSGregory Neil Shapiro 					     stats.stat_nd[i]);
31412ed1c7cSGregory Neil Shapiro 			(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
31512ed1c7cSGregory Neil Shapiro 					     "  %6ld", stats.stat_nq[i]);
31612ed1c7cSGregory Neil Shapiro 			if (mnames)
3173299c2f1SGregory Neil Shapiro 				(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
3183299c2f1SGregory Neil Shapiro 						     "  %s",
3193299c2f1SGregory Neil Shapiro 						      mtable[i]);
3203299c2f1SGregory Neil Shapiro 			(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "\n");
3213299c2f1SGregory Neil Shapiro 			frmsgs += stats.stat_nf[i];
3223299c2f1SGregory Neil Shapiro 			frbytes += stats.stat_bf[i];
32312ed1c7cSGregory Neil Shapiro 			tomsgs += stats.stat_nt[i];
324c2aa98e2SPeter Wemm 			tobytes += stats.stat_bt[i];
325c2aa98e2SPeter Wemm 			rejmsgs += stats.stat_nr[i];
32676b7bf71SPeter Wemm 			dismsgs += stats.stat_nd[i];
32776b7bf71SPeter Wemm 			quarmsgs += stats.stat_nq[i];
32812ed1c7cSGregory Neil Shapiro 		}
32912ed1c7cSGregory Neil Shapiro 	}
33012ed1c7cSGregory Neil Shapiro 	if (progmode)
33112ed1c7cSGregory Neil Shapiro 	{
33212ed1c7cSGregory Neil Shapiro 		(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
33312ed1c7cSGregory Neil Shapiro 				     " T %8ld %10ld %8ld %10ld   %6ld  %6ld",
33412ed1c7cSGregory Neil Shapiro 				     frmsgs, frbytes, tomsgs, tobytes, rejmsgs,
33512ed1c7cSGregory Neil Shapiro 				     dismsgs);
33612ed1c7cSGregory Neil Shapiro 		(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
33712ed1c7cSGregory Neil Shapiro 				     "  %6ld", quarmsgs);
33812ed1c7cSGregory Neil Shapiro 		(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "\n");
3393299c2f1SGregory Neil Shapiro 		(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
34012ed1c7cSGregory Neil Shapiro 				     " C %8ld %8ld %6ld\n",
34112ed1c7cSGregory Neil Shapiro 				     stats.stat_cf, stats.stat_ct,
34288ad41d4SGregory Neil Shapiro 				     stats.stat_cr);
343e01d6f61SPeter Wemm 		(void) close(fd);
3443299c2f1SGregory Neil Shapiro 		if (trunc)
34576b7bf71SPeter Wemm 		{
34612ed1c7cSGregory Neil Shapiro 			fd = open(sfile, O_RDWR | O_TRUNC, 0600);
34776b7bf71SPeter Wemm 			if (fd >= 0)
34876b7bf71SPeter Wemm 				(void) close(fd);
34912ed1c7cSGregory Neil Shapiro 		}
35012ed1c7cSGregory Neil Shapiro 	}
35112ed1c7cSGregory Neil Shapiro 	else
35212ed1c7cSGregory Neil Shapiro 	{
35312ed1c7cSGregory Neil Shapiro 		(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
35412ed1c7cSGregory Neil Shapiro 				     "=============================================================");
35512ed1c7cSGregory Neil Shapiro 		(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "========");
35612ed1c7cSGregory Neil Shapiro 		(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "\n");
35712ed1c7cSGregory Neil Shapiro 		(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
35812ed1c7cSGregory Neil Shapiro 				     " T %8ld %10ldK %8ld %10ldK   %6ld  %6ld",
35912ed1c7cSGregory Neil Shapiro 				     frmsgs, frbytes, tomsgs, tobytes, rejmsgs,
36012ed1c7cSGregory Neil Shapiro 				     dismsgs);
36112ed1c7cSGregory Neil Shapiro 		(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
36212ed1c7cSGregory Neil Shapiro 				     "  %6ld", quarmsgs);
36312ed1c7cSGregory Neil Shapiro 		(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "\n");
36476b7bf71SPeter Wemm 		(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
365c2aa98e2SPeter Wemm 				     " C %8ld %10s  %8ld %10s    %6ld\n",
3663299c2f1SGregory Neil Shapiro 				     stats.stat_cf, "", stats.stat_ct, "",
3673299c2f1SGregory Neil Shapiro 				     stats.stat_cr);
368c2aa98e2SPeter Wemm 	}
369 	exit(EX_OK);
370 	/* NOTREACHED */
371 	return EX_OK;
372 }
373