⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rexec.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
#ifndef lintstatic char sccsid[] = "@(#)rexec.c	4.1 	7/3/90";#endif#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <stdio.h>#include <netdb.h>#include <errno.h>extern	errno;char    *sprintf();char	*index();int	rexecoptions;char	*getpass(), *getlogin();rexec(ahost, rport, name, pass, cmd, fd2p)	char **ahost;	int rport;	char *name, *pass, *cmd;	int *fd2p;{	int s, timo = 1, s3;	struct sockaddr_in sin, sin2, from;	char c;	u_short port;	struct hostent *hp;	hp = gethostbyname(*ahost);	if (hp == 0) {		fprintf(stderr, "%s: unknown host\n", *ahost);		return (-1);	}	*ahost = hp->h_name;	ruserpass(hp->h_name, &name, &pass);retry:	s = socket(AF_INET, SOCK_STREAM, 0);	if (s < 0) {		perror("rexec: socket");		return (-1);	}	sin.sin_family = hp->h_addrtype;	sin.sin_port = rport;	bcopy(hp->h_addr, (caddr_t)&sin.sin_addr, hp->h_length);	if (connect(s, &sin, sizeof(sin)) < 0) {		if (errno == ECONNREFUSED && timo <= 16) {			(void) close(s);			sleep(timo);			timo *= 2;			goto retry;		}		perror(hp->h_name);		(void) close(s);		return (-1);	}	if (fd2p == 0) {		(void) write(s, "", 1);		port = 0;	} else {		char num[8];		int s2, sin2len;				s2 = socket(AF_INET, SOCK_STREAM, 0);		if (s2 < 0) {			(void) close(s);			return (-1);		}		listen(s2, 1);		sin2len = sizeof (sin2);		if (getsockname(s2, (char *)&sin2, &sin2len) < 0 ||		  sin2len != sizeof (sin2)) {			perror("getsockname");			(void) close(s2);			goto bad;		}		port = ntohs((u_short)sin2.sin_port);		(void) sprintf(num, "%u", port);		(void) write(s, num, strlen(num)+1);		{ int len = sizeof (from);		  s3 = accept(s2, &from, &len, 0);		  close(s2);		  if (s3 < 0) {			perror("accept");			port = 0;			goto bad;		  }		}		*fd2p = s3;	}	(void) write(s, name, strlen(name) + 1);	/* should public key encypt the password here */	(void) write(s, pass, strlen(pass) + 1);	(void) write(s, cmd, strlen(cmd) + 1);	if (read(s, &c, 1) != 1) {		perror(*ahost);		goto bad;	}	if (c != 0) {		while (read(s, &c, 1) == 1) {			(void) write(2, &c, 1);			if (c == '\n')				break;		}		goto bad;	}	return (s);bad:	if (port)		(void) close(*fd2p);	(void) close(s);	return (-1);}

⌨️ 快捷键说明

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