Blame


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