diff options
| author | Kenichi Handa | 2011-07-07 08:28:00 +0900 |
|---|---|---|
| committer | Kenichi Handa | 2011-07-07 08:28:00 +0900 |
| commit | d2a0a50628933d3cdb09818eee2e17f55e22531f (patch) | |
| tree | d19c8e71eb63eb6ccd204c2f36f406e4cf853154 /lib | |
| parent | c805dec0b5fa81b5c9f2b724e2ec12a17d723aca (diff) | |
| parent | 354cf0ba0b20108c9776be1d868458893bc2cd54 (diff) | |
| download | emacs-d2a0a50628933d3cdb09818eee2e17f55e22531f.tar.gz emacs-d2a0a50628933d3cdb09818eee2e17f55e22531f.zip | |
merge trunk
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/dup2.c | 132 | ||||
| -rw-r--r-- | lib/getopt.c | 2 | ||||
| -rw-r--r-- | lib/gnulib.mk | 11 | ||||
| -rw-r--r-- | lib/stat.c | 8 |
4 files changed, 151 insertions, 2 deletions
diff --git a/lib/dup2.c b/lib/dup2.c new file mode 100644 index 00000000000..e00dc7b2e3c --- /dev/null +++ b/lib/dup2.c | |||
| @@ -0,0 +1,132 @@ | |||
| 1 | /* Duplicate an open file descriptor to a specified file descriptor. | ||
| 2 | |||
| 3 | Copyright (C) 1999, 2004-2007, 2009-2011 Free Software Foundation, Inc. | ||
| 4 | |||
| 5 | This program is free software: you can redistribute it and/or modify | ||
| 6 | it under the terms of the GNU General Public License as published by | ||
| 7 | the Free Software Foundation; either version 3 of the License, or | ||
| 8 | (at your option) any later version. | ||
| 9 | |||
| 10 | This program is distributed in the hope that it will be useful, | ||
| 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | GNU General Public License for more details. | ||
| 14 | |||
| 15 | You should have received a copy of the GNU General Public License | ||
| 16 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
| 17 | |||
| 18 | /* written by Paul Eggert */ | ||
| 19 | |||
| 20 | #include <config.h> | ||
| 21 | |||
| 22 | /* Specification. */ | ||
| 23 | #include <unistd.h> | ||
| 24 | |||
| 25 | #include <errno.h> | ||
| 26 | #include <fcntl.h> | ||
| 27 | |||
| 28 | #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | ||
| 29 | /* Get declarations of the Win32 API functions. */ | ||
| 30 | # define WIN32_LEAN_AND_MEAN | ||
| 31 | # include <windows.h> | ||
| 32 | #endif | ||
| 33 | |||
| 34 | #if HAVE_DUP2 | ||
| 35 | |||
| 36 | # undef dup2 | ||
| 37 | |||
| 38 | int | ||
| 39 | rpl_dup2 (int fd, int desired_fd) | ||
| 40 | { | ||
| 41 | int result; | ||
| 42 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | ||
| 43 | /* If fd is closed, mingw hangs on dup2 (fd, fd). If fd is open, | ||
| 44 | dup2 (fd, fd) returns 0, but all further attempts to use fd in | ||
| 45 | future dup2 calls will hang. */ | ||
| 46 | if (fd == desired_fd) | ||
| 47 | { | ||
| 48 | if ((HANDLE) _get_osfhandle (fd) == INVALID_HANDLE_VALUE) | ||
| 49 | { | ||
| 50 | errno = EBADF; | ||
| 51 | return -1; | ||
| 52 | } | ||
| 53 | return fd; | ||
| 54 | } | ||
| 55 | /* Wine 1.0.1 return 0 when desired_fd is negative but not -1: | ||
| 56 | http://bugs.winehq.org/show_bug.cgi?id=21289 */ | ||
| 57 | if (desired_fd < 0) | ||
| 58 | { | ||
| 59 | errno = EBADF; | ||
| 60 | return -1; | ||
| 61 | } | ||
| 62 | # elif !defined __linux__ | ||
| 63 | /* On Haiku, dup2 (fd, fd) mistakenly clears FD_CLOEXEC. */ | ||
| 64 | if (fd == desired_fd) | ||
| 65 | return fcntl (fd, F_GETFL) == -1 ? -1 : fd; | ||
| 66 | # endif | ||
| 67 | result = dup2 (fd, desired_fd); | ||
| 68 | # ifdef __linux__ | ||
| 69 | /* Correct a Linux return value. | ||
| 70 | <http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.30.y.git;a=commitdiff;h=2b79bc4f7ebbd5af3c8b867968f9f15602d5f802> | ||
| 71 | */ | ||
| 72 | if (fd == desired_fd && result == (unsigned int) -EBADF) | ||
| 73 | { | ||
| 74 | errno = EBADF; | ||
| 75 | result = -1; | ||
| 76 | } | ||
| 77 | # endif | ||
| 78 | if (result == 0) | ||
| 79 | result = desired_fd; | ||
| 80 | /* Correct a cygwin 1.5.x errno value. */ | ||
| 81 | else if (result == -1 && errno == EMFILE) | ||
| 82 | errno = EBADF; | ||
| 83 | # if REPLACE_FCHDIR | ||
| 84 | if (fd != desired_fd && result != -1) | ||
| 85 | result = _gl_register_dup (fd, result); | ||
| 86 | # endif | ||
| 87 | return result; | ||
| 88 | } | ||
| 89 | |||
| 90 | #else /* !HAVE_DUP2 */ | ||
| 91 | |||
| 92 | /* On older platforms, dup2 did not exist. */ | ||
| 93 | |||
| 94 | # ifndef F_DUPFD | ||
| 95 | static int | ||
| 96 | dupfd (int fd, int desired_fd) | ||
| 97 | { | ||
| 98 | int duplicated_fd = dup (fd); | ||
| 99 | if (duplicated_fd < 0 || duplicated_fd == desired_fd) | ||
| 100 | return duplicated_fd; | ||
| 101 | else | ||
| 102 | { | ||
| 103 | int r = dupfd (fd, desired_fd); | ||
| 104 | int e = errno; | ||
| 105 | close (duplicated_fd); | ||
| 106 | errno = e; | ||
| 107 | return r; | ||
| 108 | } | ||
| 109 | } | ||
| 110 | # endif | ||
| 111 | |||
| 112 | int | ||
| 113 | dup2 (int fd, int desired_fd) | ||
| 114 | { | ||
| 115 | int result = fcntl (fd, F_GETFL) < 0 ? -1 : fd; | ||
| 116 | if (result == -1 || fd == desired_fd) | ||
| 117 | return result; | ||
| 118 | close (desired_fd); | ||
| 119 | # ifdef F_DUPFD | ||
| 120 | result = fcntl (fd, F_DUPFD, desired_fd); | ||
| 121 | # if REPLACE_FCHDIR | ||
| 122 | if (0 <= result) | ||
| 123 | result = _gl_register_dup (fd, result); | ||
| 124 | # endif | ||
| 125 | # else | ||
| 126 | result = dupfd (fd, desired_fd); | ||
| 127 | # endif | ||
| 128 | if (result == -1 && (errno == EMFILE || errno == EINVAL)) | ||
| 129 | errno = EBADF; | ||
| 130 | return result; | ||
| 131 | } | ||
| 132 | #endif /* !HAVE_DUP2 */ | ||
diff --git a/lib/getopt.c b/lib/getopt.c index 23510d8afec..2af8352ee9c 100644 --- a/lib/getopt.c +++ b/lib/getopt.c | |||
| @@ -829,7 +829,7 @@ _getopt_internal_r (int argc, char **argv, const char *optstring, | |||
| 829 | return '?'; | 829 | return '?'; |
| 830 | } | 830 | } |
| 831 | /* Convenience. Treat POSIX -W foo same as long option --foo */ | 831 | /* Convenience. Treat POSIX -W foo same as long option --foo */ |
| 832 | if (temp[0] == 'W' && temp[1] == ';') | 832 | if (temp[0] == 'W' && temp[1] == ';' && longopts) |
| 833 | { | 833 | { |
| 834 | char *nameend; | 834 | char *nameend; |
| 835 | const struct option *p; | 835 | const struct option *p; |
diff --git a/lib/gnulib.mk b/lib/gnulib.mk index 0fd7f520acb..18abe4536fa 100644 --- a/lib/gnulib.mk +++ b/lib/gnulib.mk | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | # the same distribution terms as the rest of that program. | 9 | # the same distribution terms as the rest of that program. |
| 10 | # | 10 | # |
| 11 | # Generated by gnulib-tool. | 11 | # Generated by gnulib-tool. |
| 12 | # Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=. --makefile-name=gnulib.mk --conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca-opt careadlinkat crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 dtoastr filemode getloadavg getopt-gnu ignore-value intprops lstat mktime readlink socklen stdarg stdio strftime strtoumax symlink sys_stat | 12 | # Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=. --makefile-name=gnulib.mk --conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca-opt careadlinkat crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 dtoastr dup2 filemode getloadavg getopt-gnu ignore-value intprops lstat mktime readlink socklen stdarg stdio strftime strtoumax symlink sys_stat |
| 13 | 13 | ||
| 14 | 14 | ||
| 15 | MOSTLYCLEANFILES += core *.stackdump | 15 | MOSTLYCLEANFILES += core *.stackdump |
| @@ -159,6 +159,15 @@ EXTRA_libgnu_a_SOURCES += ftoastr.c | |||
| 159 | 159 | ||
| 160 | ## end gnulib module dtoastr | 160 | ## end gnulib module dtoastr |
| 161 | 161 | ||
| 162 | ## begin gnulib module dup2 | ||
| 163 | |||
| 164 | |||
| 165 | EXTRA_DIST += dup2.c | ||
| 166 | |||
| 167 | EXTRA_libgnu_a_SOURCES += dup2.c | ||
| 168 | |||
| 169 | ## end gnulib module dup2 | ||
| 170 | |||
| 162 | ## begin gnulib module filemode | 171 | ## begin gnulib module filemode |
| 163 | 172 | ||
| 164 | libgnu_a_SOURCES += filemode.c | 173 | libgnu_a_SOURCES += filemode.c |
diff --git a/lib/stat.c b/lib/stat.c index cbc9100fd4d..f07370dd06b 100644 --- a/lib/stat.c +++ b/lib/stat.c | |||
| @@ -38,6 +38,7 @@ orig_stat (const char *filename, struct stat *buf) | |||
| 38 | #include <stdbool.h> | 38 | #include <stdbool.h> |
| 39 | #include <string.h> | 39 | #include <string.h> |
| 40 | #include "dosname.h" | 40 | #include "dosname.h" |
| 41 | #include "verify.h" | ||
| 41 | 42 | ||
| 42 | /* Store information about NAME into ST. Work around bugs with | 43 | /* Store information about NAME into ST. Work around bugs with |
| 43 | trailing slashes. Mingw has other bugs (such as st_ino always | 44 | trailing slashes. Mingw has other bugs (such as st_ino always |
| @@ -63,6 +64,12 @@ rpl_stat (char const *name, struct stat *st) | |||
| 63 | } | 64 | } |
| 64 | #endif /* REPLACE_FUNC_STAT_FILE */ | 65 | #endif /* REPLACE_FUNC_STAT_FILE */ |
| 65 | #if REPLACE_FUNC_STAT_DIR | 66 | #if REPLACE_FUNC_STAT_DIR |
| 67 | /* The only known systems where REPLACE_FUNC_STAT_DIR is needed also | ||
| 68 | have a constant PATH_MAX. */ | ||
| 69 | # ifndef PATH_MAX | ||
| 70 | # error "Please port this replacement to your platform" | ||
| 71 | # endif | ||
| 72 | |||
| 66 | if (result == -1 && errno == ENOENT) | 73 | if (result == -1 && errno == ENOENT) |
| 67 | { | 74 | { |
| 68 | /* Due to mingw's oddities, there are some directories (like | 75 | /* Due to mingw's oddities, there are some directories (like |
| @@ -77,6 +84,7 @@ rpl_stat (char const *name, struct stat *st) | |||
| 77 | char fixed_name[PATH_MAX + 1] = {0}; | 84 | char fixed_name[PATH_MAX + 1] = {0}; |
| 78 | size_t len = strlen (name); | 85 | size_t len = strlen (name); |
| 79 | bool check_dir = false; | 86 | bool check_dir = false; |
| 87 | verify (PATH_MAX <= 4096); | ||
| 80 | if (PATH_MAX <= len) | 88 | if (PATH_MAX <= len) |
| 81 | errno = ENAMETOOLONG; | 89 | errno = ENAMETOOLONG; |
| 82 | else if (len) | 90 | else if (len) |