summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2016-02-15 01:03:44 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2016-02-15 01:03:44 +0100
commitb450cb7e32ac9233d6d9225600feaf8b4a84301d (patch)
tree6508901bd0df7df1e897b2e7b21899fdfa6f010e
parent61dea9012e71b53b102e00a520ee0e8163b406d3 (diff)
downloadplan9front-b450cb7e32ac9233d6d9225600feaf8b4a84301d.tar.xz
devmnt: deal with partial response for Tversion request in mntversion()
-rw-r--r--sys/src/9/port/devmnt.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/sys/src/9/port/devmnt.c b/sys/src/9/port/devmnt.c
index ba14771eb..cd363319b 100644
--- a/sys/src/9/port/devmnt.c
+++ b/sys/src/9/port/devmnt.c
@@ -164,7 +164,6 @@ mntversion(Chan *c, char *version, int msize, int returnlen)
unlock(c);
l = devtab[c->type]->write(c, msg, k, oo);
-
if(l < k){
lock(c);
c->offset -= k - l;
@@ -173,13 +172,14 @@ mntversion(Chan *c, char *version, int msize, int returnlen)
}
/* message sent; receive and decode reply */
- k = devtab[c->type]->read(c, msg, 8192+IOHDRSZ, c->offset);
- if(k <= 0)
- error("EOF receiving fversion reply");
-
- lock(c);
- c->offset += k;
- unlock(c);
+ for(k = 0; k < BIT32SZ || (k < GBIT32(msg) && k < 8192+IOHDRSZ); k += l){
+ l = devtab[c->type]->read(c, msg+k, 8192+IOHDRSZ-k, c->offset);
+ if(l <= 0)
+ error("EOF receiving fversion reply");
+ lock(c);
+ c->offset += l;
+ unlock(c);
+ }
l = convM2S(msg, k, &f);
if(l != k)