Mail Archives: djgpp-workers/2000/08/22/07:56:39
Works OK for me.
Any comments before commiting?
Laurynas
Index: access.c
===================================================================
RCS file: /cvs/djgpp/djgpp/src/libc/posix/unistd/access.c,v
retrieving revision 1.5
diff -u -p -r1.5 access.c
--- access.c 1999/08/04 19:58:24 1.5
+++ access.c 2000/08/22 11:53:57
@@ -1,8 +1,10 @@
+/* Copyright (C) 2000 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1999 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1998 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
#include <libc/stubs.h>
+#include <libc/symlink.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
@@ -10,18 +12,25 @@
#include <dir.h>
#include <errno.h>
#include <dirent.h>
+#include <limits.h>
int access(const char *fn, int flags)
{
- int attr = _chmod(fn, 0);
+ int attr;
+ char file_name[FILENAME_MAX];
+ if (!__solve_symlinks(fn, file_name))
+ return -1;
+
+ attr = _chmod(file_name, 0);
+
if (attr == -1) {
struct ffblk ff;
char fixed_path[FILENAME_MAX];
/* Root directories on some non-local drives (e.g. CD-ROM)
might fail `_chmod'. `findfirst' to the rescue. */
- _fixpath(fn, fixed_path);
+ _fixpath(file_name, fixed_path);
if (fixed_path[1] == ':' && fixed_path[2] == '/' && fixed_path[3] == 0)
{
char *fp = fixed_path + 3;
@@ -41,7 +50,7 @@ int access(const char *fn, int flags)
/* Devices also fail `_chmod'; some programs won't write to
a device unless `access' tells them they are writeable. */
- if (findfirst(fn, &ff, FA_RDONLY | FA_ARCH) == 0
+ if (findfirst(file_name, &ff, FA_RDONLY | FA_ARCH) == 0
&& (ff.ff_attrib & 0x40) == 0x40
&& (flags & (X_OK | D_OK)) == 0)
{
@@ -70,7 +79,7 @@ int access(const char *fn, int flags)
if (flags & X_OK)
{
- if (!_is_executable(fn, 0, 0))
+ if (!_is_executable(file_name, 0, 0))
{
errno = EACCES;
return -1;
- Raw text -