From e29d0c84fea05f317385ab1a8f3abceb7726b1bb Mon Sep 17 00:00:00 2001 From: rsc Date: Fri, 6 Jan 2006 18:00:42 +0000 Subject: add con --- src/cmd/9p.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'src/cmd/9p.c') diff --git a/src/cmd/9p.c b/src/cmd/9p.c index 2570aa3e..7d218e67 100644 --- a/src/cmd/9p.c +++ b/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, @@ -318,6 +320,61 @@ xrdwr(int argc, char **argv) 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