]>
Commit | Line | Data |
---|---|---|
eb120e69 BC |
1 | /* |
2 | * The order of the following two lines is important. | |
3 | * | |
4 | * FREAD_READS_DIRECTORIES is undefined 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 | #undef FREAD_READS_DIRECTORIES | |
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 | } |