Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 18 Jul 2017 06:45:41 +0000 (UTC)
From:      Ngie Cooper <ngie@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r321108 - in stable/10: lib/libsbuf share/man/man9 sys/kern sys/sys
Message-ID:  <201707180645.v6I6jfTR090848@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201707180645.v6I6jfTR090848>