6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/***********************************************************************
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* This software is part of the ast package *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* Copyright (c) 1985-2011 AT&T Intellectual Property *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* and is licensed under the *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* Common Public License, Version 1.0 *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* by AT&T Intellectual Property *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* A copy of the License is available at *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* http://www.opensource.org/licenses/cpl1.0.txt *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* Information and Software Systems Research *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* AT&T Research *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* Florham Park NJ *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* Glenn Fowler <gsf@research.att.com> *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* David Korn <dgk@research.att.com> *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* Phong Vo <kpv@research.att.com> *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey* *
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey***********************************************************************/
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#pragma prototyped
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey/*
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey * access() euid/egid implementation
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey */
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <ast.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <errno.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include <ls.h>
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#include "FEATURE/eaccess"
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#if _lib_eaccess
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. MaskeyNoN(eaccess)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#else
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#if defined(__EXPORT__)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#define extern __EXPORT__
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#endif
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyextern int
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskeyeaccess(const char* path, register int flags)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey{
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#ifdef EFF_ONLY_OK
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return access(path, flags|EFF_ONLY_OK);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#else
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#if _lib_euidaccess
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return euidaccess(path, flags);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey#else
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey register int mode;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey struct stat st;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey static int init;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey static uid_t ruid;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey static uid_t euid;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey static gid_t rgid;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey static gid_t egid;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!init)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey ruid = getuid();
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey euid = geteuid();
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey rgid = getgid();
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey egid = getegid();
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey init = (ruid == euid && rgid == egid) ? 1 : -1;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey }
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (init > 0 || flags == F_OK)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return access(path, flags);
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (stat(path, &st))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return -1;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey mode = 0;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (euid == 0)
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey {
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey if (!S_ISREG(st.st_mode) || !(flags & X_OK) || (st.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH)))
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey return 0;
6ba597c56d749c61b4f783157f63196d7b2445f0Anurag S. Maskey goto nope;
}
else if (euid == st.st_uid)
{
if (flags & R_OK)
mode |= S_IRUSR;
if (flags & W_OK)
mode |= S_IWUSR;
if (flags & X_OK)
mode |= S_IXUSR;
}
else if (egid == st.st_gid)
{
#if _lib_getgroups
setgroup:
#endif
if (flags & R_OK)
mode |= S_IRGRP;
if (flags & W_OK)
mode |= S_IWGRP;
if (flags & X_OK)
mode |= S_IXGRP;
}
else
{
#if _lib_getgroups
register int n;
static int ngroups = -2;
static gid_t* groups;
if (ngroups == -2)
{
if ((ngroups = getgroups(0, (gid_t*)0)) <= 0)
ngroups = NGROUPS_MAX;
if (!(groups = newof(0, gid_t, ngroups + 1, 0)))
ngroups = -1;
else
ngroups = getgroups(ngroups, groups);
}
n = ngroups;
while (--n >= 0)
if (groups[n] == st.st_gid)
goto setgroup;
#endif
if (flags & R_OK)
mode |= S_IROTH;
if (flags & W_OK)
mode |= S_IWOTH;
if (flags & X_OK)
mode |= S_IXOTH;
}
if ((st.st_mode & mode) == mode)
return 0;
nope:
errno = EACCES;
return -1;
#endif
#endif
}
#endif