Annotation of researchv10no/cmd/upas/send/log.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.