1: /*
2: * Copyright (c) 1988 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that this notice is preserved and that due credit is given
7: * to the University of California at Berkeley. The name of the University
8: * may not be used to endorse or promote products derived from this
9: * software without specific prior written permission. This software
10: * is provided ``as is'' without express or implied warranty.
11: *
12: * Sendmail
13: * Copyright (c) 1983 Eric P. Allman
14: * Berkeley, California
15: */
16:
17: #ifndef lint
18: char copyright[] =
19: "@(#) Copyright (c) 1988 Regents of the University of California.\n\
20: All rights reserved.\n";
21: #endif /* not lint */
22:
23: #ifndef lint
24: static char sccsid[] = "@(#)mconnect.c 5.3 (Berkeley) 4/21/88";
25: #endif /* not lint */
26:
27: #include <stdio.h>
28: #include <signal.h>
29: #include <ctype.h>
30: #include <sgtty.h>
31: #include <sys/types.h>
32: #include <sys/socket.h>
33: #include <netinet/in.h>
34: #include <netdb.h>
35:
36: static struct sgttyb TtyBuf;
37:
38: main(argc, argv)
39: int argc;
40: char **argv;
41: {
42: extern char *optarg;
43: extern int optind;
44: register FILE *f;
45: register int s;
46: struct servent *sp;
47: struct sockaddr_in SendmailAddress;
48: int ch, raw;
49: char *host, buf[1000], *index();
50: u_long inet_addr();
51: int finis();
52:
53: raw = 0;
54: (void)gtty(0, &TtyBuf);
55: (void)signal(SIGINT, finis);
56:
57: if ((s = socket(AF_INET, SOCK_STREAM, 0, 0)) < 0) {
58: perror("socket");
59: exit(-1);
60: }
61:
62: sp = getservbyname("smtp", "tcp");
63: if (sp != NULL)
64: SendmailAddress.sin_port = sp->s_port;
65:
66: while ((ch = getopt(argc, argv, "hp:r")) != EOF)
67: switch((char)ch) {
68: case 'h': /* host */
69: break;
70: case 'p': /* port */
71: SendmailAddress.sin_port = htons(atoi(optarg));
72: break;
73: case 'r': /* raw connection */
74: raw = 1;
75: TtyBuf.sg_flags &= ~CRMOD;
76: stty(0, &TtyBuf);
77: TtyBuf.sg_flags |= CRMOD;
78: break;
79: case '?':
80: default:
81: fputs("usage: mconnect [-hr] [-p port] [host]\n", stderr);
82: exit(-1);
83: }
84: argc -= optind;
85: argv += optind;
86:
87: host = argc ? *argv : "localhost";
88:
89: if (isdigit(*host))
90: SendmailAddress.sin_addr.s_addr = inet_addr(host);
91: else {
92: register struct hostent *hp = gethostbyname(host);
93:
94: if (hp == NULL) {
95: fprintf(stderr, "mconnect: unknown host %s\r\n", host);
96: finis();
97: }
98: bcopy(hp->h_addr, &SendmailAddress.sin_addr, hp->h_length);
99: }
100: SendmailAddress.sin_family = AF_INET;
101: printf("connecting to host %s (0x%lx), port 0x%x\r\n", host,
102: SendmailAddress.sin_addr.s_addr, SendmailAddress.sin_port);
103: if (connect(s, &SendmailAddress, sizeof(SendmailAddress), 0) < 0) {
104: perror("connect");
105: exit(-1);
106: }
107:
108: /* good connection, fork both sides */
109: puts("connection open");
110: switch(fork()) {
111: case -1:
112: perror("fork");
113: exit(-1);
114: case 0: { /* child -- standard input to sendmail */
115: int c;
116:
117: f = fdopen(s, "w");
118: while ((c = fgetc(stdin)) >= 0) {
119: if (!raw && c == '\n')
120: fputc('\r', f);
121: fputc(c, f);
122: if (c == '\n')
123: (void)fflush(f);
124: }
125: }
126: default: /* parent -- sendmail to standard output */
127: f = fdopen(s, "r");
128: while (fgets(buf, sizeof(buf), f) != NULL) {
129: fputs(buf, stdout);
130: (void)fflush(stdout);
131: }
132: }
133: finis();
134: }
135:
136: finis()
137: {
138: stty(0, &TtyBuf);
139: exit(0);
140: }
Defined functions
main
defined in line
38;
never used
Defined variables