MS-Windows followup for 2012-11-14T04:55:41Z!eggert@cs.ucla.edu, regarding faccessat.
nt/inc/unistd.h (faccessat): Add prototype. (AT_FDCWD, AT_EACCESS, AT_SYMLINK_NOFOLLOW): New macros; the first 2 moved from ms-w32.h. nt/inc/ms-w32.h (AT_FDCWD, AT_EACCESS, faccessat): Remove macros. src/w32.c (faccessat): Rename from sys_faccessat. (No need to use a different name, as the MS runtime does not have such a function, and probably never will.) All callers changed. Ignore DIRFD value if PATH is an absolute file name, to match Posix spec better. If AT_SYMLINK_NOFOLLOW is set in FLAGS, don't resolve symlinks. Fixes: debbugs:12632
This commit is contained in:
parent
c62792e7df
commit
14f207289c
5 changed files with 42 additions and 18 deletions
|
@ -1,3 +1,11 @@
|
|||
2012-11-14 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* inc/unistd.h (faccessat): Add prototype.
|
||||
(AT_FDCWD, AT_EACCESS, AT_SYMLINK_NOFOLLOW): New macros; the first
|
||||
2 moved from ms-w32.h.
|
||||
|
||||
* inc/ms-w32.h (AT_FDCWD, AT_EACCESS, faccessat): Remove macros.
|
||||
|
||||
2012-11-14 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
Use faccessat, not access, when checking file permissions (Bug#12632).
|
||||
|
|
|
@ -124,10 +124,6 @@ extern char *getenv ();
|
|||
#define MAXPATHLEN _MAX_PATH
|
||||
#endif
|
||||
|
||||
/* Use values compatible with gnulib, as there's no reason to differ. */
|
||||
#define AT_FDCWD (-3041965)
|
||||
#define AT_EACCESS 4
|
||||
|
||||
#ifdef HAVE_NTGUI
|
||||
#define HAVE_WINDOW_SYSTEM 1
|
||||
#define HAVE_MENUS 1
|
||||
|
@ -163,7 +159,6 @@ extern char *getenv ();
|
|||
#define dup sys_dup
|
||||
#undef dup2
|
||||
#define dup2 sys_dup2
|
||||
#define faccessat sys_faccessat
|
||||
#define fopen sys_fopen
|
||||
#define link sys_link
|
||||
#define localtime sys_localtime
|
||||
|
|
|
@ -18,4 +18,12 @@ extern pid_t getpgrp (void);
|
|||
extern pid_t setsid (void);
|
||||
extern pid_t tcgetpgrp (int);
|
||||
|
||||
extern int faccessat (int, char const *, int, int);
|
||||
|
||||
/* These are normally on fcntl.h, but we don't override that header. */
|
||||
/* Use values compatible with gnulib, as there's no reason to differ. */
|
||||
#define AT_FDCWD (-3041965)
|
||||
#define AT_EACCESS 4
|
||||
#define AT_SYMLINK_NOFOLLOW 4096
|
||||
|
||||
#endif /* _UNISTD_H */
|
||||
|
|
|
@ -1,3 +1,12 @@
|
|||
2012-11-14 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* w32.c (faccessat): Rename from sys_faccessat. (No need to use a
|
||||
different name, as the MS runtime does not have such a function,
|
||||
and probably never will.) All callers changed. Ignore DIRFD
|
||||
value if PATH is an absolute file name, to match Posix spec
|
||||
better. If AT_SYMLINK_NOFOLLOW is set in FLAGS, don't resolve
|
||||
symlinks.
|
||||
|
||||
2012-11-14 Dmitry Antipov <dmantipov@yandex.ru>
|
||||
|
||||
* xdisp.c (echo_area_display, redisplay_internal):
|
||||
|
|
30
src/w32.c
30
src/w32.c
|
@ -1597,7 +1597,7 @@ init_environment (char ** argv)
|
|||
see if it succeeds. But I think that's too much to ask. */
|
||||
|
||||
/* MSVCRT's _access crashes with D_OK. */
|
||||
if (tmp && sys_faccessat (AT_FDCWD, tmp, D_OK, AT_EACCESS) == 0)
|
||||
if (tmp && faccessat (AT_FDCWD, tmp, D_OK, AT_EACCESS) == 0)
|
||||
{
|
||||
char * var = alloca (strlen (tmp) + 8);
|
||||
sprintf (var, "TMPDIR=%s", tmp);
|
||||
|
@ -2708,17 +2708,15 @@ logon_network_drive (const char *path)
|
|||
WNetAddConnection2 (&resource, NULL, NULL, CONNECT_INTERACTIVE);
|
||||
}
|
||||
|
||||
/* Shadow some MSVC runtime functions to map requests for long filenames
|
||||
to reasonable short names if necessary. This was originally added to
|
||||
permit running Emacs on NT 3.1 on a FAT partition, which doesn't support
|
||||
long file names. */
|
||||
|
||||
/* Emulate faccessat(2). */
|
||||
int
|
||||
sys_faccessat (int dirfd, const char * path, int mode, int flags)
|
||||
faccessat (int dirfd, const char * path, int mode, int flags)
|
||||
{
|
||||
DWORD attributes;
|
||||
|
||||
if (dirfd != AT_FDCWD)
|
||||
if (dirfd != AT_FDCWD
|
||||
&& !(IS_DIRECTORY_SEP (path[0])
|
||||
|| IS_DEVICE_SEP (path[1])))
|
||||
{
|
||||
errno = EBADF;
|
||||
return -1;
|
||||
|
@ -2731,7 +2729,8 @@ sys_faccessat (int dirfd, const char * path, int mode, int flags)
|
|||
to get the attributes of its target file. Note: any symlinks in
|
||||
PATH elements other than the last one are transparently resolved
|
||||
by GetFileAttributes below. */
|
||||
if ((volume_info.flags & FILE_SUPPORTS_REPARSE_POINTS) != 0)
|
||||
if ((volume_info.flags & FILE_SUPPORTS_REPARSE_POINTS) != 0
|
||||
&& (flags & AT_SYMLINK_NOFOLLOW) == 0)
|
||||
path = chase_symlinks (path);
|
||||
|
||||
if ((attributes = GetFileAttributes (path)) == -1)
|
||||
|
@ -2781,6 +2780,11 @@ sys_faccessat (int dirfd, const char * path, int mode, int flags)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Shadow some MSVC runtime functions to map requests for long filenames
|
||||
to reasonable short names if necessary. This was originally added to
|
||||
permit running Emacs on NT 3.1 on a FAT partition, which doesn't support
|
||||
long file names. */
|
||||
|
||||
int
|
||||
sys_chdir (const char * path)
|
||||
{
|
||||
|
@ -2966,7 +2970,7 @@ sys_mktemp (char * template)
|
|||
{
|
||||
int save_errno = errno;
|
||||
p[0] = first_char[i];
|
||||
if (sys_faccessat (AT_FDCWD, template, F_OK, AT_EACCESS) < 0)
|
||||
if (faccessat (AT_FDCWD, template, F_OK, AT_EACCESS) < 0)
|
||||
{
|
||||
errno = save_errno;
|
||||
return template;
|
||||
|
@ -4017,7 +4021,7 @@ symlink (char const *filename, char const *linkname)
|
|||
{
|
||||
/* Non-absolute FILENAME is understood as being relative to
|
||||
LINKNAME's directory. We need to prepend that directory to
|
||||
FILENAME to get correct results from sys_faccessat below, since
|
||||
FILENAME to get correct results from faccessat below, since
|
||||
otherwise it will interpret FILENAME relative to the
|
||||
directory where the Emacs process runs. Note that
|
||||
make-symbolic-link always makes sure LINKNAME is a fully
|
||||
|
@ -4031,10 +4035,10 @@ symlink (char const *filename, char const *linkname)
|
|||
strncpy (tem, linkfn, p - linkfn);
|
||||
tem[p - linkfn] = '\0';
|
||||
strcat (tem, filename);
|
||||
dir_access = sys_faccessat (AT_FDCWD, tem, D_OK, AT_EACCESS);
|
||||
dir_access = faccessat (AT_FDCWD, tem, D_OK, AT_EACCESS);
|
||||
}
|
||||
else
|
||||
dir_access = sys_faccessat (AT_FDCWD, filename, D_OK, AT_EACCESS);
|
||||
dir_access = faccessat (AT_FDCWD, filename, D_OK, AT_EACCESS);
|
||||
|
||||
/* Since Windows distinguishes between symlinks to directories and
|
||||
to files, we provide a kludgy feature: if FILENAME doesn't
|
||||
|
|
Loading…
Add table
Reference in a new issue