From: Junio C Hamano Date: Thu, 21 Feb 2008 00:13:19 +0000 (-0800) Subject: Merge branch 'bc/fopen' X-Git-Tag: v1.5.5-rc0~183 X-Git-Url: https://www.git.lorimer.id.au/gitweb.git/diff_plain/c0284cea3149cb20e24ee5e25b475e5f8edba84f?hp=9e7bd0110b41f9bb16377e322300629f8c4d6c12 Merge branch 'bc/fopen' * bc/fopen: Add compat/fopen.c which returns NULL on attempt to open directory --- diff --git a/Makefile b/Makefile index 83c359acde..d33a556ffe 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,9 @@ all:: # Define V=1 to have a more verbose compile. # +# Define FREAD_READS_DIRECTORIES if your are on a system which succeeds +# when attempting to read from an fopen'ed directory. +# # Define NO_OPENSSL environment variable if you do not have OpenSSL. # This also implies MOZILLA_SHA1. # @@ -622,6 +625,10 @@ endif ifdef NO_C99_FORMAT BASIC_CFLAGS += -DNO_C99_FORMAT endif +ifdef FREAD_READS_DIRECTORIES + COMPAT_CFLAGS += -DFREAD_READS_DIRECTORIES + COMPAT_OBJS += compat/fopen.o +endif ifdef NO_SYMLINK_HEAD BASIC_CFLAGS += -DNO_SYMLINK_HEAD endif diff --git a/compat/fopen.c b/compat/fopen.c new file mode 100644 index 0000000000..ccb9e89fa4 --- /dev/null +++ b/compat/fopen.c @@ -0,0 +1,26 @@ +#include "../git-compat-util.h" +#undef fopen +FILE *git_fopen(const char *path, const char *mode) +{ + FILE *fp; + struct stat st; + + if (mode[0] == 'w' || mode[0] == 'a') + return fopen(path, mode); + + if (!(fp = fopen(path, mode))) + return NULL; + + if (fstat(fileno(fp), &st)) { + fclose(fp); + return NULL; + } + + if (S_ISDIR(st.st_mode)) { + fclose(fp); + errno = EISDIR; + return NULL; + } + + return fp; +} diff --git a/git-compat-util.h b/git-compat-util.h index 05146047e0..2a40703c85 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -204,6 +204,11 @@ void *gitmemmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen); #endif +#ifdef FREAD_READS_DIRECTORIES +#define fopen(a,b) git_fopen(a,b) +extern FILE *git_fopen(const char*, const char*); +#endif + #ifdef __GLIBC_PREREQ #if __GLIBC_PREREQ(2, 1) #define HAVE_STRCHRNUL