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