mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-12 11:10:07 +00:00
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:
parent
36cd4c58c1
commit
a72478870a
1 changed files with 9 additions and 5 deletions
14
src/cmd/9p.c
14
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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue