stats.c
上传用户:xu_441
上传日期:2007-01-04
资源大小:1640k
文件大小:4k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
  3.  * All rights reserved.
  4.  * Copyright (c) 1983, 1995-1997 Eric P. Allman.  All rights reserved.
  5.  * Copyright (c) 1988, 1993
  6.  * The Regents of the University of California.  All rights reserved.
  7.  *
  8.  * By using this file, you agree to the terms and conditions set
  9.  * forth in the LICENSE file which can be found at the top level of
  10.  * the sendmail distribution.
  11.  *
  12.  */
  13. #ifndef lint
  14. static char id[] = "@(#)$Id: stats.c,v 8.36 1999/12/06 21:17:02 ca Exp $";
  15. #endif /* ! lint */
  16. #include <sendmail.h>
  17. #include <sendmail/mailstats.h>
  18. static struct statistics Stat;
  19. static bool GotStats = FALSE; /* set when we have stats to merge */
  20. #define ONE_K 1000 /* one thousand (twenty-four?) */
  21. #define KBYTES(x) (((x) + (ONE_K - 1)) / ONE_K)
  22. /*
  23. **  MARKSTATS -- mark statistics
  24. **
  25. ** Parameters:
  26. ** e -- the envelope.
  27. ** to -- to address.
  28. ** reject -- whether this is a rejection.
  29. **
  30. ** Returns:
  31. ** none.
  32. **
  33. ** Side Effects:
  34. ** changes static Stat structure
  35. */
  36. void
  37. markstats(e, to, reject)
  38. register ENVELOPE *e;
  39. register ADDRESS *to;
  40. bool reject;
  41. {
  42. if (reject)
  43. {
  44. if (e->e_from.q_mailer != NULL)
  45. {
  46. if (bitset(EF_DISCARD, e->e_flags))
  47. Stat.stat_nd[e->e_from.q_mailer->m_mno]++;
  48. else
  49. Stat.stat_nr[e->e_from.q_mailer->m_mno]++;
  50. }
  51. Stat.stat_cr++;
  52. }
  53. else if (to == NULL)
  54. {
  55. Stat.stat_cf++;
  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(e->e_msgsize);
  61. }
  62. }
  63. else
  64. {
  65. Stat.stat_ct++;
  66. Stat.stat_nt[to->q_mailer->m_mno]++;
  67. Stat.stat_bt[to->q_mailer->m_mno] += KBYTES(e->e_msgsize);
  68. }
  69. GotStats = TRUE;
  70. }
  71. /*
  72. **  CLEARSTATS -- clear statistics structure
  73. **
  74. ** Parameters:
  75. ** none.
  76. **
  77. ** Returns:
  78. ** none.
  79. **
  80. ** Side Effects:
  81. ** clears the Stat structure.
  82. */
  83. void
  84. clearstats()
  85. {
  86. /* clear the structure to avoid future disappointment */
  87. memset(&Stat, '', sizeof Stat);
  88. GotStats = FALSE;
  89. }
  90. /*
  91. **  POSTSTATS -- post statistics in the statistics file
  92. **
  93. ** Parameters:
  94. ** sfile -- the name of the statistics file.
  95. **
  96. ** Returns:
  97. ** none.
  98. **
  99. ** Side Effects:
  100. ** merges the Stat structure with the sfile file.
  101. */
  102. void
  103. poststats(sfile)
  104. char *sfile;
  105. {
  106. register int fd;
  107. long sff = SFF_REGONLY|SFF_OPENASROOT;
  108. struct statistics stats;
  109. extern off_t lseek();
  110. if (sfile == NULL || !GotStats)
  111. return;
  112. (void) time(&Stat.stat_itime);
  113. Stat.stat_size = sizeof Stat;
  114. Stat.stat_magic = STAT_MAGIC;
  115. Stat.stat_version = STAT_VERSION;
  116. if (!bitnset(DBS_WRITESTATSTOSYMLINK, DontBlameSendmail))
  117. sff |= SFF_NOSLINK;
  118. if (!bitnset(DBS_WRITESTATSTOHARDLINK, DontBlameSendmail))
  119. sff |= SFF_NOHLINK;
  120. fd = safeopen(sfile, O_RDWR, 0644, sff);
  121. if (fd < 0)
  122. {
  123. if (LogLevel > 12)
  124. sm_syslog(LOG_INFO, NOQID, "poststats: %s: %s",
  125.   sfile, errstring(errno));
  126. errno = 0;
  127. return;
  128. }
  129. if (read(fd, (char *) &stats, sizeof stats) == sizeof stats &&
  130.     stats.stat_size == sizeof stats &&
  131.     stats.stat_magic == Stat.stat_magic &&
  132.     stats.stat_version == Stat.stat_version)
  133. {
  134. /* merge current statistics into statfile */
  135. register int i;
  136. for (i = 0; i < MAXMAILERS; i++)
  137. {
  138. stats.stat_nf[i] += Stat.stat_nf[i];
  139. stats.stat_bf[i] += Stat.stat_bf[i];
  140. stats.stat_nt[i] += Stat.stat_nt[i];
  141. stats.stat_bt[i] += Stat.stat_bt[i];
  142. stats.stat_nr[i] += Stat.stat_nr[i];
  143. stats.stat_nd[i] += Stat.stat_nd[i];
  144. }
  145. stats.stat_cr += Stat.stat_cr;
  146. stats.stat_ct += Stat.stat_ct;
  147. stats.stat_cf += Stat.stat_cf;
  148. }
  149. else
  150. memmove((char *) &stats, (char *) &Stat, sizeof stats);
  151. /* write out results */
  152. (void) lseek(fd, (off_t) 0, 0);
  153. (void) write(fd, (char *) &stats, sizeof stats);
  154. (void) close(fd);
  155. /* clear the structure to avoid future disappointment */
  156. clearstats();
  157. }