mirror of
https://github.com/git/git.git
synced 2024-12-01 05:54:16 +08:00
f4626df51f
With this change GIT can be compiled and linked using MinGW. Builtins that only read the repository such as the log family and grep already work. Simple stubs are provided for a number of functions that the Windows C runtime does not offer. They will be completed in later patches. However, a fix for the snprintf/vsnprintf replacement is applied here to avoid buffer overflows. Dmitry Kakurin pointed out that access(..., X_OK) would always fails on Vista and suggested the -D__USE_MINGW_ACCESS workaround. Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
54 lines
1.0 KiB
C
54 lines
1.0 KiB
C
#include "../git-compat-util.h"
|
|
|
|
/*
|
|
* The size parameter specifies the available space, i.e. includes
|
|
* the trailing NUL byte; but Windows's vsnprintf expects the
|
|
* number of characters to write without the trailing NUL.
|
|
*/
|
|
#ifndef SNPRINTF_SIZE_CORR
|
|
#define SNPRINTF_SIZE_CORR 0
|
|
#endif
|
|
|
|
#undef vsnprintf
|
|
int git_vsnprintf(char *str, size_t maxsize, const char *format, va_list ap)
|
|
{
|
|
char *s;
|
|
int ret = -1;
|
|
|
|
if (maxsize > 0) {
|
|
ret = vsnprintf(str, maxsize-SNPRINTF_SIZE_CORR, format, ap);
|
|
/* Windows does not NUL-terminate if result fills buffer */
|
|
str[maxsize-1] = 0;
|
|
}
|
|
if (ret != -1)
|
|
return ret;
|
|
|
|
s = NULL;
|
|
if (maxsize < 128)
|
|
maxsize = 128;
|
|
|
|
while (ret == -1) {
|
|
maxsize *= 4;
|
|
str = realloc(s, maxsize);
|
|
if (! str)
|
|
break;
|
|
s = str;
|
|
ret = vsnprintf(str, maxsize-SNPRINTF_SIZE_CORR, format, ap);
|
|
}
|
|
free(s);
|
|
return ret;
|
|
}
|
|
|
|
int git_snprintf(char *str, size_t maxsize, const char *format, ...)
|
|
{
|
|
va_list ap;
|
|
int ret;
|
|
|
|
va_start(ap, format);
|
|
ret = git_vsnprintf(str, maxsize, format, ap);
|
|
va_end(ap);
|
|
|
|
return ret;
|
|
}
|
|
|