Blame


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