Blame


1 cfa37a7b 2004-04-10 devnull .TH PLUMB 3
2 cfa37a7b 2004-04-10 devnull .SH NAME
3 058b0118 2005-01-03 devnull eplumb, plumbfree, plumbopen, plumbopenfid, plumbsend, plumbsendtofid, plumbsendtext, plumblookup, plumbpack, plumbpackattr, plumbaddattr, plumbdelattr, plumbrecv, plumbrecvfid, plumbunpack, plumbunpackpartial, plumbunpackattr, Plumbmsg \- plumb messages
4 cfa37a7b 2004-04-10 devnull .SH SYNOPSIS
5 cfa37a7b 2004-04-10 devnull .B #include <u.h>
6 cfa37a7b 2004-04-10 devnull .br
7 cfa37a7b 2004-04-10 devnull .B #include <libc.h>
8 cfa37a7b 2004-04-10 devnull .br
9 cfa37a7b 2004-04-10 devnull .B #include <plumb.h>
10 cfa37a7b 2004-04-10 devnull .PP
11 cfa37a7b 2004-04-10 devnull .ta \w'\fLPlumbattr* 'u
12 cfa37a7b 2004-04-10 devnull .PP
13 cfa37a7b 2004-04-10 devnull .B
14 cfa37a7b 2004-04-10 devnull int plumbopen(char *port, int omode)
15 cfa37a7b 2004-04-10 devnull .PP
16 cfa37a7b 2004-04-10 devnull .B
17 cfa37a7b 2004-04-10 devnull int plumbsend(int fd, Plumbmsg *m)
18 cfa37a7b 2004-04-10 devnull .PP
19 cfa37a7b 2004-04-10 devnull .B
20 cfa37a7b 2004-04-10 devnull int plumbsendtext(int fd, char *src, char *dst, char *wdir, char *data)
21 cfa37a7b 2004-04-10 devnull .PP
22 cfa37a7b 2004-04-10 devnull .B
23 cfa37a7b 2004-04-10 devnull void plumbfree(Plumbmsg *m)
24 cfa37a7b 2004-04-10 devnull .PP
25 cfa37a7b 2004-04-10 devnull .B
26 cfa37a7b 2004-04-10 devnull Plumbmsg* plumbrecv(int fd)
27 cfa37a7b 2004-04-10 devnull .PP
28 cfa37a7b 2004-04-10 devnull .B
29 cfa37a7b 2004-04-10 devnull char* plumbpack(Plumbmsg *m, int *np)
30 cfa37a7b 2004-04-10 devnull .PP
31 cfa37a7b 2004-04-10 devnull .B
32 cfa37a7b 2004-04-10 devnull Plumbmsg* plumbunpack(char *buf, int n)
33 cfa37a7b 2004-04-10 devnull .PP
34 cfa37a7b 2004-04-10 devnull .B
35 cfa37a7b 2004-04-10 devnull Plumbmsg* plumbunpackpartial(char *buf, int n, int *morep)
36 cfa37a7b 2004-04-10 devnull .PP
37 cfa37a7b 2004-04-10 devnull .B
38 cfa37a7b 2004-04-10 devnull char* plumbpackattr(Plumbattr *a)
39 cfa37a7b 2004-04-10 devnull .PP
40 cfa37a7b 2004-04-10 devnull .B
41 cfa37a7b 2004-04-10 devnull Plumbattr* plumbunpackattr(char *a)
42 cfa37a7b 2004-04-10 devnull .PP
43 cfa37a7b 2004-04-10 devnull .B
44 cfa37a7b 2004-04-10 devnull char* plumblookup(Plumbattr *a, char *name)
45 cfa37a7b 2004-04-10 devnull .PP
46 cfa37a7b 2004-04-10 devnull .B
47 cfa37a7b 2004-04-10 devnull Plumbattr* plumbaddattr(Plumbattr *a, Plumbattr *new)
48 cfa37a7b 2004-04-10 devnull .PP
49 cfa37a7b 2004-04-10 devnull .B
50 cfa37a7b 2004-04-10 devnull Plumbattr* plumbdelattr(Plumbattra *a, char *name)
51 cfa37a7b 2004-04-10 devnull .PP
52 cfa37a7b 2004-04-10 devnull .B
53 cfa37a7b 2004-04-10 devnull int eplumb(int key, char *port)
54 058b0118 2005-01-03 devnull .PP
55 058b0118 2005-01-03 devnull .B
56 058b0118 2005-01-03 devnull #include <9pclient.h>
57 058b0118 2005-01-03 devnull .PP
58 058b0118 2005-01-03 devnull .B
59 058b0118 2005-01-03 devnull CFid *plumbopenfid(char *port, int omode)
60 058b0118 2005-01-03 devnull .PP
61 058b0118 2005-01-03 devnull .B
62 058b0118 2005-01-03 devnull Plumbmsg* plumbrecvfid(CFid *fid)
63 058b0118 2005-01-03 devnull .PP
64 058b0118 2005-01-03 devnull .B
65 058b0118 2005-01-03 devnull int plumbsendtofid(CFid *fid, Plumbmsg *m)
66 cfa37a7b 2004-04-10 devnull .SH DESCRIPTION
67 cfa37a7b 2004-04-10 devnull These routines manipulate
68 058b0118 2005-01-03 devnull .IR plumb (7)
69 cfa37a7b 2004-04-10 devnull messages, transmitting them, receiving them, and
70 cfa37a7b 2004-04-10 devnull converting them between text and these data structures:
71 cfa37a7b 2004-04-10 devnull .IP
72 cfa37a7b 2004-04-10 devnull .EX
73 cfa37a7b 2004-04-10 devnull .ta 6n +\w'\fLPlumbattr 'u +\w'ndata; 'u
74 cfa37a7b 2004-04-10 devnull typedef
75 cfa37a7b 2004-04-10 devnull struct Plumbmsg
76 cfa37a7b 2004-04-10 devnull {
77 cfa37a7b 2004-04-10 devnull char *src;
78 cfa37a7b 2004-04-10 devnull char *dst;
79 cfa37a7b 2004-04-10 devnull char *wdir;
80 cfa37a7b 2004-04-10 devnull char *type;
81 cfa37a7b 2004-04-10 devnull Plumbattr *attr;
82 cfa37a7b 2004-04-10 devnull int ndata;
83 cfa37a7b 2004-04-10 devnull char *data;
84 cfa37a7b 2004-04-10 devnull } Plumbmsg;
85 cfa37a7b 2004-04-10 devnull
86 cfa37a7b 2004-04-10 devnull typedef
87 cfa37a7b 2004-04-10 devnull struct Plumbattr
88 cfa37a7b 2004-04-10 devnull {
89 cfa37a7b 2004-04-10 devnull char *name;
90 cfa37a7b 2004-04-10 devnull char *value;
91 cfa37a7b 2004-04-10 devnull Plumbattr *next;
92 cfa37a7b 2004-04-10 devnull } Plumbattr;
93 cfa37a7b 2004-04-10 devnull .EE
94 cfa37a7b 2004-04-10 devnull .PP
95 cfa37a7b 2004-04-10 devnull .I Plumbopen
96 cfa37a7b 2004-04-10 devnull opens the named plumb
97 cfa37a7b 2004-04-10 devnull .IR port ,
98 cfa37a7b 2004-04-10 devnull using
99 bf8a59fa 2004-04-11 devnull .IR open (3)
100 cfa37a7b 2004-04-10 devnull mode
101 cfa37a7b 2004-04-10 devnull .IR omode .
102 cfa37a7b 2004-04-10 devnull If
103 cfa37a7b 2004-04-10 devnull .I port
104 cfa37a7b 2004-04-10 devnull begins with a slash, it is taken as a literal file name;
105 cfa37a7b 2004-04-10 devnull otherwise
106 cfa37a7b 2004-04-10 devnull .I plumbopen
107 cfa37a7b 2004-04-10 devnull searches for the location of the
108 cfa37a7b 2004-04-10 devnull .IR plumber (4)
109 cfa37a7b 2004-04-10 devnull service and opens the port there.
110 cfa37a7b 2004-04-10 devnull .PP
111 cfa37a7b 2004-04-10 devnull For programs using the
112 bf8a59fa 2004-04-11 devnull .IR event (3)
113 cfa37a7b 2004-04-10 devnull interface,
114 cfa37a7b 2004-04-10 devnull .I eplumb
115 cfa37a7b 2004-04-10 devnull registers, using the given
116 cfa37a7b 2004-04-10 devnull .IR key ,
117 cfa37a7b 2004-04-10 devnull receipt of messages from the named
118 cfa37a7b 2004-04-10 devnull .IR port .
119 cfa37a7b 2004-04-10 devnull .PP
120 cfa37a7b 2004-04-10 devnull .I Plumbsend
121 cfa37a7b 2004-04-10 devnull formats and writes message
122 cfa37a7b 2004-04-10 devnull .I m
123 cfa37a7b 2004-04-10 devnull to the file descriptor
124 cfa37a7b 2004-04-10 devnull .IR fd ,
125 cfa37a7b 2004-04-10 devnull which will usually be the result of
126 cfa37a7b 2004-04-10 devnull .B plumbopen("send",
127 cfa37a7b 2004-04-10 devnull .BR OWRITE) .
128 cfa37a7b 2004-04-10 devnull .I Plumbsendtext
129 cfa37a7b 2004-04-10 devnull is a simplified version for text-only messages; it assumes
130 cfa37a7b 2004-04-10 devnull .B type
131 cfa37a7b 2004-04-10 devnull is
132 cfa37a7b 2004-04-10 devnull .BR text ,
133 cfa37a7b 2004-04-10 devnull sets
134 cfa37a7b 2004-04-10 devnull .B attr
135 cfa37a7b 2004-04-10 devnull to nil,
136 cfa37a7b 2004-04-10 devnull and sets
137 cfa37a7b 2004-04-10 devnull .B ndata
138 cfa37a7b 2004-04-10 devnull to
139 cfa37a7b 2004-04-10 devnull .BI strlen( data )\f1.
140 cfa37a7b 2004-04-10 devnull .PP
141 cfa37a7b 2004-04-10 devnull .I Plumbfree
142 cfa37a7b 2004-04-10 devnull frees all the data associated with the message
143 cfa37a7b 2004-04-10 devnull .IR m ,
144 cfa37a7b 2004-04-10 devnull all the components of which must therefore have been allocated with
145 bf8a59fa 2004-04-11 devnull .IR malloc (3).
146 cfa37a7b 2004-04-10 devnull .PP
147 cfa37a7b 2004-04-10 devnull .I Plumbrecv
148 cfa37a7b 2004-04-10 devnull returns the next message available on the file descriptor
149 cfa37a7b 2004-04-10 devnull .IR fd ,
150 cfa37a7b 2004-04-10 devnull or nil for error.
151 cfa37a7b 2004-04-10 devnull .PP
152 cfa37a7b 2004-04-10 devnull .I Plumbpack
153 cfa37a7b 2004-04-10 devnull encodes message
154 cfa37a7b 2004-04-10 devnull .I m
155 cfa37a7b 2004-04-10 devnull as a character string in the format of
156 058b0118 2005-01-03 devnull .IR plumb (7) ,
157 cfa37a7b 2004-04-10 devnull setting
158 cfa37a7b 2004-04-10 devnull .BI * np
159 cfa37a7b 2004-04-10 devnull to the length in bytes of the string.
160 cfa37a7b 2004-04-10 devnull .I Plumbunpack
161 cfa37a7b 2004-04-10 devnull does the inverse, translating the
162 cfa37a7b 2004-04-10 devnull .I n
163 cfa37a7b 2004-04-10 devnull bytes of
164 cfa37a7b 2004-04-10 devnull .I buf
165 cfa37a7b 2004-04-10 devnull into a
166 cfa37a7b 2004-04-10 devnull .BR Plumbmsg .
167 cfa37a7b 2004-04-10 devnull .PP
168 cfa37a7b 2004-04-10 devnull .I Plumbunpackpartial
169 cfa37a7b 2004-04-10 devnull enables unpacking of messages that arrive in pieces.
170 cfa37a7b 2004-04-10 devnull The first call to
171 cfa37a7b 2004-04-10 devnull .I plumbunpackpartial
172 cfa37a7b 2004-04-10 devnull for a given message must be sufficient to unpack the header;
173 cfa37a7b 2004-04-10 devnull subsequent calls permit unpacking messages with long data sections.
174 cfa37a7b 2004-04-10 devnull For each call,
175 cfa37a7b 2004-04-10 devnull .I buf
176 cfa37a7b 2004-04-10 devnull points to the beginning of the complete message received so far, and
177 cfa37a7b 2004-04-10 devnull .I n
178 cfa37a7b 2004-04-10 devnull reports the total number of bytes received for that message.
179 cfa37a7b 2004-04-10 devnull If the message is complete, the return value will be as in
180 cfa37a7b 2004-04-10 devnull .IR plumbunpack .
181 cfa37a7b 2004-04-10 devnull If not, and
182 cfa37a7b 2004-04-10 devnull .I morep
183 cfa37a7b 2004-04-10 devnull is not null, the return value will be
184 cfa37a7b 2004-04-10 devnull .B nil
185 cfa37a7b 2004-04-10 devnull and
186 cfa37a7b 2004-04-10 devnull .BR * morep
187 cfa37a7b 2004-04-10 devnull will be set to the number of bytes remaining to be read for this message to be complete
188 cfa37a7b 2004-04-10 devnull (recall that the byte count is in the header).
189 cfa37a7b 2004-04-10 devnull Those bytes should be read by the caller, placed at location
190 cfa37a7b 2004-04-10 devnull .IB buf + n \f1,
191 cfa37a7b 2004-04-10 devnull and the message unpacked again.
192 cfa37a7b 2004-04-10 devnull If an error is encountered, the return value will be
193 cfa37a7b 2004-04-10 devnull .B nil
194 cfa37a7b 2004-04-10 devnull and
195 cfa37a7b 2004-04-10 devnull .BI * morep
196 cfa37a7b 2004-04-10 devnull will be zero.
197 cfa37a7b 2004-04-10 devnull .PP
198 cfa37a7b 2004-04-10 devnull .I Plumbpackattr
199 cfa37a7b 2004-04-10 devnull converts the list
200 cfa37a7b 2004-04-10 devnull .I a
201 cfa37a7b 2004-04-10 devnull of
202 cfa37a7b 2004-04-10 devnull .B Plumbattr
203 cfa37a7b 2004-04-10 devnull structures into a null-terminated string.
204 cfa37a7b 2004-04-10 devnull If an attribute value contains white space, quote characters, or equal signs,
205 cfa37a7b 2004-04-10 devnull the value will be quoted appropriately.
206 cfa37a7b 2004-04-10 devnull A newline character will terminate processing.
207 cfa37a7b 2004-04-10 devnull .I Plumbunpackattr
208 cfa37a7b 2004-04-10 devnull converts the null-terminated string
209 cfa37a7b 2004-04-10 devnull .I a
210 cfa37a7b 2004-04-10 devnull back into a list of
211 cfa37a7b 2004-04-10 devnull .I Plumbattr
212 cfa37a7b 2004-04-10 devnull structures.
213 cfa37a7b 2004-04-10 devnull .PP
214 cfa37a7b 2004-04-10 devnull .I Plumblookup
215 cfa37a7b 2004-04-10 devnull searches the
216 cfa37a7b 2004-04-10 devnull .B Plumbattr
217 cfa37a7b 2004-04-10 devnull list
218 cfa37a7b 2004-04-10 devnull .I a
219 cfa37a7b 2004-04-10 devnull for an attribute with the given
220 cfa37a7b 2004-04-10 devnull .I name
221 cfa37a7b 2004-04-10 devnull and returns the associated value.
222 cfa37a7b 2004-04-10 devnull The returned string is the original value, not a copy.
223 cfa37a7b 2004-04-10 devnull If the attribute has no value, the returned value will be the empty string;
224 cfa37a7b 2004-04-10 devnull if the attribute does not occur in the list at all, the value will be nil.
225 cfa37a7b 2004-04-10 devnull .PP
226 cfa37a7b 2004-04-10 devnull .I Plumbaddattr
227 cfa37a7b 2004-04-10 devnull appends the
228 cfa37a7b 2004-04-10 devnull .I new
229 cfa37a7b 2004-04-10 devnull .B Plumbattr
230 cfa37a7b 2004-04-10 devnull (which may be a list) to the attribute list
231 cfa37a7b 2004-04-10 devnull .IR a
232 cfa37a7b 2004-04-10 devnull and returns the new list.
233 cfa37a7b 2004-04-10 devnull .I Plumbattr
234 cfa37a7b 2004-04-10 devnull searches the list
235 cfa37a7b 2004-04-10 devnull .I a
236 cfa37a7b 2004-04-10 devnull for the first attribute with name
237 cfa37a7b 2004-04-10 devnull .I name
238 cfa37a7b 2004-04-10 devnull and deletes it from the list, returning the resulting list.
239 cfa37a7b 2004-04-10 devnull .I Plumbdelattr
240 cfa37a7b 2004-04-10 devnull is a no-op if no such attribute exists.
241 058b0118 2005-01-03 devnull .PP
242 058b0118 2005-01-03 devnull The file descriptor returned by
243 058b0118 2005-01-03 devnull .I plumbopen
244 058b0118 2005-01-03 devnull is created with
245 058b0118 2005-01-03 devnull .I fsopenfd
246 058b0118 2005-01-03 devnull (see
247 058b0118 2005-01-03 devnull .IR 9pclient (3)),
248 058b0118 2005-01-03 devnull which masks information about read and write errors.
249 058b0118 2005-01-03 devnull This is acceptable for use in
250 058b0118 2005-01-03 devnull .I plumbrecv
251 058b0118 2005-01-03 devnull but not for
252 058b0118 2005-01-03 devnull .IR plumbsend ,
253 058b0118 2005-01-03 devnull which depends on seeing details of write errors.
254 058b0118 2005-01-03 devnull .IR Plumbopenfid ,
255 058b0118 2005-01-03 devnull .IR plumbrecvfid ,
256 058b0118 2005-01-03 devnull and
257 058b0118 2005-01-03 devnull .IR plumbsendtofid
258 058b0118 2005-01-03 devnull provide an explicit interface to
259 058b0118 2005-01-03 devnull .I lib9pclient
260 058b0118 2005-01-03 devnull that preserves the exact error details.
261 cfa37a7b 2004-04-10 devnull .SH SOURCE
262 c3674de4 2005-01-11 devnull .B \*9/src/libplumb
263 cfa37a7b 2004-04-10 devnull .SH SEE ALSO
264 cfa37a7b 2004-04-10 devnull .IR plumb (1),
265 bf8a59fa 2004-04-11 devnull .IR event (3),
266 cfa37a7b 2004-04-10 devnull .IR plumber (4),
267 058b0118 2005-01-03 devnull .IR plumb (7)
268 cfa37a7b 2004-04-10 devnull .SH DIAGNOSTICS
269 cfa37a7b 2004-04-10 devnull When appropriate, including when a
270 cfa37a7b 2004-04-10 devnull .I plumbsend
271 cfa37a7b 2004-04-10 devnull fails, these routine set
272 cfa37a7b 2004-04-10 devnull .IR errstr .
273 058b0118 2005-01-03 devnull .SH BUGS
274 058b0118 2005-01-03 devnull To avoid rewriting clients that use
275 058b0118 2005-01-03 devnull .IR plumbsend ,
276 058b0118 2005-01-03 devnull the call
277 058b0118 2005-01-03 devnull .B plumbopen("send",
278 058b0118 2005-01-03 devnull .B OWRITE)
279 058b0118 2005-01-03 devnull returns a useless file descriptor
280 058b0118 2005-01-03 devnull (it is opened to
281 058b0118 2005-01-03 devnull .BR /dev/null ).
282 058b0118 2005-01-03 devnull .I Plumbsend
283 058b0118 2005-01-03 devnull looks for this particular file descriptor
284 058b0118 2005-01-03 devnull and uses a static copy of the
285 058b0118 2005-01-03 devnull .B CFid
286 058b0118 2005-01-03 devnull instead.