* strace.c (flush_tcp_output): New function.
(line_ended, droptcb, print_event_exit): Use it to flush tcp->outf.
* tests/fflush.c: New file.
* tests/fflush.test: New test.
* tests/Makefile.am (MISC_TESTS): Add it.
* tests/.gitignore: Add fflush.
* tests/pure_executables.list: Likewise.
if (current_tcp) {
int n = vfprintf(current_tcp->outf, fmt, args);
if (n < 0) {
+ /* very unlikely due to vfprintf buffering */
if (current_tcp->outf != stderr)
perror_msg("%s", outfname);
} else
current_tcp->curcol += strlen(str);
return;
}
+ /* very unlikely due to fputs_unlocked buffering */
if (current_tcp->outf != stderr)
perror_msg("%s", outfname);
}
va_end(args);
}
+static void
+flush_tcp_output(const struct tcb *const tcp)
+{
+ if (fflush(tcp->outf) && tcp->outf != stderr)
+ perror_msg("%s", outfname);
+}
+
void
line_ended(void)
{
if (current_tcp) {
current_tcp->curcol = 0;
- fflush(current_tcp->outf);
+ flush_tcp_output(current_tcp);
}
if (printing_tcp) {
printing_tcp->curcol = 0;
} else {
if (printing_tcp == tcp && tcp->curcol != 0)
fprintf(tcp->outf, " <detached ...>\n");
- fflush(tcp->outf);
+ flush_tcp_output(tcp);
}
}
&& printing_tcp->curcol != 0) {
current_tcp = printing_tcp;
tprints(" <unfinished ...>\n");
- fflush(printing_tcp->outf);
+ flush_tcp_output(printing_tcp);
printing_tcp->curcol = 0;
current_tcp = tcp;
}
fcntl
fcntl64
fdatasync
+fflush
file_handle
file_ioctl
filter-unavailable
detach-sleeping.test \
detach-stopped.test \
filter-unavailable.test \
+ fflush.test \
get_regs.test \
interactive_block.test \
ksysent.test \
--- /dev/null
+/*
+ * Check fflush error diagnostics.
+ *
+ * Copyright (c) 2017 The strace developers.
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
+ */
+
+#include "tests.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main(void)
+{
+ errno = ENOSPC;
+ printf("%s: /dev/full: %m\n", getenv("STRACE_EXE") ?: "strace");
+ return 0;
+}
--- /dev/null
+#!/bin/sh -efu
+#
+# Check fflush error diagnostics.
+#
+# Copyright (c) 2011-2017 The strace developers.
+# 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.
+# 3. The name of the author may not be used to endorse or promote products
+# derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
+
+. "${srcdir=.}/init.sh"
+
+run_prog > /dev/null
+args="-o /dev/full -e trace=none $args"
+
+$STRACE $args > "$EXP" 2> "$LOG" || {
+ msg="$STRACE $args failed with code $?"
+ cat "$LOG" >&2
+ fail_ "$msg"
+}
+
+match_diff "$LOG" "$EXP"
fcntl
fcntl64
fdatasync
+fflush
file_handle
file_ioctl
finit_module