strerror_r-posix: Fix for MSVC 9.
authorBruno Haible <bruno@clisp.org>
Sun, 25 Sep 2011 12:54:47 +0000 (14:54 +0200)
committerBruno Haible <bruno@clisp.org>
Sun, 25 Sep 2011 12:55:40 +0000 (14:55 +0200)
* lib/strerror_r.c (local_snprintf): New function.
(snprintf): Define to local_snprintf, not to _snprintf.

ChangeLog
lib/strerror_r.c

index 12ef00a..af8ce60 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2011-09-25  Bruno Haible  <bruno@clisp.org>
 
+       strerror_r-posix: Fix for MSVC 9.
+       * lib/strerror_r.c (local_snprintf): New function.
+       (snprintf): Define to local_snprintf, not to _snprintf.
+
+2011-09-25  Bruno Haible  <bruno@clisp.org>
+
        ftruncate: Support for MSVC 9.
        * lib/ftruncate.c: Include errno.h, msvc-inval.h.
        (chsize_nothrow): New function.
index 7fd90b7..e6cf99b 100644 (file)
@@ -87,9 +87,24 @@ gl_lock_define_initialized(static, strerror_lock)
 #endif
 
 /* On MSVC, there is no snprintf() function, just a _snprintf().
-   It is of lower quality, but sufficient for the simple use here.  */
+   It is of lower quality, but sufficient for the simple use here.
+   We only have to make sure to NUL terminate the result (_snprintf
+   does not NUL terminate, like strncpy).  */
 #if !HAVE_SNPRINTF
-# define snprintf _snprintf
+static int
+local_snprintf (char *buf, size_t buflen, const char *format, ...)
+{
+  va_list args;
+  int result;
+
+  va_start (args, format);
+  result = _vsnprintf (buf, buflen, format, args);
+  va_end (args);
+  if (buflen > 0 && (result < 0 || result >= buflen))
+    buf[buflen - 1] = '\0';
+  return result;
+}
+# define snprintf local_snprintf
 #endif
 
 /* Copy as much of MSG into BUF as possible, without corrupting errno.