aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Arroyo <david@aqwari.net>2021-01-31 00:51:32 -0500
committerDan Cross <crossd@gmail.com>2021-01-31 11:52:08 -0500
commita72478870ae66b7ac1e73b1d22b578cd31852f33 (patch)
treeeaf38f786a91eb09bac4c57aaff2ff4b71eda357
parent36cd4c58c1346375b98f517fb8568be5bb47618d (diff)
downloadplan9port-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.
-rw-r--r--src/cmd/9p.c14
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);
}