|
|
researchv8 Dan Cross
#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);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.