xref: /plan9/sys/src/cmd/tapefs/cpiofs.c (revision 41fe996ad1ef7168ab61531223f4e75c6cf225c2)
1bd389b36SDavid du Colombier #include <u.h>
2bd389b36SDavid du Colombier #include <libc.h>
3219b2ee8SDavid 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];
189a747e4fSDavid du Colombier 	char tbuf[Maxbuf];
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;
39*41fe996aSDavid du Colombier vlong	getoct(char*, int);
40bd389b36SDavid du Colombier 
41bd389b36SDavid du Colombier void
populate(char * name)42bd389b36SDavid du Colombier populate(char *name)
43bd389b36SDavid du Colombier {
44*41fe996aSDavid du Colombier 	vlong offset;
45*41fe996aSDavid du Colombier 	long isabs, magic, namesize, mode;
46bd389b36SDavid du Colombier 	Fileinf f;
47bd389b36SDavid du Colombier 
48bd389b36SDavid du Colombier 	tapefile = open(name, OREAD);
49bd389b36SDavid du Colombier 	if (tapefile<0)
50bd389b36SDavid du Colombier 		error("Can't open argument file");
51bd389b36SDavid du Colombier 	replete = 1;
52bd389b36SDavid du Colombier 	for (offset = 0;;) {
53bd389b36SDavid du Colombier 		seek(tapefile, offset, 0);
54bd389b36SDavid du Colombier 		if (read(tapefile, (char *)&dblock.dbuf, TBLOCK)<TBLOCK)
55bd389b36SDavid du Colombier 			break;
56bd389b36SDavid du Colombier 		magic = getoct(dblock.dbuf.magic, sizeof(dblock.dbuf.magic));
57bd389b36SDavid du Colombier 		if (magic != 070707){
587dd7cddfSDavid du Colombier 			print("%lo\n", magic);
59bd389b36SDavid du Colombier 			error("out of phase--get help");
60bd389b36SDavid du Colombier 		}
61bd389b36SDavid du Colombier 		if (dblock.nbuf.name[0]=='\0' || strcmp(dblock.nbuf.name, "TRAILER!!!")==0)
62bd389b36SDavid du Colombier 			break;
63bd389b36SDavid du Colombier 		mode = getoct(dblock.dbuf.mode, sizeof(dblock.dbuf.mode));
64bd389b36SDavid du Colombier 		f.mode = mode&0777;
65bd389b36SDavid du Colombier 		switch(mode & 0170000) {
66bd389b36SDavid du Colombier 		case 0040000:
679a747e4fSDavid du Colombier 			f.mode |= DMDIR;
68bd389b36SDavid du Colombier 			break;
69bd389b36SDavid du Colombier 		case 0100000:
70bd389b36SDavid du Colombier 			break;
71bd389b36SDavid du Colombier 		default:
72bd389b36SDavid du Colombier 			f.mode = 0;
73bd389b36SDavid du Colombier 			break;
74bd389b36SDavid du Colombier 		}
75bd389b36SDavid du Colombier 		f.uid = getoct(dblock.dbuf.uid, sizeof(dblock.dbuf.uid));
76bd389b36SDavid du Colombier 		f.gid = getoct(dblock.dbuf.gid, sizeof(dblock.dbuf.gid));
77bd389b36SDavid du Colombier 		f.size = getoct(dblock.dbuf.size, sizeof(dblock.dbuf.size));
78bd389b36SDavid du Colombier 		f.mdate = getoct(dblock.dbuf.mtime, sizeof(dblock.dbuf.mtime));
79bd389b36SDavid du Colombier 		namesize = getoct(dblock.dbuf.namesize, sizeof(dblock.dbuf.namesize));
80*41fe996aSDavid du Colombier 		f.addr = offset+sizeof(struct header)+namesize;
81bd389b36SDavid du Colombier 		isabs = dblock.nbuf.name[0]=='/';
82bd389b36SDavid du Colombier 		f.name = &dblock.nbuf.name[isabs];
83bd389b36SDavid du Colombier 		poppath(f, 1);
84bd389b36SDavid du Colombier 		offset += sizeof(struct header)+namesize+f.size;
85bd389b36SDavid du Colombier 	}
86bd389b36SDavid du Colombier }
87bd389b36SDavid du Colombier 
88*41fe996aSDavid du Colombier vlong
getoct(char * p,int l)89bd389b36SDavid du Colombier getoct(char *p, int l)
90bd389b36SDavid du Colombier {
91*41fe996aSDavid du Colombier 	vlong r;
92bd389b36SDavid du Colombier 
93bd389b36SDavid du Colombier 	for (r=0; l>0; p++, l--){
94bd389b36SDavid du Colombier 		r <<= 3;
95bd389b36SDavid du Colombier 		r += *p-'0';
96bd389b36SDavid du Colombier 	}
97bd389b36SDavid du Colombier 	return r;
98bd389b36SDavid du Colombier }
99bd389b36SDavid du Colombier 
100bd389b36SDavid du Colombier void
dotrunc(Ram * r)101bd389b36SDavid du Colombier dotrunc(Ram *r)
102bd389b36SDavid du Colombier {
103bd389b36SDavid du Colombier 	USED(r);
104bd389b36SDavid du Colombier }
105bd389b36SDavid du Colombier 
106bd389b36SDavid du Colombier void
docreate(Ram * r)107bd389b36SDavid du Colombier docreate(Ram *r)
108bd389b36SDavid du Colombier {
109bd389b36SDavid du Colombier 	USED(r);
110bd389b36SDavid du Colombier }
111bd389b36SDavid du Colombier 
112bd389b36SDavid du Colombier char *
doread(Ram * r,vlong off,long cnt)113*41fe996aSDavid du Colombier doread(Ram *r, vlong off, long cnt)
114bd389b36SDavid du Colombier {
115*41fe996aSDavid du Colombier 	seek(tapefile, r->addr+off, 0);
116bd389b36SDavid du Colombier 	if (cnt>sizeof(dblock.tbuf))
117bd389b36SDavid du Colombier 		error("read too big");
118bd389b36SDavid du Colombier 	read(tapefile, dblock.tbuf, cnt);
119bd389b36SDavid du Colombier 	return dblock.tbuf;
120bd389b36SDavid du Colombier }
121bd389b36SDavid du Colombier 
122bd389b36SDavid du Colombier void
popdir(Ram * r)123bd389b36SDavid du Colombier popdir(Ram *r)
124bd389b36SDavid du Colombier {
125bd389b36SDavid du Colombier 	USED(r);
126bd389b36SDavid du Colombier }
127bd389b36SDavid du Colombier 
128bd389b36SDavid du Colombier void
dowrite(Ram * r,char * buf,long off,long cnt)129bd389b36SDavid du Colombier dowrite(Ram *r, char *buf, long off, long cnt)
130bd389b36SDavid du Colombier {
131bd389b36SDavid du Colombier 	USED(r); USED(buf); USED(off); USED(cnt);
132bd389b36SDavid du Colombier }
133bd389b36SDavid du Colombier 
134bd389b36SDavid du Colombier int
dopermw(Ram * r)135bd389b36SDavid du Colombier dopermw(Ram *r)
136bd389b36SDavid du Colombier {
137bd389b36SDavid du Colombier 	USED(r);
138bd389b36SDavid du Colombier 	return 0;
139bd389b36SDavid du Colombier }
140