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

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)rmail.c    4.8 (Berkeley) 5/15/86";
                      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[1024];        /* one line of the message */
                     34:        char from[512];         /* accumulated path of sender */
                     35:        char ufrom[512];        /* user on remote system */
                     36:        char sys[512];          /* a system in path */
                     37:        char junk[1024];        /* scratchpad */
                     38:        char cmd[2000];
                     39:        register char *cp;
                     40:        register char *uf = ufrom;      /* 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:                for (;;)
                     69:                {
                     70:                        cp = index(cp+1, 'r');
                     71:                        if (cp == NULL)
                     72:                        {
                     73:                                register char *p = rindex(uf, '!');
                     74: 
                     75:                                if (p != NULL)
                     76:                                {
                     77:                                        *p = '\0';
                     78:                                        (void) strcpy(sys, uf);
                     79:                                        uf = p + 1;
                     80:                                        break;
                     81:                                }
                     82:                                cp = "remote from somewhere";
                     83:                        }
                     84: #ifdef DEBUG
                     85:                        if (Debug)
                     86:                                printf("cp='%s'\n", cp);
                     87: #endif
                     88:                        if (strncmp(cp, "remote from ", 12)==0)
                     89:                                break;
                     90:                }
                     91:                if (cp != NULL)
                     92:                        (void) sscanf(cp, "remote from %s", sys);
                     93:                (void) strcat(from, sys);
                     94:                (void) strcat(from, "!");
                     95: #ifdef DEBUG
                     96:                if (Debug)
                     97:                        printf("ufrom='%s', sys='%s', from now '%s'\n", uf, sys, from);
                     98: #endif
                     99:        }
                    100:        (void) strcat(from, uf);
                    101: 
                    102:        (void) sprintf(cmd, "%s -ee -f%s -i", MAILER, from);
                    103:        while (*++argv != NULL)
                    104:        {
                    105:                (void) strcat(cmd, " '");
                    106:                if (**argv == '(')
                    107:                        (void) strncat(cmd, *argv + 1, strlen(*argv) - 2);
                    108:                else
                    109:                        (void) strcat(cmd, *argv);
                    110:                (void) strcat(cmd, "'");
                    111:        }
                    112: #ifdef DEBUG
                    113:        if (Debug)
                    114:                printf("cmd='%s'\n", cmd);
                    115: #endif
                    116:        out = popen(cmd, "w");
                    117:        fputs(lbuf, out);
                    118:        while (fgets(lbuf, sizeof lbuf, stdin))
                    119:                fputs(lbuf, out);
                    120:        i = pclose(out);
                    121:        if ((i & 0377) != 0)
                    122:        {
                    123:                fprintf(stderr, "pclose: status 0%o\n", i);
                    124:                exit(EX_OSERR);
                    125:        }
                    126: 
                    127:        exit((i >> 8) & 0377);
                    128: }

unix.superglobalmegacorp.com

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