1*955eb5e1SGarrett D'Amore /* 2*955eb5e1SGarrett D'Amore * Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers. 3*955eb5e1SGarrett D'Amore * All rights reserved. 4*955eb5e1SGarrett D'Amore * Copyright (c) 1983 Eric P. Allman. All rights reserved. 5*955eb5e1SGarrett D'Amore * Copyright (c) 1988, 1993 6*955eb5e1SGarrett D'Amore * The Regents of the University of California. All rights reserved. 7*955eb5e1SGarrett D'Amore * 8*955eb5e1SGarrett D'Amore * By using this file, you agree to the terms and conditions set 9*955eb5e1SGarrett D'Amore * forth in the LICENSE file which can be found at the top level of 10*955eb5e1SGarrett D'Amore * the sendmail distribution. 11*955eb5e1SGarrett D'Amore * 12*955eb5e1SGarrett D'Amore * 13*955eb5e1SGarrett D'Amore */ 14*955eb5e1SGarrett D'Amore 15*955eb5e1SGarrett D'Amore #include <sm/gen.h> 16*955eb5e1SGarrett D'Amore 17*955eb5e1SGarrett D'Amore SM_IDSTR(copyright, 18*955eb5e1SGarrett D'Amore "@(#) Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers.\n\ 19*955eb5e1SGarrett D'Amore All rights reserved.\n\ 20*955eb5e1SGarrett D'Amore Copyright (c) 1988, 1993\n\ 21*955eb5e1SGarrett D'Amore The Regents of the University of California. All rights reserved.\n") 22*955eb5e1SGarrett D'Amore 23*955eb5e1SGarrett D'Amore SM_IDSTR(id, "@(#)$Id: mailstats.c,v 8.100 2002/06/27 23:24:06 gshapiro Exp $") 24*955eb5e1SGarrett D'Amore 25*955eb5e1SGarrett D'Amore #include <unistd.h> 26*955eb5e1SGarrett D'Amore #include <stddef.h> 27*955eb5e1SGarrett D'Amore #include <stdlib.h> 28*955eb5e1SGarrett D'Amore #include <ctype.h> 29*955eb5e1SGarrett D'Amore #include <string.h> 30*955eb5e1SGarrett D'Amore #include <time.h> 31*955eb5e1SGarrett D'Amore #ifdef EX_OK 32*955eb5e1SGarrett D'Amore # undef EX_OK /* unistd.h may have another use for this */ 33*955eb5e1SGarrett D'Amore #endif /* EX_OK */ 34*955eb5e1SGarrett D'Amore #include <sysexits.h> 35*955eb5e1SGarrett D'Amore 36*955eb5e1SGarrett D'Amore #include <sm/errstring.h> 37*955eb5e1SGarrett D'Amore #include <sm/limits.h> 38*955eb5e1SGarrett D'Amore #include <sendmail/sendmail.h> 39*955eb5e1SGarrett D'Amore #include <sendmail/mailstats.h> 40*955eb5e1SGarrett D'Amore #include <sendmail/pathnames.h> 41*955eb5e1SGarrett D'Amore 42*955eb5e1SGarrett D'Amore 43*955eb5e1SGarrett D'Amore #define MNAMELEN 20 /* max length of mailer name */ 44*955eb5e1SGarrett D'Amore 45*955eb5e1SGarrett D'Amore int 46*955eb5e1SGarrett D'Amore main(argc, argv) 47*955eb5e1SGarrett D'Amore int argc; 48*955eb5e1SGarrett D'Amore char **argv; 49*955eb5e1SGarrett D'Amore { 50*955eb5e1SGarrett D'Amore register int i; 51*955eb5e1SGarrett D'Amore int mno; 52*955eb5e1SGarrett D'Amore int save_errno; 53*955eb5e1SGarrett D'Amore int ch, fd; 54*955eb5e1SGarrett D'Amore char *sfile; 55*955eb5e1SGarrett D'Amore char *cfile; 56*955eb5e1SGarrett D'Amore SM_FILE_T *cfp; 57*955eb5e1SGarrett D'Amore bool mnames; 58*955eb5e1SGarrett D'Amore bool progmode; 59*955eb5e1SGarrett D'Amore bool trunc; 60*955eb5e1SGarrett D'Amore long frmsgs = 0, frbytes = 0, tomsgs = 0, tobytes = 0, rejmsgs = 0; 61*955eb5e1SGarrett D'Amore long dismsgs = 0; 62*955eb5e1SGarrett D'Amore long quarmsgs = 0; 63*955eb5e1SGarrett D'Amore time_t now; 64*955eb5e1SGarrett D'Amore char mtable[MAXMAILERS][MNAMELEN + 1]; 65*955eb5e1SGarrett D'Amore char sfilebuf[MAXPATHLEN]; 66*955eb5e1SGarrett D'Amore char buf[MAXLINE]; 67*955eb5e1SGarrett D'Amore struct statistics stats; 68*955eb5e1SGarrett D'Amore extern char *ctime(); 69*955eb5e1SGarrett D'Amore extern char *optarg; 70*955eb5e1SGarrett D'Amore extern int optind; 71*955eb5e1SGarrett D'Amore 72*955eb5e1SGarrett D'Amore cfile = getcfname(0, 0, SM_GET_SENDMAIL_CF, NULL); 73*955eb5e1SGarrett D'Amore sfile = NULL; 74*955eb5e1SGarrett D'Amore mnames = true; 75*955eb5e1SGarrett D'Amore progmode = false; 76*955eb5e1SGarrett D'Amore trunc = false; 77*955eb5e1SGarrett D'Amore while ((ch = getopt(argc, argv, "cC:f:opP")) != -1) 78*955eb5e1SGarrett D'Amore { 79*955eb5e1SGarrett D'Amore switch (ch) 80*955eb5e1SGarrett D'Amore { 81*955eb5e1SGarrett D'Amore case 'c': 82*955eb5e1SGarrett D'Amore cfile = getcfname(0, 0, SM_GET_SUBMIT_CF, NULL); 83*955eb5e1SGarrett D'Amore break; 84*955eb5e1SGarrett D'Amore 85*955eb5e1SGarrett D'Amore case 'C': 86*955eb5e1SGarrett D'Amore cfile = optarg; 87*955eb5e1SGarrett D'Amore break; 88*955eb5e1SGarrett D'Amore 89*955eb5e1SGarrett D'Amore case 'f': 90*955eb5e1SGarrett D'Amore sfile = optarg; 91*955eb5e1SGarrett D'Amore break; 92*955eb5e1SGarrett D'Amore 93*955eb5e1SGarrett D'Amore case 'o': 94*955eb5e1SGarrett D'Amore mnames = false; 95*955eb5e1SGarrett D'Amore break; 96*955eb5e1SGarrett D'Amore 97*955eb5e1SGarrett D'Amore case 'p': 98*955eb5e1SGarrett D'Amore trunc = true; 99*955eb5e1SGarrett D'Amore /* FALLTHROUGH */ 100*955eb5e1SGarrett D'Amore 101*955eb5e1SGarrett D'Amore case 'P': 102*955eb5e1SGarrett D'Amore progmode = true; 103*955eb5e1SGarrett D'Amore break; 104*955eb5e1SGarrett D'Amore 105*955eb5e1SGarrett D'Amore case '?': 106*955eb5e1SGarrett D'Amore default: 107*955eb5e1SGarrett D'Amore usage: 108*955eb5e1SGarrett D'Amore (void) sm_io_fputs(smioerr, SM_TIME_DEFAULT, 109*955eb5e1SGarrett D'Amore "usage: mailstats [-C cffile] [-c] [-P] [-f stfile] [-o] [-p]\n"); 110*955eb5e1SGarrett D'Amore exit(EX_USAGE); 111*955eb5e1SGarrett D'Amore } 112*955eb5e1SGarrett D'Amore } 113*955eb5e1SGarrett D'Amore argc -= optind; 114*955eb5e1SGarrett D'Amore argv += optind; 115*955eb5e1SGarrett D'Amore 116*955eb5e1SGarrett D'Amore if (argc != 0) 117*955eb5e1SGarrett D'Amore goto usage; 118*955eb5e1SGarrett D'Amore 119*955eb5e1SGarrett D'Amore if ((cfp = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, cfile, SM_IO_RDONLY, 120*955eb5e1SGarrett D'Amore NULL)) == NULL) 121*955eb5e1SGarrett D'Amore { 122*955eb5e1SGarrett D'Amore save_errno = errno; 123*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, "mailstats: "); 124*955eb5e1SGarrett D'Amore errno = save_errno; 125*955eb5e1SGarrett D'Amore sm_perror(cfile); 126*955eb5e1SGarrett D'Amore exit(EX_NOINPUT); 127*955eb5e1SGarrett D'Amore } 128*955eb5e1SGarrett D'Amore 129*955eb5e1SGarrett D'Amore mno = 0; 130*955eb5e1SGarrett D'Amore (void) sm_strlcpy(mtable[mno++], "prog", MNAMELEN + 1); 131*955eb5e1SGarrett D'Amore (void) sm_strlcpy(mtable[mno++], "*file*", MNAMELEN + 1); 132*955eb5e1SGarrett D'Amore (void) sm_strlcpy(mtable[mno++], "*include*", MNAMELEN + 1); 133*955eb5e1SGarrett D'Amore 134*955eb5e1SGarrett D'Amore while (sm_io_fgets(cfp, SM_TIME_DEFAULT, buf, sizeof(buf)) != NULL) 135*955eb5e1SGarrett D'Amore { 136*955eb5e1SGarrett D'Amore register char *b; 137*955eb5e1SGarrett D'Amore char *s; 138*955eb5e1SGarrett D'Amore register char *m; 139*955eb5e1SGarrett D'Amore 140*955eb5e1SGarrett D'Amore b = strchr(buf, '#'); 141*955eb5e1SGarrett D'Amore if (b == NULL) 142*955eb5e1SGarrett D'Amore b = strchr(buf, '\n'); 143*955eb5e1SGarrett D'Amore if (b == NULL) 144*955eb5e1SGarrett D'Amore b = &buf[strlen(buf)]; 145*955eb5e1SGarrett D'Amore while (isascii(*--b) && isspace(*b)) 146*955eb5e1SGarrett D'Amore continue; 147*955eb5e1SGarrett D'Amore *++b = '\0'; 148*955eb5e1SGarrett D'Amore 149*955eb5e1SGarrett D'Amore b = buf; 150*955eb5e1SGarrett D'Amore switch (*b++) 151*955eb5e1SGarrett D'Amore { 152*955eb5e1SGarrett D'Amore case 'M': /* mailer definition */ 153*955eb5e1SGarrett D'Amore break; 154*955eb5e1SGarrett D'Amore 155*955eb5e1SGarrett D'Amore case 'O': /* option -- see if .st file */ 156*955eb5e1SGarrett D'Amore if (sm_strncasecmp(b, " StatusFile", 11) == 0 && 157*955eb5e1SGarrett D'Amore !(isascii(b[11]) && isalnum(b[11]))) 158*955eb5e1SGarrett D'Amore { 159*955eb5e1SGarrett D'Amore /* new form -- find value */ 160*955eb5e1SGarrett D'Amore b = strchr(b, '='); 161*955eb5e1SGarrett D'Amore if (b == NULL) 162*955eb5e1SGarrett D'Amore continue; 163*955eb5e1SGarrett D'Amore while (isascii(*++b) && isspace(*b)) 164*955eb5e1SGarrett D'Amore continue; 165*955eb5e1SGarrett D'Amore } 166*955eb5e1SGarrett D'Amore else if (*b++ != 'S') 167*955eb5e1SGarrett D'Amore { 168*955eb5e1SGarrett D'Amore /* something else boring */ 169*955eb5e1SGarrett D'Amore continue; 170*955eb5e1SGarrett D'Amore } 171*955eb5e1SGarrett D'Amore 172*955eb5e1SGarrett D'Amore /* this is the S or StatusFile option -- save it */ 173*955eb5e1SGarrett D'Amore if (sm_strlcpy(sfilebuf, b, sizeof sfilebuf) >= 174*955eb5e1SGarrett D'Amore sizeof sfilebuf) 175*955eb5e1SGarrett D'Amore { 176*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 177*955eb5e1SGarrett D'Amore "StatusFile filename too long: %.30s...\n", 178*955eb5e1SGarrett D'Amore b); 179*955eb5e1SGarrett D'Amore exit(EX_CONFIG); 180*955eb5e1SGarrett D'Amore } 181*955eb5e1SGarrett D'Amore if (sfile == NULL) 182*955eb5e1SGarrett D'Amore sfile = sfilebuf; 183*955eb5e1SGarrett D'Amore /* FALLTHROUGH */ 184*955eb5e1SGarrett D'Amore 185*955eb5e1SGarrett D'Amore default: 186*955eb5e1SGarrett D'Amore continue; 187*955eb5e1SGarrett D'Amore } 188*955eb5e1SGarrett D'Amore 189*955eb5e1SGarrett D'Amore if (mno >= MAXMAILERS) 190*955eb5e1SGarrett D'Amore { 191*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 192*955eb5e1SGarrett D'Amore "Too many mailers defined, %d max.\n", 193*955eb5e1SGarrett D'Amore MAXMAILERS); 194*955eb5e1SGarrett D'Amore exit(EX_SOFTWARE); 195*955eb5e1SGarrett D'Amore } 196*955eb5e1SGarrett D'Amore m = mtable[mno]; 197*955eb5e1SGarrett D'Amore s = m + MNAMELEN; /* is [MNAMELEN + 1] */ 198*955eb5e1SGarrett D'Amore while (*b != ',' && !(isascii(*b) && isspace(*b)) && 199*955eb5e1SGarrett D'Amore *b != '\0' && m < s) 200*955eb5e1SGarrett D'Amore *m++ = *b++; 201*955eb5e1SGarrett D'Amore *m = '\0'; 202*955eb5e1SGarrett D'Amore for (i = 0; i < mno; i++) 203*955eb5e1SGarrett D'Amore { 204*955eb5e1SGarrett D'Amore if (strcmp(mtable[i], mtable[mno]) == 0) 205*955eb5e1SGarrett D'Amore break; 206*955eb5e1SGarrett D'Amore } 207*955eb5e1SGarrett D'Amore if (i == mno) 208*955eb5e1SGarrett D'Amore mno++; 209*955eb5e1SGarrett D'Amore } 210*955eb5e1SGarrett D'Amore (void) sm_io_close(cfp, SM_TIME_DEFAULT); 211*955eb5e1SGarrett D'Amore for (; mno < MAXMAILERS; mno++) 212*955eb5e1SGarrett D'Amore mtable[mno][0] = '\0'; 213*955eb5e1SGarrett D'Amore 214*955eb5e1SGarrett D'Amore if (sfile == NULL) 215*955eb5e1SGarrett D'Amore { 216*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 217*955eb5e1SGarrett D'Amore "mailstats: no statistics file located\n"); 218*955eb5e1SGarrett D'Amore exit(EX_OSFILE); 219*955eb5e1SGarrett D'Amore } 220*955eb5e1SGarrett D'Amore 221*955eb5e1SGarrett D'Amore fd = open(sfile, O_RDONLY, 0600); 222*955eb5e1SGarrett D'Amore if ((fd < 0) || (i = read(fd, &stats, sizeof stats)) < 0) 223*955eb5e1SGarrett D'Amore { 224*955eb5e1SGarrett D'Amore save_errno = errno; 225*955eb5e1SGarrett D'Amore (void) sm_io_fputs(smioerr, SM_TIME_DEFAULT, "mailstats: "); 226*955eb5e1SGarrett D'Amore errno = save_errno; 227*955eb5e1SGarrett D'Amore sm_perror(sfile); 228*955eb5e1SGarrett D'Amore exit(EX_NOINPUT); 229*955eb5e1SGarrett D'Amore } 230*955eb5e1SGarrett D'Amore if (i == 0) 231*955eb5e1SGarrett D'Amore { 232*955eb5e1SGarrett D'Amore (void) sleep(1); 233*955eb5e1SGarrett D'Amore if ((i = read(fd, &stats, sizeof stats)) < 0) 234*955eb5e1SGarrett D'Amore { 235*955eb5e1SGarrett D'Amore save_errno = errno; 236*955eb5e1SGarrett D'Amore (void) sm_io_fputs(smioerr, SM_TIME_DEFAULT, 237*955eb5e1SGarrett D'Amore "mailstats: "); 238*955eb5e1SGarrett D'Amore errno = save_errno; 239*955eb5e1SGarrett D'Amore sm_perror(sfile); 240*955eb5e1SGarrett D'Amore exit(EX_NOINPUT); 241*955eb5e1SGarrett D'Amore } 242*955eb5e1SGarrett D'Amore else if (i == 0) 243*955eb5e1SGarrett D'Amore { 244*955eb5e1SGarrett D'Amore memset((ARBPTR_T) &stats, '\0', sizeof stats); 245*955eb5e1SGarrett D'Amore (void) time(&stats.stat_itime); 246*955eb5e1SGarrett D'Amore } 247*955eb5e1SGarrett D'Amore } 248*955eb5e1SGarrett D'Amore if (i != 0) 249*955eb5e1SGarrett D'Amore { 250*955eb5e1SGarrett D'Amore if (stats.stat_magic != STAT_MAGIC) 251*955eb5e1SGarrett D'Amore { 252*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 253*955eb5e1SGarrett D'Amore "mailstats: incorrect magic number in %s\n", 254*955eb5e1SGarrett D'Amore sfile); 255*955eb5e1SGarrett D'Amore exit(EX_OSERR); 256*955eb5e1SGarrett D'Amore } 257*955eb5e1SGarrett D'Amore else if (stats.stat_version != STAT_VERSION) 258*955eb5e1SGarrett D'Amore { 259*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 260*955eb5e1SGarrett D'Amore "mailstats version (%d) incompatible with %s version (%d)\n", 261*955eb5e1SGarrett D'Amore STAT_VERSION, sfile, 262*955eb5e1SGarrett D'Amore stats.stat_version); 263*955eb5e1SGarrett D'Amore 264*955eb5e1SGarrett D'Amore exit(EX_OSERR); 265*955eb5e1SGarrett D'Amore } 266*955eb5e1SGarrett D'Amore else if (i != sizeof stats || stats.stat_size != sizeof(stats)) 267*955eb5e1SGarrett D'Amore { 268*955eb5e1SGarrett D'Amore (void) sm_io_fputs(smioerr, SM_TIME_DEFAULT, 269*955eb5e1SGarrett D'Amore "mailstats: file size changed.\n"); 270*955eb5e1SGarrett D'Amore exit(EX_OSERR); 271*955eb5e1SGarrett D'Amore } 272*955eb5e1SGarrett D'Amore } 273*955eb5e1SGarrett D'Amore 274*955eb5e1SGarrett D'Amore if (progmode) 275*955eb5e1SGarrett D'Amore { 276*955eb5e1SGarrett D'Amore (void) time(&now); 277*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "%ld %ld\n", 278*955eb5e1SGarrett D'Amore (long) stats.stat_itime, (long) now); 279*955eb5e1SGarrett D'Amore } 280*955eb5e1SGarrett D'Amore else 281*955eb5e1SGarrett D'Amore { 282*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 283*955eb5e1SGarrett D'Amore "Statistics from %s", 284*955eb5e1SGarrett D'Amore ctime(&stats.stat_itime)); 285*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 286*955eb5e1SGarrett D'Amore " M msgsfr bytes_from msgsto bytes_to msgsrej msgsdis"); 287*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, " msgsqur"); 288*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "%s\n", 289*955eb5e1SGarrett D'Amore mnames ? " Mailer" : ""); 290*955eb5e1SGarrett D'Amore } 291*955eb5e1SGarrett D'Amore for (i = 0; i < MAXMAILERS; i++) 292*955eb5e1SGarrett D'Amore { 293*955eb5e1SGarrett D'Amore if (stats.stat_nf[i] || stats.stat_nt[i] || 294*955eb5e1SGarrett D'Amore stats.stat_nq[i] || 295*955eb5e1SGarrett D'Amore stats.stat_nr[i] || stats.stat_nd[i]) 296*955eb5e1SGarrett D'Amore { 297*955eb5e1SGarrett D'Amore char *format; 298*955eb5e1SGarrett D'Amore 299*955eb5e1SGarrett D'Amore if (progmode) 300*955eb5e1SGarrett D'Amore format = "%2d %8ld %10ld %8ld %10ld %6ld %6ld"; 301*955eb5e1SGarrett D'Amore else 302*955eb5e1SGarrett D'Amore format = "%2d %8ld %10ldK %8ld %10ldK %6ld %6ld"; 303*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 304*955eb5e1SGarrett D'Amore format, i, 305*955eb5e1SGarrett D'Amore stats.stat_nf[i], 306*955eb5e1SGarrett D'Amore stats.stat_bf[i], 307*955eb5e1SGarrett D'Amore stats.stat_nt[i], 308*955eb5e1SGarrett D'Amore stats.stat_bt[i], 309*955eb5e1SGarrett D'Amore stats.stat_nr[i], 310*955eb5e1SGarrett D'Amore stats.stat_nd[i]); 311*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 312*955eb5e1SGarrett D'Amore " %6ld", stats.stat_nq[i]); 313*955eb5e1SGarrett D'Amore if (mnames) 314*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 315*955eb5e1SGarrett D'Amore " %s", 316*955eb5e1SGarrett D'Amore mtable[i]); 317*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "\n"); 318*955eb5e1SGarrett D'Amore frmsgs += stats.stat_nf[i]; 319*955eb5e1SGarrett D'Amore frbytes += stats.stat_bf[i]; 320*955eb5e1SGarrett D'Amore tomsgs += stats.stat_nt[i]; 321*955eb5e1SGarrett D'Amore tobytes += stats.stat_bt[i]; 322*955eb5e1SGarrett D'Amore rejmsgs += stats.stat_nr[i]; 323*955eb5e1SGarrett D'Amore dismsgs += stats.stat_nd[i]; 324*955eb5e1SGarrett D'Amore quarmsgs += stats.stat_nq[i]; 325*955eb5e1SGarrett D'Amore } 326*955eb5e1SGarrett D'Amore } 327*955eb5e1SGarrett D'Amore if (progmode) 328*955eb5e1SGarrett D'Amore { 329*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 330*955eb5e1SGarrett D'Amore " T %8ld %10ld %8ld %10ld %6ld %6ld", 331*955eb5e1SGarrett D'Amore frmsgs, frbytes, tomsgs, tobytes, rejmsgs, 332*955eb5e1SGarrett D'Amore dismsgs); 333*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 334*955eb5e1SGarrett D'Amore " %6ld", quarmsgs); 335*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "\n"); 336*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 337*955eb5e1SGarrett D'Amore " C %8ld %8ld %6ld\n", 338*955eb5e1SGarrett D'Amore stats.stat_cf, stats.stat_ct, 339*955eb5e1SGarrett D'Amore stats.stat_cr); 340*955eb5e1SGarrett D'Amore (void) close(fd); 341*955eb5e1SGarrett D'Amore if (trunc) 342*955eb5e1SGarrett D'Amore { 343*955eb5e1SGarrett D'Amore fd = open(sfile, O_RDWR | O_TRUNC, 0600); 344*955eb5e1SGarrett D'Amore if (fd >= 0) 345*955eb5e1SGarrett D'Amore (void) close(fd); 346*955eb5e1SGarrett D'Amore } 347*955eb5e1SGarrett D'Amore } 348*955eb5e1SGarrett D'Amore else 349*955eb5e1SGarrett D'Amore { 350*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 351*955eb5e1SGarrett D'Amore "============================================================="); 352*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "========"); 353*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "\n"); 354*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 355*955eb5e1SGarrett D'Amore " T %8ld %10ldK %8ld %10ldK %6ld %6ld", 356*955eb5e1SGarrett D'Amore frmsgs, frbytes, tomsgs, tobytes, rejmsgs, 357*955eb5e1SGarrett D'Amore dismsgs); 358*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 359*955eb5e1SGarrett D'Amore " %6ld", quarmsgs); 360*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "\n"); 361*955eb5e1SGarrett D'Amore (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, 362*955eb5e1SGarrett D'Amore " C %8ld %10s %8ld %10s %6ld\n", 363*955eb5e1SGarrett D'Amore stats.stat_cf, "", stats.stat_ct, "", 364*955eb5e1SGarrett D'Amore stats.stat_cr); 365*955eb5e1SGarrett D'Amore } 366*955eb5e1SGarrett D'Amore exit(EX_OK); 367*955eb5e1SGarrett D'Amore /* NOTREACHED */ 368*955eb5e1SGarrett D'Amore return EX_OK; 369*955eb5e1SGarrett D'Amore } 370