Annotation of researchv10no/cmd/nupas/smtp/smtpqer.c, revision 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: catcher(s)
        !            31:        int s;
        !            32: {
        !            33:        bomb("interrupted\n");
        !            34: }
        !            35: 
        !            36: main(argc, argv)
        !            37: int argc;
        !            38: char *argv[];
        !            39: {
        !            40:        register int c;
        !            41:        int errflg=0;
        !            42:        extern int optind;
        !            43:        extern char *optarg;
        !            44:        char *p;
        !            45:        char *prefix;
        !            46:        char *domain=0;
        !            47:        char *sys=0;
        !            48:        int unixformat=0;
        !            49:        int gateway=0;
        !            50:        int helo=0;
        !            51:        int norun=0;
        !            52:        char *helohost=0;
        !            53:        char *gatehost=0;
        !            54:        char *toaddr=0;
        !            55:        char *from=0;
        !            56:        char *host=0;
        !            57:        char *spooldir;
        !            58:        string *to=s_new();
        !            59: 
        !            60:        umask(2);
        !            61: 
        !            62:        signal(SIGHUP, catcher);
        !            63:        signal(SIGINT, catcher);
        !            64:        while ((c=getopt(argc, argv, "H:d:ua:nD")) != EOF)
        !            65:                switch(c) {
        !            66:                case 'H':       helohost=optarg;        break;
        !            67:                case 'd':       domain=optarg;          break;
        !            68:                case 'u':       unixformat++;           break;
        !            69:                case 'a':       toaddr=optarg;          break;
        !            70:                case 'n':       norun++;                break;
        !            71:                case 'D':       debug++;                break;
        !            72:                case '?':
        !            73:                default:
        !            74:                                errflg++;               break;
        !            75:                }
        !            76:        if (errflg || (argc - optind) < 3)
        !            77:                bomb(USAGE);
        !            78:        if(*argv[optind]==0 || *argv[optind+1]==0 || *argv[optind+2]==0)
        !            79:                bomb(USAGE);
        !            80:        if (helohost==NULL)
        !            81:                helohost=s_to_c(s_copy(sysname_read()));
        !            82: 
        !            83:        from=argv[optind++];
        !            84:        host=argv[optind++];
        !            85:        for (; optind < argc; optind++){
        !            86:                s_append(to, argv[optind]);
        !            87:                s_append(to, " ");
        !            88:        }
        !            89: 
        !            90:        /*
        !            91:         *  make spool files:
        !            92:         *      C.xxxxxxxxxxxx  - the control file
        !            93:         *      D.xxxxxxxxxxxx  - the data file
        !            94:         */
        !            95:        if(gotodir(host)<0)
        !            96:                bomb("going to spool directory %s\n", spoolsubdir);
        !            97:        makedata(from, domain, s_to_c(to));
        !            98:        makectl(unixformat, helohost, domain, from, toaddr, host, s_to_c(to));
        !            99: 
        !           100:        /*
        !           101:         *  run the queue for the receiver
        !           102:         */
        !           103:        if(!norun)
        !           104:                smtpsched("Qsmtpsched", spoolsubdir);
        !           105: 
        !           106:        exit(0);
        !           107: }
        !           108: 
        !           109: /*
        !           110:  *  the data file is pre-converted to rfc822
        !           111:  */
        !           112: makedata(from, domain, to)
        !           113:        char *from;
        !           114:        char *domain;
        !           115:        char *to;
        !           116: {
        !           117:        int fd;
        !           118:        FILE *fp;
        !           119: 
        !           120:        /*
        !           121:         *  create data file
        !           122:         */
        !           123:        strcpy(datafile, "D.xxxxxxxxxxxx");
        !           124:        fd = mkdatafile(datafile);
        !           125:        if(fd<0)
        !           126:                bomb("creating spool file\n");
        !           127:        fp = fdopen(fd, "w");
        !           128: 
        !           129:        /*
        !           130:         *  copy data
        !           131:         */
        !           132:        clearerr(fp);
        !           133:        clearerr(stdin);
        !           134:        copymsg(stdin, fp);
        !           135:        fflush(fp);
        !           136: 
        !           137:        /*
        !           138:         *  make sure it worked
        !           139:         */
        !           140:        if(ferror(fp) || ferror(stdin)){
        !           141:                unlink(datafile);
        !           142:                bomb("writing data file");
        !           143:        }
        !           144:        fclose(fp);
        !           145: }
        !           146: 
        !           147: /*
        !           148:  *  just copy input to output
        !           149:  */
        !           150: copymsg(in, out)
        !           151:        FILE *in;
        !           152:        FILE *out;
        !           153: {
        !           154:        char buf[4096];
        !           155:        int n;
        !           156: 
        !           157:        while(n=fread(buf, 1, sizeof(buf), in))
        !           158:                if(fwrite(buf, 1, n, out)!=n)
        !           159:                        bomb("writing data file");
        !           160: }
        !           161: 
        !           162: /*
        !           163:  *  Make a control file.  The two lines contain:
        !           164:  *     <reply-addr>    <dest>
        !           165:  *     -H <hello host> -d <domain> <reply_addr> <dest> <recipients>
        !           166:  */
        !           167: makectl(unixformat, helo, domain, from, daddr, dest, to)
        !           168:        char *from, *dest, *to;
        !           169: {
        !           170:        string *msg = s_new();
        !           171: 
        !           172:        s_append(msg, from);
        !           173:        s_append(msg, " ");
        !           174:        s_append(msg, dest);
        !           175:        s_append(msg, "\n");
        !           176:        if(unixformat)
        !           177:                s_append(msg, "-u ");
        !           178:        if(domain){
        !           179:                s_append(msg, "-d ");
        !           180:                s_append(msg, domain);
        !           181:                s_append(msg, " ");
        !           182:        }
        !           183:        if(daddr){
        !           184:                s_append(msg, "-a ");
        !           185:                s_append(msg, daddr);
        !           186:                s_append(msg, " ");
        !           187:        }
        !           188:        s_append(msg, "-H ");
        !           189:        s_append(msg, helo);
        !           190:        s_append(msg, " ");
        !           191:        s_append(msg, from);
        !           192:        s_append(msg, " ");
        !           193:        s_append(msg, dest);
        !           194:        s_append(msg, " ");
        !           195:        s_append(msg, to);
        !           196:        s_append(msg, "\n");
        !           197:        if(mkctlfile('C', datafile, s_to_c(msg))<0)
        !           198:                bomb("creating control file\n");
        !           199: }
        !           200: 
        !           201: void
        !           202: bomb(msg, a1, a2, a3, a4)
        !           203:        char *msg;
        !           204: {
        !           205:        fprintf(stderr, "smtpqer: ");
        !           206:        fprintf(stderr, msg, a1, a2, a3, a4);
        !           207:        if (datafile[0]!=0)
        !           208:                unlink(datafile);
        !           209:        exit(1);
        !           210: }

unix.superglobalmegacorp.com

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