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