Annotation of researchv10no/cmd/nupas/smtp/to822.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <ctype.h>
                      3: #include <regexp.h>
                      4: #include "mail.h"
                      5: #include "string.h"
                      6: #include "header.h"
                      7: #include "aux.h"
                      8: #include "addrformat.h"
                      9: 
                     10: /* imports */
                     11: header hdrs[] = {
                     12:        HEADER("Date:"),
                     13:        HEADER("From:"),
                     14:        HEADER("To:"),
                     15:        HEADER("")
                     16: };
                     17: #define datehdr hdrs[0]
                     18: #define fromhdr hdrs[1]
                     19: #define tohdr hdrs[2]
                     20: 
                     21: /* imported */
                     22: extern int getheader();
                     23: extern int printheaders();
                     24: extern void printbodies();
                     25: extern char *fgets();
                     26: extern string *getaddr();
                     27: extern int cistrncmp();
                     28: extern void exit();
                     29: extern int debug;
                     30: 
                     31: /* predeclared */
                     32: static char *convertdate();
                     33: extern char *convertaddr();
                     34: static int indomain();
                     35: 
                     36: /* exported */
                     37: int extrafrom = 0;
                     38: 
                     39: extern int
                     40: to822(fputsp, in, out, sender, domain, rcvr)
                     41:        int (*fputsp)();
                     42:        FILE *in, *out;         /* file to output to */
                     43:        char *sender;           /* name of sender (already in 822 format) */
                     44:        char *domain;
                     45:        char *rcvr;
                     46: {
                     47:        string *buf=s_new();
                     48:        string *from=s_new();
                     49:        string *date=s_new();
                     50:        string *remfrom=s_new();
                     51:        string *faddr;
                     52:        static regexp *pp=NULL;
                     53:        int originalfrom=0;
                     54:        regsubexp subexp[10];
                     55:        char xbuf[4096];
                     56:        int n;
                     57:        char *cp;
                     58: 
                     59:        /* get UNIX from line */
                     60:        if(fgets(xbuf, sizeof xbuf, in)==NULL) {
                     61:                fprintf(stderr, "to822: empty file.\n");
                     62:                return -1;
                     63:        }
                     64: 
                     65:        /* first line had better be a from */
                     66:        if (pp==NULL)
                     67:                pp = regcomp(REMFROMRE);
                     68:        if (regexec(pp, xbuf, subexp, 10)) {
                     69:                append_match(subexp, from, REMSENDERMATCH);
                     70:                append_match(subexp, date, REMDATEMATCH);
                     71:                append_match(subexp, remfrom, REMSYSMATCH);
                     72:        } else {
                     73:                fprintf(stderr, "to822: From_ line missing or malformed.\n");
                     74:                return -1;
                     75:        }
                     76: 
                     77:        /* get any pre-existing RFC822 header lines */
                     78:        if(getheader(fgets, in)<0){
                     79:                fprintf(stderr, "to822: error reading input.\n");
                     80:                return -1;
                     81:        }
                     82: 
                     83:        /*
                     84:         *  Output new message.  If there is an original From: line with
                     85:         *  an address in the requested domain, leave it alone.  Otherwise
                     86:         *  generate a From: line and turn any existing one into
                     87:         *  Original-From:
                     88:         */
                     89:        if (fromhdr.line != NULL) {
                     90:                faddr = getaddr(HCONTENT(fromhdr));
                     91:                if(domain!=NULL && !indomain(s_to_c(faddr), domain)){
                     92:                        sprintf(xbuf, "%s %s\n", fromhdr.name, sender);
                     93:                        (*fputsp)(xbuf, out);
                     94:                        originalfrom = 1;
                     95:                }
                     96:        } else {
                     97:                sprintf(xbuf, "%s %s\n", fromhdr.name, sender);
                     98:                (*fputsp)(xbuf, out);
                     99:        }
                    100:        if (datehdr.line == NULL){
                    101:                sprintf(xbuf, "%s %s\n", datehdr.name, convertdate((s_to_c(date))));
                    102:                (*fputsp)(xbuf, out);
                    103:        }
                    104:        if (tohdr.line == NULL && rcvr != NULL){
                    105:                sprintf(xbuf, "%s %s\n", tohdr.name, rcvr);
                    106:                (*fputsp)(xbuf, out);
                    107:        }
                    108:                
                    109:        printheaders(fputsp, out, originalfrom);
                    110:        (*fputsp)("\n", out);
                    111:        printbodies(fputsp, out);
                    112:        n = 0;
                    113:        while (fgets(xbuf, sizeof(xbuf), in)!=NULL) {
                    114:                (*fputsp)(xbuf, out);
                    115:                n += strlen(xbuf)+1;
                    116:                if (n>1024) {
                    117:                        if (debug)
                    118:                                fprintf(stderr, ".");
                    119:                        n -= 1024;
                    120:                        setalarm(5 * 60, "sending mail data");
                    121:                }
                    122:        }
                    123:        s_free(from);
                    124:        s_free(date);
                    125: 
                    126:        if(ferror(in))
                    127:                return -1;
                    128: 
                    129:        return 0;
                    130: }
                    131: 
                    132: /* juggle date fields
                    133:        Unix ctime: Mon Oct 19 19:47:25 EDT 1987
                    134:        822 standard: [Mon, ] 19 Oct 87 19:47:25 EDT
                    135:                (sometimes the , is omitted; sometimes (Mon) at end)
                    136:  */
                    137: static char *
                    138: convertdate(date)
                    139: char *date;
                    140: {
                    141:        static string *ndate=NULL;
                    142:        char *field[6];
                    143:        char *sp;
                    144:        int i;
                    145: 
                    146:        sp = date;
                    147:        /* parse the date into fields */
                    148:        for (i = 0; i < 6; i++) {               
                    149:                while (isspace(*sp) || *sp == ',' || *sp == '-')
                    150:                        *sp++ = '\0';
                    151:                field[i] = sp;
                    152:                while (!isspace(*sp) && *sp != ',' && *sp != '-' && *sp != '\0')
                    153:                        sp++;
                    154:        }
                    155:        *sp = '\0';
                    156:        if (strlen(field[5])==4)
                    157:                field[5] += 2;
                    158: 
                    159:        /* shuffle the fields into internet format */
                    160:        if (ndate==NULL)
                    161:                ndate = s_new();
                    162:        s_restart(ndate);
                    163:        s_append(ndate, field[0]);
                    164:        s_append(ndate, ", ");
                    165:        s_append(ndate, field[2]);
                    166:        s_append(ndate, " ");
                    167:        s_append(ndate, field[1]);
                    168:        s_append(ndate, " ");
                    169:        s_append(ndate, field[5]);
                    170:        s_append(ndate, " ");
                    171:        s_append(ndate, field[3]);
                    172:        s_append(ndate, " ");
                    173:        s_append(ndate, field[4]);
                    174:        return s_to_c(ndate);
                    175: }
                    176: 
                    177: /*
                    178:  *  return true if addr belongs to domain
                    179:  */
                    180: static int
                    181: indomain(addr, domain)
                    182:        char *addr;
                    183:        char *domain;
                    184: {
                    185:        int n, m;
                    186:        int punct;
                    187: 
                    188:        n = strlen(domain);
                    189:        m = strlen(addr);
                    190:        if(m<n)
                    191:                return 0;
                    192:        punct = *(addr+m-n);
                    193:        if(punct!='@' && punct!='.')
                    194:                return 0;
                    195:        return(cistrncmp(addr+m-n+1, domain+1, n-1)==0);
                    196: }

unix.superglobalmegacorp.com

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