Subversion Repositories planix.SVN

Rev

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

Rev Author Line No. Line
2 - 1
.TH FCALL 2
2
.SH NAME
3
Fcall, convS2M, convD2M, convM2S, convM2D, fcallfmt, dirfmt, dirmodefmt, read9pmsg, statcheck, sizeS2M, sizeD2M \- interface to Plan 9 File protocol
4
.SH SYNOPSIS
5
.B #include <u.h>
6
.br
7
.B #include <libc.h>
8
.br
9
.br
10
.B #include <fcall.h>
11
.PP
12
.B
13
uint convS2M(Fcall *f, uchar *ap, uint nap)
14
.PP
15
.B
16
uint convD2M(Dir *d, uchar *ap, uint nap)
17
.PP
18
.B
19
uint convM2S(uchar *ap, uint nap, Fcall *f)
20
.PP
21
.B
22
uint convM2D(uchar *ap, uint nap, Dir *d, char *strs)
23
.PP
24
.B
25
int dirfmt(Fmt*)
26
.PP
27
.B
28
int fcallfmt(Fmt*)
29
.PP
30
.B
31
int dirmodefmt(Fmt*)
32
.PP
33
.B
34
int read9pmsg(int fd, uchar *buf, uint nbuf)
35
.PP
36
.B
37
int statcheck(uchar *buf, uint nbuf)
38
.PP
39
.B
40
uint sizeS2M(Fcall *f)
41
.PP
42
.B
43
uint sizeD2M(Dir *d)
44
.SH DESCRIPTION
45
These
46
routines convert messages in the machine-independent format of
47
the Plan 9 file protocol,
48
9P, to and from a more convenient form,
49
an
50
.B Fcall
51
structure:
52
.PP
53
.EX
54
.if n .ta 4n +6n +5n +6n +18n +4n
55
.if t .ta \w'xxxx'u +\w'short 'u +\w'xxxx'u +\w'ushort 'u +\w'ticket[TICKETLEN]; 'u +\w'/* 'u
56
#define MAXWELEM 16
57
 
58
typedef
59
struct Fcall
60
{
61
	uchar	type;
62
	u32int	fid;
63
	ushort	tag;
64
	union {
65
		struct {
66
			u32int	msize;	/* Tversion, Rversion */
67
			char	*version;	/* Tversion, Rversion */
68
		};
69
		struct {
70
			ushort	oldtag;	/* Tflush */
71
		};
72
		struct {
73
			char	*ename;	/* Rerror */
74
		};
75
		struct {
76
			Qid	qid;	/* Rattach, Ropen, Rcreate */
77
			u32int	iounit;	/* Ropen, Rcreate */
78
		};
79
		struct {
80
			Qid	aqid;	/* Rauth */
81
		};
82
		struct {
83
			u32int	afid;	/* Tauth, Tattach */
84
			char	*uname;	/* Tauth, Tattach */
85
			char	*aname;	/* Tauth, Tattach */
86
		};
87
		struct {
88
			u32int	perm;	/* Tcreate */ 
89
			char	*name;	/* Tcreate */
90
			uchar	mode;	/* Tcreate, Topen */
91
		};
92
		struct {
93
			u32int	newfid;	/* Twalk */
94
			ushort	nwname;	/* Twalk */
95
			char	*wname[MAXWELEM];	/* Twalk */
96
		};
97
		struct {
98
			ushort	nwqid;	/* Rwalk */
99
			Qid	wqid[MAXWELEM];	/* Rwalk */
100
		};
101
		struct {
102
			vlong	offset;	/* Tread, Twrite */
103
			u32int	count;	/* Tread, Twrite, Rread */
104
			char	*data;	/* Twrite, Rread */
105
		};
106
		struct {
107
			ushort	nstat;	/* Twstat, Rstat */
108
			uchar	*stat;	/* Twstat, Rstat */
109
		};
110
	};
111
} Fcall;
112
.EE
113
.EX
114
 
115
/* these are implemented as macros */
116
 
117
uchar	GBIT8(uchar*)
118
ushort	GBIT16(uchar*)
119
ulong	GBIT32(uchar*)
120
vlong	GBIT64(uchar*)
121
 
122
void	PBIT8(uchar*, uchar)
123
void	PBIT16(uchar*, ushort)
124
void	PBIT32(uchar*, ulong)
125
void	PBIT64(uchar*, vlong)
126
 
