diff options
author | David Arroyo <david@aqwari.net> | 2021-01-31 00:51:32 -0500 |
---|---|---|
committer | Dan Cross <crossd@gmail.com> | 2021-01-31 11:52:08 -0500 |
commit | a72478870ae66b7ac1e73b1d22b578cd31852f33 (patch) | |
tree | eaf38f786a91eb09bac4c57aaff2ff4b71eda357 /src/cmd/9p.c | |
parent | 36cd4c58c1346375b98f517fb8568be5bb47618d (diff) | |
download | plan9port-a72478870ae66b7ac1e73b1d22b578cd31852f33.tar.gz plan9port-a72478870ae66b7ac1e73b1d22b578cd31852f33.tar.bz2 plan9port-a72478870ae66b7ac1e73b1d22b578cd31852f33.zip |
9p: parse lines in rdwr command
Use bio(3) to read at most one line of input per iteration, even
if there is more than one line available in the input buffer. This
makes it easier to interact with line-oriented ctl files like that of
factotum(4) from shell scripts, without the need to control when
and how much data is flushed to a pipe.
Diffstat (limited to 'src/cmd/9p.c')
-rw-r--r-- | src/cmd/9p.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/cmd/9p.c b/src/cmd/9p.c index 75511a19..a5b97f85 100644 --- a/src/cmd/9p.c +++ b/src/cmd/9p.c @@ -302,8 +302,10 @@ void xrdwr(int argc, char **argv) { char buf[4096]; + char *p; int n; CFid *fid; + Biobuf *b; ARGBEGIN{ default: @@ -313,6 +315,8 @@ xrdwr(int argc, char **argv) if(argc != 1) usage(); + if((b = Bfdopen(0, OREAD)) == nil) + sysfatal("out of memory"); fid = xopen(argv[0], ORDWR); for(;;){ fsseek(fid, 0, 0); @@ -322,15 +326,15 @@ xrdwr(int argc, char **argv) if(write(1, buf, n) < 0 || write(1, "\n", 1) < 0) sysfatal("write error: %r"); } - n = read(0, buf, sizeof buf); - if(n <= 0) + if((p = Brdstr(b, '\n', 1)) == nil) break; - if(buf[n-1] == '\n') - n--; - if(fswrite(fid, buf, n) != n) + n = strlen(p); + if(fswrite(fid, p, n) != n) fprint(2, "write: %r\n"); + free(p); } fsclose(fid); + Bterm(b); threadexitsall(0); } |