1bd389b36SDavid du Colombier #include <u.h> 2bd389b36SDavid du Colombier #include <libc.h> 3*219b2ee8SDavid du Colombier #include <auth.h> 4bd389b36SDavid du Colombier #include <fcall.h> 5bd389b36SDavid du Colombier #include "tapefs.h" 6bd389b36SDavid du Colombier 7bd389b36SDavid du Colombier /* 8bd389b36SDavid du Colombier * File system for cpio tapes (read-only) 9bd389b36SDavid du Colombier */ 10bd389b36SDavid du Colombier 11bd389b36SDavid du Colombier #define TBLOCK 512 12bd389b36SDavid du Colombier #define NBLOCK 40 /* maximum blocksize */ 13bd389b36SDavid du Colombier #define DBLOCK 20 /* default blocksize */ 14bd389b36SDavid du Colombier #define TNAMSIZ 100 15bd389b36SDavid du Colombier 16bd389b36SDavid du Colombier union hblock { 17bd389b36SDavid du Colombier char dummy[TBLOCK]; 18bd389b36SDavid du Colombier char tbuf[MAXFDATA]; 19bd389b36SDavid du Colombier struct header { 20bd389b36SDavid du Colombier char magic[6]; 21bd389b36SDavid du Colombier char dev[6]; 22bd389b36SDavid du Colombier char ino[6]; 23bd389b36SDavid du Colombier char mode[6]; 24bd389b36SDavid du Colombier char uid[6]; 25bd389b36SDavid du Colombier char gid[6]; 26bd389b36SDavid du Colombier char nlink[6]; 27bd389b36SDavid du Colombier char rdev[6]; 28bd389b36SDavid du Colombier char mtime[11]; 29bd389b36SDavid du Colombier char namesize[6]; 30bd389b36SDavid du Colombier char size[11]; 31bd389b36SDavid du Colombier } dbuf; 32bd389b36SDavid du Colombier struct hname { 33bd389b36SDavid du Colombier struct header x; 34bd389b36SDavid du Colombier char name[1]; 35bd389b36SDavid du Colombier } nbuf; 36bd389b36SDavid du Colombier } dblock; 37bd389b36SDavid du Colombier 38bd389b36SDavid du Colombier int tapefile; 39bd389b36SDavid du Colombier int getoct(char*, int); 40bd389b36SDavid du Colombier 41bd389b36SDavid du Colombier void 42bd389b36SDavid du Colombier populate(char *name) 43bd389b36SDavid du Colombier { 44bd389b36SDavid du Colombier long offset, isabs, magic, linkflg, namesize, mode; 45bd389b36SDavid du Colombier Fileinf f; 46bd389b36SDavid du Colombier 47bd389b36SDavid du Colombier tapefile = open(name, OREAD); 48bd389b36SDavid du Colombier if (tapefile<0) 49bd389b36SDavid du Colombier error("Can't open argument file"); 50bd389b36SDavid du Colombier replete = 1; 51bd389b36SDavid du Colombier for (offset = 0;;) { 52bd389b36SDavid du Colombier seek(tapefile, offset, 0); 53bd389b36SDavid du Colombier if (read(tapefile, (char *)&dblock.dbuf, TBLOCK)<TBLOCK) 54bd389b36SDavid du Colombier break; 55bd389b36SDavid du Colombier magic = getoct(dblock.dbuf.magic, sizeof(dblock.dbuf.magic)); 56bd389b36SDavid du Colombier if (magic != 070707){ 57bd389b36SDavid du Colombier print("%o\n", magic); 58bd389b36SDavid du Colombier error("out of phase--get help"); 59bd389b36SDavid du Colombier } 60bd389b36SDavid du Colombier if (dblock.nbuf.name[0]=='\0' || strcmp(dblock.nbuf.name, "TRAILER!!!")==0) 61bd389b36SDavid du Colombier break; 62bd389b36SDavid du Colombier mode = getoct(dblock.dbuf.mode, sizeof(dblock.dbuf.mode)); 63bd389b36SDavid du Colombier f.mode = mode&0777; 64bd389b36SDavid du Colombier switch(mode & 0170000) { 65bd389b36SDavid du Colombier case 0040000: 66bd389b36SDavid du Colombier f.mode |= CHDIR; 67bd389b36SDavid du Colombier break; 68bd389b36SDavid du Colombier case 0100000: 69bd389b36SDavid du Colombier break; 70bd389b36SDavid du Colombier default: 71bd389b36SDavid du Colombier f.mode = 0; 72bd389b36SDavid du Colombier break; 73bd389b36SDavid du Colombier } 74bd389b36SDavid du Colombier f.uid = getoct(dblock.dbuf.uid, sizeof(dblock.dbuf.uid)); 75bd389b36SDavid du Colombier f.gid = getoct(dblock.dbuf.gid, sizeof(dblock.dbuf.gid)); 76bd389b36SDavid du Colombier f.size = getoct(dblock.dbuf.size, sizeof(dblock.dbuf.size)); 77bd389b36SDavid du Colombier f.mdate = getoct(dblock.dbuf.mtime, sizeof(dblock.dbuf.mtime)); 78bd389b36SDavid du Colombier linkflg = 0; 79bd389b36SDavid du Colombier namesize = getoct(dblock.dbuf.namesize, sizeof(dblock.dbuf.namesize)); 80bd389b36SDavid du Colombier f.addr = (void*)(offset+sizeof(struct header)+namesize); 81bd389b36SDavid du Colombier isabs = dblock.nbuf.name[0]=='/'; 82bd389b36SDavid du Colombier /* if (linkflg) { 83bd389b36SDavid du Colombier fprint(2, "link %s->%s skipped\n", dblock.dbuf.name, 84bd389b36SDavid du Colombier dblock.dbuf.linkname); 85bd389b36SDavid du Colombier f.size = 0; 86bd389b36SDavid du Colombier blkno += 1; 87bd389b36SDavid du Colombier continue; 88bd389b36SDavid du Colombier }*/ 89bd389b36SDavid du Colombier f.name = &dblock.nbuf.name[isabs]; 90bd389b36SDavid du Colombier poppath(f, 1); 91bd389b36SDavid du Colombier offset += sizeof(struct header)+namesize+f.size; 92bd389b36SDavid du Colombier } 93bd389b36SDavid du Colombier } 94bd389b36SDavid du Colombier 95bd389b36SDavid du Colombier int 96bd389b36SDavid du Colombier getoct(char *p, int l) 97bd389b36SDavid du Colombier { 98bd389b36SDavid du Colombier int r; 99bd389b36SDavid du Colombier 100bd389b36SDavid du Colombier for (r=0; l>0; p++, l--){ 101bd389b36SDavid du Colombier r <<= 3; 102bd389b36SDavid du Colombier r += *p-'0'; 103bd389b36SDavid du Colombier } 104bd389b36SDavid du Colombier return r; 105bd389b36SDavid du Colombier } 106bd389b36SDavid du Colombier 107bd389b36SDavid du Colombier void 108bd389b36SDavid du Colombier dotrunc(Ram *r) 109bd389b36SDavid du Colombier { 110bd389b36SDavid du Colombier USED(r); 111bd389b36SDavid du Colombier } 112bd389b36SDavid du Colombier 113bd389b36SDavid du Colombier void 114bd389b36SDavid du Colombier docreate(Ram *r) 115bd389b36SDavid du Colombier { 116bd389b36SDavid du Colombier USED(r); 117bd389b36SDavid du Colombier } 118bd389b36SDavid du Colombier 119bd389b36SDavid du Colombier char * 120bd389b36SDavid du Colombier doread(Ram *r, long off, long cnt) 121bd389b36SDavid du Colombier { 122bd389b36SDavid du Colombier 123bd389b36SDavid du Colombier seek(tapefile, (long)r->data+off, 0); 124bd389b36SDavid du Colombier if (cnt>sizeof(dblock.tbuf)) 125bd389b36SDavid du Colombier error("read too big"); 126bd389b36SDavid du Colombier read(tapefile, dblock.tbuf, cnt); 127bd389b36SDavid du Colombier return dblock.tbuf; 128bd389b36SDavid du Colombier } 129bd389b36SDavid du Colombier 130bd389b36SDavid du Colombier void 131bd389b36SDavid du Colombier popdir(Ram *r) 132bd389b36SDavid du Colombier { 133bd389b36SDavid du Colombier USED(r); 134bd389b36SDavid du Colombier } 135bd389b36SDavid du Colombier 136bd389b36SDavid du Colombier void 137bd389b36SDavid du Colombier dowrite(Ram *r, char *buf, long off, long cnt) 138bd389b36SDavid du Colombier { 139bd389b36SDavid du Colombier USED(r); USED(buf); USED(off); USED(cnt); 140bd389b36SDavid du Colombier } 141bd389b36SDavid du Colombier 142bd389b36SDavid du Colombier int 143bd389b36SDavid du Colombier dopermw(Ram *r) 144bd389b36SDavid du Colombier { 145bd389b36SDavid du Colombier USED(r); 146bd389b36SDavid du Colombier return 0; 147bd389b36SDavid du Colombier } 148