From 27db309518eb722b421a3a26a873a71c794bacfd Mon Sep 17 00:00:00 2001 From: Ferenc Wagner Date: Tue, 30 Mar 2004 04:32:46 +0000 Subject: [PATCH] Don't expect stdout be usable after exchanging file descriptors under it. --- programs/winetest/main.c | 2 -- programs/winetest/util.c | 43 ++++++++++++++++++++++++++++++------------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/programs/winetest/main.c b/programs/winetest/main.c index 52e1bfb1213..b826bf73ed7 100644 --- a/programs/winetest/main.c +++ b/programs/winetest/main.c @@ -335,8 +335,6 @@ run_tests (char *logname, const char *tag) SetErrorMode (SEM_FAILCRITICALERRORS); if (!(wineloader = getenv("WINELOADER"))) wineloader = "wine"; - if (setvbuf (stdout, NULL, _IONBF, 0)) - report (R_FATAL, "Can't unbuffer output."); tempdir = tempnam (0, "wct"); if (!tempdir) diff --git a/programs/winetest/util.c b/programs/winetest/util.c index a074d25759c..77182462cb9 100644 --- a/programs/winetest/util.c +++ b/programs/winetest/util.c @@ -19,6 +19,7 @@ * */ #include +#include #include #include "winetest.h" @@ -39,26 +40,14 @@ void *xrealloc (void *op, size_t len) return p; } -void xprintf (const char *fmt, ...) -{ - va_list ap; - - va_start (ap, fmt); - if (vprintf (fmt, ap) < 0) - report (R_FATAL, "Can't write logs: %d", errno); - va_end (ap); -} - -char *vstrmake (size_t *lenp, va_list ap) +char *vstrfmtmake (size_t *lenp, const char *fmt, va_list ap) { - char *fmt; size_t size = 1000; char *p, *q; int n; p = malloc (size); if (!p) return NULL; - fmt = va_arg (ap, char*); while (1) { n = vsnprintf (p, size, fmt, ap); if (n < 0) size *= 2; /* Windows */ @@ -75,6 +64,14 @@ char *vstrmake (size_t *lenp, va_list ap) return p; } +char *vstrmake (size_t *lenp, va_list ap) +{ + const char *fmt; + + fmt = va_arg (ap, const char*); + return vstrfmtmake (lenp, fmt, ap); +} + char *strmake (size_t *lenp, ...) { va_list ap; @@ -87,6 +84,26 @@ char *strmake (size_t *lenp, ...) return p; } +void xprintf (const char *fmt, ...) +{ + va_list ap; + size_t size; + ssize_t written; + char *buffer, *head; + + va_start (ap, fmt); + buffer = vstrfmtmake (&size, fmt, ap); + head = buffer; + va_end (ap); + while ((written = write (1, head, size)) != size) { + if (written == -1) + report (R_FATAL, "Can't write logs: %d", errno); + head += written; + size -= written; + } + free (buffer); +} + char * badtagchar (char *tag) { -- 2.11.4.GIT