xref: /plan9/sys/src/cmd/unix/drawterm/libc/convS2M.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1 #include	<u.h>
2 #include	<libc.h>
3 #include	<fcall.h>
4 
5 static
6 uchar*
pstring(uchar * p,char * s)7 pstring(uchar *p, char *s)
8 {
9 	uint n;
10 
11 	if(s == nil){
12 		PBIT16(p, 0);
13 		p += BIT16SZ;
14 		return p;
15 	}
16 
17 	n = strlen(s);
18 	PBIT16(p, n);
19 	p += BIT16SZ;
20 	memmove(p, s, n);
21 	p += n;
22 	return p;
23 }
24 
25 static
26 uchar*
pqid(uchar * p,Qid * q)27 pqid(uchar *p, Qid *q)
28 {
29 	PBIT8(p, q->type);
30 	p += BIT8SZ;
31 	PBIT32(p, q->vers);
32 	p += BIT32SZ;
33 	PBIT64(p, q->path);
34 	p += BIT64SZ;
35 	return p;
36 }
37 
38 static
39 uint
stringsz(char * s)40 stringsz(char *s)
41 {
42 	if(s == nil)
43 		return BIT16SZ;
44 
45 	return BIT16SZ+strlen(s);
46 }
47 
48 uint
sizeS2M(Fcall * f)49 sizeS2M(Fcall *f)
50 {
51 	uint n;
52 	int i;
53 
54 	n = 0;
55 	n += BIT32SZ;	/* size */
56 	n += BIT8SZ;	/* type */
57 	n += BIT16SZ;	/* tag */
58 
59 	switch(f->type)
60 	{
61 	default:
62 		return 0;
63 
64 	case Tversion:
65 		n += BIT32SZ;
66 		n += stringsz(f->version);
67 		break;
68 
69 	case Tflush:
70 		n += BIT16SZ;
71 		break;
72 
73 	case Tauth:
74 		n += BIT32SZ;
75 		n += stringsz(f->uname);
76 		n += stringsz(f->aname);
77 		break;
78 
79 	case Tattach:
80 		n += BIT32SZ;
81 		n += BIT32SZ;
82 		n += stringsz(f->uname);
83 		n += stringsz(f->aname);
84 		break;
85 
86 	case Twalk:
87 		n += BIT32SZ;
88 		n += BIT32SZ;
89 		n += BIT16SZ;
90 		for(i=0; i<f->nwname; i++)
91 			n += stringsz(f->wname[i]);
92 		break;
93 
94 	case Topen:
95 		n += BIT32SZ;
96 		n += BIT8SZ;
97 		break;
98 
99 	case Tcreate:
100 		n += BIT32SZ;
101 		n += stringsz(f->name);
102 		n += BIT32SZ;
103 		n += BIT8SZ;
104 		break;
105 
106 	case Tread:
107 		n += BIT32SZ;
108 		n += BIT64SZ;
109 		n += BIT32SZ;
110 		break;
111 
112 	case Twrite:
113 		n += BIT32SZ;
114 		n += BIT64SZ;
115 		n += BIT32SZ;
116 		n += f->count;
117 		break;
118 
119 	case Tclunk:
120 	case Tremove:
121 		n += BIT32SZ;
122 		break;
123 
124 	case Tstat:
125 		n += BIT32SZ;
126 		break;
127 
128 	case Twstat:
129 		n += BIT32SZ;
130 		n += BIT16SZ;
131 		n += f->nstat;
132 		break;
133 /*
134  */
135 
136 	case Rversion:
137 		n += BIT32SZ;
138 		n += stringsz(f->version);
139 		break;
140 
141 	case Rerror:
142 		n += stringsz(f->ename);
143 		break;
144 
145 	case Rflush:
146 		break;
147 
148 	case Rauth:
149 		n += QIDSZ;
150 		break;
151 
152 	case Rattach:
153 		n += QIDSZ;
154 		break;
155 
156 	case Rwalk:
157 		n += BIT16SZ;
158 		n += f->nwqid*QIDSZ;
159 		break;
160 
161 	case Ropen:
162 	case Rcreate:
163 		n += QIDSZ;
164 		n += BIT32SZ;
165 		break;
166 
167 	case Rread:
168 		n += BIT32SZ;
169 		n += f->count;
170 		break;
171 
172 	case Rwrite:
173 		n += BIT32SZ;
174 		break;
175 
176 	case Rclunk:
177 		break;
178 
179 	case Rremove:
180 		break;
181 
182 	case Rstat:
183 		n += BIT16SZ;
184 		n += f->nstat;
185 		break;
186 
187 	case Rwstat:
188 		break;
189 	}
190 	return n;
191 }
192 
193 uint
convS2M(Fcall * f,uchar * ap,uint nap)194 convS2M(Fcall *f, uchar *ap, uint nap)
195 {
196 	uchar *p;
197 	uint i, size;
198 
199 	size = sizeS2M(f);
200 	if(size == 0)
201 		return 0;
202 	if(size > nap)
203 		return 0;
204 
205 	p = (uchar*)ap;
206 
207 	PBIT32(p, size);
208 	p += BIT32SZ;
209 	PBIT8(p, f->type);
210 	p += BIT8SZ;
211 	PBIT16(p, f->tag);
212 	p += BIT16SZ;
213 
214 	switch(f->type)
215 	{
216 	default:
217 		return 0;
218 
219 	case Tversion:
220 		PBIT32(p, f->msize);
221 		p += BIT32SZ;
222 		p = pstring(p, f->version);
223 		break;
224 
225 	case Tflush:
226 		PBIT16(p, f->oldtag);
227 		p += BIT16SZ;
228 		break;
229 
230 	case Tauth:
231 		PBIT32(p, f->afid);
232 		p += BIT32SZ;
233 		p  = pstring(p, f->uname);
234 		p  = pstring(p, f->aname);
235 		break;
236 
237 	case Tattach:
238 		PBIT32(p, f->fid);
239 		p += BIT32SZ;
240 		PBIT32(p, f->afid);
241 		p += BIT32SZ;
242 		p  = pstring(p, f->uname);
243 		p  = pstring(p, f->aname);
244 		break;
245 
246 	case Twalk:
247 		PBIT32(p, f->fid);
248 		p += BIT32SZ;
249 		PBIT32(p, f->newfid);
250 		p += BIT32SZ;
251 		PBIT16(p, f->nwname);
252 		p += BIT16SZ;
253 		if(f->nwname > MAXWELEM)
254 			return 0;
255 		for(i=0; i<f->nwname; i++)
256 			p = pstring(p, f->wname[i]);
257 		break;
258 
259 	case Topen:
260 		PBIT32(p, f->fid);
261 		p += BIT32SZ;
262 		PBIT8(p, f->mode);
263 		p += BIT8SZ;
264 		break;
265 
266 	case Tcreate:
267 		PBIT32(p, f->fid);
268 		p += BIT32SZ;
269 		p = pstring(p, f->name);
270 		PBIT32(p, f->perm);
271 		p += BIT32SZ;
272 		PBIT8(p, f->mode);
273 		p += BIT8SZ;
274 		break;
275 
276 	case Tread:
277 		PBIT32(p, f->fid);
278 		p += BIT32SZ;
279 		PBIT64(p, f->offset);
280 		p += BIT64SZ;
281 		PBIT32(p, f->count);
282 		p += BIT32SZ;
283 		break;
284 
285 	case Twrite:
286 		PBIT32(p, f->fid);
287 		p += BIT32SZ;
288 		PBIT64(p, f->offset);
289 		p += BIT64SZ;
290 		PBIT32(p, f->count);
291 		p += BIT32SZ;
292 		memmove(p, f->data, f->count);
293 		p += f->count;
294 		break;
295 
296 	case Tclunk:
297 	case Tremove:
298 		PBIT32(p, f->fid);
299 		p += BIT32SZ;
300 		break;
301 
302 	case Tstat:
303 		PBIT32(p, f->fid);
304 		p += BIT32SZ;
305 		break;
306 
307 	case Twstat:
308 		PBIT32(p, f->fid);
309 		p += BIT32SZ;
310 		PBIT16(p, f->nstat);
311 		p += BIT16SZ;
312 		memmove(p, f->stat, f->nstat);
313 		p += f->nstat;
314 		break;
315 /*
316  */
317 
318 	case Rversion:
319 		PBIT32(p, f->msize);
320 		p += BIT32SZ;
321 		p = pstring(p, f->version);
322 		break;
323 
324 	case Rerror:
325 		p = pstring(p, f->ename);
326 		break;
327 
328 	case Rflush:
329 		break;
330 
331 	case Rauth:
332 		p = pqid(p, &f->aqid);
333 		break;
334 
335 	case Rattach:
336 		p = pqid(p, &f->qid);
337 		break;
338 
339 	case Rwalk:
340 		PBIT16(p, f->nwqid);
341 		p += BIT16SZ;
342 		if(f->nwqid > MAXWELEM)
343 			return 0;
344 		for(i=0; i<f->nwqid; i++)
345 			p = pqid(p, &f->wqid[i]);
346 		break;
347 
348 	case Ropen:
349 	case Rcreate:
350 		p = pqid(p, &f->qid);
351 		PBIT32(p, f->iounit);
352 		p += BIT32SZ;
353 		break;
354 
355 	case Rread:
356 		PBIT32(p, f->count);
357 		p += BIT32SZ;
358 		memmove(p, f->data, f->count);
359 		p += f->count;
360 		break;
361 
362 	case Rwrite:
363 		PBIT32(p, f->count);
364 		p += BIT32SZ;
365 		break;
366 
367 	case Rclunk:
368 		break;
369 
370 	case Rremove:
371 		break;
372 
373 	case Rstat:
374 		PBIT16(p, f->nstat);
375 		p += BIT16SZ;
376 		memmove(p, f->stat, f->nstat);
377 		p += f->nstat;
378 		break;
379 
380 	case Rwstat:
381 		break;
382 	}
383 	if(size != p-ap)
384 		return 0;
385 	return size;
386 }
387