t9p: parse lines in rdwr command - plan9port - [fork] Plan 9 from user space
HTML git clone git://src.adamsgaard.dk/plan9port
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
DIR commit a72478870ae66b7ac1e73b1d22b578cd31852f33
DIR parent 36cd4c58c1346375b98f517fb8568be5bb47618d
HTML Author: David Arroyo <david@aqwari.net>
Date: Sun, 31 Jan 2021 00:51:32 -0500
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:
M src/cmd/9p.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
---
DIR diff --git a/src/cmd/9p.c b/src/cmd/9p.c
t@@ -302,8 +302,10 @@ void
xrdwr(int argc, char **argv)
{
char buf[4096];
+ char *p;
int n;
CFid *fid;
+ Biobuf *b;
ARGBEGIN{
default:
t@@ -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);
t@@ -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);
}