X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-compat-util.h;h=f982b8e48469a5f09698808d1e55ded04d5923b8;hb=810255fd12536d296597a0366f514bf65c2e10f6;hp=ead0ede5872e3c1ca10596010d4827ed726ff394;hpb=252fef7149204d52ed4b46fd7e8ac8c803ceb0aa;p=git.git diff --git a/git-compat-util.h b/git-compat-util.h index ead0ede5..f982b8e4 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -1,6 +1,14 @@ #ifndef GIT_COMPAT_UTIL_H #define GIT_COMPAT_UTIL_H +#ifndef FLEX_ARRAY +#if defined(__GNUC__) && (__GNUC__ < 3) +#define FLEX_ARRAY 0 +#else +#define FLEX_ARRAY /* empty */ +#endif +#endif + #include #include #include @@ -55,6 +63,11 @@ extern int gitfakemunmap(void *start, size_t length); extern int gitsetenv(const char *, const char *, int); #endif +#ifdef NO_UNSETENV +#define unsetenv gitunsetenv +extern void gitunsetenv(const char *); +#endif + #ifdef NO_STRCASESTR #define strcasestr gitstrcasestr extern char *gitstrcasestr(const char *haystack, const char *needle); @@ -63,6 +76,8 @@ extern char *gitstrcasestr(const char *haystack, const char *needle); static inline void *xmalloc(size_t size) { void *ret = malloc(size); + if (!ret && !size) + ret = malloc(1); if (!ret) die("Out of memory, malloc failed"); return ret; @@ -71,6 +86,8 @@ static inline void *xmalloc(size_t size) static inline void *xrealloc(void *ptr, size_t size) { void *ret = realloc(ptr, size); + if (!ret && !size) + ret = realloc(ptr, 1); if (!ret) die("Out of memory, realloc failed"); return ret; @@ -79,11 +96,35 @@ static inline void *xrealloc(void *ptr, size_t size) static inline void *xcalloc(size_t nmemb, size_t size) { void *ret = calloc(nmemb, size); + if (!ret && (!nmemb || !size)) + ret = calloc(1, 1); if (!ret) die("Out of memory, calloc failed"); return ret; } +static inline ssize_t xread(int fd, void *buf, size_t len) +{ + ssize_t nr; + while (1) { + nr = read(fd, buf, len); + if ((nr < 0) && (errno == EAGAIN || errno == EINTR)) + continue; + return nr; + } +} + +static inline ssize_t xwrite(int fd, const void *buf, size_t len) +{ + ssize_t nr; + while (1) { + nr = write(fd, buf, len); + if ((nr < 0) && (errno == EAGAIN || errno == EINTR)) + continue; + return nr; + } +} + /* Sane ctype - no locale, and works with signed chars */ #undef isspace #undef isdigit