deliverquota.c
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:3k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 2000 Double Precision, Inc.
  3. ** See COPYING for distribution information.
  4. */
  5. #include "maildirquota.h"
  6. #include "maildircreate.h"
  7. #include "maildirmisc.h"
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <stdlib.h>
  11. #include <sys/types.h>
  12. #include <errno.h>
  13. #if HAVE_SYS_STAT_H
  14. #include <sys/stat.h>
  15. #endif
  16. #if HAVE_UNISTD_H
  17. #include <unistd.h>
  18. #endif
  19. #if HAVE_FCNTL_H
  20. #include <fcntl.h>
  21. #endif
  22. #ifndef BUFSIZE
  23. #define BUFSIZE 8192
  24. #endif
  25. static const char rcsid[]="$Id: deliverquota.c,v 1.8 2000/05/11 22:04:34 mrsam Exp $";
  26. static long deliver(const char *dir, const char *q, long s)
  27. {
  28. char *tname, *nname;
  29. char buf[BUFSIZ];
  30. int n;
  31. long ss=0;
  32. int fd;
  33. int rc;
  34. while ((rc=maildir_try_create(dir, 0, s, &tname, &nname)) != 0)
  35. {
  36. if (rc < 0)
  37. {
  38. perror("maildir_try_create");
  39. exit(75);
  40. }
  41. sleep(3);
  42. }
  43. if ((fd=maildir_safeopen(tname, O_WRONLY|O_CREAT|O_EXCL, 0644)) < 0)
  44. {
  45. perror(tname);
  46. exit(77);
  47. }
  48. while ((n=read(0, buf, sizeof(buf))) > 0)
  49. {
  50. char *p=buf;
  51. ss += n;
  52. while (n)
  53. {
  54. int l;
  55. if ((l=write(fd, p, n)) < 0)
  56. {
  57. close(fd);
  58. unlink(tname);
  59. perror(tname);
  60. exit(77);
  61. }
  62. p += l;
  63. n -= l;
  64. }
  65. }
  66. close(fd);
  67. if (n < 0)
  68. {
  69. unlink(tname);
  70. perror(tname);
  71. exit(77);
  72. }
  73. if (s != ss)
  74. {
  75. char *qq;
  76. int quotafd;
  77. if (s) *strrchr(nname, ',')=0; /* Zap incorrect size */
  78. qq=malloc(strlen(nname)+100);
  79. if (!qq)
  80. {
  81. unlink(tname);
  82. perror(tname);
  83. exit(77);
  84. }
  85. sprintf(qq, "%s,S=%ld", nname, ss-s);
  86. free(nname);
  87. nname=qq;
  88. if (*q)
  89. {
  90. if (maildir_checkquota(dir, &quotafd, q, ss-s, 1)
  91. && errno != EAGAIN)
  92. {
  93. if (quotafd >= 0) close(quotafd);
  94. unlink(tname);
  95. printf("Mail quota exceeded.n");
  96. exit(77);
  97. }
  98. maildir_addquota(dir, quotafd, q, ss-s, 1);
  99. if (quotafd >= 0) close(quotafd);
  100. }
  101. }
  102. if (rename(tname, nname))
  103. {
  104. unlink(tname);
  105. perror(tname);
  106. exit(77);
  107. }
  108. return (ss);
  109. }
  110. int main(int argc, char **argv)
  111. {
  112. const char *dir;
  113. const char *q;
  114. struct stat stat_buf;
  115. int quotafd;
  116. if (argc < 3)
  117. {
  118. fprintf(stderr, "Usage: %s maildir quotan", argv[0]);
  119. exit(73);
  120. }
  121. dir=argv[1];
  122. q=argv[2];
  123. if (fstat(0, &stat_buf) == 0 && S_ISREG(stat_buf.st_mode) &&
  124. stat_buf.st_size > 0 && *q)
  125. {
  126. if (maildir_checkquota(dir, &quotafd, q, stat_buf.st_size, 1)
  127. && errno != EAGAIN)
  128. {
  129. if (quotafd >= 0) close(quotafd);
  130. printf("Mail quota exceeded.n");
  131. exit(77);
  132. }
  133. maildir_addquota(dir, quotafd, q, stat_buf.st_size, 1);
  134. if (quotafd >= 0)       close(quotafd);
  135. deliver(dir, q, stat_buf.st_size);
  136. exit(0);
  137. }
  138. deliver(dir, q, 0);
  139. exit(0);
  140. }