2 .\" Copyright (c) 2000 Poul-Henning Kamp and Dag-Erling Coïdan Smørgrav
3 .\" All rights reserved.
5 .\" Redistribution and use in source and binary forms, with or without
6 .\" modification, are permitted provided that the following conditions
8 .\" 1. Redistributions of source code must retain the above copyright
9 .\" notice, this list of conditions and the following disclaimer.
10 .\" 2. Redistributions in binary form must reproduce the above copyright
11 .\" notice, this list of conditions and the following disclaimer in the
12 .\" documentation and/or other materials provided with the distribution.
14 .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 .\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 .Nm sbuf_new_for_sysctl ,
55 .Nd safe string composition
59 .Ft typedef\ int ( sbuf_drain_func ) ( void\ *arg, const\ char\ *data, int\ len ) ;
62 .Fn sbuf_new "struct sbuf *s" "char *buf" "int length" "int flags"
66 .Fn sbuf_clear "struct sbuf *s"
68 .Fn sbuf_setpos "struct sbuf *s" "int pos"
70 .Fn sbuf_bcat "struct sbuf *s" "const void *buf" "size_t len"
72 .Fn sbuf_bcopyin "struct sbuf *s" "const void *uaddr" "size_t len"
74 .Fn sbuf_bcpy "struct sbuf *s" "const void *buf" "size_t len"
76 .Fn sbuf_cat "struct sbuf *s" "const char *str"
78 .Fn sbuf_copyin "struct sbuf *s" "const void *uaddr" "size_t len"
80 .Fn sbuf_cpy "struct sbuf *s" "const char *str"
82 .Fn sbuf_printf "struct sbuf *s" "const char *fmt" "..."
84 .Fn sbuf_vprintf "struct sbuf *s" "const char *fmt" "va_list ap"
86 .Fn sbuf_putc "struct sbuf *s" "int c"
88 .Fn sbuf_set_drain "struct sbuf *s" "sbuf_drain_func *func" "void *arg"
90 .Fn sbuf_trim "struct sbuf *s"
92 .Fn sbuf_error "struct sbuf *s"
94 .Fn sbuf_finish "struct sbuf *s"
96 .Fn sbuf_data "struct sbuf *s"
98 .Fn sbuf_len "struct sbuf *s"
100 .Fn sbuf_done "struct sbuf *s"
102 .Fn sbuf_delete "struct sbuf *s"
105 .Fn sbuf_new_for_sysctl "struct sbuf *s" "char *buf" "int length" "struct sysctl_req *req"
109 family of functions allows one to safely allocate, compose and
110 release strings in kernel or user space.
112 Instead of arrays of characters, these functions operate on structures
118 Any errors encountered during the allocation or composition of the
119 string will be latched in the data structure,
120 making a single error test at the end of the composition
121 sufficient to determine success or failure of the entire process.
125 function initializes the
127 pointed to by its first argument.
137 argument is a pointer to a buffer in which to store the actual string;
141 will allocate one using
145 is the initial size of the storage buffer.
148 may be comprised of the following flags:
149 .Bl -tag -width ".Dv SBUF_AUTOEXTEND"
151 The storage buffer is fixed at its initial size.
152 Attempting to extend the sbuf beyond this size results in an overflow condition.
153 .It Dv SBUF_AUTOEXTEND
154 This indicates that the storage buffer may be extended as necessary, so long
155 as resources allow, to hold additional data.
162 it must point to an array of at least
165 The result of accessing that array directly while it is in use by the
170 function is a shortcut for creating a completely dynamic
172 It is the equivalent of calling
179 .Dv SBUF_AUTOEXTEND .
182 .Fn sbuf_new_for_sysctl
183 function will set up an sbuf with a drain function to use
185 when the internal buffer fills.
186 Note that if the various functions which append to an sbuf are used while
187 a non-sleepable lock is held, the user buffer should be wired using
188 .Fn sysctl_wire_old_buffer .
194 and frees any memory allocated for it.
195 There must be a call to
199 Any attempt to access the sbuf after it has been deleted will fail.
203 function invalidates the contents of the
205 and resets its position to zero.
213 which is a value between zero and one less than the size of the
215 This effectively truncates the sbuf at the new position.
219 function appends the first
221 bytes from the buffer
230 bytes from the specified userland address into the
235 function replaces the contents of the
239 bytes from the buffer
244 function appends the NUL-terminated string
248 at the current position.
252 function sets a drain function
256 and records a pointer
258 to be passed to the drain on callback.
259 The drain function cannot be changed while
263 The registered drain function
265 will be called with the argument
271 to a byte string that is the contents of the sbuf, and the length
274 If the drain function exists, it will be called when the sbuf internal
275 buffer is full, or on behalf of
277 The drain function may drain some or all of the data, but must drain
279 The return value from the drain function, if positive, indicates how
280 many bytes were drained.
281 If negative, the return value indicates the negative error code which
282 will be returned from this or a later call to
284 The returned drained length cannot be zero.
285 To do unbuffered draining, initialize the sbuf with a two-byte buffer.
286 The drain will be called for every byte added to the sbuf.
293 functions cannot be used on an sbuf with a drain.
297 function copies a NUL-terminated string from the specified userland
302 argument is non-zero, no more than
304 characters (not counting the terminating NUL) are copied; otherwise
305 the entire string, or as much of it as can fit in the
311 function replaces the contents of the
313 with those of the NUL-terminated string
315 This is equivalent to calling
319 or one which position has been reset to zero with
326 function formats its arguments according to the format string pointed
329 and appends the resulting string to the
331 at the current position.
335 function behaves the same as
337 except that the arguments are obtained from the variable-length argument list
342 function appends the character
346 at the current position.
350 function removes trailing whitespace from the
355 function returns any error value that the
357 may have accumulated, either from the drain function, or ENOMEM if the
360 This function is generally not needed and instead the error code from
362 is the preferred way to discover whether an sbuf had an error.
366 function will call the attached drain function if one exists until all
370 If there is no attached drain,
374 In either case it marks the
376 as finished, which means that it may no longer be modified using
385 is used to reset the sbuf.
389 function returns the actual string;
391 only works on a finished
394 .Fn sbuf_len function returns the length of the string.
397 with an attached drain,
399 returns the length of the un-drained data.
401 returns non-zero if the
405 If an operation caused an
407 to overflow, most subsequent operations on it will fail until the
413 or its position is reset to a value between 0 and one less than the
414 size of its storage buffer using
416 or it is reinitialized to a sufficiently short string using
419 Drains in user-space will not always function as indicated.
420 While the drain function will be called immediately on overflow from
429 currently have no way to determine whether there will be an overflow
430 until after it occurs, and cannot do a partial expansion of the format
432 Thus when using libsbuf the buffer may be extended to allow completion
433 of a single printf call, even though a drain is attached.
439 if it failed to allocate a storage buffer, and a pointer to the new
445 function returns \-1 if
447 was invalid, and zero otherwise.
457 all return \-1 if the buffer overflowed, and zero otherwise.
461 function returns a non-zero value if the buffer has an overflow or
462 drain error, and zero otherwise.
470 and \-1, respectively, if the buffer overflowed.
475 returns \-1 if copying string from userland failed, and number of bytes
480 function (the kernel version) returns ENOMEM if the sbuf overflowed before
482 or returns the error code from the drain if one is attached.
486 function (the userland version)
487 will return zero for success and \-1 and set errno on error.
489 .Bd -literal -compact
490 #include <sys/sbuf.h>
494 sb = sbuf_new_auto();
495 sbuf_cat(sb, "Customers found:\en");
496 TAILQ_FOREACH(foo, &foolist, list) {
497 sbuf_printf(sb, " %4d %s\en", foo->index, foo->name);
498 sbuf_printf(sb, " Address: %s\en", foo->address);
499 sbuf_printf(sb, " Zip: %s\en", foo->zipcode);
501 if (sbuf_finish(sb)) /* Check for any and all errors */
502 err(1,"Could not generate message");
503 transmit_msg(sbuf_data(sb), sbuf_len(sb));
516 family of functions first appeared in
522 family of functions was designed by
523 .An Poul-Henning Kamp Aq phk@FreeBSD.org
525 .An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org .
526 Additional improvements were suggested by
527 .An Justin T. Gibbs Aq gibbs@FreeBSD.org .
528 Auto-extend support added by
529 .An Kelly Yancey Aq kbyanc@FreeBSD.org .
530 Drain functionality added by
531 .An Matthew Fleming Aq mdf@FreeBSD.org .
533 This manual page was written by
534 .An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org .