Blame


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"
6 64f7506b 2006-02-24 devnull
7 64f7506b 2006-02-24 devnull /*
8 64f7506b 2006-02-24 devnull * File system for cpio tapes (read-only)
9 64f7506b 2006-02-24 devnull */
10 64f7506b 2006-02-24 devnull
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
15 64f7506b 2006-02-24 devnull
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];
31 64f7506b 2006-02-24 devnull } dbuf;
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];
35 64f7506b 2006-02-24 devnull } nbuf;
36 64f7506b 2006-02-24 devnull } dblock;
37 64f7506b 2006-02-24 devnull
38 64f7506b 2006-02-24 devnull int tapefile;
39 64f7506b 2006-02-24 devnull vlong getoct(char*, int);
40 64f7506b 2006-02-24 devnull
41 64f7506b 2006-02-24 devnull void
42 64f7506b 2006-02-24 devnull populate(char *name)
43 64f7506b 2006-02-24 devnull {
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;
47 64f7506b 2006-02-24 devnull
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)
55 64f7506b 2006-02-24 devnull break;
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");
60 64f7506b 2006-02-24 devnull }
61 64f7506b 2006-02-24 devnull if (dblock.nbuf.name[0]=='\0' || strcmp(dblock.nbuf.name, "TRAILER!!!")==0)
62 64f7506b 2006-02-24 devnull break;
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;
68 64f7506b 2006-02-24 devnull break;
69 64f7506b 2006-02-24 devnull case 0100000:
70 64f7506b 2006-02-24 devnull break;
71 64f7506b 2006-02-24 devnull default:
72 64f7506b 2006-02-24 devnull f.mode = 0;
73 64f7506b 2006-02-24 devnull break;
74 64f7506b 2006-02-24 devnull }
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;
85 64f7506b 2006-02-24 devnull }
86 64f7506b 2006-02-24 devnull }
87 64f7506b 2006-02-24 devnull
88 64f7506b 2006-02-24 devnull vlong
89 64f7506b 2006-02-24 devnull getoct(char *p, int l)
90 64f7506b 2006-02-24 devnull {
91 64f7506b 2006-02-24 devnull vlong r;
92 64f7506b 2006-02-24 devnull
93 64f7506b 2006-02-24 devnull for (r=0; l>0; p++, l--){
94 64f7506b 2006-02-24 devnull r <<= 3;
95 64f7506b 2006-02-24 devnull r += *p-'0';
96 64f7506b 2006-02-24 devnull }
97 64f7506b 2006-02-24 devnull return r;
98 64f7506b 2006-02-24 devnull }
99 64f7506b 2006-02-24 devnull
100 64f7506b 2006-02-24 devnull void
101 64f7506b 2006-02-24 devnull dotrunc(Ram *r)
102 64f7506b 2006-02-24 devnull {
103 64f7506b 2006-02-24 devnull USED(r);
104 64f7506b 2006-02-24 devnull }
105 64f7506b 2006-02-24 devnull
106 64f7506b 2006-02-24 devnull void
107 64f7506b 2006-02-24 devnull docreate(Ram *r)
108 64f7506b 2006-02-24 devnull {
109 64f7506b 2006-02-24 devnull USED(r);
110 64f7506b 2006-02-24 devnull }
111 64f7506b 2006-02-24 devnull
112 64f7506b 2006-02-24 devnull char *
113 64f7506b 2006-02-24 devnull doread(Ram *r, vlong off, long cnt)
114 64f7506b 2006-02-24 devnull {
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;
120 64f7506b 2006-02-24 devnull }
121 64f7506b 2006-02-24 devnull
122 64f7506b 2006-02-24 devnull void
123 64f7506b 2006-02-24 devnull popdir(Ram *r)
124 64f7506b 2006-02-24 devnull {
125 64f7506b 2006-02-24 devnull USED(r);
126 64f7506b 2006-02-24 devnull }
127 64f7506b 2006-02-24 devnull
128 64f7506b 2006-02-24 devnull void
129 64f7506b 2006-02-24 devnull dowrite(Ram *r, char *buf, long off, long cnt)
130 64f7506b 2006-02-24 devnull {
131 64f7506b 2006-02-24 devnull USED(r); USED(buf); USED(off); USED(cnt);
132 64f7506b 2006-02-24 devnull }
133 64f7506b 2006-02-24 devnull
134 64f7506b 2006-02-24 devnull int
135 64f7506b 2006-02-24 devnull dopermw(Ram *r)
136 64f7506b 2006-02-24 devnull {
137 64f7506b 2006-02-24 devnull USED(r);
138 64f7506b 2006-02-24 devnull return 0;
139 64f7506b 2006-02-24 devnull }