#include #include #include #include "fns.h" void usage(void) { fprint(2, "usage: %s [-k keypattern] addr\n", argv0); exits("usage"); } int copy(int from, int to) { int n; char buf[12*1024]; while((n = read(from, buf, sizeof buf)) > 0) { if(write(to, buf, n) != n) return -1; } return 0; } void cleanup(void *, char *note) { if(note == nil) note = "done"; postnote(PNGROUP, getpid(), note); exits(note); } void main(int argc, char **argv) { char *addr, *keypattern; int fd; AuthInfo *ai; char *alg = "rc4_256 sha1"; keypattern = ""; ARGBEGIN { case 'k': keypattern = EARGF(usage()); break; default: usage(); } ARGEND if(argc != 1) usage(); addr = argv[0]; argv0 = smprint("%s %s", argv0, addr); addr = netmkaddr(addr, "net", "styx"); if((fd = dial(addr, nil, nil, nil)) < 0) sysfatal("dial %s: %r", addr); if((ai = auth_proxy(fd, nil, "proto=infauth %s", keypattern)) == nil) sysfatal("auth: %r"); if(sendmsg(fd, alg) < 0) sysfatal("sendmsg: %r"); if((fd = mypushssl(fd, alg, ai->secret, ai->nsecret)) < 0) sysfatal("pushssl: %r"); if(rfork(RFNOTEG) < 0) sysfatal("rfork s: %r"); notify(cleanup); switch(rfork(RFPROC)) { case -1: sysfatal("fork: %r"); case 0: if(copy(0, fd) < 0) fprint(2, "%s: copy to server: %r\n", argv0); break; default: if(copy(fd, 1) < 0) fprint(2, "%s: copy from server: %r\n", argv0); break; } cleanup(nil, nil); abort(); }