aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorKenichi Handa2011-07-07 08:28:00 +0900
committerKenichi Handa2011-07-07 08:28:00 +0900
commitd2a0a50628933d3cdb09818eee2e17f55e22531f (patch)
treed19c8e71eb63eb6ccd204c2f36f406e4cf853154 /lib
parentc805dec0b5fa81b5c9f2b724e2ec12a17d723aca (diff)
parent354cf0ba0b20108c9776be1d868458893bc2cd54 (diff)
downloademacs-d2a0a50628933d3cdb09818eee2e17f55e22531f.tar.gz
emacs-d2a0a50628933d3cdb09818eee2e17f55e22531f.zip
merge trunk
Diffstat (limited to 'lib')
-rw-r--r--lib/dup2.c132
-rw-r--r--lib/getopt.c2
-rw-r--r--lib/gnulib.mk11
-rw-r--r--lib/stat.c8
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
38int
39rpl_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
95static int
96dupfd (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
112int
113dup2 (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
15MOSTLYCLEANFILES += core *.stackdump 15MOSTLYCLEANFILES += 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
165EXTRA_DIST += dup2.c
166
167EXTRA_libgnu_a_SOURCES += dup2.c
168
169## end gnulib module dup2
170
162## begin gnulib module filemode 171## begin gnulib module filemode
163 172
164libgnu_a_SOURCES += filemode.c 173libgnu_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)