#define COMPAT_CODE_ACCESS | |
#include "../git-compat-util.h" | |
/* Do the same thing access(2) does, but use the effective uid, | |
* and don't make the mistake of telling root that any file is | |
* executable. This version uses stat(2). | |
*/ | |
int git_access(const char *path, int mode) | |
{ | |
struct stat st; | |
/* do not interfere a normal user */ | |
if (geteuid()) | |
return access(path, mode); | |
if (stat(path, &st) < 0) | |
return -1; | |
/* Root can read or write any file. */ | |
if (!(mode & X_OK)) | |
return 0; | |
/* Root can execute any file that has any one of the execute | |
* bits set. | |
*/ | |
if (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) | |
return 0; | |
errno = EACCES; | |
return -1; | |
} |