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