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.
This commit is contained in:
David Arroyo 2021-01-31 00:51:32 -05:00 committed by Dan Cross
parent 36cd4c58c1
commit a72478870a

View file

@ -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);
}