it9p: parse lines in rdwr command - plan9port - [fork] Plan 9 from user space Err mx1.adamsgaard.dk 70 hgit clone git://src.adamsgaard.dk/plan9port URL:git://src.adamsgaard.dk/plan9port mx1.adamsgaard.dk 70 1Log /src/plan9port/log.gph mx1.adamsgaard.dk 70 1Files /src/plan9port/files.gph mx1.adamsgaard.dk 70 1Refs /src/plan9port/refs.gph mx1.adamsgaard.dk 70 1README /src/plan9port/file/README.md.gph mx1.adamsgaard.dk 70 1LICENSE /src/plan9port/file/LICENSE.gph mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1commit a72478870ae66b7ac1e73b1d22b578cd31852f33 /src/plan9port/commit/a72478870ae66b7ac1e73b1d22b578cd31852f33.gph mx1.adamsgaard.dk 70 1parent 36cd4c58c1346375b98f517fb8568be5bb47618d /src/plan9port/commit/36cd4c58c1346375b98f517fb8568be5bb47618d.gph mx1.adamsgaard.dk 70 hAuthor: David Arroyo URL:mailto:david@aqwari.net mx1.adamsgaard.dk 70 iDate: Sun, 31 Jan 2021 00:51:32 -0500 Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i9p: parse lines in rdwr command Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iUse bio(3) to read at most one line of input per iteration, even Err mx1.adamsgaard.dk 70 iif there is more than one line available in the input buffer. This Err mx1.adamsgaard.dk 70 imakes it easier to interact with line-oriented ctl files like that of Err mx1.adamsgaard.dk 70 ifactotum(4) from shell scripts, without the need to control when Err mx1.adamsgaard.dk 70 iand how much data is flushed to a pipe. Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iDiffstat: Err mx1.adamsgaard.dk 70 i M src/cmd/9p.c | 14 +++++++++----- Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i1 file changed, 9 insertions(+), 5 deletions(-) Err mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/9p.c b/src/cmd/9p.c /src/plan9port/file/src/cmd/9p.c.gph mx1.adamsgaard.dk 70 it@@ -302,8 +302,10 @@ void Err mx1.adamsgaard.dk 70 i xrdwr(int argc, char **argv) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i char buf[4096]; Err mx1.adamsgaard.dk 70 i+ char *p; Err mx1.adamsgaard.dk 70 i int n; Err mx1.adamsgaard.dk 70 i CFid *fid; Err mx1.adamsgaard.dk 70 i+ Biobuf *b; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i ARGBEGIN{ Err mx1.adamsgaard.dk 70 i default: Err mx1.adamsgaard.dk 70 it@@ -313,6 +315,8 @@ xrdwr(int argc, char **argv) Err mx1.adamsgaard.dk 70 i if(argc != 1) Err mx1.adamsgaard.dk 70 i usage(); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+ if((b = Bfdopen(0, OREAD)) == nil) Err mx1.adamsgaard.dk 70 i+ sysfatal("out of memory"); Err mx1.adamsgaard.dk 70 i fid = xopen(argv[0], ORDWR); Err mx1.adamsgaard.dk 70 i for(;;){ Err mx1.adamsgaard.dk 70 i fsseek(fid, 0, 0); Err mx1.adamsgaard.dk 70 it@@ -322,15 +326,15 @@ xrdwr(int argc, char **argv) Err mx1.adamsgaard.dk 70 i if(write(1, buf, n) < 0 || write(1, "\n", 1) < 0) Err mx1.adamsgaard.dk 70 i sysfatal("write error: %r"); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i- n = read(0, buf, sizeof buf); Err mx1.adamsgaard.dk 70 i- if(n <= 0) Err mx1.adamsgaard.dk 70 i+ if((p = Brdstr(b, '\n', 1)) == nil) Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i- if(buf[n-1] == '\n') Err mx1.adamsgaard.dk 70 i- n--; Err mx1.adamsgaard.dk 70 i- if(fswrite(fid, buf, n) != n) Err mx1.adamsgaard.dk 70 i+ n = strlen(p); Err mx1.adamsgaard.dk 70 i+ if(fswrite(fid, p, n) != n) Err mx1.adamsgaard.dk 70 i fprint(2, "write: %r\n"); Err mx1.adamsgaard.dk 70 i+ free(p); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i fsclose(fid); Err mx1.adamsgaard.dk 70 i+ Bterm(b); Err mx1.adamsgaard.dk 70 i threadexitsall(0); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 .