From 5d88030bd1a197041f84530a88c2590e6bb1bbb1 Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Sat, 4 Jan 2014 23:57:05 +0100 Subject: Support non-standard vsnprintf() return code C99 states that vsnprintf() "returns the number of characters that would have been printed if the n were unlimited"; but according to the Linux manual page "glibc until 2.0.6 would return -1 when the output was truncated" -- so we have to handle both cases ... --- src/portab/portabtest.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'src/portab') diff --git a/src/portab/portabtest.c b/src/portab/portabtest.c index 9e6bd228..b104739e 100644 --- a/src/portab/portabtest.c +++ b/src/portab/portabtest.c @@ -139,16 +139,35 @@ va_dcl { char str[5]; va_list ap; + int r; #ifdef PROTOTYPES va_start(ap, Format); #else va_start(ap); #endif - if (vsnprintf(str, sizeof(str), Format, ap) != Len) - Panic("vsnprintf return code"); + r = vsnprintf(str, sizeof(str), Format, ap); va_end(ap); - + if (r != Len) { + /* C99 states that vsnprintf() "returns the number of + * characters that would have been printed if the n were + * unlimited", but according to the Linux manual page "glibc + * until 2.0.6 would return -1 when the output was truncated", + * and other implementations (libUTIL on A/UX) even return the + * number of characters processed ... so we only test our own + * implementation and warn on errors otherwise :-/ */ +#ifdef HAVE_VSNPRINTF + fprintf(stderr, + "\n ** WARNING: The vsnprintf() function of this system isn't standard\n"); + fprintf(stderr, + " ** conformant and returns a WRONG result: %d (should be %d)! The test\n", + r, Len); + fprintf(stderr, + " ** result has been ignored but may lead to errors during execution!\n\n"); +#else + Panic("vsnprintf return code"); +#endif + } if (str[4] != '\0') Panic("vsnprintf NULL byte"); if (strlen(str) != 4) -- cgit 1.4.1