i've been able to read tarballs >2G and read individual files >2G in tarballs with these changes. i've also incorporated the suggested cleanup. one question, with tpfs, there's a cast to vlong: seek(tapefile, 512*(vlong)r->data+off, 0); i cast to (int) because the size is only 3 bytes. is there anything drasticlly wrong with this? - erik ./fs.c 108c108 < r->blockno = 0; --- > r->data = 0; 406,407c406,407 < // if(off > 100*1024*1024) /* sanity check */ < // return "write too big"; --- > if(off > 100*1024*1024) /* sanity check */ > return "write too big"; ===================================================== ./32vfs.c 106c106 < doread(Ram *r, uvlong off, long cnt) --- > doread(Ram *r, long off, long cnt) 109,117c109,112 < uvlong _bno; < ulong bno; < int i; < < _bno = off/BLSIZE; < off -= _bno*BLSIZE; < bno = (ulong)bno; < if (bno!=_bno) < error("offset to large"); --- > int bno, i; > > bno = off/BLSIZE; > off -= bno*BLSIZE; 133c128 < dowrite(Ram *r, char *buf, uvlong off, long cnt) --- > dowrite(Ram *r, char *buf, long off, long cnt) ===================================================== ./zipfs.c 33a34,41 > extern void populate(char *); > extern void dotrunc(Ram *); > extern void docreate(Ram *); > extern char *doread(Ram *, long, long); > extern void popdir(Ram *); > extern void dowrite(Ram *, char *, long, long); > extern int dopermw(Ram *); > 101c109 < doread(Ram *r, uvlong off, long cnt) --- > doread(Ram *r, long off, long cnt) 113c121 < if (Bseek(bin, r->blockno, 0) < 0) --- > if (Bseek(bin, (uvlong)r->data & 0x7fffffff, 0) < 0) 142c150 < if (r->blockno & 0x80000000 && MUNGE_CR){ --- > if ((uvlong)r->data & 0x80000000 && MUNGE_CR){ 165c173 < dowrite(Ram *r, char *buf, uvlong off, long cnt) --- > dowrite(Ram *r, char *buf, long off, long cnt) ===================================================== ./tapfs.c 95c95 < doread(Ram *r, uvlong off, long cnt) --- > doread(Ram *r, long off, long cnt) 99c99 < seek(tapefile, 512*(int)r->blockno+off, 0); --- > seek(tapefile, 512*(vlong)r->data+off, 0); 105c105 < dowrite(Ram *r, char *buf, uvlong off, long cnt) --- > dowrite(Ram *r, char *buf, long off, long cnt) ===================================================== ./tarfs.c 38,39c38 < vlong blkno; < long isabs, chksum, linkflg; --- > long blkno, isabs, chksum, linkflg; 52c51 < f.blockno = blkno+1; --- > f.addr = (void*)(blkno+1); 56c55 < f.size = strtoull(dblock.dbuf.size, 0, 8); --- > f.size = strtoul(dblock.dbuf.size, 0, 8); 62c61 < || strrchr(dblock.dbuf.name, '\0')[-1] == '/') --- > || strrchr(dblock.dbuf.name, '\0')[-1] == '/'){ 63a63,64 > f.size = 0; > } 69c70 < abort(); --- > exits("checksum"); 100c101 < doread(Ram *r, uvlong off, long cnt) --- > doread(Ram *r, long off, long cnt) 103c104 < seek(tapefile, (TBLOCK * r->blockno)+off, 0); --- > seek(tapefile, (TBLOCK * (vlong)r->data)+off, 0); 117c118 < dowrite(Ram *r, char *buf, uvlong off, long cnt) --- > dowrite(Ram *r, char *buf, long off, long cnt) 132,133c133,134 < int i; < char *cp; --- > register i; > register char *cp; ===================================================== ./cpiofs.c 39c39 < uvlong getoct(char*, int); --- > int getoct(char*, int); 79c79 < f.blockno = (offset+sizeof(struct header)+namesize); --- > f.addr = (void*)(offset+sizeof(struct header)+namesize); 87c87 < uvlong --- > int 90c90 < uvlong r; --- > int r; 112c112 < doread(Ram *r, uvlong off, long cnt) --- > doread(Ram *r, long off, long cnt) 115c115 < seek(tapefile, r->blockno+off, 0); --- > seek(tapefile, (vlong)r->data+off, 0); 129c129 < dowrite(Ram *r, char *buf, uvlong off, long cnt) --- > dowrite(Ram *r, char *buf, long off, long cnt) ===================================================== ./v6fs.c 107c107 < doread(Ram *r, uvlong off, long cnt) --- > doread(Ram *r, long off, long cnt) 129c129 < dowrite(Ram *r, char *buf, uvlong off, long cnt) --- > dowrite(Ram *r, char *buf, long off, long cnt) ===================================================== ./tpfs.c 20c20 < unsigned char unused2[16]; --- > unsigned char unused[16]; 88c88 < doread(Ram *r, uvlong off, long cnt) --- > doread(Ram *r, long off, long cnt) 92c92 < seek(tapefile, 512*(int)r->blockno+off, 0); --- > seek(tapefile, 512*(vlong)r->data+off, 0); 98c98 < dowrite(Ram *r, char *buf, uvlong off, long cnt) --- > dowrite(Ram *r, char *buf, long off, long cnt) ===================================================== ./util.c 96c96 < ent->blockno = fi.blockno; --- > ent->data = fi.addr; 133c133 < ent->blockno = fi.blockno; --- > ent->data = fi.addr; ===================================================== ./tapefs.h 41,45c41,42 < union { < void *data; < uvlong blockno; < }; < uvlong ndata; --- > void *data; > long ndata; 65,69c62,63 < union { < void *addr; < uvlong blockno; < }; < uvlong size; --- > void *addr; > long size; 89,90c83,84 < char *doread(Ram*, uvlong, long); < void dowrite(Ram*, char*, uvlong, long); --- > char *doread(Ram*, long, long); > void dowrite(Ram*, char*, long, long); 92c86 < Idmap *_getpass(char*); --- > Idmap *getpass(char*); ===================================================== ./v10fs.c 106c106 < doread(Ram *r, uvlong off, long cnt) --- > doread(Ram *r, long off, long cnt) 109,113c109 < ulong bno; < int i; < < if (off>0xffffffff) < error("offset too large"); --- > int bno, i; 132c128 < dowrite(Ram *r, char *buf, uvlong off, long cnt) --- > dowrite(Ram *r, char *buf, long off, long cnt) =====================================================