commit e29d0c84fea05f317385ab1a8f3abceb7726b1bb from: rsc date: Fri Jan 06 18:00:42 2006 UTC add con commit - d9742d7e94acc0279f687d3fd0c6360d36480f8b commit + e29d0c84fea05f317385ab1a8f3abceb7726b1bb blob - 2570aa3e6aebabbf095a03d02cdc147912b2e7b5 blob + 7d218e67c38f9d1b6f1df6a86779d0e839ad29f7 --- src/cmd/9p.c +++ src/cmd/9p.c @@ -33,11 +33,13 @@ void xwritefd(int, char**); void xstat(int, char**); void xls(int, char**); void xrdwr(int, char**); +void xcon(int, char**); struct { char *s; void (*f)(int, char**); } cmds[] = { + "con", xcon, "read", xread, "write", xwrite, "readfd", xreadfd, @@ -316,8 +318,63 @@ xrdwr(int argc, char **argv) } fsclose(fid); threadexitsall(0); +} + +void +rdcon(void *v) +{ + char buf[4096]; + CFid *fid; + + fid = v; + for(;;){ + n = read(0, buf, sizeof buf); + if(n <= 0) + threadexitsall(0); + if(fswrite(fid, buf, n) != n) + fprint(2, "write: %r\n"); + } } +void +xcon(int argc, char **argv) +{ + char buf[4096], *r, *w, *e; + int n, nocr; + CFid *fid; + + nocr = 1; + + ARGBEGIN{ + case 'r': + nocr = 0; + break; + default: + usage(); + }ARGEND + + if(argc != 1) + usage(); + + fid = xopen(argv[0], ORDWR); + proccreate(rdcon, fid, STACK); + for(;;){ + n = fsread(fid, buf, n); + if(n <= 0) + threadexitsall(0); + if(nocr){ + for(r=w=buf, e=buf+n; r