xref: /plan9/sys/src/cmd/aux/flashfs/conv.c (revision b85a83648eec38fe82b6f00adfd7828ceec5ee8d)
1*9a747e4fSDavid du Colombier #include <u.h>
2*9a747e4fSDavid du Colombier #include <libc.h>
3*9a747e4fSDavid du Colombier #include "flashfs.h"
4*9a747e4fSDavid du Colombier 
5*9a747e4fSDavid du Colombier int
convJ2M(Jrec * j,uchar * buff)6*9a747e4fSDavid du Colombier convJ2M(Jrec *j, uchar *buff)
7*9a747e4fSDavid du Colombier {
8*9a747e4fSDavid du Colombier 	int m, n;
9*9a747e4fSDavid du Colombier 
10*9a747e4fSDavid du Colombier 	switch(j->type) {
11*9a747e4fSDavid du Colombier 	case FT_create:
12*9a747e4fSDavid du Colombier 		if(j->mode & (1 << 8)) {
13*9a747e4fSDavid du Colombier 			if(j->mode & DMDIR)
14*9a747e4fSDavid du Colombier 				j->type = FT_DCREATE1;
15*9a747e4fSDavid du Colombier 			else
16*9a747e4fSDavid du Colombier 				j->type = FT_FCREATE1;
17*9a747e4fSDavid du Colombier 		}
18*9a747e4fSDavid du Colombier 		else {
19*9a747e4fSDavid du Colombier 			if(j->mode & DMDIR)
20*9a747e4fSDavid du Colombier 				j->type = FT_DCREATE0;
21*9a747e4fSDavid du Colombier 			else
22*9a747e4fSDavid du Colombier 				j->type = FT_FCREATE0;
23*9a747e4fSDavid du Colombier 		}
24*9a747e4fSDavid du Colombier 	case FT_FCREATE0:
25*9a747e4fSDavid du Colombier 	case FT_FCREATE1:
26*9a747e4fSDavid du Colombier 	case FT_DCREATE0:
27*9a747e4fSDavid du Colombier 	case FT_DCREATE1:
28*9a747e4fSDavid du Colombier 		n = putc3(&buff[0], j->fnum);
29*9a747e4fSDavid du Colombier 		goto create;
30*9a747e4fSDavid du Colombier 	case FT_chmod:
31*9a747e4fSDavid du Colombier 		if(j->mode & (1 << 8))
32*9a747e4fSDavid du Colombier 			j->type = FT_CHMOD1;
33*9a747e4fSDavid du Colombier 		else
34*9a747e4fSDavid du Colombier 			j->type = FT_CHMOD0;
35*9a747e4fSDavid du Colombier 	case FT_CHMOD0:
36*9a747e4fSDavid du Colombier 	case FT_CHMOD1:
37*9a747e4fSDavid du Colombier 		n = putc3(&buff[0], j->fnum);
38*9a747e4fSDavid du Colombier 		buff[n++] = j->mode;
39*9a747e4fSDavid du Colombier 		return n + putc3(&buff[n], j->mnum);
40*9a747e4fSDavid du Colombier 	case FT_REMOVE:
41*9a747e4fSDavid du Colombier 		return putc3(&buff[0], j->fnum);
42*9a747e4fSDavid du Colombier 	case FT_WRITE:
43*9a747e4fSDavid du Colombier 		n = putc3(&buff[0], j->fnum);
44*9a747e4fSDavid du Colombier 		n += putc3(&buff[n], j->mtime);
45*9a747e4fSDavid du Colombier 		n += putc3(&buff[n], j->offset);
46*9a747e4fSDavid du Colombier 		return n + putc3(&buff[n], j->size - 1);
47*9a747e4fSDavid du Colombier 	case FT_AWRITE:
48*9a747e4fSDavid du Colombier 		n = putc3(&buff[0], j->fnum);
49*9a747e4fSDavid du Colombier 		n += putc3(&buff[n], j->offset);
50*9a747e4fSDavid du Colombier 		return n + putc3(&buff[n], j->size - 1);
51*9a747e4fSDavid du Colombier 	case FT_trunc:
52*9a747e4fSDavid du Colombier 		if(j->mode & (1 << 8))
53*9a747e4fSDavid du Colombier 			j->type = FT_TRUNC1;
54*9a747e4fSDavid du Colombier 		else
55*9a747e4fSDavid du Colombier 			j->type = FT_TRUNC0;
56*9a747e4fSDavid du Colombier 	case FT_TRUNC0:
57*9a747e4fSDavid du Colombier 	case FT_TRUNC1:
58*9a747e4fSDavid du Colombier 		n = putc3(&buff[0], j->fnum);
59*9a747e4fSDavid du Colombier 		n += putc3(&buff[n], j->tnum);
60*9a747e4fSDavid du Colombier 		goto create;
61*9a747e4fSDavid du Colombier 	case FT_SUMMARY:
62*9a747e4fSDavid du Colombier 	case FT_SUMBEG:
63*9a747e4fSDavid du Colombier 		return putc3(&buff[0], j->seq);
64*9a747e4fSDavid du Colombier 	case FT_SUMEND:
65*9a747e4fSDavid du Colombier 		return 0;
66*9a747e4fSDavid du Colombier 	create:
67*9a747e4fSDavid du Colombier 		buff[n++] = j->mode;
68*9a747e4fSDavid du Colombier 		n += putc3(&buff[n], j->mtime);
69*9a747e4fSDavid du Colombier 		n += putc3(&buff[n], j->parent);
70*9a747e4fSDavid du Colombier 		m = strlen(j->name);
71*9a747e4fSDavid du Colombier 		memmove(&buff[n], j->name, m);
72*9a747e4fSDavid du Colombier 		n += m;
73*9a747e4fSDavid du Colombier 		buff[n++] = '\0';
74*9a747e4fSDavid du Colombier 		return n;
75*9a747e4fSDavid du Colombier 	}
76*9a747e4fSDavid du Colombier 	return -1;
77*9a747e4fSDavid du Colombier }
78*9a747e4fSDavid du Colombier 
79*9a747e4fSDavid du Colombier int
convM2J(Jrec * j,uchar * buff)80*9a747e4fSDavid du Colombier convM2J(Jrec *j, uchar *buff)
81*9a747e4fSDavid du Colombier {
82*9a747e4fSDavid du Colombier 	int m, n;
83*9a747e4fSDavid du Colombier 
84*9a747e4fSDavid du Colombier 	j->type = buff[0];
85*9a747e4fSDavid du Colombier 
86*9a747e4fSDavid du Colombier 	switch(j->type) {
87*9a747e4fSDavid du Colombier 	case FT_FCREATE0:
88*9a747e4fSDavid du Colombier 	case FT_FCREATE1:
89*9a747e4fSDavid du Colombier 	case FT_DCREATE0:
90*9a747e4fSDavid du Colombier 	case FT_DCREATE1:
91*9a747e4fSDavid du Colombier 		n = 1 + getc3(&buff[1], &j->fnum);
92*9a747e4fSDavid du Colombier 		j->mode = buff[n++];
93*9a747e4fSDavid du Colombier 		switch(j->type) {
94*9a747e4fSDavid du Colombier 		case FT_FCREATE0:
95*9a747e4fSDavid du Colombier 			break;
96*9a747e4fSDavid du Colombier 		case FT_FCREATE1:
97*9a747e4fSDavid du Colombier 			j->mode |= 1 << 8;
98*9a747e4fSDavid du Colombier 			break;
99*9a747e4fSDavid du Colombier 		case FT_DCREATE0:
100*9a747e4fSDavid du Colombier 			j->mode |= DMDIR;
101*9a747e4fSDavid du Colombier 			break;
102*9a747e4fSDavid du Colombier 		case FT_DCREATE1:
103*9a747e4fSDavid du Colombier 			j->mode |= DMDIR | (1 << 8);
104*9a747e4fSDavid du Colombier 			break;
105*9a747e4fSDavid du Colombier 		}
106*9a747e4fSDavid du Colombier 		j->type = FT_create;
107*9a747e4fSDavid du Colombier 		goto create;
108*9a747e4fSDavid du Colombier 	case FT_CHMOD0:
109*9a747e4fSDavid du Colombier 	case FT_CHMOD1:
110*9a747e4fSDavid du Colombier 		n = 1 + getc3(&buff[1], &j->fnum);
111*9a747e4fSDavid du Colombier 		j->mode = buff[n++];
112*9a747e4fSDavid du Colombier 		switch(j->type) {
113*9a747e4fSDavid du Colombier 		case FT_CHMOD0:
114*9a747e4fSDavid du Colombier 			break;
115*9a747e4fSDavid du Colombier 		case FT_CHMOD1:
116*9a747e4fSDavid du Colombier 			j->mode |= 1 << 8;
117*9a747e4fSDavid du Colombier 			break;
118*9a747e4fSDavid du Colombier 		}
119*9a747e4fSDavid du Colombier 		j->type = FT_chmod;
120*9a747e4fSDavid du Colombier 		return n + getc3(&buff[n], &j->mnum);
121*9a747e4fSDavid du Colombier 	case FT_REMOVE:
122*9a747e4fSDavid du Colombier 		return 1 + getc3(&buff[1], &j->fnum);
123*9a747e4fSDavid du Colombier 	case FT_WRITE:
124*9a747e4fSDavid du Colombier 		n = 1 + getc3(&buff[1], &j->fnum);
125*9a747e4fSDavid du Colombier 		n += getc3(&buff[n], &j->mtime);
126*9a747e4fSDavid du Colombier 		n += getc3(&buff[n], &j->offset);
127*9a747e4fSDavid du Colombier 		n += getc3(&buff[n], &j->size);
128*9a747e4fSDavid du Colombier 		j->size++;
129*9a747e4fSDavid du Colombier 		return n;
130*9a747e4fSDavid du Colombier 	case FT_AWRITE:
131*9a747e4fSDavid du Colombier 		n = 1 + getc3(&buff[1], &j->fnum);
132*9a747e4fSDavid du Colombier 		n += getc3(&buff[n], &j->offset);
133*9a747e4fSDavid du Colombier 		n += getc3(&buff[n], &j->size);
134*9a747e4fSDavid du Colombier 		j->size++;
135*9a747e4fSDavid du Colombier 		return n;
136*9a747e4fSDavid du Colombier 	case FT_TRUNC0:
137*9a747e4fSDavid du Colombier 	case FT_TRUNC1:
138*9a747e4fSDavid du Colombier 		n = 1 + getc3(&buff[1], &j->fnum);
139*9a747e4fSDavid du Colombier 		n += getc3(&buff[n], &j->tnum);
140*9a747e4fSDavid du Colombier 		j->mode = buff[n++];
141*9a747e4fSDavid du Colombier 		switch(j->type) {
142*9a747e4fSDavid du Colombier 		case FT_TRUNC0:
143*9a747e4fSDavid du Colombier 			break;
144*9a747e4fSDavid du Colombier 		case FT_TRUNC1:
145*9a747e4fSDavid du Colombier 			j->mode |= 1 << 8;
146*9a747e4fSDavid du Colombier 			break;
147*9a747e4fSDavid du Colombier 		}
148*9a747e4fSDavid du Colombier 		j->type = FT_trunc;
149*9a747e4fSDavid du Colombier 		goto create;
150*9a747e4fSDavid du Colombier 	case FT_SUMMARY:
151*9a747e4fSDavid du Colombier 	case FT_SUMBEG:
152*9a747e4fSDavid du Colombier 		return 1 + getc3(&buff[1], &j->seq);
153*9a747e4fSDavid du Colombier 	case FT_SUMEND:
154*9a747e4fSDavid du Colombier 		return 1;
155*9a747e4fSDavid du Colombier 	create:
156*9a747e4fSDavid du Colombier 		n += getc3(&buff[n], &j->mtime);
157*9a747e4fSDavid du Colombier 		n += getc3(&buff[n], &j->parent);
158*9a747e4fSDavid du Colombier 		memmove(j->name, &buff[n], MAXNSIZE+1);
159*9a747e4fSDavid du Colombier 		j->name[MAXNSIZE+1] = '\0';
160*9a747e4fSDavid du Colombier 		m = strlen(j->name);
161*9a747e4fSDavid du Colombier 		if(m > MAXNSIZE)
162*9a747e4fSDavid du Colombier 			return -1;
163*9a747e4fSDavid du Colombier 		return n + m + 1;
164*9a747e4fSDavid du Colombier 	}
165*9a747e4fSDavid du Colombier 	return -1;
166*9a747e4fSDavid du Colombier }
167*9a747e4fSDavid du Colombier 
168*9a747e4fSDavid du Colombier int
Jconv(Fmt * fp)169*9a747e4fSDavid du Colombier Jconv(Fmt *fp)
170*9a747e4fSDavid du Colombier {
171*9a747e4fSDavid du Colombier 	Jrec *j;
172*9a747e4fSDavid du Colombier 
173*9a747e4fSDavid du Colombier 	j = va_arg(fp->args, Jrec *);
174*9a747e4fSDavid du Colombier 	switch(j->type) {
175*9a747e4fSDavid du Colombier 	case FT_create:
176*9a747e4fSDavid du Colombier 	case FT_FCREATE0:
177*9a747e4fSDavid du Colombier 	case FT_FCREATE1:
178*9a747e4fSDavid du Colombier 	case FT_DCREATE0:
179*9a747e4fSDavid du Colombier 	case FT_DCREATE1:
180*9a747e4fSDavid du Colombier 		return fmtprint(fp, "create f %ld p %ld t %lud m %ulo %s",
181*9a747e4fSDavid du Colombier 			j->fnum, j->parent, j->mtime, j->mode, j->name);
182*9a747e4fSDavid du Colombier 	case FT_chmod:
183*9a747e4fSDavid du Colombier 	case FT_CHMOD0:
184*9a747e4fSDavid du Colombier 	case FT_CHMOD1:
185*9a747e4fSDavid du Colombier 		return fmtprint(fp, "chmod f %ld m %ulo #%ld",
186*9a747e4fSDavid du Colombier 			j->fnum, j->mode, j->mnum);
187*9a747e4fSDavid du Colombier 	case FT_REMOVE:
188*9a747e4fSDavid du Colombier 		return fmtprint(fp, "remove f %ld", j->fnum);
189*9a747e4fSDavid du Colombier 	case FT_WRITE:
190*9a747e4fSDavid du Colombier 		return fmtprint(fp, "write f %ld z %ld o %ld t %uld",
191*9a747e4fSDavid du Colombier 			j->fnum, j->size, j->offset, j->mtime);
192*9a747e4fSDavid du Colombier 	case FT_AWRITE:
193*9a747e4fSDavid du Colombier 		return fmtprint(fp, "awrite f %ld z %ld o %ld",
194*9a747e4fSDavid du Colombier 			j->fnum, j->size, j->offset);
195*9a747e4fSDavid du Colombier 	case FT_trunc:
196*9a747e4fSDavid du Colombier 	case FT_TRUNC0:
197*9a747e4fSDavid du Colombier 	case FT_TRUNC1:
198*9a747e4fSDavid du Colombier 		return fmtprint(fp, "trunc f %ld o %ld p %ld t %ld m %ulo %s",
199*9a747e4fSDavid du Colombier 			j->fnum, j->tnum, j->parent, j->mtime, j->mode, j->name);
200*9a747e4fSDavid du Colombier 	case FT_SUMMARY:
201*9a747e4fSDavid du Colombier 		return fmtprint(fp, "summary %ld",
202*9a747e4fSDavid du Colombier 			j->seq);
203*9a747e4fSDavid du Colombier 	case FT_SUMBEG:
204*9a747e4fSDavid du Colombier 		return fmtprint(fp, "sumbeg %ld",
205*9a747e4fSDavid du Colombier 			j->seq);
206*9a747e4fSDavid du Colombier 	case FT_SUMEND:
207*9a747e4fSDavid du Colombier 		return fmtprint(fp, "end");
208*9a747e4fSDavid du Colombier 	default:
209*9a747e4fSDavid du Colombier 		return fmtprint(fp, "?type %d", j->type);
210*9a747e4fSDavid du Colombier 	}
211*9a747e4fSDavid du Colombier }
212