compat / access.con commit Merge branch 'vv/merge-squash-with-explicit-commit' (6e0b1c6)
   1#define COMPAT_CODE_ACCESS
   2#include "../git-compat-util.h"
   3
   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 */
   8int git_access(const char *path, int mode)
   9{
  10        struct stat st;
  11
  12        /* do not interfere a normal user */
  13        if (geteuid())
  14                return access(path, mode);
  15
  16        if (stat(path, &st) < 0)
  17                return -1;
  18
  19        /* Root can read or write any file. */
  20        if (!(mode & X_OK))
  21                return 0;
  22
  23        /* Root can execute any file that has any one of the execute
  24         * bits set.
  25         */
  26        if (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))
  27                return 0;
  28
  29        errno = EACCES;
  30        return -1;
  31}