xref: /plan9/sys/src/cmd/tapefs/cpiofs.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
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