V8/usr/src/cmd/inet/libin/tcp_lib.c

Compare this file to the similar file:
Show the results in this format:

#include <sys/inet/tcp_user.h>
#include <ctype.h>
#include <stdio.h>
#include <errno.h>
#include "config.h"

extern errno;
unsigned int tcp_localaddr = INADDR_ANY;
unsigned int tcp_acceptaddr;

tcp_sock()
{
	int fd, n;
	char name[32];

	for(n = 01; n < 100; n += 2){
		sprintf(name, "/dev/tcp%02d", n);
		fd = open(name, 2);
		if(fd >= 0)
			return(fd);
		if(errno != ENXIO)
			break;
	}
	perror(name);
	return(-1);
}

tcp_connect(fd, lport, faddr, fport)
int fd;
tcp_port lport, fport;
in_addr faddr;
{
	struct tcpreply tr;

	errno = 0;
	if(tcp_cmd(fd, TCPC_CONNECT, lport, faddr, fport) < 0)
		return(-1);
	if(tcp_wait(fd, &tr) < 0)
		return(-1);
	if(tr.reply != TCPR_OK)
		return(-1);
	return(0);
}

tcp_wait(fd, trp)
int fd;
struct tcpreply *trp;
{
	int n;
	/* timeout? */
	n = read(fd, trp, sizeof(struct tcpreply));
	if(n != sizeof(struct tcpreply))
		return(-1);
	return(0);
}

tcp_listen(fd, lport, faddr, fport)
int fd;
tcp_port lport, fport;
in_addr faddr;
{
	struct tcpreply tr;

	if(tcp_cmd(fd, TCPC_LISTEN, lport, faddr, fport) < 0)
		return(-1);
	return(0);
}

tcp_cmd(fd, cmd, lport, faddr, fport)
int fd;
int cmd;
tcp_port lport, fport;
in_addr faddr;
{
	struct tcpuser tu;

	tu.cmd = cmd;
	tu.src = tcp_localaddr;
	tu.dst = faddr;
	tu.sport = lport;
	tu.dport = fport;
	if(write(fd, &tu, sizeof(tu)) != sizeof(tu)){
		perror("cmd write");
		return(-1);
	}
	return(0);
}

tcp_accept(fd, faddrp, fportp, devp)
int fd;
in_addr *faddrp;
tcp_port *fportp;
int *devp;
{
	char name[32];
	int nfd;
	struct tcpreply tr;

	if(tcp_wait(fd, &tr) < 0)
		return(-1);
	if(tr.reply != TCPR_OK)
		return(-1);
	*devp = tr.tcpdev;
	sprintf(name, "/dev/tcp%02d", tr.tcpdev);
	nfd = open(name, 2);
	if(nfd < 0)
		return(-1);
	if (faddrp != 0)
		*faddrp = tr.dst;
	if (fportp != 0)
		*fportp = tr.dport;
	tcp_acceptaddr = tr.src;
	return(nfd);
}


tcp_rcmd(host, port, locuser, remuser, cmd, fd2p)
char *host, *port, *locuser, *remuser, *cmd;
int *fd2p;
{
	char buf[1];
	int fd;
	unsigned int faddr, fport;
	struct in_service *sp;

	faddr = in_address(host);
	if(faddr == 0){
		fprintf(stderr, "%s: unknown host\n", host);
		return(-1);
	}
	sp = in_service(port, "tcp", 0);
	if(sp == 0){
		fprintf(stderr, "%s: unknown service\n", port);
		return(-1);
	}
	fport = sp->port;
	fd = tcp_sock();
	if(fd < 0){
		perror(host);
		return(-1);
	}
	if(tcp_connect(fd, 0, faddr, fport) < 0){
		fprintf(stderr, "%s: connection failed\n", host);
		goto bad;
	}

	if(fd2p == 0)
		write(fd, "", 1);
	else
		goto bad;	/* later */

	write(fd, locuser, strlen(locuser)+1);
	write(fd, remuser, strlen(remuser)+1);
	write(fd, cmd, strlen(cmd)+1);

	if(read(fd, buf, 1) != 1){
		perror(host);
		goto bad;
	}
	if(buf[0] != 0){
		while(read(fd, buf, 1) == 1){
			write(2, buf, 1);
			if(buf[0] == '\n')
				break;
		}
		goto bad;
	}
	return(fd);
bad:
	close(fd);
	return(-1);
}