Commit Diff


commit - 36cd4c58c1346375b98f517fb8568be5bb47618d
commit + a72478870ae66b7ac1e73b1d22b578cd31852f33
blob - 75511a1947480ad5cb0c2c0a626749e683fe5ea6
blob + a5b97f85f0223de4a9f162325f63f92bc9671d67
--- src/cmd/9p.c
+++ 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);
 }