1/* 2 * The order of the following two lines is important. 3 * 4 * SUPPRESS_FOPEN_REDEFINITION is defined before including git-compat-util.h 5 * to avoid the redefinition of fopen within git-compat-util.h. This is 6 * necessary since fopen is a macro on some platforms which may be set 7 * based on compiler options. For example, on AIX fopen is set to fopen64 8 * when _LARGE_FILES is defined. The previous technique of merely undefining 9 * fopen after including git-compat-util.h is inadequate in this case. 10 */ 11#define SUPPRESS_FOPEN_REDEFINITION 12#include"../git-compat-util.h" 13 14FILE*git_fopen(const char*path,const char*mode) 15{ 16FILE*fp; 17struct stat st; 18 19if(mode[0] =='w'|| mode[0] =='a') 20returnfopen(path, mode); 21 22if(!(fp =fopen(path, mode))) 23return NULL; 24 25if(fstat(fileno(fp), &st)) { 26fclose(fp); 27return NULL; 28} 29 30if(S_ISDIR(st.st_mode)) { 31fclose(fp); 32 errno = EISDIR; 33return NULL; 34} 35 36return fp; 37}