Merge branch 'rs/diff-parseopts-cleanup'
[git/gitster.git] / compat / access.c
blob19fda3e877641c3c083618928c241351f1caaf91
1 #define COMPAT_CODE_ACCESS
2 #include "../git-compat-util.h"
4 /* Do the same thing access(2) does, but use the effective uid,
5 * and don't make the mistake of telling root that any file is
6 * executable. This version uses stat(2).
7 */
8 int git_access(const char *path, int mode)
10 struct stat st;
12 /* do not interfere a normal user */
13 if (geteuid())
14 return access(path, mode);
16 if (stat(path, &st) < 0)
17 return -1;
19 /* Root can read or write any file. */
20 if (!(mode & X_OK))
21 return 0;
23 /* Root can execute any file that has any one of the execute
24 * bits set.
26 if (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))
27 return 0;
29 errno = EACCES;
30 return -1;