Annotation of 43BSD/usr.lib/sendmail/aux/mconnect.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[] = "@(#)mconnect.c      5.2 (Berkeley) 7/13/85";
                     19: #endif not lint
                     20: 
                     21: # include <stdio.h>
                     22: # include <signal.h>
                     23: # include <ctype.h>
                     24: # include <sgtty.h>
                     25: # include <sys/types.h>
                     26: # include <sys/socket.h>
                     27: # include <netinet/in.h>
                     28: # include <netdb.h>
                     29: 
                     30: struct sockaddr_in     SendmailAddress;
                     31: struct sgttyb          TtyBuf;
                     32: 
                     33: main(argc, argv)
                     34:        int argc;
                     35:        char **argv;
                     36: {
                     37:        register int s;
                     38:        char *host;
                     39:        register int i;
                     40:        int pid;
                     41:        struct servent *sp;
                     42:        int raw = 0;
                     43:        char buf[1000];
                     44:        register char *p;
                     45:        extern char *index();
                     46:        register FILE *f;
                     47:        extern u_long inet_addr();
                     48:        extern finis();
                     49: 
                     50:        (void) gtty(0, &TtyBuf);
                     51:        (void) signal(SIGINT, finis);
                     52:        s = socket(AF_INET, SOCK_STREAM, 0, 0);
                     53:        if (s < 0)
                     54:        {
                     55:                perror("socket");
                     56:                exit(-1);
                     57:        }
                     58: 
                     59:        sp = getservbyname("smtp", "tcp");
                     60:        if (sp != NULL)
                     61:                SendmailAddress.sin_port = sp->s_port;
                     62: 
                     63:        while (--argc > 0)
                     64:        {
                     65:                register char *p = *++argv;
                     66: 
                     67:                if (*p == '-')
                     68:                {
                     69:                        switch (*++p)
                     70:                        {
                     71:                          case 'h':             /* host */
                     72:                                break;
                     73: 
                     74:                          case 'p':             /* port */
                     75:                                SendmailAddress.sin_port = htons(atoi(*++argv));
                     76:                                argc--;
                     77:                                break;
                     78: 
                     79:                          case 'r':             /* raw connection */
                     80:                                raw = 1;
                     81:                                TtyBuf.sg_flags &= ~CRMOD;
                     82:                                stty(0, &TtyBuf);
                     83:                                TtyBuf.sg_flags |= CRMOD;
                     84:                                break;
                     85:                        }
                     86:                }
                     87:                else if (host == NULL)
                     88:                        host = p;
                     89:        }
                     90:        if (host == NULL)
                     91:                host = "localhost";
                     92: 
                     93:        if (isdigit(*host))
                     94:                SendmailAddress.sin_addr.s_addr = inet_addr(host);
                     95:        else
                     96:        {
                     97:                register struct hostent *hp = gethostbyname(host);
                     98: 
                     99:                if (hp == NULL)
                    100:                {
                    101:                        fprintf(stderr, "mconnect: unknown host %s\r\n", host);
                    102:                        finis();
                    103:                }
                    104:                bcopy(hp->h_addr, &SendmailAddress.sin_addr, hp->h_length);
                    105:        }
                    106:        SendmailAddress.sin_family = AF_INET;
                    107:        printf("connecting to host %s (0x%x), port 0x%x\r\n", host,
                    108:               SendmailAddress.sin_addr.s_addr, SendmailAddress.sin_port);
                    109:        if (connect(s, &SendmailAddress, sizeof SendmailAddress, 0) < 0)
                    110:        {
                    111:                perror("connect");
                    112:                exit(-1);
                    113:        }
                    114: 
                    115:        /* good connection, fork both sides */
                    116:        printf("connection open\n");
                    117:        pid = fork();
                    118:        if (pid < 0)
                    119:        {
                    120:                perror("fork");
                    121:                exit(-1);
                    122:        }
                    123:        if (pid == 0)
                    124:        {
                    125:                /* child -- standard input to sendmail */
                    126:                int c;
                    127: 
                    128:                f = fdopen(s, "w");
                    129:                while ((c = fgetc(stdin)) >= 0)
                    130:                {
                    131:                        if (!raw && c == '\n')
                    132:                                fputc('\r', f);
                    133:                        fputc(c, f);
                    134:                        if (c == '\n')
                    135:                                fflush(f);
                    136:                }
                    137:        }
                    138:        else
                    139:        {
                    140:                /* parent -- sendmail to standard output */
                    141:                f = fdopen(s, "r");
                    142:                while (fgets(buf, sizeof buf, f) != NULL)
                    143:                {
                    144:                        fputs(buf, stdout);
                    145:                        fflush(stdout);
                    146:                }
                    147:        }
                    148:        finis();
                    149: }
                    150: 
                    151: finis()
                    152: {
                    153:        stty(0, &TtyBuf);
                    154:        exit(0);
                    155: }

unix.superglobalmegacorp.com

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