|
|
researchv10 Norman
/*
* WARNING! the mail log does not get locked.
*
* Vismon users beware!
*/
#include "mail.h"
#include "string.h"
#include "message.h"
#include "aux.h"
#include "dest.h"
#include <sys/stat.h>
/* configuration */
#define LOGFILE "mail.log"
/* imports */
extern struct tm *localtime();
extern char *asctime();
extern long time();
/* open log file for appending */
static int
logopen()
{
int out;
string *file=s_new();
long lseek();
umask(0);
abspath(LOGFILE, MAILROOT, file);
out = open(s_to_c(file), 2);
if(out<0)
out = creat(s_to_c(file), 0666);
s_free(file);
return out;
}
/* log mail delivery */
logdelivery(list, rcvr, mp)
dest *list; /* receiver(s) */
char *rcvr; /* mailbox */
message *mp; /* message */
{
dest *next;
int out;
char buf[2048];
dest *parent;
char *dp;
struct tm *bp;
long thetime;
out = logopen();
thetime = time((long *)0);
bp = localtime(&thetime);
dp = asctime(bp);
for(parent=list; parent->parent!=NULL; parent=parent->parent)
;
if(parent!=list && strcmp(s_to_c(parent->addr), rcvr)!=0)
sprintf(buf,"delivered %s From %.256s %.256s (%.256s) [%.5s] %d\n",
rcvr,
s_to_c(mp->sender), s_to_c(mp->date),
s_to_c(parent->addr), dp+11, mp->size);
else
sprintf(buf, "delivered %s From %.256s %.256s [%.5s] %d\n", rcvr,
s_to_c(mp->sender), s_to_c(mp->date), dp+11, mp->size);
lseek(out, 0L, 2);
write(out, buf, strlen(buf));
close(out);
}
/* log mail forwarding */
loglist(list, mp, tag)
dest *list; /* receiver(s) */
message *mp; /* message */
char *tag; /* type of mail */
{
dest *next;
int out;
char buf[2048];
dest *parent;
char *dp;
struct tm *bp;
long thetime;
out = logopen();
thetime = time((long *)0);
bp = localtime(&thetime);
dp = asctime(bp);
for(next=d_rm(&list); next != NULL; next = d_rm(&list)) {
for(parent=next; parent->parent!=NULL; parent=parent->parent)
;
if(parent!=next)
sprintf(buf, "%s %.256s From %.256s %.256s (%.256s) [%.5s] %d\n",
tag,
s_to_c(next->addr), s_to_c(mp->sender),
s_to_c(mp->date), s_to_c(parent->addr), dp+11,
mp->size);
else
sprintf(buf, "%s %.256s From %.256s %.256s [%.5s] %d\n", tag,
s_to_c(next->addr), s_to_c(mp->sender),
s_to_c(mp->date), dp+11, mp->size);
lseek(out, 0L, 2);
write(out, buf, strlen(buf));
}
close(out);
}
/* log a mail refusal */
logrefusal(dp, mp, msg)
dest *dp; /* receiver */
message *mp; /* message */
char *msg; /* error message */
{
int out;
char buf[2048];
char *cp, *ep;
out = logopen();
sprintf(buf, "error %.256s From %.256s %.256s\nerror+ ", s_to_c(dp->addr),
s_to_c(mp->sender), s_to_c(mp->date));
cp = buf + strlen(buf);
ep = buf + sizeof(buf) - sizeof("error + ");
while(*msg && cp<ep) {
*cp++ = *msg;
if (*msg++ == '\n') {
strcpy(cp, "error+ ");
cp += sizeof("error+ ") - 1;
}
}
*cp++ = '\n';
lseek(out, 0L, 2);
write(out, buf, cp - buf);
close(out);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.