home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / usr.sbin / sendmail / src / stats.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-20  |  3.5 KB  |  123 lines

  1. /*
  2.  * Copyright (c) 1983 Eric P. Allman
  3.  * Copyright (c) 1988 Regents of the University of California.
  4.  * All rights reserved.
  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
  36. static char sccsid[] = "@(#)stats.c    5.11 (Berkeley) 6/1/90";
  37. #endif /* not lint */
  38.  
  39. # include "sendmail.h"
  40. # include "mailstats.h"
  41.  
  42. struct statistics    Stat;
  43.  
  44. #define ONE_K        1000        /* one thousand (twenty-four?) */
  45. #define KBYTES(x)    (((x) + (ONE_K - 1)) / ONE_K)
  46. /*
  47. **  MARKSTATS -- mark statistics
  48. */
  49.  
  50. markstats(e, to)
  51.     register ENVELOPE *e;
  52.     register ADDRESS *to;
  53. {
  54.     if (to == NULL)
  55.     {
  56.         if (e->e_from.q_mailer != NULL)
  57.         {
  58.             Stat.stat_nf[e->e_from.q_mailer->m_mno]++;
  59.             Stat.stat_bf[e->e_from.q_mailer->m_mno] +=
  60.                 KBYTES(CurEnv->e_msgsize);
  61.         }
  62.     }
  63.     else
  64.     {
  65.         Stat.stat_nt[to->q_mailer->m_mno]++;
  66.         Stat.stat_bt[to->q_mailer->m_mno] += KBYTES(CurEnv->e_msgsize);
  67.     }
  68. }
  69. /*
  70. **  POSTSTATS -- post statistics in the statistics file
  71. **
  72. **    Parameters:
  73. **        sfile -- the name of the statistics file.
  74. **
  75. **    Returns:
  76. **        none.
  77. **
  78. **    Side Effects:
  79. **        merges the Stat structure with the sfile file.
  80. */
  81.  
  82. poststats(sfile)
  83.     char *sfile;
  84. {
  85.     register int fd;
  86.     struct statistics stat;
  87.     extern off_t lseek();
  88.  
  89.     if (sfile == NULL)
  90.         return;
  91.  
  92.     (void) time(&Stat.stat_itime);
  93.     Stat.stat_size = sizeof Stat;
  94.  
  95.     fd = open(sfile, 2);
  96.     if (fd < 0)
  97.     {
  98.         errno = 0;
  99.         return;
  100.     }
  101.     if (read(fd, (char *) &stat, sizeof stat) == sizeof stat &&
  102.         stat.stat_size == sizeof stat)
  103.     {
  104.         /* merge current statistics into statfile */
  105.         register int i;
  106.  
  107.         for (i = 0; i < MAXMAILERS; i++)
  108.         {
  109.             stat.stat_nf[i] += Stat.stat_nf[i];
  110.             stat.stat_bf[i] += Stat.stat_bf[i];
  111.             stat.stat_nt[i] += Stat.stat_nt[i];
  112.             stat.stat_bt[i] += Stat.stat_bt[i];
  113.         }
  114.     }
  115.     else
  116.         bcopy((char *) &Stat, (char *) &stat, sizeof stat);
  117.  
  118.     /* write out results */
  119.     (void) lseek(fd, (off_t) 0, 0);
  120.     (void) write(fd, (char *) &stat, sizeof stat);
  121.     (void) close(fd);
  122. }
  123.