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: }
Defined functions
main
defined in line
33;
never used
Defined variables