cat_mail.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include "common.h"
  2. #include "send.h"
  3. /* dispose of local addresses */
  4. int
  5. cat_mail(dest *dp, message *mp)
  6. {
  7. Biobuf *fp;
  8. char *rcvr, *cp;
  9. Mlock *l;
  10. String *tmp, *s;
  11. int i, n;
  12. s = unescapespecial(s_clone(dp->repl1));
  13. if (nflg) {
  14. if(!xflg)
  15. print("cat >> %s\n", s_to_c(s));
  16. else
  17. print("%s\n", s_to_c(dp->addr));
  18. s_free(s);
  19. return 0;
  20. }
  21. for(i = 0;; i++){
  22. l = syslock(s_to_c(s));
  23. if(l == 0)
  24. return refuse(dp, mp, "can't lock mail file", 0, 0);
  25. fp = sysopen(s_to_c(s), "al", MBOXMODE);
  26. if(fp)
  27. break;
  28. tmp = s_append(0, s_to_c(s));
  29. s_append(tmp, ".tmp");
  30. fp = sysopen(s_to_c(tmp), "al", MBOXMODE);
  31. if(fp){
  32. syslog(0, "mail", "error: used %s", s_to_c(tmp));
  33. s_free(tmp);
  34. break;
  35. }
  36. s_free(tmp);
  37. sysunlock(l);
  38. if(i >= 5)
  39. return refuse(dp, mp, "mail file cannot be opened", 0, 0);
  40. sleep(1000);
  41. }
  42. s_free(s);
  43. n = m_print(mp, fp, (char *)0, 1);
  44. if (Bprint(fp, "\n") < 0 || Bflush(fp) < 0 || n < 0){
  45. sysclose(fp);
  46. sysunlock(l);
  47. return refuse(dp, mp, "error writing mail file", 0, 0);
  48. }
  49. sysclose(fp);
  50. sysunlock(l);
  51. rcvr = s_to_c(dp->addr);
  52. if(cp = strrchr(rcvr, '!'))
  53. rcvr = cp+1;
  54. logdelivery(dp, rcvr, mp);
  55. return 0;
  56. }