aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/vac/vacfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/vac/vacfs.c')
-rw-r--r--src/cmd/vac/vacfs.c176
1 files changed, 39 insertions, 137 deletions
diff --git a/src/cmd/vac/vacfs.c b/src/cmd/vac/vacfs.c
index 8cf78642..1ce3e2df 100644
--- a/src/cmd/vac/vacfs.c
+++ b/src/cmd/vac/vacfs.c
@@ -5,18 +5,12 @@
#include "vac.h"
typedef struct Fid Fid;
-typedef struct DirBuf DirBuf;
enum
{
OPERM = 0x3 /* mask of all permission types in open mode */
};
-enum
-{
- DirBufSize = 20
-};
-
struct Fid
{
short busy;
@@ -25,18 +19,8 @@ struct Fid
char *user;
Qid qid;
VacFile *file;
-
- DirBuf *db;
-
- Fid *next;
-};
-
-struct DirBuf
-{
VacDirEnum *vde;
- VacDir buf[DirBufSize];
- int i, n;
- int eof;
+ Fid *next;
};
enum
@@ -73,12 +57,8 @@ int perm(Fid*, int);
int permf(VacFile*, char*, int);
ulong getl(void *p);
void init(char*, char*, long, int);
-DirBuf *dirBufAlloc(VacFile*);
-VacDir *dirBufGet(DirBuf*);
-int dirBufUnget(DirBuf*);
-void dirBufFree(DirBuf*);
int vacdirread(Fid *f, char *p, long off, long cnt);
-int vdStat(VacFile *parent, VacDir *vd, uchar *p, int np);
+int vacstat(VacFile *parent, VacDir *vd, uchar *p, int np);
void srv(void* a);
@@ -141,7 +121,6 @@ threadmain(int argc, char *argv[])
int stdio = 0;
char *host = nil;
long ncache = 1000;
- int readOnly = 1;
fmtinstall('H', encodefmt);
fmtinstall('V', vtscorefmt);
@@ -184,7 +163,20 @@ threadmain(int argc, char *argv[])
usage();
initfcalls();
- init(argv[0], host, ncache, readOnly);
+
+ notify(notifyf);
+ user = getuser();
+
+ conn = vtdial(host);
+ if(conn == nil)
+ sysfatal("could not connect to server: %r");
+
+ if(vtconnect(conn) < 0)
+ sysfatal("vtconnect: %r");
+
+ fs = vacfsopen(conn, argv[0], VtOREAD, ncache);
+ if(fs == nil)
+ sysfatal("vacfsopen: %r");
if(pipe(p) < 0)
sysfatal("pipe failed: %r");
@@ -294,19 +286,6 @@ rattach(Fid *f)
return 0;
}
-VacFile*
-_vfWalk(VacFile *file, char *name)
-{
- VacFile *n;
-
- n = vacfilewalk(file, name);
- if(n)
- return n;
- if(strcmp(name, "SLASH") == 0)
- return vacfilewalk(file, "/");
- return nil;
-}
-
char*
rwalk(Fid *f)
{
@@ -356,7 +335,7 @@ rwalk(Fid *f)
err = Eperm;
break;
}
- nfile = _vfWalk(file, rhdr.wname[nqid]);
+ nfile = vacfilewalk(file, rhdr.wname[nqid]);
if(nfile == nil)
break;
vacfiledecref(file);
@@ -410,7 +389,7 @@ ropen(Fid *f)
if(!perm(f, Pread))
return vtstrdup(Eperm);
thdr.qid = f->qid;
- f->db = nil;
+ f->vde = nil;
f->open = 1;
return 0;
}
@@ -564,8 +543,8 @@ rclunk(Fid *f)
if(f->file)
vacfiledecref(f->file);
f->file = nil;
- dirBufFree(f->db);
- f->db = nil;
+ vdeclose(f->vde);
+ f->vde = nil;
return 0;
}
@@ -588,8 +567,6 @@ rremove(Fid *f)
if(!vacfileremove(vf, "none")) {
rerrstr(errbuf, sizeof errbuf);
-print("vfRemove failed: %s\n", errbuf);
-
err = errbuf;
}
@@ -611,7 +588,7 @@ rstat(Fid *f)
parent = vacfilegetparent(f->file);
vacfilegetdir(f->file, &dir);
thdr.stat = statbuf;
- thdr.nstat = vdStat(parent, &dir, thdr.stat, sizeof statbuf);
+ thdr.nstat = vacstat(parent, &dir, thdr.stat, sizeof statbuf);
vdcleanup(&dir);
vacfiledecref(parent);
return 0;
@@ -626,7 +603,7 @@ rwstat(Fid *f)
}
int
-vdStat(VacFile *parent, VacDir *vd, uchar *p, int np)
+vacstat(VacFile *parent, VacDir *vd, uchar *p, int np)
{
char *ext;
int n, ret;
@@ -694,96 +671,39 @@ vdStat(VacFile *parent, VacDir *vd, uchar *p, int np)
return ret;
}
-DirBuf*
-dirBufAlloc(VacFile *vf)
-{
- DirBuf *db;
-
- db = vtmallocz(sizeof(DirBuf));
- db->vde = vdeopen(vf);
- return db;
-}
-
-VacDir *
-dirBufGet(DirBuf *db)
-{
- VacDir *vd;
- int n;
-
- if(db->eof)
- return nil;
-
- if(db->i >= db->n) {
- n = vderead(db->vde, db->buf);
- if(n < 0)
- return nil;
- db->i = 0;
- db->n = n;
- if(n == 0) {
- db->eof = 1;
- return nil;
- }
- }
-
- vd = db->buf + db->i;
- db->i++;
-
- return vd;
-}
-
-int
-dirBufUnget(DirBuf *db)
-{
- assert(db->i > 0);
- db->i--;
- return 1;
-}
-
-void
-dirBufFree(DirBuf *db)
-{
- int i;
-
- if(db == nil)
- return;
-
- for(i=db->i; i<db->n; i++)
- vdcleanup(db->buf + i);
- vdeclose(db->vde);
- vtfree(db);
-}
-
int
vacdirread(Fid *f, char *p, long off, long cnt)
{
- int n, nb;
- VacDir *vd;
+ int i, n, nb;
+ VacDir vd;
/*
* special case of rewinding a directory
* otherwise ignore the offset
*/
- if(off == 0 && f->db) {
- dirBufFree(f->db);
- f->db = nil;
+ if(off == 0 && f->vde){
+ vdeclose(f->vde);
+ f->vde = nil;
}
- if(f->db == nil)
- f->db = dirBufAlloc(f->file);
+ if(f->vde == nil){
+ f->vde = vdeopen(f->file);
+ if(f->vde == nil)
+ return -1;
+ }
for(nb = 0; nb < cnt; nb += n) {
- vd = dirBufGet(f->db);
- if(vd == nil) {
- if(!f->db->eof)
- return -1;
+ i = vderead(f->vde, &vd);
+ if(i < 0)
+ return -1;
+ if(i == 0)
break;
- }
- n = vdStat(f->file, vd, (uchar*)p, cnt-nb);
+ n = vacstat(f->file, &vd, (uchar*)p, cnt-nb);
if(n <= BIT16SZ) {
- dirBufUnget(f->db);
+ vdeunread(f->vde);
break;
}
- vdcleanup(vd);
+ vdcleanup(&vd);
p += n;
}
return nb;
@@ -886,24 +806,6 @@ perm(Fid *f, int p)
}
void
-init(char *file, char *host, long ncache, int readOnly)
-{
- notify(notifyf);
- user = getuser();
-
- conn = vtdial(host);
- if(conn == nil)
- sysfatal("could not connect to server: %r");
-
- if(vtconnect(conn) < 0)
- sysfatal("vtconnect: %r");
-
- fs = vacfsopen(conn, file, /*readOnly ? ModeSnapshot :*/ VtOREAD, ncache);
- if(fs == nil)
- sysfatal("vfsOpen: %r");
-}
-
-void
vacshutdown(void)
{
Fid *f;