|
|
1.1 root 1: /*
2: * WARNING! the mail log does not get locked.
3: *
4: * Vismon users beware!
5: */
6: #include "mail.h"
7: #include "string.h"
8: #include "message.h"
9: #include "aux.h"
10: #include "dest.h"
11: #include <sys/stat.h>
12:
13: /* configuration */
14: #define LOGFILE "mail.log"
15:
16: /* imports */
17: extern struct tm *localtime();
18: extern char *asctime();
19: extern long time();
20:
21: /* open log file for appending */
22: static int
23: logopen()
24: {
25: int out;
26: string *file=s_new();
27: long lseek();
28:
29: umask(0);
30: abspath(LOGFILE, MAILROOT, file);
31: out = open(s_to_c(file), 2);
32: if(out<0)
33: out = creat(s_to_c(file), 0666);
34: s_free(file);
35: return out;
36: }
37:
38: /* log mail delivery */
39: logdelivery(list, rcvr, mp)
40: dest *list; /* receiver(s) */
41: char *rcvr; /* mailbox */
42: message *mp; /* message */
43: {
44: dest *next;
45: int out;
46: char buf[2048];
47: dest *parent;
48: char *dp;
49: struct tm *bp;
50: long thetime;
51:
52: out = logopen();
53:
54: thetime = time((long *)0);
55: bp = localtime(&thetime);
56: dp = asctime(bp);
57:
58: for(parent=list; parent->parent!=NULL; parent=parent->parent)
59: ;
60: if(parent!=list && strcmp(s_to_c(parent->addr), rcvr)!=0)
61: sprintf(buf,"delivered %s From %.256s %.256s (%.256s) [%.5s] %d\n",
62: rcvr,
63: s_to_c(mp->sender), s_to_c(mp->date),
64: s_to_c(parent->addr), dp+11, mp->size);
65: else
66: sprintf(buf, "delivered %s From %.256s %.256s [%.5s] %d\n", rcvr,
67: s_to_c(mp->sender), s_to_c(mp->date), dp+11, mp->size);
68: lseek(out, 0L, 2);
69: write(out, buf, strlen(buf));
70:
71: close(out);
72: }
73:
74: /* log mail forwarding */
75: loglist(list, mp, tag)
76: dest *list; /* receiver(s) */
77: message *mp; /* message */
78: char *tag; /* type of mail */
79: {
80: dest *next;
81: int out;
82: char buf[2048];
83: dest *parent;
84: char *dp;
85: struct tm *bp;
86: long thetime;
87:
88: out = logopen();
89:
90: thetime = time((long *)0);
91: bp = localtime(&thetime);
92: dp = asctime(bp);
93:
94: for(next=d_rm(&list); next != NULL; next = d_rm(&list)) {
95: for(parent=next; parent->parent!=NULL; parent=parent->parent)
96: ;
97: if(parent!=next)
98: sprintf(buf, "%s %.256s From %.256s %.256s (%.256s) [%.5s] %d\n",
99: tag,
100: s_to_c(next->addr), s_to_c(mp->sender),
101: s_to_c(mp->date), s_to_c(parent->addr), dp+11,
102: mp->size);
103: else
104: sprintf(buf, "%s %.256s From %.256s %.256s [%.5s] %d\n", tag,
105: s_to_c(next->addr), s_to_c(mp->sender),
106: s_to_c(mp->date), dp+11, mp->size);
107: lseek(out, 0L, 2);
108: write(out, buf, strlen(buf));
109: }
110: close(out);
111: }
112:
113: /* log a mail refusal */
114: logrefusal(dp, mp, msg)
115: dest *dp; /* receiver */
116: message *mp; /* message */
117: char *msg; /* error message */
118: {
119: int out;
120: char buf[2048];
121: char *cp, *ep;
122:
123: out = logopen();
124: sprintf(buf, "error %.256s From %.256s %.256s\nerror+ ", s_to_c(dp->addr),
125: s_to_c(mp->sender), s_to_c(mp->date));
126: cp = buf + strlen(buf);
127: ep = buf + sizeof(buf) - sizeof("error + ");
128: while(*msg && cp<ep) {
129: *cp++ = *msg;
130: if (*msg++ == '\n') {
131: strcpy(cp, "error+ ");
132: cp += sizeof("error+ ") - 1;
133: }
134: }
135: *cp++ = '\n';
136: lseek(out, 0L, 2);
137: write(out, buf, cp - buf);
138: close(out);
139: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.