Don't define _XOPEN_SOURCE Do define _SGI_SOURCE Declare the _xpg5 versions of *snprintf() along with wrapper macros Defining _XOPEN_SOURCE prevents many of the common functions and macros from being defined. _Not_ setting _XOPEN_SOURCE, and instead setting _SGI_SOURCE, provides all of the XPG4, XPG5, BSD, POSIX functions and declarations, _BUT_ provides a horribly broken snprintf(). The provided snprintf() can not be worked around using git's compat workaround, since SGI's vsnprintf() always returns the number of characters written into the string, instead of -1 which is what git's compat version expects. SGI does have a working snprintf(), but it is only provided when _NO_XOPEN5 evaluates to zero, and this only happens if _XOPEN_SOURCE is defined which, as mentioned above, prevents many other common functions and defines. The working *snprintf() functions are named _xpg5_vsnprintf() and _xpg5_snprintf(), so declarations for these two functions were added to git-compat-util.h and macros were added for vsnprintf and snprintf to call these versions. --- git-compat-util.h | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-) diff --git a/git-compat-util.h b/git-compat-util.h index cf89cdf..f22707c 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -39,13 +39,14 @@ /* Approximation of the length of the decimal representation of this type. */ #define decimal_length(x) ((int)(sizeof(x) * 2.56 + 0.5) + 1) -#if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__USLC__) && !defined(_M_UNIX) +#if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__USLC__) && !defined(_M_UNIX) && !defined(sgi) #define _XOPEN_SOURCE 600 /* glibc2 and AIX 5.3L need 500, OpenBSD needs 600 for S_ISLNK() */ #define _XOPEN_SOURCE_EXTENDED 1 /* AIX 5.3L needs this */ #endif #define _ALL_SOURCE 1 #define _GNU_SOURCE 1 #define _BSD_SOURCE 1 +#define _SGI_SOURCE 1 #include <unistd.h> #include <stdio.h> @@ -262,6 +263,15 @@ extern int git_snprintf(char *str, size_t maxsize, #define vsnprintf git_vsnprintf extern int git_vsnprintf(char *str, size_t maxsize, const char *format, va_list ap); +#elif defined(sgi) +extern int _xpg5_vsnprintf(char * __restrict, + __SGI_LIBC_NAMESPACE_QUALIFIER size_t, + const char * __restrict, /* va_list */ char *); +#define vsnprintf _xpg5_vsnprintf +extern int _xpg5_snprintf(char * __restrict, + __SGI_LIBC_NAMESPACE_QUALIFIER size_t, + const char * __restrict, ...); +#define snprintf _xpg5_snprintf #endif #ifdef __GLIBC_PREREQ -- 1.6.0.13.ge1c8 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html