Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <auth.h>
4 #include <fcall.h>
5 #include "tapefs.h"
7 /*
8 * File system for cpio tapes (read-only)
9 */
11 #define TBLOCK 512
12 #define NBLOCK 40 /* maximum blocksize */
13 #define DBLOCK 20 /* default blocksize */
14 #define TNAMSIZ 100
16 union hblock {
17 char dummy[TBLOCK];
18 char tbuf[Maxbuf];
19 struct header {
20 char magic[6];
21 char dev[6];
22 char ino[6];
23 char mode[6];
24 char uid[6];
25 char gid[6];
26 char nlink[6];
27 char rdev[6];
28 char mtime[11];
29 char namesize[6];
30 char size[11];
31 } dbuf;
32 struct hname {
33 struct header x;
34 char name[1];
35 } nbuf;
36 } dblock;
38 int tapefile;
39 vlong getoct(char*, int);
41 void
42 populate(char *name)
43 {
44 vlong offset;
45 long isabs, magic, namesize, mode;
46 Fileinf f;
48 tapefile = open(name, OREAD);
49 if (tapefile<0)
50 error("Can't open argument file");
51 replete = 1;
52 for (offset = 0;;) {
53 seek(tapefile, offset, 0);
54 if (read(tapefile, (char *)&dblock.dbuf, TBLOCK)<TBLOCK)
55 break;
56 magic = getoct(dblock.dbuf.magic, sizeof(dblock.dbuf.magic));
57 if (magic != 070707){
58 print("%lo\n", magic);
59 error("out of phase--get help");
60 }
61 if (dblock.nbuf.name[0]=='\0' || strcmp(dblock.nbuf.name, "TRAILER!!!")==0)
62 break;
63 mode = getoct(dblock.dbuf.mode, sizeof(dblock.dbuf.mode));
64 f.mode = mode&0777;
65 switch(mode & 0170000) {
66 case 0040000:
67 f.mode |= DMDIR;
68 break;
69 case 0100000:
70 break;
71 default:
72 f.mode = 0;
73 break;
74 }
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];
83 poppath(f, 1);
84 offset += sizeof(struct header)+namesize+f.size;
85 }
86 }
88 vlong
89 getoct(char *p, int l)
90 {
91 vlong r;
93 for (r=0; l>0; p++, l--){
94 r <<= 3;
95 r += *p-'0';
96 }
97 return r;
98 }
100 void
101 dotrunc(Ram *r)
103 USED(r);
106 void
107 docreate(Ram *r)
109 USED(r);
112 char *
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);
119 return dblock.tbuf;
122 void
123 popdir(Ram *r)
125 USED(r);
128 void
129 dowrite(Ram *r, char *buf, long off, long cnt)
131 USED(r); USED(buf); USED(off); USED(cnt);
134 int
135 dopermw(Ram *r)
137 USED(r);
138 return 0;