diff options
| author | Eli Zaretskii | 2012-11-14 19:22:55 +0200 |
|---|---|---|
| committer | Eli Zaretskii | 2012-11-14 19:22:55 +0200 |
| commit | 14f207289c224b3ad12fc8704c2183ef8fbcab28 (patch) | |
| tree | 762793d11e03d384ff44353bdfde59c302cda66d | |
| parent | c62792e7dfa403db8c36cb92f32fb69258a199ef (diff) | |
| download | emacs-14f207289c224b3ad12fc8704c2183ef8fbcab28.tar.gz emacs-14f207289c224b3ad12fc8704c2183ef8fbcab28.zip | |
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
| -rw-r--r-- | nt/ChangeLog | 8 | ||||
| -rw-r--r-- | nt/inc/ms-w32.h | 5 | ||||
| -rw-r--r-- | nt/inc/unistd.h | 8 | ||||
| -rw-r--r-- | src/ChangeLog | 9 | ||||
| -rw-r--r-- | src/w32.c | 30 |
5 files changed, 42 insertions, 18 deletions
diff --git a/nt/ChangeLog b/nt/ChangeLog index 320c9e6366e..685e291e272 100644 --- a/nt/ChangeLog +++ b/nt/ChangeLog | |||
| @@ -1,3 +1,11 @@ | |||
| 1 | 2012-11-14 Eli Zaretskii <eliz@gnu.org> | ||
| 2 | |||
| 3 | * inc/unistd.h (faccessat): Add prototype. | ||
| 4 | (AT_FDCWD, AT_EACCESS, AT_SYMLINK_NOFOLLOW): New macros; the first | ||
| 5 | 2 moved from ms-w32.h. | ||
| 6 | |||
| 7 | * inc/ms-w32.h (AT_FDCWD, AT_EACCESS, faccessat): Remove macros. | ||
| 8 | |||
| 1 | 2012-11-14 Paul Eggert <eggert@cs.ucla.edu> | 9 | 2012-11-14 Paul Eggert <eggert@cs.ucla.edu> |
| 2 | 10 | ||
| 3 | Use faccessat, not access, when checking file permissions (Bug#12632). | 11 | Use faccessat, not access, when checking file permissions (Bug#12632). |
diff --git a/nt/inc/ms-w32.h b/nt/inc/ms-w32.h index 0f6b51d3915..1b2a309e1be 100644 --- a/nt/inc/ms-w32.h +++ b/nt/inc/ms-w32.h | |||
| @@ -124,10 +124,6 @@ extern char *getenv (); | |||
| 124 | #define MAXPATHLEN _MAX_PATH | 124 | #define MAXPATHLEN _MAX_PATH |
| 125 | #endif | 125 | #endif |
| 126 | 126 | ||
| 127 | /* Use values compatible with gnulib, as there's no reason to differ. */ | ||
| 128 | #define AT_FDCWD (-3041965) | ||
| 129 | #define AT_EACCESS 4 | ||
| 130 | |||
| 131 | #ifdef HAVE_NTGUI | 127 | #ifdef HAVE_NTGUI |
| 132 | #define HAVE_WINDOW_SYSTEM 1 | 128 | #define HAVE_WINDOW_SYSTEM 1 |
| 133 | #define HAVE_MENUS 1 | 129 | #define HAVE_MENUS 1 |
| @@ -163,7 +159,6 @@ extern char *getenv (); | |||
| 163 | #define dup sys_dup | 159 | #define dup sys_dup |
| 164 | #undef dup2 | 160 | #undef dup2 |
| 165 | #define dup2 sys_dup2 | 161 | #define dup2 sys_dup2 |
| 166 | #define faccessat sys_faccessat | ||
| 167 | #define fopen sys_fopen | 162 | #define fopen sys_fopen |
| 168 | #define link sys_link | 163 | #define link sys_link |
| 169 | #define localtime sys_localtime | 164 | #define localtime sys_localtime |
diff --git a/nt/inc/unistd.h b/nt/inc/unistd.h index 4c5f7d4c124..b0f3092cafb 100644 --- a/nt/inc/unistd.h +++ b/nt/inc/unistd.h | |||
| @@ -18,4 +18,12 @@ extern pid_t getpgrp (void); | |||
| 18 | extern pid_t setsid (void); | 18 | extern pid_t setsid (void); |
| 19 | extern pid_t tcgetpgrp (int); | 19 | extern pid_t tcgetpgrp (int); |
| 20 | 20 | ||
| 21 | extern int faccessat (int, char const *, int, int); | ||
| 22 | |||
| 23 | /* These are normally on fcntl.h, but we don't override that header. */ | ||
| 24 | /* Use values compatible with gnulib, as there's no reason to differ. */ | ||
| 25 | #define AT_FDCWD (-3041965) | ||
| 26 | #define AT_EACCESS 4 | ||
| 27 | #define AT_SYMLINK_NOFOLLOW 4096 | ||
| 28 | |||
| 21 | #endif /* _UNISTD_H */ | 29 | #endif /* _UNISTD_H */ |
diff --git a/src/ChangeLog b/src/ChangeLog index 99f3128b321..ec8f7e219f7 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,12 @@ | |||
| 1 | 2012-11-14 Eli Zaretskii <eliz@gnu.org> | ||
| 2 | |||
| 3 | * w32.c (faccessat): Rename from sys_faccessat. (No need to use a | ||
| 4 | different name, as the MS runtime does not have such a function, | ||
| 5 | and probably never will.) All callers changed. Ignore DIRFD | ||
| 6 | value if PATH is an absolute file name, to match Posix spec | ||
| 7 | better. If AT_SYMLINK_NOFOLLOW is set in FLAGS, don't resolve | ||
| 8 | symlinks. | ||
| 9 | |||
| 1 | 2012-11-14 Dmitry Antipov <dmantipov@yandex.ru> | 10 | 2012-11-14 Dmitry Antipov <dmantipov@yandex.ru> |
| 2 | 11 | ||
| 3 | * xdisp.c (echo_area_display, redisplay_internal): | 12 | * xdisp.c (echo_area_display, redisplay_internal): |
| @@ -1597,7 +1597,7 @@ init_environment (char ** argv) | |||
| 1597 | see if it succeeds. But I think that's too much to ask. */ | 1597 | see if it succeeds. But I think that's too much to ask. */ |
| 1598 | 1598 | ||
| 1599 | /* MSVCRT's _access crashes with D_OK. */ | 1599 | /* MSVCRT's _access crashes with D_OK. */ |
| 1600 | if (tmp && sys_faccessat (AT_FDCWD, tmp, D_OK, AT_EACCESS) == 0) | 1600 | if (tmp && faccessat (AT_FDCWD, tmp, D_OK, AT_EACCESS) == 0) |
| 1601 | { | 1601 | { |
| 1602 | char * var = alloca (strlen (tmp) + 8); | 1602 | char * var = alloca (strlen (tmp) + 8); |
| 1603 | sprintf (var, "TMPDIR=%s", tmp); | 1603 | sprintf (var, "TMPDIR=%s", tmp); |
| @@ -2708,17 +2708,15 @@ logon_network_drive (const char *path) | |||
| 2708 | WNetAddConnection2 (&resource, NULL, NULL, CONNECT_INTERACTIVE); | 2708 | WNetAddConnection2 (&resource, NULL, NULL, CONNECT_INTERACTIVE); |
| 2709 | } | 2709 | } |
| 2710 | 2710 | ||
| 2711 | /* Shadow some MSVC runtime functions to map requests for long filenames | 2711 | /* Emulate faccessat(2). */ |
| 2712 | to reasonable short names if necessary. This was originally added to | ||
| 2713 | permit running Emacs on NT 3.1 on a FAT partition, which doesn't support | ||
| 2714 | long file names. */ | ||
| 2715 | |||
| 2716 | int | 2712 | int |
| 2717 | sys_faccessat (int dirfd, const char * path, int mode, int flags) | 2713 | faccessat (int dirfd, const char * path, int mode, int flags) |
| 2718 | { | 2714 | { |
| 2719 | DWORD attributes; | 2715 | DWORD attributes; |
| 2720 | 2716 | ||
| 2721 | if (dirfd != AT_FDCWD) | 2717 | if (dirfd != AT_FDCWD |
| 2718 | && !(IS_DIRECTORY_SEP (path[0]) | ||
| 2719 | || IS_DEVICE_SEP (path[1]))) | ||
| 2722 | { | 2720 | { |
| 2723 | errno = EBADF; | 2721 | errno = EBADF; |
| 2724 | return -1; | 2722 | return -1; |
| @@ -2731,7 +2729,8 @@ sys_faccessat (int dirfd, const char * path, int mode, int flags) | |||
| 2731 | to get the attributes of its target file. Note: any symlinks in | 2729 | to get the attributes of its target file. Note: any symlinks in |
| 2732 | PATH elements other than the last one are transparently resolved | 2730 | PATH elements other than the last one are transparently resolved |
| 2733 | by GetFileAttributes below. */ | 2731 | by GetFileAttributes below. */ |
| 2734 | if ((volume_info.flags & FILE_SUPPORTS_REPARSE_POINTS) != 0) | 2732 | if ((volume_info.flags & FILE_SUPPORTS_REPARSE_POINTS) != 0 |
| 2733 | && (flags & AT_SYMLINK_NOFOLLOW) == 0) | ||
| 2735 | path = chase_symlinks (path); | 2734 | path = chase_symlinks (path); |
| 2736 | 2735 | ||
| 2737 | if ((attributes = GetFileAttributes (path)) == -1) | 2736 | if ((attributes = GetFileAttributes (path)) == -1) |
| @@ -2781,6 +2780,11 @@ sys_faccessat (int dirfd, const char * path, int mode, int flags) | |||
| 2781 | return 0; | 2780 | return 0; |
| 2782 | } | 2781 | } |
| 2783 | 2782 | ||
| 2783 | /* Shadow some MSVC runtime functions to map requests for long filenames | ||
| 2784 | to reasonable short names if necessary. This was originally added to | ||
| 2785 | permit running Emacs on NT 3.1 on a FAT partition, which doesn't support | ||
| 2786 | long file names. */ | ||
| 2787 | |||
| 2784 | int | 2788 | int |
| 2785 | sys_chdir (const char * path) | 2789 | sys_chdir (const char * path) |
| 2786 | { | 2790 | { |
| @@ -2966,7 +2970,7 @@ sys_mktemp (char * template) | |||
| 2966 | { | 2970 | { |
| 2967 | int save_errno = errno; | 2971 | int save_errno = errno; |
| 2968 | p[0] = first_char[i]; | 2972 | p[0] = first_char[i]; |
| 2969 | if (sys_faccessat (AT_FDCWD, template, F_OK, AT_EACCESS) < 0) | 2973 | if (faccessat (AT_FDCWD, template, F_OK, AT_EACCESS) < 0) |
| 2970 | { | 2974 | { |
| 2971 | errno = save_errno; | 2975 | errno = save_errno; |
| 2972 | return template; | 2976 | return template; |
| @@ -4017,7 +4021,7 @@ symlink (char const *filename, char const *linkname) | |||
| 4017 | { | 4021 | { |
| 4018 | /* Non-absolute FILENAME is understood as being relative to | 4022 | /* Non-absolute FILENAME is understood as being relative to |
| 4019 | LINKNAME's directory. We need to prepend that directory to | 4023 | LINKNAME's directory. We need to prepend that directory to |
| 4020 | FILENAME to get correct results from sys_faccessat below, since | 4024 | FILENAME to get correct results from faccessat below, since |
| 4021 | otherwise it will interpret FILENAME relative to the | 4025 | otherwise it will interpret FILENAME relative to the |
| 4022 | directory where the Emacs process runs. Note that | 4026 | directory where the Emacs process runs. Note that |
| 4023 | make-symbolic-link always makes sure LINKNAME is a fully | 4027 | make-symbolic-link always makes sure LINKNAME is a fully |
| @@ -4031,10 +4035,10 @@ symlink (char const *filename, char const *linkname) | |||
| 4031 | strncpy (tem, linkfn, p - linkfn); | 4035 | strncpy (tem, linkfn, p - linkfn); |
| 4032 | tem[p - linkfn] = '\0'; | 4036 | tem[p - linkfn] = '\0'; |
| 4033 | strcat (tem, filename); | 4037 | strcat (tem, filename); |
| 4034 | dir_access = sys_faccessat (AT_FDCWD, tem, D_OK, AT_EACCESS); | 4038 | dir_access = faccessat (AT_FDCWD, tem, D_OK, AT_EACCESS); |
| 4035 | } | 4039 | } |
| 4036 | else | 4040 | else |
| 4037 | dir_access = sys_faccessat (AT_FDCWD, filename, D_OK, AT_EACCESS); | 4041 | dir_access = faccessat (AT_FDCWD, filename, D_OK, AT_EACCESS); |
| 4038 | 4042 | ||
| 4039 | /* Since Windows distinguishes between symlinks to directories and | 4043 | /* Since Windows distinguishes between symlinks to directories and |
| 4040 | to files, we provide a kludgy feature: if FILENAME doesn't | 4044 | to files, we provide a kludgy feature: if FILENAME doesn't |