Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include <u.h>
2
#include <libc.h>
3
#include "flashfs.h"
4
 
5
int
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
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
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
}