lib9pclient: add support for 9P2000.u

This commit is contained in:
Russ Cox 2008-07-04 02:46:05 -04:00
parent ac5a97e6b3
commit 382ae73f24
5 changed files with 17 additions and 12 deletions

View file

@ -4,9 +4,10 @@
#include <libc.h> #include <libc.h>
#include <fcall.h> #include <fcall.h>
#include <9pclient.h> #include <9pclient.h>
#include "fsimpl.h"
static long static long
dirpackage(uchar *buf, long ts, Dir **d) dirpackage(uchar *buf, long ts, Dir **d, int dotu)
{ {
char *s; char *s;
long ss, i, n, nn, m; long ss, i, n, nn, m;
@ -22,7 +23,7 @@ dirpackage(uchar *buf, long ts, Dir **d)
n = 0; n = 0;
for(i = 0; i < ts; i += m){ for(i = 0; i < ts; i += m){
m = BIT16SZ + GBIT16(&buf[i]); m = BIT16SZ + GBIT16(&buf[i]);
if(statcheck(&buf[i], m) < 0) if(statchecku(&buf[i], m, dotu) < 0)
break; break;
ss += m; ss += m;
n++; n++;
@ -42,7 +43,7 @@ dirpackage(uchar *buf, long ts, Dir **d)
nn = 0; nn = 0;
for(i = 0; i < ts; i += m){ for(i = 0; i < ts; i += m){
m = BIT16SZ + GBIT16((uchar*)&buf[i]); 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); free(*d);
*d = nil; *d = nil;
return -1; return -1;
@ -65,7 +66,7 @@ fsdirread(CFid *fid, Dir **d)
return -1; return -1;
ts = fsread(fid, buf, DIRMAX); ts = fsread(fid, buf, DIRMAX);
if(ts >= 0) if(ts >= 0)
ts = dirpackage(buf, ts, d); ts = dirpackage(buf, ts, d, fid->fs->dotu);
free(buf); free(buf);
return ts; return ts;
} }
@ -91,9 +92,9 @@ fsdirreadall(CFid *fid, Dir **d)
ts += n; ts += n;
} }
if(ts >= 0){ if(ts >= 0){
ts = dirpackage(buf, ts, d); ts = dirpackage(buf, ts, d, fid->fs->dotu);
if(ts < 0) if(ts < 0)
werrstr("malformed directory contents"); werrstr("malformed directory contents [dotu=%d]", fid->fs->dotu);
} }
free(buf); free(buf);
if(ts == 0 && n < 0) if(ts == 0 && n < 0)

View file

@ -49,12 +49,15 @@ fsinit(int fd)
fs->iosend = ioproc(); fs->iosend = ioproc();
muxinit(&fs->mux); muxinit(&fs->mux);
strcpy(fs->version, "9P2000"); strcpy(fs->version, "9P2000.u");
if((n = fsversion(fs, 8192, fs->version, sizeof fs->version)) < 0){ if((n = fsversion(fs, 8192, fs->version, sizeof fs->version)) < 0){
werrstr("fsversion: %r"); werrstr("fsversion: %r");
_fsunmount(fs); _fsunmount(fs);
return nil; return nil;
} }
if(strcmp(fs->version, "9P2000.u") == 0)
fs->dotu = 1;
fprint(2, "speaking %d\n", fs->dotu);
fs->msize = n; fs->msize = n;
return fs; return fs;
} }
@ -215,7 +218,7 @@ _fsrpc(CFsys *fs, Fcall *tx, Fcall *rx, void **freep)
tx->tag = 0; tx->tag = 0;
if(chatty9pclient) if(chatty9pclient)
fprint(2, "<- %F\n", tx); fprint(2, "<- %F\n", tx);
nn = convS2M(tx, tpkt, n); nn = convS2Mu(tx, tpkt, n, fs->dotu);
if(nn != n){ if(nn != n){
free(tpkt); free(tpkt);
werrstr("lib9pclient: sizeS2M convS2M mismatch"); werrstr("lib9pclient: sizeS2M convS2M mismatch");
@ -229,7 +232,7 @@ _fsrpc(CFsys *fs, Fcall *tx, Fcall *rx, void **freep)
return -1; return -1;
} }
n = GBIT32((uchar*)rpkt); n = GBIT32((uchar*)rpkt);
nn = convM2S(rpkt, n, rx); nn = convM2Su(rpkt, n, rx, fs->dotu);
if(nn != n){ if(nn != n){
free(rpkt); free(rpkt);
werrstr("lib9pclient: convM2S packet size mismatch %d %d", n, nn); werrstr("lib9pclient: convM2S packet size mismatch %d %d", n, nn);

View file

@ -14,6 +14,7 @@ void *_fsnbqrecv(Queue*);
struct CFsys struct CFsys
{ {
char version[20]; char version[20];
int dotu;
int msize; int msize;
QLock lk; QLock lk;
int fd; int fd;

View file

@ -42,7 +42,7 @@ fsdirfstat(CFid *fid)
free(freep); free(freep);
return nil; 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); free(freep);
if(n != rx.nstat){ if(n != rx.nstat){
free(d); free(d);

View file

@ -28,11 +28,11 @@ fsdirfwstat(CFid *fid, Dir *d)
int n, nn; int n, nn;
Fcall tx, rx; Fcall tx, rx;
n = sizeD2M(d); n = sizeD2Mu(d, fid->fs->dotu);
a = malloc(n); a = malloc(n);
if(a == nil) if(a == nil)
return -1; return -1;
nn = convD2M(d, a, n); nn = convD2Mu(d, a, n, fid->fs->dotu);
if(n != nn){ if(n != nn){
werrstr("convD2M and sizeD2M disagree"); werrstr("convD2M and sizeD2M disagree");
free(a); free(a);