aboutsummaryrefslogtreecommitdiff
path: root/src/lib9pclient
diff options
context:
space:
mode:
authorRuss Cox <rsc@swtch.com>2008-07-04 02:46:05 -0400
committerRuss Cox <rsc@swtch.com>2008-07-04 02:46:05 -0400
commit382ae73f24c4566b2948d72f65ff68dc35857556 (patch)
tree749b031ddc640bd624e78884abf946a3acf8005c /src/lib9pclient
parentac5a97e6b3b136c1ab669ae19a813a81cce673eb (diff)
downloadplan9port-382ae73f24c4566b2948d72f65ff68dc35857556.tar.gz
plan9port-382ae73f24c4566b2948d72f65ff68dc35857556.tar.bz2
plan9port-382ae73f24c4566b2948d72f65ff68dc35857556.zip
lib9pclient: add support for 9P2000.u
Diffstat (limited to 'src/lib9pclient')
-rw-r--r--src/lib9pclient/dirread.c13
-rw-r--r--src/lib9pclient/fs.c9
-rw-r--r--src/lib9pclient/fsimpl.h1
-rw-r--r--src/lib9pclient/stat.c2
-rw-r--r--src/lib9pclient/wstat.c4
5 files changed, 17 insertions, 12 deletions
diff --git a/src/lib9pclient/dirread.c b/src/lib9pclient/dirread.c
index 2d111917..c2b13882 100644
--- a/src/lib9pclient/dirread.c
+++ b/src/lib9pclient/dirread.c
@@ -4,9 +4,10 @@
#include <libc.h>
#include <fcall.h>
#include <9pclient.h>
+#include "fsimpl.h"
static long
-dirpackage(uchar *buf, long ts, Dir **d)
+dirpackage(uchar *buf, long ts, Dir **d, int dotu)
{
char *s;
long ss, i, n, nn, m;
@@ -22,7 +23,7 @@ dirpackage(uchar *buf, long ts, Dir **d)
n = 0;
for(i = 0; i < ts; i += m){
m = BIT16SZ + GBIT16(&buf[i]);
- if(statcheck(&buf[i], m) < 0)
+ if(statchecku(&buf[i], m, dotu) < 0)
break;
ss += m;
n++;
@@ -42,7 +43,7 @@ dirpackage(uchar *buf, long ts, Dir **d)
nn = 0;
for(i = 0; i < ts; i += m){
m = BIT16SZ + GBIT16((uchar*)&buf[i]);
- if(nn >= n || convM2D(&buf[i], m, *d + nn, s) != m){
+ if(nn >= n || convM2Du(&buf[i], m, *d + nn, s, dotu) != m){
free(*d);
*d = nil;
return -1;
@@ -65,7 +66,7 @@ fsdirread(CFid *fid, Dir **d)
return -1;
ts = fsread(fid, buf, DIRMAX);
if(ts >= 0)
- ts = dirpackage(buf, ts, d);
+ ts = dirpackage(buf, ts, d, fid->fs->dotu);
free(buf);
return ts;
}
@@ -91,9 +92,9 @@ fsdirreadall(CFid *fid, Dir **d)
ts += n;
}
if(ts >= 0){
- ts = dirpackage(buf, ts, d);
+ ts = dirpackage(buf, ts, d, fid->fs->dotu);
if(ts < 0)
- werrstr("malformed directory contents");
+ werrstr("malformed directory contents [dotu=%d]", fid->fs->dotu);
}
free(buf);
if(ts == 0 && n < 0)
diff --git a/src/lib9pclient/fs.c b/src/lib9pclient/fs.c
index c6b1c3e9..b87811f3 100644
--- a/src/lib9pclient/fs.c
+++ b/src/lib9pclient/fs.c
@@ -49,12 +49,15 @@ fsinit(int fd)
fs->iosend = ioproc();
muxinit(&fs->mux);
- strcpy(fs->version, "9P2000");
+ strcpy(fs->version, "9P2000.u");
if((n = fsversion(fs, 8192, fs->version, sizeof fs->version)) < 0){
werrstr("fsversion: %r");
_fsunmount(fs);
return nil;
}
+ if(strcmp(fs->version, "9P2000.u") == 0)
+ fs->dotu = 1;
+fprint(2, "speaking %d\n", fs->dotu);
fs->msize = n;
return fs;
}
@@ -215,7 +218,7 @@ _fsrpc(CFsys *fs, Fcall *tx, Fcall *rx, void **freep)
tx->tag = 0;
if(chatty9pclient)
fprint(2, "<- %F\n", tx);
- nn = convS2M(tx, tpkt, n);
+ nn = convS2Mu(tx, tpkt, n, fs->dotu);
if(nn != n){
free(tpkt);
werrstr("lib9pclient: sizeS2M convS2M mismatch");
@@ -229,7 +232,7 @@ _fsrpc(CFsys *fs, Fcall *tx, Fcall *rx, void **freep)
return -1;
}
n = GBIT32((uchar*)rpkt);
- nn = convM2S(rpkt, n, rx);
+ nn = convM2Su(rpkt, n, rx, fs->dotu);
if(nn != n){
free(rpkt);
werrstr("lib9pclient: convM2S packet size mismatch %d %d", n, nn);
diff --git a/src/lib9pclient/fsimpl.h b/src/lib9pclient/fsimpl.h
index 9c5c5553..d609dde8 100644
--- a/src/lib9pclient/fsimpl.h
+++ b/src/lib9pclient/fsimpl.h
@@ -14,6 +14,7 @@ void *_fsnbqrecv(Queue*);
struct CFsys
{
char version[20];
+ int dotu;
int msize;
QLock lk;
int fd;
diff --git a/src/lib9pclient/stat.c b/src/lib9pclient/stat.c
index 9c69446a..594f8be1 100644
--- a/src/lib9pclient/stat.c
+++ b/src/lib9pclient/stat.c
@@ -42,7 +42,7 @@ fsdirfstat(CFid *fid)
free(freep);
return nil;
}
- n = convM2D(rx.stat, rx.nstat, d, (char*)&d[1]);
+ n = convM2Du(rx.stat, rx.nstat, d, (char*)&d[1], fs->dotu);
free(freep);
if(n != rx.nstat){
free(d);
diff --git a/src/lib9pclient/wstat.c b/src/lib9pclient/wstat.c
index 26e44f8e..cc193d25 100644
--- a/src/lib9pclient/wstat.c
+++ b/src/lib9pclient/wstat.c
@@ -28,11 +28,11 @@ fsdirfwstat(CFid *fid, Dir *d)
int n, nn;
Fcall tx, rx;
- n = sizeD2M(d);
+ n = sizeD2Mu(d, fid->fs->dotu);
a = malloc(n);
if(a == nil)
return -1;
- nn = convD2M(d, a, n);
+ nn = convD2Mu(d, a, n, fid->fs->dotu);
if(n != nn){
werrstr("convD2M and sizeD2M disagree");
free(a);