Subversion Repositories planix.SVN

Rev

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

/* tonet dest - copy stdin to dest, after dialing dest */
#include <u.h>
#include <libc.h>

enum { TIMEOUT = 10*60*1000 };

int
alarmhandler(void *, char *note)
{
        if(strcmp(note, "alarm") == 0) {
                fprint(2, "alarm\n");
                return 1;
        } else
                return 0;
}

void
pass(int in, int out)
{
        int rv;
        static char buf[4096];

        for(;;) {
                alarm(TIMEOUT);         /* to break hanging */
                rv = read(in, buf, sizeof buf);
                if (rv == 0)
                        break;
                if(rv < 0)
                        sysfatal("read error: %r");
                if(write(out, buf, rv) != rv)
                        sysfatal("write error: %r");
        }
        alarm(0);
}

static void
usage(void)
{
        fprint(2, "usage: %s network!destination!service\n", argv0);
        exits("usage");
}

void
main(int argc, char *argv[])
{
        int netfd;

        argv0 = argv[0];
        if (argc != 2)
                usage();

        atnotify(alarmhandler, 1);

        netfd = dial(argv[1], "net", 0, 0);
        if (netfd < 0)
                sysfatal("can't dial %s: %r", argv[1]);
        pass(0, netfd);
        exits(0);
}