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