svn commit: r321108 - in stable/10: lib/libsbuf share/man/man9 sys/kern sys/sys
Ngie Cooper
ngie at FreeBSD.org
Tue Jul 18 06:45:43 UTC 2017
Author: ngie
Date: Tue Jul 18 06:45:41 2017
New Revision: 321108
URL: https://svnweb.freebsd.org/changeset/base/321108
Log:
MFC r307873,r314397,r314399,r314419,r314420,r314533,r316553:
r307873 (by marcel):
Include <stdarg.h> instead of <machine/stdarg.h> when compiled as
part of libsbuf. The former is the standard header, and allows us
to compile libsbuf on macOS/linux.
r314397 (by scottl):
Implement sbuf_prf(), which takes an sbuf and outputs it
to stdout in the non-kernel case and to the console+log
in the kernel case. For the kernel case it hooks the
putbuf() machinery underneath printf(9) so that the buffer
is written completely atomically and without a copy into
another temporary buffer. This is useful for fixing
compound console/log messages that become broken and
interleaved when multiple threads are competing for the
console.
r314399 (by scottl):
Add prototype for sbuf_putbuf()
r314419 (by jkim):
Include stdio.h to fix libsbuf build.
r314420 (by scottl):
Provide a comment on why stdio.h needs to be included.
r314533 (by scottl):
Expose the sbuf_putbuf() symbol to libsbuf. There are a few other symbols
that are present but not exposed, like get/set/clear flags, not sure if they
need to be exposed at this point.
r316553:
sbuf(3): expose sbuf_{clear,get,set}_flags(3) via libsbuf
These functions were added to sbuf(9) in r279992, but never
exposed to userspace. Expose them now so they can be used/tested.
Modified:
stable/10/lib/libsbuf/Symbol.map
stable/10/lib/libsbuf/Version.def
stable/10/share/man/man9/sbuf.9
stable/10/sys/kern/subr_prf.c
stable/10/sys/sys/sbuf.h
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/lib/libsbuf/Symbol.map
==============================================================================
--- stable/10/lib/libsbuf/Symbol.map Tue Jul 18 06:45:13 2017 (r321107)
+++ stable/10/lib/libsbuf/Symbol.map Tue Jul 18 06:45:41 2017 (r321108)
@@ -21,6 +21,9 @@ FBSD_1.2 {
sbuf_len;
sbuf_done;
sbuf_delete;
+ sbuf_clear_flags;
+ sbuf_get_flags;
+ sbuf_set_flags;
};
FBSD_1.3 {
@@ -31,3 +34,8 @@ FBSD_1.3 {
FBSD_1.4 {
sbuf_hexdump;
};
+
+FBSD_1.5 {
+ sbuf_putbuf;
+};
+
Modified: stable/10/lib/libsbuf/Version.def
==============================================================================
--- stable/10/lib/libsbuf/Version.def Tue Jul 18 06:45:13 2017 (r321107)
+++ stable/10/lib/libsbuf/Version.def Tue Jul 18 06:45:41 2017 (r321108)
@@ -8,3 +8,6 @@ FBSD_1.3 {
FBSD_1.4 {
} FBSD_1.3;
+
+FBSD_1.5 {
+} FBSD_1.4;
Modified: stable/10/share/man/man9/sbuf.9
==============================================================================
--- stable/10/share/man/man9/sbuf.9 Tue Jul 18 06:45:13 2017 (r321107)
+++ stable/10/share/man/man9/sbuf.9 Tue Jul 18 06:45:41 2017 (r321108)
@@ -54,7 +54,8 @@
.Nm sbuf_delete ,
.Nm sbuf_start_section ,
.Nm sbuf_end_section ,
-.Nm sbuf_hexdump
+.Nm sbuf_hexdump ,
+.Nm sbuf_putbuf
.Nd safe string composition
.Sh SYNOPSIS
.In sys/types.h
@@ -115,6 +116,8 @@
.Fa "const char *hdr"
.Fa "int flags"
.Fc
+.Ft void
+.Fn sbuf_putbuf "struct sbuf *s"
.In sys/sysctl.h
.Ft struct sbuf *
.Fn sbuf_new_for_sysctl "struct sbuf *s" "char *buf" "int length" "struct sysctl_req *req"
@@ -449,6 +452,12 @@ representation of the bytes if possible.
See the
.Xr hexdump 3
man page for more details on the interface.
+.Pp
+The
+.Fn sbuf_putbuf
+function printfs the sbuf to stdout if in userland, and to the console
+and log if in the kernel.
+It does not drain the buffer or update any pointers.
.Sh NOTES
If an operation caused an
.Fa sbuf
Modified: stable/10/sys/kern/subr_prf.c
==============================================================================
--- stable/10/sys/kern/subr_prf.c Tue Jul 18 06:45:13 2017 (r321107)
+++ stable/10/sys/kern/subr_prf.c Tue Jul 18 06:45:41 2017 (r321108)
@@ -72,8 +72,20 @@ __FBSDID("$FreeBSD$");
* Note that stdarg.h and the ANSI style va_start macro is used for both
* ANSI and traditional C compilers.
*/
+#ifdef _KERNEL
#include <machine/stdarg.h>
+#else
+#include <stdarg.h>
+#endif
+/*
+ * This is needed for sbuf_putbuf() when compiled into userland. Due to the
+ * shared nature of this file, it's the only place to put it.
+ */
+#ifndef _KERNEL
+#include <stdio.h>
+#endif
+
#ifdef _KERNEL
#define TOCONS 0x01
@@ -403,6 +415,23 @@ vprintf(const char *fmt, va_list ap)
}
static void
+prf_putbuf(char *bufr, int flags, int pri)
+{
+
+ if (flags & TOLOG)
+ msglogstr(bufr, pri, /*filter_cr*/1);
+
+ if (flags & TOCONS) {
+ if ((panicstr == NULL) && (constty != NULL))
+ msgbuf_addstr(&consmsgbuf, -1,
+ bufr, /*filter_cr*/ 0);
+
+ if ((constty == NULL) ||(always_console_output))
+ cnputs(bufr);
+ }
+}
+
+static void
putbuf(int c, struct putchar_arg *ap)
{
/* Check if no console output buffer was provided. */
@@ -423,19 +452,8 @@ putbuf(int c, struct putchar_arg *ap)
/* Check if the buffer needs to be flushed. */
if (ap->remain == 2 || c == '\n') {
+ prf_putbuf(ap->p_bufr, ap->flags, ap->pri);
- if (ap->flags & TOLOG)
- msglogstr(ap->p_bufr, ap->pri, /*filter_cr*/1);
-
- if (ap->flags & TOCONS) {
- if ((panicstr == NULL) && (constty != NULL))
- msgbuf_addstr(&consmsgbuf, -1,
- ap->p_bufr, /*filter_cr*/ 0);
-
- if ((constty == NULL) ||(always_console_output))
- cnputs(ap->p_bufr);
- }
-
ap->p_next = ap->p_bufr;
ap->remain = ap->n_bufr;
*ap->p_next = '\0';
@@ -1203,5 +1221,21 @@ counted_warning(unsigned *counter, const char *msg)
break;
}
}
+}
+#endif
+
+#ifdef _KERNEL
+void
+sbuf_putbuf(struct sbuf *sb)
+{
+
+ prf_putbuf(sbuf_data(sb), TOLOG | TOCONS, -1);
+}
+#else
+void
+sbuf_putbuf(struct sbuf *sb)
+{
+
+ printf("%s", sbuf_data(sb));
}
#endif
Modified: stable/10/sys/sys/sbuf.h
==============================================================================
--- stable/10/sys/sys/sbuf.h Tue Jul 18 06:45:13 2017 (r321107)
+++ stable/10/sys/sys/sbuf.h Tue Jul 18 06:45:41 2017 (r321108)
@@ -95,6 +95,7 @@ void sbuf_start_section(struct sbuf *, ssize_t *);
ssize_t sbuf_end_section(struct sbuf *, ssize_t, size_t, int);
void sbuf_hexdump(struct sbuf *, const void *, int, const char *,
int);
+void sbuf_putbuf(struct sbuf *);
#ifdef _KERNEL
struct uio;
More information about the svn-src-all
mailing list