1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- #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");
- }
- }
- }
|