]>
Commit | Line | Data |
---|---|---|
eb120e69 BC |
1 | /* |
2 | * The order of the following two lines is important. | |
3 | * | |
b0a642ac | 4 | * SUPPRESS_FOPEN_REDEFINITION is defined before including git-compat-util.h |
eb120e69 BC |
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 | */ | |
b0a642ac | 11 | #define SUPPRESS_FOPEN_REDEFINITION |
cba22528 | 12 | #include "../git-compat-util.h" |
eb120e69 | 13 | |
cba22528 BC |
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 | } |