summaryrefslogtreecommitdiff
path: root/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'file.c')
-rw-r--r--file.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/file.c b/file.c
index 8104f33d5f..f1527a0407 100644
--- a/file.c
+++ b/file.c
@@ -818,11 +818,15 @@ group_member(GETGROUPS_T gid)
# define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH)
#endif
+#if defined(S_IXGRP) && !defined(_WIN32) && !defined(__CYGWIN__)
+#define USE_GETEUID 1
+#endif
+
#ifndef HAVE_EACCESS
int
eaccess(const char *path, int mode)
{
-#if defined(S_IXGRP) && !defined(_WIN32) && !defined(__CYGWIN__)
+#ifdef USE_GETEUID
struct stat st;
int euid;
@@ -3655,6 +3659,9 @@ rb_stat_r(VALUE obj)
{
struct stat *st = get_stat(obj);
+#ifdef USE_GETEUID
+ if (geteuid() == 0) return Qtrue;
+#endif
#ifdef S_IRUSR
if (rb_stat_owned(obj))
return st->st_mode & S_IRUSR ? Qtrue : Qfalse;
@@ -3687,6 +3694,9 @@ rb_stat_R(VALUE obj)
{
struct stat *st = get_stat(obj);
+#ifdef USE_GETEUID
+ if (getuid() == 0) return Qtrue;
+#endif
#ifdef S_IRUSR
if (rb_stat_rowned(obj))
return st->st_mode & S_IRUSR ? Qtrue : Qfalse;
@@ -3743,6 +3753,9 @@ rb_stat_w(VALUE obj)
{
struct stat *st = get_stat(obj);
+#ifdef USE_GETEUID
+ if (geteuid() == 0) return Qtrue;
+#endif
#ifdef S_IWUSR
if (rb_stat_owned(obj))
return st->st_mode & S_IWUSR ? Qtrue : Qfalse;
@@ -3773,6 +3786,9 @@ rb_stat_W(VALUE obj)
{
struct stat *st = get_stat(obj);
+#ifdef USE_GETEUID
+ if (getuid() == 0) return Qtrue;
+#endif
#ifdef S_IWUSR
if (rb_stat_rowned(obj))
return st->st_mode & S_IWUSR ? Qtrue : Qfalse;
@@ -3831,6 +3847,11 @@ rb_stat_x(VALUE obj)
{
struct stat *st = get_stat(obj);
+#ifdef USE_GETEUID
+ if (geteuid() == 0) {
+ return st->st_mode & S_IXUGO ? Qtrue : Qfalse;
+ }
+#endif
#ifdef S_IXUSR
if (rb_stat_owned(obj))
return st->st_mode & S_IXUSR ? Qtrue : Qfalse;
@@ -3859,6 +3880,11 @@ rb_stat_X(VALUE obj)
{
struct stat *st = get_stat(obj);
+#ifdef USE_GETEUID
+ if (getuid() == 0) {
+ return st->st_mode & S_IXUGO ? Qtrue : Qfalse;
+ }
+#endif
#ifdef S_IXUSR
if (rb_stat_rowned(obj))
return st->st_mode & S_IXUSR ? Qtrue : Qfalse;