1 #include <u.h>
2 #include <libc.h>
3 
4 int ppid;
5 
6 /*
7  * predefined
8  */
9 void pass(int from, int to);
10 
11 
12 /*
13  *  Connect to given datakit port
14  */
main(int argc,char * argv[])15 main(int argc, char *argv[])
16 {
17 	int fd0, fd1;
18 	int cpid;
19 	char c;
20 	char *cp, *devdir, *buf;
21 
22 	if (argc != 4) {
23 		fprint(2, "usage: %s destination network service\n", argv[0]);
24 		exits("incorrect number of arguments");
25 	}
26 	if(!(cp = malloc((long)(strlen(argv[1])+strlen(argv[2])+strlen(argv[3])+8)))) {
27 		perror("malloc");
28 		exits("malloc failed");
29 	}
30 	sprint(cp, "%s!%s!%s", argv[2], argv[1], argv[3]);
31 	if (dial(cp, &devdir, 0) < 0) {
32 		fprint(2, "dialing %s\n", cp);
33 		perror("dial");
34 		exits("can't dial");
35 	}
36 
37 	/*
38 	 * Initialize the input fd, and copy bytes.
39 	 */
40 
41 	if(!(buf = malloc((long)(strlen(devdir)+6)))) {
42 		perror("malloc");
43 		exits("malloc failed");
44 	}
45 	sprint(buf, "%s/data", devdir);
46 	fd0=open(buf, OREAD);
47 	fd1=open(buf, OWRITE);
48 	if(fd0<0 || fd1<0) {
49 		print("can't open", buf);
50 		exits("can't open port");
51 	}
52 	ppid = getpid();
53 	switch(cpid = fork()){
54 	case -1:
55 		perror("fork failed");
56 		exits("fork failed");
57 	case 0:
58 		close(0);
59 		close(fd1);
60 		pass(fd0, 1);	/* from remote */
61 		hangup(fd0);
62 		close(1);
63 		close(fd0);
64 		exits("");
65 	default:
66 		close(1);
67 		close(fd0);
68 		pass(0, fd1);	/* to remote */
69 		hangup(fd1);
70 		close(0);
71 		close(fd1);
72 		exits("");
73 	}
74 }
75 
76 void
pass(int from,int to)77 pass(int from, int to)
78 {
79 	char buf[1024];
80 	int ppid, cpid;
81 	int n, tot = 0;
82 
83 	while ((n=read(from, buf, sizeof(buf))) > 0) {
84 		if (n==1 && tot==0 && *buf=='\0')
85 			break;
86 		tot += n;
87 		if (write(to, buf, n)!=n) {
88 			perror("pass write error");
89 			exits("pass write error");
90 		}
91 	}
92 }
93