summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_sbuf.c
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2001-09-29 00:32:46 +0000
committerdes <des@FreeBSD.org>2001-09-29 00:32:46 +0000
commit8ee76c0339260330346f9d720d3c9ef43ecf04de (patch)
treea2ea6069153ab68fbe23e7cf2807fa3ad2ce34d8 /sys/kern/subr_sbuf.c
parent5f0513c0ec8c5c90bc0e3c5a9ccb5dfc0af4d7ca (diff)
downloadFreeBSD-src-8ee76c0339260330346f9d720d3c9ef43ecf04de.zip
FreeBSD-src-8ee76c0339260330346f9d720d3c9ef43ecf04de.tar.gz
Add a couple of API functions I need for my pseudofs WIP. Documentation
will follow when I've decided whether to keep this API or ditch it in favor of something slightly more subtle.
Diffstat (limited to 'sys/kern/subr_sbuf.c')
-rw-r--r--sys/kern/subr_sbuf.c52
1 files changed, 51 insertions, 1 deletions
diff --git a/sys/kern/subr_sbuf.c b/sys/kern/subr_sbuf.c
index 3c3b93b..330c556 100644
--- a/sys/kern/subr_sbuf.c
+++ b/sys/kern/subr_sbuf.c
@@ -29,18 +29,22 @@
*/
#include <sys/param.h>
-#include <sys/sbuf.h>
#ifdef _KERNEL
+#include <sys/ctype.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/systm.h>
+#include <sys/uio.h>
#include <machine/stdarg.h>
#else /* _KERNEL */
+#include <ctype.h>
#include <stdarg.h>
#include <stdlib.h>
#endif /* _KERNEL */
+#include <sys/sbuf.h>
+
#ifdef _KERNEL
MALLOC_DEFINE(M_SBUF, "sbuf", "string buffers");
#define SBMALLOC(size) malloc(size, M_SBUF, M_WAITOK)
@@ -133,6 +137,34 @@ sbuf_new(struct sbuf *s, char *buf, int length, int flags)
return (s);
}
+#ifdef _KERNEL
+/*
+ * Create an sbuf with uio data
+ */
+struct sbuf *
+sbuf_uionew(struct sbuf *s, struct uio *uio, int *error)
+{
+ KASSERT(uio != NULL,
+ (__FUNCTION__ " called with NULL uio pointer"));
+ KASSERT(error != NULL,
+ (__FUNCTION__ " called with NULL error pointer"));
+
+ s = sbuf_new(s, NULL, uio->uio_resid + 1, 0);
+ if (s == NULL) {
+ *error = ENOMEM;
+ return (NULL);
+ }
+ *error = uiomove(s->s_buf, uio->uio_resid, uio);
+ if (*error != 0) {
+ sbuf_delete(s);
+ return (NULL);
+ }
+ s->s_len = s->s_size - 1;
+ *error = 0;
+ return (s);
+}
+#endif
+
/*
* Clear an sbuf and reset its position
*/
@@ -357,6 +389,24 @@ sbuf_putc(struct sbuf *s, int c)
}
/*
+ * Trim whitespace characters from an sbuf.
+ */
+int
+sbuf_trim(struct sbuf *s)
+{
+ assert_sbuf_integrity(s);
+ assert_sbuf_state(s, 0);
+
+ if (SBUF_HASOVERFLOWED(s))
+ return (-1);
+
+ while (s->s_len && isspace(s->s_buf[s->s_len-1]))
+ --s->s_len;
+
+ return (0);
+}
+
+/*
* Check if an sbuf overflowed
*/
int
OpenPOWER on IntegriCloud