summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_sbuf.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2011-05-17 06:36:32 +0000
committerphk <phk@FreeBSD.org>2011-05-17 06:36:32 +0000
commit99b5f982260da2ec08402620828ca746bec5e43a (patch)
tree2fbafa288eb9a252d82c6b46a9bef5cb34370e05 /sys/kern/subr_sbuf.c
parent9cdc6d68bef35c6bd2805de0f0ae28a700a055b8 (diff)
downloadFreeBSD-src-99b5f982260da2ec08402620828ca746bec5e43a.zip
FreeBSD-src-99b5f982260da2ec08402620828ca746bec5e43a.tar.gz
Don't expect PAGE_SIZE to exist on all platforms (It is a pretty arbitrary
choice of default size in the first place) Reverse the order of arguments to the internal static sbuf_put_byte() function to match everything else in this file. Move sbuf_putc_func() inside the kernel version of sbuf_vprintf where it belongs. sbuf_putc() incorrectly used sbuf_putc_func() which supress NUL characters, it should use sbuf_put_byte(). Make sbuf_finish() return -1 on error. Minor stylistic nits fixed.
Diffstat (limited to 'sys/kern/subr_sbuf.c')
-rw-r--r--sys/kern/subr_sbuf.c60
1 files changed, 33 insertions, 27 deletions
diff --git a/sys/kern/subr_sbuf.c b/sys/kern/subr_sbuf.c
index 793e17e..bf4e73c 100644
--- a/sys/kern/subr_sbuf.c
+++ b/sys/kern/subr_sbuf.c
@@ -67,7 +67,7 @@ static MALLOC_DEFINE(M_SBUF, "sbuf", "string buffers");
#define SBUF_ISDYNSTRUCT(s) ((s)->s_flags & SBUF_DYNSTRUCT)
#define SBUF_ISFINISHED(s) ((s)->s_flags & SBUF_FINISHED)
#define SBUF_HASROOM(s) ((s)->s_len < (s)->s_size - 1)
-#define SBUF_FREESPACE(s) ((s)->s_size - (s)->s_len - 1)
+#define SBUF_FREESPACE(s) ((s)->s_size - ((s)->s_len + 1))
#define SBUF_CANEXTEND(s) ((s)->s_flags & SBUF_AUTOEXTEND)
/*
@@ -77,8 +77,14 @@ static MALLOC_DEFINE(M_SBUF, "sbuf", "string buffers");
#define SBUF_CLEARFLAG(s, f) do { (s)->s_flags &= ~(f); } while (0)
#define SBUF_MINEXTENDSIZE 16 /* Should be power of 2. */
+
+#ifdef PAGE_SIZE
#define SBUF_MAXEXTENDSIZE PAGE_SIZE
#define SBUF_MAXEXTENDINCR PAGE_SIZE
+#else
+#define SBUF_MAXEXTENDSIZE 4096
+#define SBUF_MAXEXTENDINCR 4096
+#endif
/*
* Debugging support
@@ -328,7 +334,7 @@ sbuf_drain(struct sbuf *s)
* buffer and marking overflow.
*/
static void
-sbuf_put_byte(int c, struct sbuf *s)
+sbuf_put_byte(struct sbuf *s, int c)
{
assert_sbuf_integrity(s);
@@ -337,7 +343,7 @@ sbuf_put_byte(int c, struct sbuf *s)
if (s->s_error != 0)
return;
if (SBUF_FREESPACE(s) <= 0) {
- /*
+ /*
* If there is a drain, use it, otherwise extend the
* buffer.
*/
@@ -352,18 +358,6 @@ sbuf_put_byte(int c, struct sbuf *s)
}
/*
- * Append a non-NUL character to an sbuf. This prototype signature is
- * suitable for use with kvprintf(9).
- */
-static void
-sbuf_putc_func(int c, void *arg)
-{
-
- if (c != '\0')
- sbuf_put_byte(c, arg);
-}
-
-/*
* Append a byte string to an sbuf.
*/
int
@@ -378,10 +372,10 @@ sbuf_bcat(struct sbuf *s, const void *buf, size_t len)
if (s->s_error != 0)
return (-1);
for (; str < end; str++) {
- sbuf_put_byte(*str, s);
+ sbuf_put_byte(s, *str);
if (s->s_error != 0)
return (-1);
- }
+ }
return (0);
}
@@ -443,7 +437,7 @@ sbuf_cat(struct sbuf *s, const char *str)
return (-1);
while (*str != '\0') {
- sbuf_put_byte(*str++, s);
+ sbuf_put_byte(s, *str++);
if (s->s_error != 0)
return (-1);
}
@@ -507,6 +501,19 @@ sbuf_cpy(struct sbuf *s, const char *str)
* Format the given argument list and append the resulting string to an sbuf.
*/
#ifdef _KERNEL
+
+/*
+ * Append a non-NUL character to an sbuf. This prototype signature is
+ * suitable for use with kvprintf(9).
+ */
+static void
+sbuf_putc_func(int c, void *arg)
+{
+
+ if (c != '\0')
+ sbuf_put_byte(arg, c);
+}
+
int
sbuf_vprintf(struct sbuf *s, const char *fmt, va_list ap)
{
@@ -611,7 +618,7 @@ int
sbuf_putc(struct sbuf *s, int c)
{
- sbuf_putc_func(c, s);
+ sbuf_put_byte(s, c);
if (s->s_error != 0)
return (-1);
return (0);
@@ -654,24 +661,23 @@ sbuf_error(const struct sbuf *s)
int
sbuf_finish(struct sbuf *s)
{
- int error;
assert_sbuf_integrity(s);
assert_sbuf_state(s, 0);
- error = s->s_error;
if (s->s_drain_func != NULL) {
- while (s->s_len > 0 && error == 0)
- error = sbuf_drain(s);
+ while (s->s_len > 0 && s->s_error == 0)
+ s->s_error = sbuf_drain(s);
}
s->s_buf[s->s_len] = '\0';
- s->s_error = 0;
SBUF_SETFLAG(s, SBUF_FINISHED);
#ifdef _KERNEL
- return (error);
+ return (s->s_error);
#else
- errno = error;
- return (-1);
+ errno = s->s_error;
+ if (s->s_error)
+ return (-1);
+ return (0);
#endif
}
OpenPOWER on IntegriCloud