Update of /cvsroot/libsysio/libsysio/src
In directory sc8-pr-cvs1:/tmp/cvs-serv29917/src
Modified Files:
Tag: RedStorm
Makefile.am
Added Files:
Tag: RedStorm
access.c
Log Message:
Merged access(2) addition from the HEAD.
--- NEW FILE ---
/*
* This Cplant(TM) source code is the property of Sandia National
* Laboratories.
*
* This Cplant(TM) source code is copyrighted by Sandia National
* Laboratories.
*
* The redistribution of this Cplant(TM) source code is subject to the
* terms of the GNU Lesser General Public License
* (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
*
* Cplant(TM) Copyright 1998-2003 Sandia Corporation.
* Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
* license for use of this work by or on behalf of the US Government.
* Export of this program may require a license from the United States
* Government.
*/
/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Questions or comments about this library should be sent to:
*
* Lee Ward
* Sandia National Laboratories, New Mexico
* P.O. Box 5800
* Albuquerque, NM 87185-1110
*
* le...@sa...
*/
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int
access(const char *path, int amode)
{
gid_t *list, *entry;
size_t n;
int err;
unsigned mask, mode;
struct stat stbuf;
int oerrno;
err = 0;
n = getgroups(0, NULL);
list = NULL;
if (n) {
list = malloc(n * sizeof(gid_t));
if (!list) {
err = -1;
goto out;
}
}
err = getgroups(n, list);
if (err)
goto out;
err = stat(path, &stbuf);
if (err)
goto out;
mask = 0;
if (amode & R_OK)
mask |= S_IRUSR;
if (amode & W_OK)
mask |= S_IWUSR;
if (amode & X_OK)
mask |= S_IXUSR;
mode = stbuf.st_mode;
if (stbuf.st_uid == getuid() && (mode & mask) != mask) {
err = -1;
goto out;
}
mask >>= 3;
entry = list;
while (n--) {
if (stbuf.st_gid == *entry++) {
if ((mode & mask) != mask) {
err = -1;
goto out;
}
break;
}
}
if (stbuf.st_gid == getgid() && (mode & mask) != mask) {
err = -1;
goto out;
}
mask >>= 3;
if ((mode & mask) != mask) {
err = -1;
goto out;
}
out:
oerrno = errno;
if (list)
free(list);
errno = oerrno;
return err;
}
Index: Makefile.am
===================================================================
RCS file: /cvsroot/libsysio/libsysio/src/Makefile.am,v
retrieving revision 1.5.6.1
retrieving revision 1.5.6.2
diff -u -w -b -B -p -r1.5.6.1 -r1.5.6.2
--- Makefile.am 12 May 2003 11:48:45 -0000 1.5.6.1
+++ Makefile.am 29 Jul 2003 20:17:22 -0000 1.5.6.2
@@ -4,5 +4,6 @@ libsysio_a_SOURCES = chdir.c chmod.c cho
fsync.c getdirentries.c init.c inode.c ioctl.c ioctx.c iowait.c \
lseek.c mkdir.c mknod.c mount.c namei.c open.c read.c rmdir.c stat.c \
stat64.c symlink.c truncate.c unlink.c write.c
+ stat64.c symlink.c truncate.c unlink.c write.c access.c
include $(top_srcdir)/Rules.make
|