diff options
author | herbert <herbert@gondor.apana.org.au> | 2005-03-02 22:14:54 +1100 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2005-09-26 18:33:04 +1000 |
commit | 61331aba7c7f2d75d59c3f30f1e2df7b32eb6b62 (patch) | |
tree | 98b2e8657b8b30eaff17d142ef15fb5912c205a1 /src/bltin | |
parent | Eliminate duplicate stat in test_eaccess. (diff) | |
download | dash-61331aba7c7f2d75d59c3f30f1e2df7b32eb6b62.tar.gz dash-61331aba7c7f2d75d59c3f30f1e2df7b32eb6b62.zip |
Invert return value of test_eaccess and rename it to test_st_mode.
Diffstat (limited to '')
-rw-r--r-- | src/bltin/test.c | 32 |
1 files changed, 14 insertions, 18 deletions
diff --git a/src/bltin/test.c b/src/bltin/test.c index e0e48c7..97ced57 100644 --- a/src/bltin/test.c +++ b/src/bltin/test.c @@ -157,7 +157,7 @@ static int getn(const char *); static int newerf(const char *, const char *); static int olderf(const char *, const char *); static int equalf(const char *, const char *); -static int test_eaccess(const struct stat64 *, int); +static int test_st_mode(const struct stat64 *, int); static int bash_group_member(gid_t); #ifndef SHELL @@ -348,11 +348,11 @@ filstat(char *nm, enum token mode) switch (mode) { case FILRD: - return test_eaccess(&s, R_OK) == 0; + return test_st_mode(&s, R_OK); case FILWR: - return test_eaccess(&s, W_OK) == 0; + return test_st_mode(&s, W_OK); case FILEX: - return test_eaccess(&s, X_OK) == 0; + return test_st_mode(&s, X_OK); case FILEXIST: return 1; case FILREG: @@ -484,34 +484,30 @@ equalf (const char *f1, const char *f2) b1.st_ino == b2.st_ino); } -/* Do the same thing access(2) does, but use the effective uid and gid, - and don't make the mistake of telling root that any file is - executable. */ +/* + * Similar to what access(2) does, but uses the effective uid and gid. + * Doesn't make the mistake of telling root that any file is executable. + * Returns non-zero if the file is accessible. + */ static int -test_eaccess(const struct stat64 *st, int mode) +test_st_mode(const struct stat64 *st, int mode) { int euid = geteuid(); if (euid == 0) { /* Root can read or write any file. */ if (mode != X_OK) - return (0); + return 1; /* 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); - } - - if (st->st_uid == euid) + mode = S_IXUSR | S_IXGRP | S_IXOTH; + } else if (st->st_uid == euid) mode <<= 6; else if (bash_group_member(st->st_gid)) mode <<= 3; - if (st->st_mode & mode) - return (0); - - return (-1); + return st->st_mode & mode; } /* Return non-zero if GID is one that we have in our groups list. */ |