mconnect.c

来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 138 行

C
138
字号
# 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>static char	SccsId[] =	"@(#)mconnect.c	4.1		7/25/83";struct sockaddr_in	SendmailAddress;struct sgttyb		TtyBuf;main(argc, argv)	int argc;	char **argv;{	register int s;	char *host;	register int i;	int pid;	struct servent *sp;	int raw = 0;	char buf[1000];	register char *p;	extern char *index();	register FILE *f;	extern u_long inet_addr();	extern finis();	(void) gtty(0, &TtyBuf);	(void) signal(SIGINT, finis);	s = socket(AF_INET, SOCK_STREAM, 0, 0);	if (s < 0)	{		perror("socket");		exit(-1);	}	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";	if (isdigit(*host))		SendmailAddress.sin_addr.s_addr = inet_addr(host);	else	{		register struct hostent *hp = gethostbyname(host);		if (hp == NULL)		{			fprintf(stderr, "mconnect: unknown host %s\r\n", host);			finis();		}		bcopy(hp->h_addr, &SendmailAddress.sin_addr, hp->h_length);	}	SendmailAddress.sin_family = AF_INET;	printf("connecting to host %s (0x%x), port 0x%x\r\n", host,	       SendmailAddress.sin_addr.s_addr, SendmailAddress.sin_port);	if (connect(s, &SendmailAddress, sizeof SendmailAddress, 0) < 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);		}	}	else	{		/* parent -- sendmail to standard output */		f = fdopen(s, "r");		while (fgets(buf, sizeof buf, f) != NULL)		{			fputs(buf, stdout);			fflush(stdout);		}	}	finis();}finis(){	stty(0, &TtyBuf);	exit(0);}

⌨️ 快捷键说明

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