127
#define	BIT8SZ	1
128
#define	BIT16SZ	2
129
#define	BIT32SZ	4
130
#define	BIT64SZ	8
131
.EE
132
.PP
133
This structure is defined in
134
.BR <fcall.h> .
135
See section 5
136
for a full description of 9P messages and their encoding.
137
For all message types, the
138
.B type
139
field of an
140
.B Fcall
141
holds one of
142
.BR Tversion ,
143
.BR Rversion ,
144
.BR Tattach ,
145
.BR Rattach ,
146
etc. (defined in an enumerated type in
147
.BR <fcall.h> ).
148
.B Fid
149
is used by most messages, and
150
.B tag
151
is used by all messages.
152
The other fields are used selectively by the message types
153
given in comments.
154
.PP
155
.I ConvM2S
156
takes a 9P message at
157
.I ap
158
of length
159
.IR nap ,
160
and uses it to fill in
161
.B Fcall
162
structure
163
.IR f .
164
If the passed message
165
including any data for
166
.B Twrite
167
and
168
.B Rread
169
messages
170
is formatted properly,
171
the return value is the number of bytes the message occupied in the buffer
172
.IR ap ,
173
which will always be less than or equal to
174
.IR nap ;
175
otherwise it is 0.
176
For
177
.B Twrite
178
and
179
.B Tread
180
messages,
181
.B data
182
is set to a pointer into the argument message,
183
not a copy.
184
.PP
185
.I ConvS2M
186
does the reverse conversion, turning
187
.I f
188
into a message starting at
189
.IR ap .
190
The length of the resulting message is returned.
191
For
192
.B Twrite
193
and
194
.B Rread
195
messages,
196
.B count
197
bytes starting at
198
.B data
199
are copied into the message.
200
.PP
201
The constant
202
.B IOHDRSZ
203
is a suitable amount of buffer to reserve for storing
204
the 9P header;
205
the data portion of a
206
.B Twrite
207
or
208
.B Rread
209
will be no more than the buffer size negotiated in the
210
.BR Tversion/Rversion
211
exchange, minus
212
.BR IOHDRSZ .
213
.PP
214
The routine
215
.I sizeS2M
216
returns the number of bytes required to store the machine-independent representation of the
217
.B Fcall
218
structure
219
.IR f ,
220
including its initial 32-bit size field.
221
In other words, it reports the number of bytes produced
222
by a successful call to
223
.IR convS2M .
224
.PP
225
Another structure is
226
.BR Dir ,
227
used by the routines described in
228
.IR stat (2).
229
.I ConvM2D
230
converts the machine-independent form starting at
231
.I ap
232
into
233
.IR d
234
and returns the length of the machine-independent encoding.
235
The strings in the returned
236
.B Dir
237
structure are stored at successive locations starting at
238
.BR strs .
239
Usually
240
.B strs
241
will point to storage immediately after the
242
.B Dir
243
itself.
244
It can also be a
245
.B nil
246
pointer, in which case the string pointers in the returned
247
.B Dir
248
are all
249
.BR nil ;
250
however, the return value still includes their length.
251
.PP
252
.I ConvD2M
253
does the reverse translation,
254
also returning the length of the encoding.
255
If the buffer is too short, the return value will be
256
.B BIT16SZ
257
and the correct size will be returned in the first
258
.B BIT16SZ
259
bytes.
260
(If the buffer is less that
261
.BR BIT16SZ ,
262
the return value is zero; therefore a correct test for
263
complete packing of the message is that the return value is
264
greater than
265
.BR BIT16SZ ).
266
The macro
267
.B GBIT16
268
can be used to extract the correct value.
269
The related macros with different sizes retrieve the corresponding-sized quantities.
270
.B PBIT16
271
and its brethren place values in messages.
272
With the exception of handling short buffers in
273
.IR convD2M ,
274
these macros are not usually needed except by internal routines.
275
.PP
276
Analogous to
277
.IR sizeS2M ,
278
.I sizeD2M
279
returns the number of bytes required to store the machine-independent representation of the
280
.B Dir
281
structure
282
.IR d ,
283
including its initial 16-bit size field.
284
.PP
285
The routine
286
.B statcheck
287
checks whether the
288
.I nbuf
289
bytes of
290
.I buf
291
contain a validly formatted machine-independent
292
.B Dir
293
entry suitable as an argument, for example, for the
294
.B wstat
295
(see
296
.IR stat (2))
297
system call.
298
It checks that the sizes of all the elements of the the entry sum to exactly
299
.IR nbuf ,
300
which is a simple but effective test of validity.
301
.I Nbuf
302
and
303
.I buf
304
should include the second two-byte (16-bit) length field that precedes the entry when
305
formatted in a 9P message (see
306
.IR stat (5));
307
in other words,
308
.I nbuf
309
is 2 plus the sum of the sizes of the entry itself.
310
.I Statcheck
311
also verifies that the length field has the correct value (that is,
312
.IB nbuf -2\f1).
313
It returns
314
.B 0
315
for a valid entry and
316
.B -1
317
for an incorrectly formatted entry.
318
.PP
319
.IR Dirfmt ,
320
.IR fcallfmt ,
321
and
322
.I dirmodefmt
323
are formatting routines, suitable for
324
.IR fmtinstall (2).
325
They convert
326
.BR Dir* ,
327
.BR Fcall* ,
328
and
329
.BR long
330
values into string representations of the directory buffer,
331
.B Fcall
332
buffer,
333
or file mode value.
334
.I Fcallfmt
335
assumes that
336
.I dirfmt
337
has been installed with format letter
338
.L D
339
and
340
.I dirmodefmt
341
with format letter
342
.LR M .
343
.PP
344
.I Read9pmsg
345
calls
346
.IR read (2)
347
multiple times, if necessary, to read an entire 9P message into
348
.BR buf .
349
The return value is 0 for end of file, or -1 for error; it does not return
350
partial messages.
351
.SH SOURCE
352
.B /sys/src/libc/9sys
353
.SH SEE ALSO
354
.IR intro (2),
355
.IR 9p (2),
356
.IR stat (2),
357
.IR intro (5)