# 1 "rcmd.c"






# 1 "/usr/minclude/stdio.h"







#ident	"@(#)head:stdio.h	2.14"



# 14 "/usr/minclude/stdio.h"




# 20 "/usr/minclude/stdio.h"





typedef struct {

	int	_cnt;
	unsigned char	*_ptr;
# 32 "/usr/minclude/stdio.h"

	unsigned char	*_base;
	char	_flag;
	char	_file;
} FILE;











































extern FILE	_iob[100];
extern FILE	*fopen(), *fdopen(), *freopen(), *popen(), *tmpfile();
extern long	ftell();
extern void	rewind(), setbuf();
extern char	*ctermid(), *cuserid(), *fgets(), *gets(), *tempnam(), *tmpnam();
extern int	fclose(), fflush(), fread(), fwrite(), fseek(), fgetc(),
		getw(), pclose(), printf(), fprintf(), sprintf(),
		vprintf(), vfprintf(), vsprintf(), fputc(), putw(),
		puts(), fputs(), scanf(), fscanf(), sscanf(),
		setvbuf(), system(), ungetc();
extern unsigned char *_bufendtab[];






# 8 "rcmd.c"
# 1 "/usr/minclude/sys/types.h"







#ident	"@(#)kern-port:sys/types.h	10.6"

typedef	struct { int r[1]; } *	physadr;
typedef	long		daddr_t;	
typedef	char *		caddr_t;	
typedef	unsigned char	unchar;
typedef	unsigned short	ushort;
typedef	unsigned int	uint;
typedef	unsigned long	ulong;
typedef	ushort		ino_t;		
typedef	short		cnt_t;		
typedef	long		time_t;		


# 28 "/usr/minclude/sys/types.h"

typedef	int		label_t[24];
typedef	short		dev_t;		
typedef	long		off_t;		
typedef	long		paddr_t;	
typedef	int		key_t;		
typedef	unsigned char	use_t;		
typedef	short		sysid_t;
typedef	short		index_t;
typedef	short		lock_t;		
typedef	unsigned int	size_t;		




typedef struct cookie {
	long	c_sysid;
	long 	c_rcvd;
} *cookie_t;















typedef long	fd_mask;





typedef	struct fd_set {
	fd_mask	fds_bits[(((256)+(( (sizeof(fd_mask) * 8))-1))/( (sizeof(fd_mask) * 8)))];
} fd_set;





# 9 "rcmd.c"
# 1 "/usr/minclude/sys/socket.h"















































struct sockaddr {
	short sa_family;		
	char  sa_data[14];		
};
























# 11 "rcmd.c"
# 1 "/usr/minclude/errno.h"







#ident	"@(#)head:errno.h	1.4"





# 1 "/usr/minclude/sys/errno.h"







#ident	"@(#)kern-port:sys/errno.h	10.7"

























































































































# 15 "/usr/minclude/errno.h"
extern int errno;
# 13 "rcmd.c"
static char sccsId[] = "@(#)rcmd.c	1.4 5/8/85";



extern char *index();

extern	errno;

char	*sprintf();

int	rcmdoptions;

rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
	char **ahost;
	int rport;
	char *locuser, *remuser, *cmd;
	int *fd2p;
{
	int s, timo = 1;	
	long addr;
	struct sockaddr_in sin, sin2, from;
	char c;
	short port;
	extern long rhost();

	addr = rhost(ahost);
	if (addr == -1) {
		fprintf((&_iob[2]), "%s: unknown host\n", *ahost);
		return (-1);
	}
retry:
	s = rresvport(rcmdoptions|0x0004);

# 48 "rcmd.c"


	if (s < 0)
		return (-1);
	sin.sin_family = 2;
	sin.sin_addr.s_addr = addr;
	sin.sin_port = rport;
	sin.sin_port = htons(sin.sin_port);
# 59 "rcmd.c"

	if (connect(s, &sin) < 0) {
		if (errno == 116 && timo <= 16) {
			close(s);
			sleep(timo);
			timo *= 2;
			goto retry;
		}
		perror(*ahost);
		return (-1);
	}
	if (fd2p == 0) {
		write(s, "", 1);
# 74 "rcmd.c"

		port = 0;
	} else {
		char num[8];
		long readfd;
		int p1,nbio, ret;
		int s2 = rresvport(rcmdoptions|SO_ACCEPTCONN);
		extern errno;
# 84 "rcmd.c"

		if (s2 < 0) {
			close(s);
			return (-1);
		}
		if ((socketaddr(s2, &sin2)) < 0) {
			perror("rcmd");
			fprintf ((&_iob[2]), "error=%d\n", errno);
			exit(1);
		}
		port = sin2.sin_port;
		port = htons((unsigned short)port);
		sprintf(num, "%d", port);
		write(s, num, strlen(num)+1);

reselect:
		p1=1;
		nbio=1;
		readfd = (p1<<s2);
		if((ret=ioctl(s2,FIONBIO,&nbio)) < 0) {
			perror("ioctl/FIONBIO");
			goto bad;
		}
		if (select(20,&readfd,(long *)0,100000) <= 0) {
			perror("select - host failed to connect");
			close(s2);
			port=0;
			*fd2p=0;
			goto printerr;
		}

		if ((ret = accept(s2, &from)) < 0) {
			if(errno == 90)
				goto reselect;
			else {
				perror("accept");
				goto bad;
			}
		}
		nbio = 0;
		if((ret=ioctl(s2,FIONBIO,&nbio)) < 0) {
			perror("ioctl/FIONBIO");
			goto bad;
		}
		from.sin_port = ntohs(from.sin_port);
		if (from.sin_family != 2 ||
		    from.sin_port >= IPPORT_RESERVED) {
			fprintf((&_iob[2]),
			    "socket: protocol failure in circuit setup.\n");
			fprintf((&_iob[2]), "family=%d, port=%d\n",
			    from.sin_family, from.sin_port);
			goto bad;
		}
		*fd2p = s2;
	}
	write(s, locuser, strlen(locuser)+1);
	write(s, remuser, strlen(remuser)+1);
	write(s, cmd, strlen(cmd)+1);
printerr:
# 156 "rcmd.c"

	read(s, &c, 1);

	if (c != 0) {
		while (read(s, &c, 1) == 1) {
			write(2, &c, 1);
			if (c == '\n')
				break;
		}
		goto bad;
	}
# 169 "rcmd.c"

	return (s);
bad:
	if (port)
		close(*fd2p);
	close(s);
	return (-1);
}

rresvport(options)
	int options;
{
	struct sockaddr_in sin;
	static short lport = IPPORT_RESERVED - 1;
	int s;

	for (;;) {
		memset(&sin, 0, sizeof(sin));
		sin.sin_family = 2;
		sin.sin_port = lport--;
		sin.sin_addr.s_addr = 0;
		sin.sin_port = htons(sin.sin_port);
		s = socket(1, (struct sockproto *)0, &sin, options);
		if (s >= 0)
			return (s);
		if (errno != 103 && errno != 104) {
			perror("socket");
			return (-1);
		}
		if (lport == IPPORT_RESERVED/2) {
			fprintf((&_iob[2]), "socket: All ports in use\n");
			return (-1);
		}
	}
}

char * firstwhite();
char * skipwhite();
ruserok(rhost, ruser, luser)
	char *rhost, *ruser, *luser;
{
	FILE *hostf;
	char ahost[32];
	int first = 1;

	hostf = fopen("/hosts.equiv", "r");
again:
	if (hostf) {
		while (fgets(ahost, sizeof (ahost), hostf)) {
			char *user, *buf;
			buf = ahost;
			if (index(buf, '\n'))
				*index(buf, '\n') = 0;
			buf = firstwhite(buf, ' ');
			if (buf)
				*buf++ = 0;
			buf = skipwhite(buf, ' ');
			user = buf;
			buf = firstwhite(buf, ' ');
			if(buf)
				*buf = 0;
			if (!strcmp(rhost, ahost) &&
			    !strcmp(ruser, user ? user : luser))
			    


				if( !first || 
					strcmp( "root", user ? user: luser) )
				goto ok;
		}
		fclose(hostf);
	}
	if (first == 1) {
		first = 0;
		hostf = fopen(".rhosts", "r");
		goto again;
	}
	return (-1);
ok:
	fclose(hostf);
	return (0);
}

# 264 "rcmd.c"

