Annotation of 43BSD/usr.lib/sendmail/aux/rmail.c, revision 1.1.1.1

1.1       root        1: /*
                      2: **  Sendmail
                      3: **  Copyright (c) 1983  Eric P. Allman
                      4: **  Berkeley, California
                      5: **
                      6: **  Copyright (c) 1983 Regents of the University of California.
                      7: **  All rights reserved.  The Berkeley software License Agreement
                      8: **  specifies the terms and conditions for redistribution.
                      9: */
                     10: 
                     11: #ifndef lint
                     12: char copyright[] =
                     13: "@(#) Copyright (c) 1980 Regents of the University of California.\n\
                     14:  All rights reserved.\n";
                     15: #endif not lint
                     16: 
                     17: #ifndef lint
                     18: static char    SccsId[] = "@(#)rmail.c 5.1 (Berkeley) 6/7/85";
                     19: #endif not lint
                     20: 
                     21: /*
                     22: **  RMAIL -- UUCP mail server.
                     23: **
                     24: **     This program reads the >From ... remote from ... lines that
                     25: **     UUCP is so fond of and turns them into something reasonable.
                     26: **     It calls sendmail giving it a -f option built from these
                     27: **     lines.
                     28: */
                     29: 
                     30: # include <stdio.h>
                     31: # include <sysexits.h>
                     32: 
                     33: typedef char   bool;
                     34: #define TRUE   1
                     35: #define FALSE  0
                     36: 
                     37: extern FILE    *popen();
                     38: extern char    *index();
                     39: extern char    *rindex();
                     40: 
                     41: bool   Debug;
                     42: 
                     43: # define MAILER        "/usr/lib/sendmail"
                     44: 
                     45: main(argc, argv)
                     46:        char **argv;
                     47: {
                     48:        FILE *out;      /* output to sendmail */
                     49:        char lbuf[512]; /* one line of the message */
                     50:        char from[512]; /* accumulated path of sender */
                     51:        char ufrom[64]; /* user on remote system */
                     52:        char sys[64];   /* a system in path */
                     53:        char junk[512]; /* scratchpad */
                     54:        char cmd[2000];
                     55:        register char *cp;
                     56:        register char *uf;      /* ptr into ufrom */
                     57:        int i;
                     58: 
                     59: # ifdef DEBUG
                     60:        if (argc > 1 && strcmp(argv[1], "-T") == 0)
                     61:        {
                     62:                Debug = TRUE;
                     63:                argc--;
                     64:                argv++;
                     65:        }
                     66: # endif DEBUG
                     67: 
                     68:        if (argc < 2)
                     69:        {
                     70:                fprintf(stderr, "Usage: rmail user ...\n");
                     71:                exit(EX_USAGE);
                     72:        }
                     73: 
                     74:        (void) strcpy(from, "");
                     75:        (void) strcpy(ufrom, "/dev/null");
                     76: 
                     77:        for (;;)
                     78:        {
                     79:                (void) fgets(lbuf, sizeof lbuf, stdin);
                     80:                if (strncmp(lbuf, "From ", 5) != 0 && strncmp(lbuf, ">From ", 6) != 0)
                     81:                        break;
                     82:                (void) sscanf(lbuf, "%s %s", junk, ufrom);
                     83:                cp = lbuf;
                     84:                uf = ufrom;
                     85:                for (;;)
                     86:                {
                     87:                        cp = index(cp+1, 'r');
                     88:                        if (cp == NULL)
                     89:                        {
                     90:                                register char *p = rindex(uf, '!');
                     91: 
                     92:                                if (p != NULL)
                     93:                                {
                     94:                                        *p = '\0';
                     95:                                        (void) strcpy(sys, uf);
                     96:                                        uf = p + 1;
                     97:                                        break;
                     98:                                }
                     99:                                cp = "remote from somewhere";
                    100:                        }
                    101: #ifdef DEBUG
                    102:                        if (Debug)
                    103:                                printf("cp='%s'\n", cp);
                    104: #endif
                    105:                        if (strncmp(cp, "remote from ", 12)==0)
                    106:                                break;
                    107:                }
                    108:                if (cp != NULL)
                    109:                        (void) sscanf(cp, "remote from %s", sys);
                    110:                (void) strcat(from, sys);
                    111:                (void) strcat(from, "!");
                    112: #ifdef DEBUG
                    113:                if (Debug)
                    114:                        printf("ufrom='%s', sys='%s', from now '%s'\n", uf, sys, from);
                    115: #endif
                    116:        }
                    117:        (void) strcat(from, uf);
                    118: 
                    119:        (void) sprintf(cmd, "%s -ee -f%s", MAILER, from);
                    120:        while (*++argv != NULL)
                    121:        {
                    122:                (void) strcat(cmd, " '");
                    123:                if (**argv == '(')
                    124:                        (void) strncat(cmd, *argv + 1, strlen(*argv) - 2);
                    125:                else
                    126:                        (void) strcat(cmd, *argv);
                    127:                (void) strcat(cmd, "'");
                    128:        }
                    129: #ifdef DEBUG
                    130:        if (Debug)
                    131:                printf("cmd='%s'\n", cmd);
                    132: #endif
                    133:        out = popen(cmd, "w");
                    134:        fputs(lbuf, out);
                    135:        while (fgets(lbuf, sizeof lbuf, stdin))
                    136:                fputs(lbuf, out);
                    137:        i = pclose(out);
                    138:        if ((i & 0377) != 0)
                    139:        {
                    140:                fprintf(stderr, "pclose: status 0%o\n", i);
                    141:                exit(EX_OSERR);
                    142:        }
                    143: 
                    144:        exit((i >> 8) & 0377);
                    145: }

unix.superglobalmegacorp.com

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