Re: [PATCH] Add compat/vsnprintf.c for systems that returns -1 on maxsize reached
- From
Wayne Davison <wayne@opencoder.net>
- Date
- Mar 5, 2008, 15:54 UTC
- Message-ID
- <20080305155412.GA19295@herod.dreamhost.com>
- In-Reply-To
- <200803051600.06605.michal.rokos@nextsoft.cz>
On Wed, Mar 05, 2008 at 04:00:06PM +0100, Michal Rokos wrote:
> + [[char buf[1]; > + if (test_vsnprintf(buf, 1, "%s", "12345") != 5) return 1; > + if (snprintf(buf, 1, "%s", "12345") != 5) return 1]])],
I'd suggest using a longer buf, requesting a longer length (e.g. 3 instead of 1), and then making sure that the resulting buf is right (e.g. "12" instead of "123").
[[char buf[6]; if (test_vsnprintf(buf, 3, "%s", "12345") != 5 || strcmp(buf, "12") != 0) return 1; if (snprintf(buf, 3, "%s", "12345") != 5 || strcmp(buf, "12") != 0) return 1]])],
Then, set a define that snprintf is bogus and use a version of snprintf() based on this instead:
http://rsync.samba.org/ftp/unpacked/rsync/lib/snprintf.c
That defines rsync_snprintf() and rsync_vsnprintf() functions (which could be renamed for git). Then, in a global .h file, add something like this:
#if !defined HAVE_VSNPRINTF || !defined HAVE_C99_VSNPRINTF #define vsnprintf rsync_vsnprintf int vsnprintf(char *str, size_t count, const char *fmt, va_list args); #endif
#if !defined HAVE_SNPRINTF || !defined HAVE_C99_VSNPRINTF #define snprintf rsync_snprintf int snprintf(char *str, size_t count, const char *fmt,...); #endif
Just be sure to put those that after the various system includes so that they are not adversely affected.
..wayne..