#include <u.h>#include <libc.h> int ppid; /* * predefined */void pass(int from, int to); /* * Connect to given datakit port */main(int argc, char *argv[]){ int fd0, fd1; int cpid; char c; char *cp, *devdir, *buf; if (argc != 4) { fprint(2, "usage: %s destination network service\n", argv[0]); exits("incorrect number of arguments"); } if(!(cp = malloc((long)(strlen(argv[1])+strlen(argv[2])+strlen(argv[3])+8)))) { perror("malloc"); exits("malloc failed"); } sprint(cp, "%s!%s!%s", argv[2], argv[1], argv[3]); if (dial(cp, &devdir, 0) < 0) { fprint(2, "dialing %s\n", cp); perror("dial"); exits("can't dial"); } /* * Initialize the input fd, and copy bytes. */ if(!(buf = malloc((long)(strlen(devdir)+6)))) { perror("malloc"); exits("malloc failed"); } sprint(buf, "%s/data", devdir); fd0=open(buf, OREAD); fd1=open(buf, OWRITE); if(fd0<0 || fd1<0) { print("can't open", buf); exits("can't open port"); } ppid = getpid(); switch(cpid = fork()){ case -1: perror("fork failed"); exits("fork failed"); case 0: close(0); close(fd1); pass(fd0, 1); /* from remote */ hangup(fd0); close(1); close(fd0); exits(""); default: close(1); close(fd0); pass(0, fd1); /* to remote */ hangup(fd1); close(0); close(fd1); exits(""); }} voidpass(int from, int to){ char buf[1024]; int ppid, cpid; int n, tot = 0; while ((n=read(from, buf, sizeof(buf))) > 0) { if (n==1 && tot==0 && *buf=='\0') break; tot += n; if (write(to, buf, n)!=n) { perror("pass write error"); exits("pass write error"); } }}
#include <u.h>
#include <libc.h>
int ppid;
/*
* predefined
*/
void pass(int from, int to);
/*
* Connect to given datakit port
*/
main(int argc, char *argv[])
{
int fd0, fd1;
int cpid;
char c;
char *cp, *devdir, *buf;
if (argc != 4) {
fprint(2, "usage: %s destination network service\n", argv[0]);
exits("incorrect number of arguments");
}
if(!(cp = malloc((long)(strlen(argv[1])+strlen(argv[2])+strlen(argv[3])+8)))) {
perror("malloc");
exits("malloc failed");
}
sprint(cp, "%s!%s!%s", argv[2], argv[1], argv[3]);
if (dial(cp, &devdir, 0) < 0) {
fprint(2, "dialing %s\n", cp);
perror("dial");
exits("can't dial");
}
/*
* Initialize the input fd, and copy bytes.
*/
if(!(buf = malloc((long)(strlen(devdir)+6)))) {
perror("malloc");
exits("malloc failed");
}
sprint(buf, "%s/data", devdir);
fd0=open(buf, OREAD);
fd1=open(buf, OWRITE);
if(fd0<0 || fd1<0) {
print("can't open", buf);
exits("can't open port");
}
ppid = getpid();
switch(cpid = fork()){
case -1:
perror("fork failed");
exits("fork failed");
case 0:
close(0);
close(fd1);
pass(fd0, 1); /* from remote */
hangup(fd0);
close(1);
close(fd0);
exits("");
default:
close(1);
close(fd0);
pass(0, fd1); /* to remote */
hangup(fd1);
close(0);
close(fd1);
exits("");
}
}
void
pass(int from, int to)
{
char buf[1024];
int ppid, cpid;
int n, tot = 0;
while ((n=read(from, buf, sizeof(buf))) > 0) {
if (n==1 && tot==0 && *buf=='\0')
break;
tot += n;
if (write(to, buf, n)!=n) {
perror("pass write error");
exits("pass write error");
}
}
}