deliver.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include "sys.h"
  2. #include "dat.h"
  3. void
  4. usage(void)
  5. {
  6. fprint(2, "usage: %s recipient fromaddr-file mbox\n", argv0);
  7. exits("usage");
  8. }
  9. void
  10. main(int argc, char **argv)
  11. {
  12. int fd;
  13. char now[30];
  14. char buf[1024];
  15. int n, bytes;
  16. Addr *a;
  17. char *deliveredto;
  18. char last;
  19. char *str;
  20. Mlock *l;
  21. ARGBEGIN{
  22. }ARGEND;
  23. if(argc != 3)
  24. usage();
  25. deliveredto = strrchr(argv[0], '!');
  26. if(deliveredto == nil)
  27. deliveredto = argv[0];
  28. else
  29. deliveredto++;
  30. a = readaddrs(argv[1], nil);
  31. if(a == nil)
  32. sysfatal("missing from address");
  33. l = syslock(argv[2]);
  34. if(l == 0)
  35. sysfatal("can't grab lock");
  36. /* append to mbox */
  37. fd = open(argv[2], OWRITE);
  38. if(fd < 0)
  39. sysfatal("opening mailbox: %r");
  40. seek(fd, 0, 2);
  41. strncpy(now, ctime(time(0)), sizeof(now));
  42. now[28] = 0;
  43. if(fprint(fd, "From %s %s\n", a->val, now) < 0)
  44. sysfatal("writing mailbox: %r");
  45. last = 0;
  46. for(bytes = 0;; bytes += n){
  47. n = read(0, buf, sizeof buf);
  48. if(n < 0)
  49. sysfatal("writing mailbox: %r");
  50. if(n == 0)
  51. break;
  52. if(write(fd, buf, n) != n)
  53. sysfatal("writing mailbox: %r");
  54. last = buf[n-1];
  55. }
  56. /* a blank line must follow every message */
  57. if(last == '\n')
  58. str = "\n";
  59. else
  60. str ="\n\n";
  61. if(write(fd, str, strlen(str)) < 0)
  62. sysfatal("writing mailbox: %r");
  63. close(fd);
  64. sysunlock(l);
  65. /* log it */
  66. syslog(0, "mail", "delivered %s From %s %s (%s) %d", deliveredto,
  67. a->val, now, argv[0], bytes);
  68. exits(0);
  69. }