summaryrefslogtreecommitdiff
path: root/usr.bin/stdbuf
diff options
context:
space:
mode:
authorJeremie Le Hen <jlh@FreeBSD.org>2012-04-28 20:52:20 +0000
committerJeremie Le Hen <jlh@FreeBSD.org>2012-04-28 20:52:20 +0000
commit6486b015fc84e96725fef22b0e3363351399ae83 (patch)
tree82e8a2c00b0e28749e9fc998b6ae46e1602dfc3d /usr.bin/stdbuf
parent64cc18cc015fc09d2cf9b1fb3d4cd76d3cef1634 (diff)
downloadsrc-test2-6486b015fc84e96725fef22b0e3363351399ae83.tar.gz
src-test2-6486b015fc84e96725fef22b0e3363351399ae83.zip
Notes
Diffstat (limited to 'usr.bin/stdbuf')
-rw-r--r--usr.bin/stdbuf/Makefile8
-rw-r--r--usr.bin/stdbuf/stdbuf.1116
-rw-r--r--usr.bin/stdbuf/stdbuf.c104
3 files changed, 228 insertions, 0 deletions
diff --git a/usr.bin/stdbuf/Makefile b/usr.bin/stdbuf/Makefile
new file mode 100644
index 000000000000..ccf139d3e49e
--- /dev/null
+++ b/usr.bin/stdbuf/Makefile
@@ -0,0 +1,8 @@
+# $FreeBSD$
+
+PROG= stdbuf
+SRCS= stdbuf.c
+
+WARNS?= 6
+
+.include <bsd.prog.mk>
diff --git a/usr.bin/stdbuf/stdbuf.1 b/usr.bin/stdbuf/stdbuf.1
new file mode 100644
index 000000000000..2e287400c22e
--- /dev/null
+++ b/usr.bin/stdbuf/stdbuf.1
@@ -0,0 +1,116 @@
+.\" Copyright (c) 2012 Jeremie Le Hen <jlh@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code and documentation must retain the above
+.\" copyright notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd April 28, 2012
+.Dt STDBUF 1
+.Os
+.Sh NAME
+.Nm stdbuf
+.Nd change standard streams initial buffering
+.Sh SYNOPSIS
+.Nm
+.Op Fl e Ar bufdef
+.Op Fl i Ar bufdef
+.Op Fl o Ar bufdef
+.Op Ar command Op ...
+.Sh DESCRIPTION
+.Nm
+is used to change the initial buffering of standard input,
+standard output and/or standard error streams for
+.Ar command .
+It relies on
+.Xr libstdbuf 3
+which is loaded and configured by
+.Nm
+through environment variables.
+.Pp
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl e Ar bufdef
+Set initial buffering of the standard error stream for
+.Ar command
+as defined by
+.Ar bufdef
+.Pq see Sx BUFFER DEFINITION .
+.It Fl i Ar bufdef
+Set initial buffering of the standard input stream for
+.Ar command
+as defined by
+.Ar bufdef
+.Pq see Sx BUFFER DEFINITION .
+.It Fl o Ar bufdef
+Set initial buffering of the standard output stream for
+.Ar command
+as defined by
+.Ar bufdef
+.Pq see Sx BUFFER DEFINITION .
+.El
+.Sh BUFFER DEFINITION
+Buffer definition is the same as in
+.Xr libstdbuf 3 :
+.Bl -tag -width size -offset indent
+.It Qq 0
+unbuffered
+.It Qq L
+line buffered
+.It Qq B
+fully buffered with the default buffer size
+.It Ar size
+fully buffered with a buffer of
+.Ar size
+bytes (suffixes 'k', 'M' and 'G' are accepted)
+.El
+.Sh EXAMPLES
+In the following example, the stdout stream of the
+.Xr awk 1
+command
+will be fully buffered by default because it does not refer
+to a terminal.
+.Nm
+is used to force it to be line-buffered so
+.Xr vmstat 8 Ns 's
+output will not stall until the full buffer fills.
+.Bd -literal -offset indent
+# vmstat 1 | stdbuf -o L awk '$2 > 1 || $3 > 1' | cat -n
+.Ed
+.Sh SEE ALSO
+.Xr libstdbuf 3 ,
+.Xr setvbuf 3
+.Sh HISTORY
+The
+.Nm
+utility first appeared in
+.Fx 8.4 .
+.Sh AUTHORS
+.An -nosplit
+The original idea of the
+.Nm
+command comes from
+.An Padraig Brady
+who implemented it in the GNU coreutils.
+.An Jeremie Le Hen
+implemented it on
+.Fx .
diff --git a/usr.bin/stdbuf/stdbuf.c b/usr.bin/stdbuf/stdbuf.c
new file mode 100644
index 000000000000..c6951bba72b9
--- /dev/null
+++ b/usr.bin/stdbuf/stdbuf.c
@@ -0,0 +1,104 @@
+/*-
+ * Copyright (c) 2012 Jeremie Le Hen <jlh@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#define LIBSTDBUF "/usr/lib/libstdbuf.so"
+
+extern char *__progname;
+
+static void
+usage(int s)
+{
+
+ fprintf(stderr, "Usage: %s [-e 0|L|<sz>] [-i 0|L|<sz>] [-o 0|L|<sz>] "
+ "<cmd> [args ...]\n", __progname);
+ exit(s);
+}
+
+int
+main(int argc, char *argv[])
+{
+ char *ibuf, *obuf, *ebuf;
+ char *preload0, *preload1;
+ int i;
+
+ ibuf = obuf = ebuf = NULL;
+ while ((i = getopt(argc, argv, ":e:i:o:")) != -1) {
+ switch (i) {
+ case 'e':
+ ebuf = optarg;
+ break;
+ case 'i':
+ ibuf = optarg;
+ break;
+ case 'o':
+ obuf = optarg;
+ break;
+ case ':':
+ warnx("Missing argument for option -%c", optopt);
+ usage(1);
+ break;
+ case '?':
+ default:
+ warnx("Unknown option: %c", optopt);
+ usage(1);
+ break;
+ }
+ }
+ argc -= optind;
+ argv += optind;
+ if (argc < 2)
+ usage(0);
+
+ if (ibuf != NULL && setenv("_STDBUF_I", ibuf, 1) == -1)
+ warn("Failed to set environment variable: %s=%s",
+ "_STDBUF_I", ibuf);
+ if (obuf != NULL && setenv("_STDBUF_O", obuf, 1) == -1)
+ warn("Failed to set environment variable: %s=%s",
+ "_STDBUF_O", obuf);
+ if (ebuf != NULL && setenv("_STDBUF_E", ebuf, 1) == -1)
+ warn("Failed to set environment variable: %s=%s",
+ "_STDBUF_E", ebuf);
+
+ preload0 = getenv("LD_PRELOAD");
+ if (preload0 == NULL)
+ i = asprintf(&preload1, "LD_PRELOAD=" LIBSTDBUF);
+ else
+ i = asprintf(&preload1, "LD_PRELOAD=%s:%s", preload0,
+ LIBSTDBUF);
+
+ if (i < 0 || putenv(preload1) == -1)
+ warn("Failed to set environment variable: %s", preload1);
+
+ execvp(argv[0], argv);
+ err(2, "%s", argv[0]);
+}