Brandon Casey | eb120e6 | 2008-05-07 12:34:18 -0500 | [diff] [blame] | 1 | /* |
| 2 | * The order of the following two lines is important. |
| 3 | * |
Ramsay Jones | b0a642a | 2017-05-08 21:45:56 +0100 | [diff] [blame] | 4 | * SUPPRESS_FOPEN_REDEFINITION is defined before including git-compat-util.h |
Brandon Casey | eb120e6 | 2008-05-07 12:34:18 -0500 | [diff] [blame] | 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 | */ |
Ramsay Jones | b0a642a | 2017-05-08 21:45:56 +0100 | [diff] [blame] | 11 | #define SUPPRESS_FOPEN_REDEFINITION |
Brandon Casey | cba2252 | 2008-02-08 20:32:47 -0600 | [diff] [blame] | 12 | #include "../git-compat-util.h" |
Brandon Casey | eb120e6 | 2008-05-07 12:34:18 -0500 | [diff] [blame] | 13 | |
Brandon Casey | cba2252 | 2008-02-08 20:32:47 -0600 | [diff] [blame] | 14 | FILE *git_fopen(const char *path, const char *mode) |
| 15 | { |
| 16 | FILE *fp; |
| 17 | struct stat st; |
| 18 | |
| 19 | if (mode[0] == 'w' || mode[0] == 'a') |
| 20 | return fopen(path, mode); |
| 21 | |
| 22 | if (!(fp = fopen(path, mode))) |
| 23 | return NULL; |
| 24 | |
| 25 | if (fstat(fileno(fp), &st)) { |
| 26 | fclose(fp); |
| 27 | return NULL; |
| 28 | } |
| 29 | |
| 30 | if (S_ISDIR(st.st_mode)) { |
| 31 | fclose(fp); |
| 32 | errno = EISDIR; |
| 33 | return NULL; |
| 34 | } |
| 35 | |
| 36 | return fp; |
| 37 | } |