Annotation of researchv10no/cmd/upas/smtp/smtpqer.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * smtpqer -- put mail (on stdin) in an smtpq subdirectory, with a shell script
                      3:  *            to send it via smtp
                      4:  */
                      5: 
                      6: #define USAGE "usage: smtpqer [-n] [-H  helohost] [-d domain] [-K] [-a toaddr] [-u] from tohost to...\n"
                      7: #define DIRDOMLEVEL 2
                      8: #define SPOOLNAMSIZ 12 /* keep spool dir names no longer (12 allows L.name on v9) */
                      9: #include <stdio.h>
                     10: #include <signal.h>
                     11: #include "string.h"
                     12: #include "mail.h"
                     13: #include <ctype.h>
                     14: #include <sys/stat.h>
                     15: 
                     16: /* globals */
                     17: char datafile[1024];
                     18: int debug = 0;
                     19: 
                     20: void bomb();
                     21: 
                     22: /* imports (other than in .h's) */
                     23: extern spoolsubdir[];
                     24: extern void exit(), cleanlocks();
                     25: extern FILE* lockopen();
                     26: extern char *sysname_read();
                     27: 
                     28: /* interrupt handling */
                     29: SIGRETURN
                     30: catchhup(s)
                     31:        int s;
                     32: {
                     33:        bomb("interrupted: HUP\n");
                     34: }
                     35: 
                     36: /* interrupt handling */
                     37: SIGRETURN
                     38: catchint(s)
                     39:        int s;
                     40: {
                     41:        bomb("interrupted: INT\n");
                     42: }
                     43: 
                     44: main(argc, argv)
                     45: int argc;
                     46: char *argv[];
                     47: {
                     48:        register int c;
                     49:        int errflg=0;
                     50:        extern int optind;
                     51:        extern char *optarg;
                     52:        char *p;
                     53:        char *prefix;
                     54:        char *domain=0;
                     55:        char *sys=0;
                     56:        int unixformat=0;
                     57:        int gateway=0;
                     58:        int helo=0;
                     59:        int norun=0;
                     60:        char *helohost=0;
                     61:        char *gatehost=0;
                     62:        char *toaddr=0;
                     63:        char *from=0;
                     64:        char *host=0;
                     65:        char *spooldir;
                     66:        string *to=s_new();
                     67: 
                     68:        umask(2);
                     69: 
                     70:        signal(SIGHUP, SIG_IGN);
                     71:        signal(SIGINT, catchint);
                     72:        while ((c=getopt(argc, argv, "H:d:ua:nD")) != EOF)
                     73:                switch(c) {
                     74:                case 'H':       helohost=optarg;        break;
                     75:                case 'd':       domain=optarg;          break;
                     76:                case 'u':       unixformat++;           break;
                     77:                case 'a':       toaddr=optarg;          break;
                     78:                case 'n':       norun++;                break;
                     79:                case 'D':       debug++;                break;
                     80:                case '?':
                     81:                default:
                     82:                                errflg++;               break;
                     83:                }
                     84:        if (errflg || (argc - optind) < 3)
                     85:                bomb(USAGE);
                     86:        if(*argv[optind]==0 || *argv[optind+1]==0 || *argv[optind+2]==0)
                     87:                bomb(USAGE);
                     88:        if (helohost==NULL)
                     89:                helohost=s_to_c(s_copy(sysname_read()));
                     90: 
                     91:        from=argv[optind++];
                     92:        host=argv[optind++];
                     93:        for (; optind < argc; optind++){
                     94:                s_append(to, argv[optind]);
                     95:                s_append(to, " ");
                     96:        }
                     97: 
                     98:        /*
                     99:         *  make spool files:
                    100:         *      C.xxxxxxxxxxxx  - the control file
                    101:         *      D.xxxxxxxxxxxx  - the data file
                    102:         */
                    103:        if(gotodir(host)<0)
                    104:                bomb("going to spool directory %s\n", spoolsubdir);
                    105:        makedata(from, domain, s_to_c(to));
                    106:        makectl(unixformat, helohost, domain, from, toaddr, host, s_to_c(to));
                    107: 
                    108:        /*
                    109:         *  run the queue for the receiver
                    110:         */
                    111:        if(!norun)
                    112:                smtpsched("Qsmtpsched", spoolsubdir);
                    113: 
                    114:        exit(0);
                    115: }
                    116: 
                    117: /*
                    118:  *  the data file is pre-converted to rfc822
                    119:  */
                    120: makedata(from, domain, to)
                    121:        char *from;
                    122:        char *domain;
                    123:        char *to;
                    124: {
                    125:        int fd;
                    126:        FILE *fp;
                    127: 
                    128:        /*
                    129:         *  create data file
                    130:         */
                    131:        strcpy(datafile, "D.xxxxxxxxxxxx");
                    132:        fd = mkdatafile(datafile);
                    133:        if(fd<0)
                    134:                bomb("creating spool file\n");
                    135:        fp = fdopen(fd, "w");
                    136: 
                    137:        /*
                    138:         *  copy data
                    139:         */
                    140:        clearerr(fp);
                    141:        clearerr(stdin);
                    142:        copymsg(stdin, fp);
                    143:        fflush(fp);
                    144: 
                    145:        /*
                    146:         *  make sure it worked
                    147:         */
                    148:        if(ferror(fp) || ferror(stdin)){
                    149:                unlink(datafile);
                    150:                bomb("writing data file");
                    151:        }
                    152:        fclose(fp);
                    153: }
                    154: 
                    155: /*
                    156:  *  just copy input to output
                    157:  */
                    158: copymsg(in, out)
                    159:        FILE *in;
                    160:        FILE *out;
                    161: {
                    162:        char buf[4096];
                    163:        int n;
                    164: 
                    165:        while(n=fread(buf, 1, sizeof(buf), in))
                    166:                if(fwrite(buf, 1, n, out)!=n)
                    167:                        bomb("writing data file");
                    168: }
                    169: 
                    170: /*
                    171:  *  Make a control file.  The two lines contain:
                    172:  *     <reply-addr>    <dest>
                    173:  *     -H <hello host> -d <domain> <reply_addr> <dest> <recipients>
                    174:  */
                    175: makectl(unixformat, helo, domain, from, daddr, dest, to)
                    176:        char *from, *dest, *to;
                    177: {
                    178:        string *msg = s_new();
                    179: 
                    180:        s_append(msg, from);
                    181:        s_append(msg, " ");
                    182:        s_append(msg, dest);
                    183:        s_append(msg, "\n");
                    184:        if(unixformat)
                    185:                s_append(msg, "-u ");
                    186:        if(domain){
                    187:                s_append(msg, "-d ");
                    188:                s_append(msg, domain);
                    189:                s_append(msg, " ");
                    190:        }
                    191:        if(daddr){
                    192:                s_append(msg, "-a ");
                    193:                s_append(msg, daddr);
                    194:                s_append(msg, " ");
                    195:        }
                    196:        s_append(msg, "-H ");
                    197:        s_append(msg, helo);
                    198:        s_append(msg, " ");
                    199:        s_append(msg, from);
                    200:        s_append(msg, " ");
                    201:        s_append(msg, dest);
                    202:        s_append(msg, " ");
                    203:        s_append(msg, to);
                    204:        s_append(msg, "\n");
                    205:        if(mkctlfile('C', datafile, s_to_c(msg))<0)
                    206:                bomb("creating control file\n");
                    207: }
                    208: 
                    209: void
                    210: bomb(msg, a1, a2, a3, a4)
                    211:        char *msg;
                    212: {
                    213:        fprintf(stderr, "smtpqer: ");
                    214:        fprintf(stderr, msg, a1, a2, a3, a4);
                    215:        if (datafile[0]!=0)
                    216:                unlink(datafile);
                    217:        exit(1);
                    218: }

unix.superglobalmegacorp.com

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