aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/9p.c
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 /src/cmd/9p.c
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.
Diffstat (limited to 'src/cmd/9p.c')
-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);
}