|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.