| /* |
| * The order of the following two lines is important. |
| * |
| * SUPPRESS_FOPEN_REDEFINITION is defined 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. |
| */ |
| #define SUPPRESS_FOPEN_REDEFINITION |
| #include "../git-compat-util.h" |
| |
| 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; |
| } |