Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

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