From cba22528fa897728ebbffb95c05037ec9a20ea7c Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Fri, 8 Feb 2008 20:32:47 -0600 Subject: Add compat/fopen.c which returns NULL on attempt to open directory Some systems do not fail as expected when fread et al. are called on a directory stream. Replace fopen on such systems which will fail when the supplied path is a directory. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- compat/fopen.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 compat/fopen.c (limited to 'compat/fopen.c') 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; +} -- cgit v1.2.3 From eb120e699f3faea2d71cd9cb79a8cf4f79ec1d45 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Wed, 7 May 2008 12:34:18 -0500 Subject: compat/fopen.c: avoid clobbering the system defined fopen macro Some systems define fopen as a macro based on compiler settings. The previous technique for reverting to the system fopen function by merely undefining fopen is inadequate in this case. Instead, avoid defining fopen entirely when compiling this source file. Signed-off-by: Brandon Casey Tested-by: Mike Ralphson Signed-off-by: Junio C Hamano --- compat/fopen.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'compat/fopen.c') diff --git a/compat/fopen.c b/compat/fopen.c index ccb9e89fa4..b5ca142fed 100644 --- a/compat/fopen.c +++ b/compat/fopen.c @@ -1,5 +1,16 @@ +/* + * The order of the following two lines is important. + * + * FREAD_READS_DIRECTORIES is undefined before including git-compat-util.h + * to avoid the redefinition of fopen within git-compat-util.h. This is + * necessary since fopen is a macro on some platforms which may be set + * based on compiler options. For example, on AIX fopen is set to fopen64 + * when _LARGE_FILES is defined. The previous technique of merely undefining + * fopen after including git-compat-util.h is inadequate in this case. + */ +#undef FREAD_READS_DIRECTORIES #include "../git-compat-util.h" -#undef fopen + FILE *git_fopen(const char *path, const char *mode) { FILE *fp; -- cgit v1.2.3