Blob


1 #include <u.h>
2 #include <libc.h>
4 int ppid;
6 /*
7 * predefined
8 */
9 void pass(int from, int to);
12 /*
13 * Connect to given datakit port
14 */
15 main(int argc, char *argv[])
16 {
17 int fd0, fd1;
18 int cpid;
19 char c;
20 char *cp, *devdir, *buf;
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 }
37 /*
38 * Initialize the input fd, and copy bytes.
39 */
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 }
76 void
77 pass(int from, int to)
78 {
79 char buf[1024];
80 int ppid, cpid;
81 int n, tot = 0;
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 }