8 * File system for cpio tapes (read-only)
12 #define NBLOCK 40 /* maximum blocksize */
13 #define DBLOCK 20 /* default blocksize */
39 vlong getoct(char*, int);
45 long isabs, magic, namesize, mode;
48 tapefile = open(name, OREAD);
50 error("Can't open argument file");
53 seek(tapefile, offset, 0);
54 if (read(tapefile, (char *)&dblock.dbuf, TBLOCK)<TBLOCK)
56 magic = getoct(dblock.dbuf.magic, sizeof(dblock.dbuf.magic));
58 print("%lo\n", magic);
59 error("out of phase--get help");
61 if (dblock.nbuf.name[0]=='\0' || strcmp(dblock.nbuf.name, "TRAILER!!!")==0)
63 mode = getoct(dblock.dbuf.mode, sizeof(dblock.dbuf.mode));
65 switch(mode & 0170000) {
75 f.uid = getoct(dblock.dbuf.uid, sizeof(dblock.dbuf.uid));
76 f.gid = getoct(dblock.dbuf.gid, sizeof(dblock.dbuf.gid));
77 f.size = getoct(dblock.dbuf.size, sizeof(dblock.dbuf.size));
78 f.mdate = getoct(dblock.dbuf.mtime, sizeof(dblock.dbuf.mtime));
79 namesize = getoct(dblock.dbuf.namesize, sizeof(dblock.dbuf.namesize));
80 f.addr = offset+sizeof(struct header)+namesize;
81 isabs = dblock.nbuf.name[0]=='/';
82 f.name = &dblock.nbuf.name[isabs];
84 offset += sizeof(struct header)+namesize+f.size;
89 getoct(char *p, int l)
93 for (r=0; l>0; p++, l--){
113 doread(Ram *r, vlong off, long cnt)
115 seek(tapefile, r->addr+off, 0);
116 if (cnt>sizeof(dblock.tbuf))
117 error("read too big");
118 read(tapefile, dblock.tbuf, cnt);
129 dowrite(Ram *r, char *buf, long off, long cnt)
131 USED(r); USED(buf); USED(off); USED(cnt);