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