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 tar 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 name[TNAMSIZ];
21 64f7506b 2006-02-24 devnull char mode[8];
22 64f7506b 2006-02-24 devnull char uid[8];
23 64f7506b 2006-02-24 devnull char gid[8];
24 64f7506b 2006-02-24 devnull char size[12];
25 64f7506b 2006-02-24 devnull char mtime[12];
26 64f7506b 2006-02-24 devnull char chksum[8];
27 64f7506b 2006-02-24 devnull char linkflag;
28 64f7506b 2006-02-24 devnull char linkname[TNAMSIZ];
29 64f7506b 2006-02-24 devnull } dbuf;
30 64f7506b 2006-02-24 devnull } dblock;
31 64f7506b 2006-02-24 devnull
32 64f7506b 2006-02-24 devnull int tapefile;
33 64f7506b 2006-02-24 devnull int checksum(void);
34 64f7506b 2006-02-24 devnull
35 64f7506b 2006-02-24 devnull void
36 64f7506b 2006-02-24 devnull populate(char *name)
37 64f7506b 2006-02-24 devnull {
38 64f7506b 2006-02-24 devnull long blkno, isabs, chksum, linkflg;
39 64f7506b 2006-02-24 devnull Fileinf f;
40 64f7506b 2006-02-24 devnull
41 64f7506b 2006-02-24 devnull tapefile = open(name, OREAD);
42 64f7506b 2006-02-24 devnull if (tapefile<0)
43 64f7506b 2006-02-24 devnull error("Can't open argument file");
44 64f7506b 2006-02-24 devnull replete = 1;
45 64f7506b 2006-02-24 devnull for (blkno = 0;;) {
46 64f7506b 2006-02-24 devnull seek(tapefile, TBLOCK*blkno, 0);
47 64f7506b 2006-02-24 devnull if (read(tapefile, dblock.dummy, sizeof(dblock.dummy))<sizeof(dblock.dummy))
48 64f7506b 2006-02-24 devnull break;
49 64f7506b 2006-02-24 devnull if (dblock.dbuf.name[0]=='\0')
50 64f7506b 2006-02-24 devnull break;
51 64f7506b 2006-02-24 devnull f.addr = blkno+1;
52 64f7506b 2006-02-24 devnull f.mode = strtoul(dblock.dbuf.mode, 0, 8);
53 64f7506b 2006-02-24 devnull f.uid = strtoul(dblock.dbuf.uid, 0, 8);
54 64f7506b 2006-02-24 devnull f.gid = strtoul(dblock.dbuf.gid, 0, 8);
55 64f7506b 2006-02-24 devnull if((uchar)dblock.dbuf.size[0] == 0x80)
56 38c7eb9b 2006-05-21 devnull f.size = b8byte(dblock.dbuf.size+3);
57 64f7506b 2006-02-24 devnull else
58 64f7506b 2006-02-24 devnull f.size = strtoull(dblock.dbuf.size, 0, 8);
59 64f7506b 2006-02-24 devnull f.mdate = strtoul(dblock.dbuf.mtime, 0, 8);
60 64f7506b 2006-02-24 devnull chksum = strtoul(dblock.dbuf.chksum, 0, 8);
61 64f7506b 2006-02-24 devnull /* the mode test is ugly but sometimes necessary */
62 64f7506b 2006-02-24 devnull if (dblock.dbuf.linkflag == '5'
63 64f7506b 2006-02-24 devnull || (f.mode&0170000) == 040000
64 64f7506b 2006-02-24 devnull || strrchr(dblock.dbuf.name, '\0')[-1] == '/'){
65 64f7506b 2006-02-24 devnull f.mode |= DMDIR;
66 64f7506b 2006-02-24 devnull f.size = 0;
67 64f7506b 2006-02-24 devnull }
68 64f7506b 2006-02-24 devnull f.mode &= DMDIR|0777;
69 64f7506b 2006-02-24 devnull linkflg = dblock.dbuf.linkflag=='s' || dblock.dbuf.linkflag=='1';
70 64f7506b 2006-02-24 devnull isabs = dblock.dbuf.name[0]=='/';
71 64f7506b 2006-02-24 devnull if (chksum != checksum()){
72 64f7506b 2006-02-24 devnull fprint(1, "bad checksum on %.28s\n", dblock.dbuf.name);
73 64f7506b 2006-02-24 devnull exits("checksum");
74 64f7506b 2006-02-24 devnull }
75 64f7506b 2006-02-24 devnull if (linkflg) {
76 64f7506b 2006-02-24 devnull /*fprint(2, "link %s->%s skipped\n", dblock.dbuf.name,
77 64f7506b 2006-02-24 devnull dblock.dbuf.linkname);*/
78 64f7506b 2006-02-24 devnull f.size = 0;
79 64f7506b 2006-02-24 devnull blkno += 1;
80 64f7506b 2006-02-24 devnull continue;
81 64f7506b 2006-02-24 devnull }
82 64f7506b 2006-02-24 devnull f.name = dblock.dbuf.name+isabs;
83 64f7506b 2006-02-24 devnull if (f.name[0]=='\0')
84 64f7506b 2006-02-24 devnull fprint(1, "null name skipped\n");
85 64f7506b 2006-02-24 devnull else
86 64f7506b 2006-02-24 devnull poppath(f, 1);
87 64f7506b 2006-02-24 devnull blkno += 1 + (f.size+TBLOCK-1)/TBLOCK;
88 64f7506b 2006-02-24 devnull }
89 64f7506b 2006-02-24 devnull }
90 64f7506b 2006-02-24 devnull
91 64f7506b 2006-02-24 devnull void
92 64f7506b 2006-02-24 devnull dotrunc(Ram *r)
93 64f7506b 2006-02-24 devnull {
94 64f7506b 2006-02-24 devnull USED(r);
95 64f7506b 2006-02-24 devnull }
96 64f7506b 2006-02-24 devnull
97 64f7506b 2006-02-24 devnull void
98 64f7506b 2006-02-24 devnull docreate(Ram *r)
99 64f7506b 2006-02-24 devnull {
100 64f7506b 2006-02-24 devnull USED(r);
101 64f7506b 2006-02-24 devnull }
102 64f7506b 2006-02-24 devnull
103 64f7506b 2006-02-24 devnull char *
104 64f7506b 2006-02-24 devnull doread(Ram *r, vlong off, long cnt)
105 64f7506b 2006-02-24 devnull {
106 64f7506b 2006-02-24 devnull seek(tapefile, TBLOCK*r->addr+off, 0);
107 64f7506b 2006-02-24 devnull if (cnt>sizeof(dblock.tbuf))
108 64f7506b 2006-02-24 devnull error("read too big");
109 64f7506b 2006-02-24 devnull read(tapefile, dblock.tbuf, cnt);
110 64f7506b 2006-02-24 devnull return dblock.tbuf;
111 64f7506b 2006-02-24 devnull }
112 64f7506b 2006-02-24 devnull
113 64f7506b 2006-02-24 devnull void
114 64f7506b 2006-02-24 devnull popdir(Ram *r)
115 64f7506b 2006-02-24 devnull {
116 64f7506b 2006-02-24 devnull USED(r);
117 64f7506b 2006-02-24 devnull }
118 64f7506b 2006-02-24 devnull
119 64f7506b 2006-02-24 devnull void
120 64f7506b 2006-02-24 devnull dowrite(Ram *r, char *buf, long off, long cnt)
121 64f7506b 2006-02-24 devnull {
122 64f7506b 2006-02-24 devnull USED(r); USED(buf); USED(off); USED(cnt);
123 64f7506b 2006-02-24 devnull }
124 64f7506b 2006-02-24 devnull
125 64f7506b 2006-02-24 devnull int
126 64f7506b 2006-02-24 devnull dopermw(Ram *r)
127 64f7506b 2006-02-24 devnull {
128 64f7506b 2006-02-24 devnull USED(r);
129 64f7506b 2006-02-24 devnull return 0;
130 64f7506b 2006-02-24 devnull }
131 64f7506b 2006-02-24 devnull
132 64f7506b 2006-02-24 devnull int
133 64f7506b 2006-02-24 devnull checksum()
134 64f7506b 2006-02-24 devnull {
135 64f7506b 2006-02-24 devnull int i;
136 64f7506b 2006-02-24 devnull char *cp;
137 64f7506b 2006-02-24 devnull
138 64f7506b 2006-02-24 devnull for (cp = dblock.dbuf.chksum; cp < &dblock.dbuf.chksum[sizeof(dblock.dbuf.chksum)]; cp++)
139 64f7506b 2006-02-24 devnull *cp = ' ';
140 64f7506b 2006-02-24 devnull i = 0;
141 64f7506b 2006-02-24 devnull for (cp = dblock.dummy; cp < &dblock.dummy[TBLOCK]; cp++)
142 64f7506b 2006-02-24 devnull i += *cp&0xff;
143 64f7506b 2006-02-24 devnull return(i);
144 64f7506b 2006-02-24 devnull }