Annotation of researchv8dc/cmd/upas/rfc822/to822.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <ctype.h>
                      3: #include "mail.h"
                      4: #include "header.h"
                      5: #include "string.h"
                      6: 
                      7: /* imports */
                      8: header hdrs[] = {
                      9:        HEADER("Date:"),
                     10:        HEADER("From:"),
                     11:        HEADER("To:"),
                     12:        HEADER("Received:"),
                     13:        HEADER("Message-Id:"),
                     14:        HEADER("Status:"),
                     15:        HEADER("")
                     16: };
                     17: #define datehdr hdrs[0]
                     18: #define fromhdr hdrs[1]
                     19: #define tohdr hdrs[2]
                     20: #define receivedhdr hdrs[3]
                     21: #define idhdr hdrs[4]
                     22: #define statushdr hdrs[5]
                     23: 
                     24: /* imported */
                     25: extern void getheader();
                     26: extern void printheaders();
                     27: extern void addheader();
                     28: extern char *fgets();
                     29: extern int getunix();
                     30: extern void initgetunix();
                     31: 
                     32: /* predeclared */
                     33: char *gets();
                     34: static char *convertdate();
                     35: extern char *convertaddr();
                     36: 
                     37: extern void
                     38: to822(fp, hostname)
                     39: FILE *fp;              /* file to output to */
                     40: char *hostname;                /* name of our host */
                     41: {
                     42:        char buf[FROMLINESIZE];
                     43:        char from[FROMLINESIZE];
                     44:        char date[DATESIZE];
                     45: 
                     46:        /* get UNIX from line */
                     47:        if (fgets(buf, sizeof buf, stdin) == NULL)
                     48:                exit(1);
                     49: 
                     50:        /* first line had better be a from */
                     51:        if (getunix(buf, from, date) == 0)
                     52:                exit(1);
                     53: 
                     54:        /* get any pre-existing RFC822 header lines */
                     55:        getheader();
                     56: 
                     57:        /* output new message */
                     58:        fprintf(fp, "%s %s.%s\n", fromhdr.name, convertaddr(from), hostname);
                     59:        fprintf(fp, "%s %s\n\n", datehdr.name, convertdate(date));
                     60:        printheaders(fp);
                     61:        while (gets(buf) != NULL)
                     62:                fprintf(fp, "%s\n", buf);
                     63: }
                     64: 
                     65: /* juggle date fields */
                     66: static char *
                     67: convertdate(date)
                     68: char *date;
                     69: {
                     70:        static char ndate[DATESIZE];
                     71:        char *field[6];
                     72:        char *sp;
                     73:        int i;
                     74: 
                     75:        sp = date;
                     76:        /* parse the date into fields */
                     77:        for (i = 0; i < 6; i++) {               
                     78:                while (isspace(*sp) || *sp == ',' || *sp == '-')
                     79:                        *sp++ = '\0';
                     80:                field[i] = sp;
                     81:                while (!isspace(*sp) && *sp != ',' && *sp != '-' && *sp != '\0')
                     82:                        sp++;
                     83:        }
                     84:        *sp = '\0';
                     85: 
                     86:        /* shuffle the fields into internet format */
                     87:        sprintf (ndate, "%s, %s %s %s %s %s", field[0], field[2], field[1],
                     88:                 field[4], field[5], field[3]);
                     89:        return ndate;
                     90: }
                     91: 
                     92: /*
                     93:  *     Convert from `bang' to `rfc822' format.
                     94:  */
                     95: extern char *
                     96: convertaddr(addr)
                     97: char *addr;
                     98: {
                     99:        static char buf[FROMLINESIZE];
                    100:        register int i=0;
                    101:        register char *sp;
                    102:        char *field[128];
                    103: 
                    104:        sp = field[i] = addr;
                    105:        while (*sp) {
                    106:                if (*sp == '!') {
                    107:                        *sp = '\0';
                    108:                        if (strcmp(field[i], "uucp") == 0) {
                    109:                                /* the token 'uucp' stops the parsing */
                    110:                                field[i] = ++sp;
                    111:                                break;
                    112:                        }
                    113:                        field[++i] = ++sp;
                    114:                } else
                    115:                        ++sp;
                    116:        }
                    117:        strcpy(buf, field[i--]);
                    118:        if (i >= 0) {
                    119:                strcat(buf, "@");
                    120:                strcat(buf, field[i--]);
                    121:        }
                    122:        while (i >= 0) {
                    123:                strcat(buf, ".");
                    124:                strcat(buf, field[i--]);
                    125:        }
                    126:                
                    127:        return buf;
                    128: }

unix.superglobalmegacorp.com

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