Annotation of 42BSD/bin/rmail.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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