1 64f7506b 2006-02-24 devnull #include <u.h>
2 64f7506b 2006-02-24 devnull #include <libc.h>
3 64f7506b 2006-02-24 devnull #include <auth.h>
4 64f7506b 2006-02-24 devnull #include <fcall.h>
5 64f7506b 2006-02-24 devnull #include "tapefs.h"
8 64f7506b 2006-02-24 devnull * File system for cpio tapes (read-only)
11 64f7506b 2006-02-24 devnull #define TBLOCK 512
12 64f7506b 2006-02-24 devnull #define NBLOCK 40 /* maximum blocksize */
13 64f7506b 2006-02-24 devnull #define DBLOCK 20 /* default blocksize */
14 64f7506b 2006-02-24 devnull #define TNAMSIZ 100
16 64f7506b 2006-02-24 devnull union hblock {
17 64f7506b 2006-02-24 devnull char dummy[TBLOCK];
18 64f7506b 2006-02-24 devnull char tbuf[Maxbuf];
19 64f7506b 2006-02-24 devnull struct header {
20 64f7506b 2006-02-24 devnull char magic[6];
21 64f7506b 2006-02-24 devnull char dev[6];
22 64f7506b 2006-02-24 devnull char ino[6];
23 64f7506b 2006-02-24 devnull char mode[6];
24 64f7506b 2006-02-24 devnull char uid[6];
25 64f7506b 2006-02-24 devnull char gid[6];
26 64f7506b 2006-02-24 devnull char nlink[6];
27 64f7506b 2006-02-24 devnull char rdev[6];
28 64f7506b 2006-02-24 devnull char mtime[11];
29 64f7506b 2006-02-24 devnull char namesize[6];
30 64f7506b 2006-02-24 devnull char size[11];
32 64f7506b 2006-02-24 devnull struct hname {
33 64f7506b 2006-02-24 devnull struct header x;
34 64f7506b 2006-02-24 devnull char name[1];
36 64f7506b 2006-02-24 devnull } dblock;
38 64f7506b 2006-02-24 devnull int tapefile;
39 64f7506b 2006-02-24 devnull vlong getoct(char*, int);
42 64f7506b 2006-02-24 devnull populate(char *name)
44 64f7506b 2006-02-24 devnull vlong offset;
45 64f7506b 2006-02-24 devnull long isabs, magic, namesize, mode;
46 64f7506b 2006-02-24 devnull Fileinf f;
48 64f7506b 2006-02-24 devnull tapefile = open(name, OREAD);
49 64f7506b 2006-02-24 devnull if (tapefile<0)
50 64f7506b 2006-02-24 devnull error("Can't open argument file");
51 64f7506b 2006-02-24 devnull replete = 1;
52 64f7506b 2006-02-24 devnull for (offset = 0;;) {
53 64f7506b 2006-02-24 devnull seek(tapefile, offset, 0);
54 64f7506b 2006-02-24 devnull if (read(tapefile, (char *)&dblock.dbuf, TBLOCK)<TBLOCK)
56 64f7506b 2006-02-24 devnull magic = getoct(dblock.dbuf.magic, sizeof(dblock.dbuf.magic));
57 64f7506b 2006-02-24 devnull if (magic != 070707){
58 64f7506b 2006-02-24 devnull print("%lo\n", magic);
59 64f7506b 2006-02-24 devnull error("out of phase--get help");
61 64f7506b 2006-02-24 devnull if (dblock.nbuf.name[0]=='\0' || strcmp(dblock.nbuf.name, "TRAILER!!!")==0)
63 64f7506b 2006-02-24 devnull mode = getoct(dblock.dbuf.mode, sizeof(dblock.dbuf.mode));
64 64f7506b 2006-02-24 devnull f.mode = mode&0777;
65 64f7506b 2006-02-24 devnull switch(mode & 0170000) {
66 64f7506b 2006-02-24 devnull case 0040000:
67 64f7506b 2006-02-24 devnull f.mode |= DMDIR;
69 64f7506b 2006-02-24 devnull case 0100000:
72 64f7506b 2006-02-24 devnull f.mode = 0;
75 64f7506b 2006-02-24 devnull f.uid = getoct(dblock.dbuf.uid, sizeof(dblock.dbuf.uid));
76 64f7506b 2006-02-24 devnull f.gid = getoct(dblock.dbuf.gid, sizeof(dblock.dbuf.gid));
77 64f7506b 2006-02-24 devnull f.size = getoct(dblock.dbuf.size, sizeof(dblock.dbuf.size));
78 64f7506b 2006-02-24 devnull f.mdate = getoct(dblock.dbuf.mtime, sizeof(dblock.dbuf.mtime));
79 64f7506b 2006-02-24 devnull namesize = getoct(dblock.dbuf.namesize, sizeof(dblock.dbuf.namesize));
80 64f7506b 2006-02-24 devnull f.addr = offset+sizeof(struct header)+namesize;
81 64f7506b 2006-02-24 devnull isabs = dblock.nbuf.name[0]=='/';
82 64f7506b 2006-02-24 devnull f.name = &dblock.nbuf.name[isabs];
83 64f7506b 2006-02-24 devnull poppath(f, 1);
84 64f7506b 2006-02-24 devnull offset += sizeof(struct header)+namesize+f.size;
89 64f7506b 2006-02-24 devnull getoct(char *p, int l)
93 64f7506b 2006-02-24 devnull for (r=0; l>0; p++, l--){
95 64f7506b 2006-02-24 devnull r += *p-'0';
97 64f7506b 2006-02-24 devnull return r;
101 64f7506b 2006-02-24 devnull dotrunc(Ram *r)
103 64f7506b 2006-02-24 devnull USED(r);
107 64f7506b 2006-02-24 devnull docreate(Ram *r)
109 64f7506b 2006-02-24 devnull USED(r);
113 64f7506b 2006-02-24 devnull doread(Ram *r, vlong off, long cnt)
115 64f7506b 2006-02-24 devnull seek(tapefile, r->addr+off, 0);
116 64f7506b 2006-02-24 devnull if (cnt>sizeof(dblock.tbuf))
117 64f7506b 2006-02-24 devnull error("read too big");
118 64f7506b 2006-02-24 devnull read(tapefile, dblock.tbuf, cnt);
119 64f7506b 2006-02-24 devnull return dblock.tbuf;
123 64f7506b 2006-02-24 devnull popdir(Ram *r)
125 64f7506b 2006-02-24 devnull USED(r);
129 64f7506b 2006-02-24 devnull dowrite(Ram *r, char *buf, long off, long cnt)
131 64f7506b 2006-02-24 devnull USED(r); USED(buf); USED(off); USED(cnt);
135 64f7506b 2006-02-24 devnull dopermw(Ram *r)
137 64f7506b 2006-02-24 devnull USED(r);
138 64f7506b 2006-02-24 devnull return 0;