hgfs: update index

This commit is contained in:
cinap_lenrek 2011-06-27 05:43:25 +00:00
parent fff6d18d51
commit 637a770a16
4 changed files with 19 additions and 7 deletions

View file

@ -36,6 +36,8 @@ struct Revlog
int ifd;
int dfd;
vlong ioff;
int nmap;
Revmap *map;
};

View file

@ -13,6 +13,7 @@ int funzip(int ofd, int zfd, int len);
/* revlog */
int fmktemp(void);
int revlogopen(Revlog *r, char *path, int mode);
void revlogupdate(Revlog *r);
void revlogclose(Revlog *r);
int revlogextract(Revlog *r, int rev, int ofd);
uchar *revhash(Revlog *r, int rev);

View file

@ -311,6 +311,9 @@ fswalk1(Fid *fid, char *name, Qid *qid)
} else {
switch(rf->level){
case Qroot:
revlogupdate(&changelog);
revlogupdate(&manifest);
i = findrev(&changelog, name);
if(rf->info = getrevinfo(i)){
rf->level = Qrev;
@ -455,6 +458,9 @@ fsread(Req *r)
respond(r, "bug in fsread");
return;
case Qroot:
revlogupdate(&changelog);
revlogupdate(&manifest);
dirread9p(r, rootgen, nil);
respond(r, nil);
return;

View file

@ -13,15 +13,16 @@ fmktemp(void)
return create(mktemp(temp), OTRUNC|ORCLOSE|ORDWR, 0666);
}
static void
readindex(Revlog *r)
void
revlogupdate(Revlog *r)
{
uchar buf[64];
Revmap *m;
int rev;
seek(r->ifd, 0, 0);
for(rev=0;;rev++){
if(seek(r->ifd, r->ioff, 0) < 0)
return;
for(rev=r->nmap;;rev++){
if(readn(r->ifd, buf, sizeof(buf)) != sizeof(buf))
break;
if((rev % 16) == 0)
@ -48,8 +49,9 @@ readindex(Revlog *r)
if(r->dfd < 0){
m->hoff = seek(r->ifd, 0, 1);
seek(r->ifd, m->hlen, 1);
}
r->ioff = seek(r->ifd, m->hlen, 1);
} else
r->ioff = seek(r->ifd, 0, 1);
}
r->nmap = rev;
}
@ -67,9 +69,10 @@ revlogopen(Revlog *r, char *path, int mode)
path[strlen(path)-1] = 'd';
r->dfd = open(path, mode);
free(path);
r->ioff = 0;
r->nmap = 0;
r->map = nil;
readindex(r);
revlogupdate(r);
return 0;
}