mconnect.c

来自「操作系统SunOS 4.1.3版本的源码」· C语言 代码 · 共 153 行

C
153
字号
#ifndef lintstatic	char sccsid[] = "@(#)mconnect.c 1.1 92/07/30 SMI"; /* From UCB 3.4 1/5/83 */#endif/* * mconnect.c - A program to test out SMTP connections. * Usage: mconnect [host] *  ... SMTP dialog *  ^C or ^D or QUIT */# include <stdio.h># include <signal.h># include <ctype.h># include <sgtty.h># include <sys/types.h># include <sys/socket.h># include <netinet/in.h># include <netdb.h>struct sockaddr_in	SendmailAddress;struct sgttyb		TtyBuf;main(argc, argv)	int argc;	char **argv;{	register int s;	char *host = NULL;	int pid;	int on = 1;	struct servent *sp;	int raw = 0;	char buf[1000];	extern char *index();	register FILE *f;	register struct hostent *hp;	u_long theaddr;	extern u_long inet_addr();	extern finis();	(void) gtty(0, &TtyBuf);	(void) signal(SIGINT, finis);	s = socket(AF_INET, SOCK_STREAM, 0);	if (s < 0)	{		perror("socket");		exit(-1);	}	(void) setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, sizeof(on));	sp = getservbyname("smtp", "tcp");	if (sp != NULL)		SendmailAddress.sin_port = sp->s_port;	while (--argc > 0)	{		register char *p = *++argv;		if (*p == '-')		{			switch (*++p)			{			  case 'h':		/* host */				break;			  case 'p':		/* port */				SendmailAddress.sin_port = htons(atoi(*++argv));				argc--;				break;			  case 'r':		/* raw connection */				raw = 1;				TtyBuf.sg_flags &= ~CRMOD;				stty(0, &TtyBuf);				TtyBuf.sg_flags |= CRMOD;				break;			}		}		else if (host == NULL)			host = p;	}	if (host == NULL)		host = "localhost";	hp = gethostbyname(host);	if (hp == NULL)	{		/* Try for dotted pair or whatever */		theaddr = inet_addr(host);		SendmailAddress.sin_addr.s_addr = theaddr;		if (-1 == theaddr) {			fprintf(stderr, "mconnect: unknown host %s\r\n", host);			finis();		}	} else {		bcopy(hp->h_addr, &SendmailAddress.sin_addr, hp->h_length);	}	SendmailAddress.sin_family = AF_INET;	printf("connecting to host %s (%s), port %d\r\n", host,	       inet_ntoa(SendmailAddress.sin_addr),	       ntohs(SendmailAddress.sin_port));	if (connect(s, &SendmailAddress, sizeof SendmailAddress) < 0)	{		perror("connect");		exit(-1);	}	/* good connection, fork both sides */	printf("connection open\n");	pid = fork();	if (pid < 0)	{		perror("fork");		exit(-1);	}	if (pid == 0)	{		/* child -- standard input to sendmail */		int c;		f = fdopen(s, "w");		while ((c = fgetc(stdin)) >= 0)		{			if (!raw && c == '\n')				fputc('\r', f);			fputc(c, f);			if (c == '\n')				fflush(f);		}		shutdown(s,1);		sleep(10);	}	else	{		/* parent -- sendmail to standard output */		f = fdopen(s, "r");		while (fgets(buf, sizeof buf, f) != NULL)		{			fputs(buf, stdout);			fflush(stdout);		}		kill(pid, SIGTERM);	}	finis();}finis(){	stty(0, &TtyBuf);	exit(0);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?