int entryUnpack(Entry *e, uchar *p, int index) { p += index * VtEntrySize; e->gen = U32GET(p); e->psize = U16GET(p+4); e->dsize = U16GET(p+6); e->flags = U8GET(p+8); e->depth = (e->flags & VtEntryDepthMask) >> VtEntryDepthShift; e->flags &= ~VtEntryDepthMask; e->size = U48GET(p+14); if(e->flags & VtEntryLocal){ e->archive = p[27]; e->snap = U32GET(p+28); e->tag = U32GET(p+32); memset(e->score, 0, 16); memmove(e->score+16, p+36, 4); }else{ e->archive = 0; e->snap = 0; e->tag = 0; memmove(e->score, p+20, VtScoreSize); } return 1; }
p += 4; e->psize = U16GET(p); p += 2; e->dsize = U16GET(p); p += 2; e->flags = U8GET(p); p++; if(e->flags & _VtEntryBig) { e->psize = (e->psize>>5)<<(e->psize & 31); e->dsize = (e->dsize>>5)<<(e->dsize & 31); } e->type = (e->flags&_VtEntryDir) ? VtDirType : VtDataType; e->type += (e->flags & _VtEntryDepthMask) >> _VtEntryDepthShift; e->flags &= ~(_VtEntryDir|_VtEntryDepthMask|_VtEntryBig); p += 5; e->size = U48GET(p); p += 6; memmove(e->score, p, VtScoreSize); p += VtScoreSize; assert(p-op == VtEntrySize); if(!(e->flags & VtEntryActive)) return 0; /* * Some old vac files use psize==0 and dsize==0 when the * file itself has size 0 or is zeros. Just to make programs not * have to figure out what block sizes of 0 means, rewrite them. */ if(e->psize == 0 && e->dsize == 0