diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2023-02-11 07:20:24 +0100 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2023-02-11 07:20:24 +0100 |
commit | f867d7b44080fa9716deeff4476275f9a489879f (patch) | |
tree | bc964662fc3300dc626fb6d833d8ed5c8f46eca7 /gl/m4/fcntl.m4 | |
parent | 9734c439cba0a02b087e50789e94ec9b07754608 (diff) | |
parent | c07206f2ccc2356aa74bc6813a94c2190017d44e (diff) | |
download | monitoring-plugins-f867d7b.tar.gz |
Merge branch 'master' into curlfixes
Diffstat (limited to 'gl/m4/fcntl.m4')
-rw-r--r-- | gl/m4/fcntl.m4 | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/gl/m4/fcntl.m4 b/gl/m4/fcntl.m4 new file mode 100644 index 00000000..524a99af --- /dev/null +++ b/gl/m4/fcntl.m4 | |||
@@ -0,0 +1,151 @@ | |||
1 | # fcntl.m4 serial 11 | ||
2 | dnl Copyright (C) 2009-2023 Free Software Foundation, Inc. | ||
3 | dnl This file is free software; the Free Software Foundation | ||
4 | dnl gives unlimited permission to copy and/or distribute it, | ||
5 | dnl with or without modifications, as long as this notice is preserved. | ||
6 | |||
7 | # For now, this module ensures that fcntl() | ||
8 | # - supports F_DUPFD correctly | ||
9 | # - supports or emulates F_DUPFD_CLOEXEC | ||
10 | # - supports F_GETFD | ||
11 | # Still to be ported to mingw: | ||
12 | # - F_SETFD | ||
13 | # - F_GETFL, F_SETFL | ||
14 | # - F_GETOWN, F_SETOWN | ||
15 | # - F_GETLK, F_SETLK, F_SETLKW | ||
16 | AC_DEFUN([gl_FUNC_FCNTL], | ||
17 | [ | ||
18 | dnl Persuade glibc to expose F_DUPFD_CLOEXEC. | ||
19 | AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) | ||
20 | AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) | ||
21 | AC_REQUIRE([AC_CANONICAL_HOST]) | ||
22 | AC_CHECK_FUNCS_ONCE([fcntl]) | ||
23 | if test $ac_cv_func_fcntl = no; then | ||
24 | gl_REPLACE_FCNTL | ||
25 | else | ||
26 | dnl cygwin 1.5.x F_DUPFD has wrong errno, and allows negative target | ||
27 | dnl haiku alpha 2 F_DUPFD has wrong errno | ||
28 | AC_CACHE_CHECK([whether fcntl handles F_DUPFD correctly], | ||
29 | [gl_cv_func_fcntl_f_dupfd_works], | ||
30 | [AC_RUN_IFELSE( | ||
31 | [AC_LANG_PROGRAM( | ||
32 | [[#include <errno.h> | ||
33 | #include <fcntl.h> | ||
34 | #include <limits.h> | ||
35 | #include <sys/resource.h> | ||
36 | #include <unistd.h> | ||
37 | ]GL_MDA_DEFINES[ | ||
38 | #ifndef RLIM_SAVED_CUR | ||
39 | # define RLIM_SAVED_CUR RLIM_INFINITY | ||
40 | #endif | ||
41 | #ifndef RLIM_SAVED_MAX | ||
42 | # define RLIM_SAVED_MAX RLIM_INFINITY | ||
43 | #endif | ||
44 | ]], | ||
45 | [[int result = 0; | ||
46 | int bad_fd = INT_MAX; | ||
47 | struct rlimit rlim; | ||
48 | if (getrlimit (RLIMIT_NOFILE, &rlim) == 0 | ||
49 | && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX | ||
50 | && rlim.rlim_cur != RLIM_INFINITY | ||
51 | && rlim.rlim_cur != RLIM_SAVED_MAX | ||
52 | && rlim.rlim_cur != RLIM_SAVED_CUR) | ||
53 | bad_fd = rlim.rlim_cur; | ||
54 | if (fcntl (0, F_DUPFD, -1) != -1) result |= 1; | ||
55 | if (errno != EINVAL) result |= 2; | ||
56 | if (fcntl (0, F_DUPFD, bad_fd) != -1) result |= 4; | ||
57 | if (errno != EINVAL) result |= 8; | ||
58 | /* On OS/2 kLIBC, F_DUPFD does not work on a directory fd */ | ||
59 | { | ||
60 | int fd; | ||
61 | fd = open (".", O_RDONLY); | ||
62 | if (fd == -1) | ||
63 | result |= 16; | ||
64 | else if (fcntl (fd, F_DUPFD, STDERR_FILENO + 1) == -1) | ||
65 | result |= 32; | ||
66 | |||
67 | close (fd); | ||
68 | } | ||
69 | return result;]])], | ||
70 | [gl_cv_func_fcntl_f_dupfd_works=yes], | ||
71 | [gl_cv_func_fcntl_f_dupfd_works=no], | ||
72 | [case $host_os in | ||
73 | aix* | cygwin* | haiku*) | ||
74 | gl_cv_func_fcntl_f_dupfd_works="guessing no" ;; | ||
75 | *) gl_cv_func_fcntl_f_dupfd_works="guessing yes" ;; | ||
76 | esac])]) | ||
77 | case $gl_cv_func_fcntl_f_dupfd_works in | ||
78 | *yes) ;; | ||
79 | *) gl_REPLACE_FCNTL | ||
80 | AC_DEFINE([FCNTL_DUPFD_BUGGY], [1], [Define this to 1 if F_DUPFD | ||
81 | behavior does not match POSIX]) ;; | ||
82 | esac | ||
83 | |||
84 | dnl Many systems lack F_DUPFD_CLOEXEC. | ||
85 | dnl NetBSD 9.0 declares F_DUPFD_CLOEXEC but it works only like F_DUPFD. | ||
86 | AC_CACHE_CHECK([whether fcntl understands F_DUPFD_CLOEXEC], | ||
87 | [gl_cv_func_fcntl_f_dupfd_cloexec], | ||
88 | [AC_RUN_IFELSE( | ||
89 | [AC_LANG_SOURCE( | ||
90 | [[#include <fcntl.h> | ||
91 | #include <unistd.h> | ||
92 | int main (int argc, char *argv[]) | ||
93 | { | ||
94 | if (argc == 1) | ||
95 | /* parent process */ | ||
96 | { | ||
97 | if (fcntl (1, F_DUPFD_CLOEXEC, 10) < 0) | ||
98 | return 1; | ||
99 | return execl ("./conftest", "./conftest", "child", NULL); | ||
100 | } | ||
101 | else | ||
102 | /* child process */ | ||
103 | return (fcntl (10, F_GETFL) < 0 ? 0 : 42); | ||
104 | } | ||
105 | ]]) | ||
106 | ], | ||
107 | [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ | ||
108 | #ifdef __linux__ | ||
109 | /* The Linux kernel only added F_DUPFD_CLOEXEC in 2.6.24, so we always replace | ||
110 | it to support the semantics on older kernels that failed with EINVAL. */ | ||
111 | choke me | ||
112 | #endif | ||
113 | ]])], | ||
114 | [gl_cv_func_fcntl_f_dupfd_cloexec=yes], | ||
115 | [gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check"]) | ||
116 | ], | ||
117 | [gl_cv_func_fcntl_f_dupfd_cloexec=no], | ||
118 | [case "$host_os" in | ||
119 | # Guess no on NetBSD. | ||
120 | netbsd*) gl_cv_func_fcntl_f_dupfd_cloexec="guessing no" ;; | ||
121 | *) gl_cv_func_fcntl_f_dupfd_cloexec="$gl_cross_guess_normal" ;; | ||
122 | esac | ||
123 | ]) | ||
124 | ]) | ||
125 | case "$gl_cv_func_fcntl_f_dupfd_cloexec" in | ||
126 | *yes) ;; | ||
127 | *) gl_REPLACE_FCNTL | ||
128 | dnl No witness macro needed for this bug. | ||
129 | ;; | ||
130 | esac | ||
131 | fi | ||
132 | dnl Replace fcntl() for supporting the gnulib-defined fchdir() function, | ||
133 | dnl to keep fchdir's bookkeeping up-to-date. | ||
134 | m4_ifdef([gl_FUNC_FCHDIR], [ | ||
135 | gl_TEST_FCHDIR | ||
136 | if test $HAVE_FCHDIR = 0; then | ||
137 | gl_REPLACE_FCNTL | ||
138 | fi | ||
139 | ]) | ||
140 | ]) | ||
141 | |||
142 | AC_DEFUN([gl_REPLACE_FCNTL], | ||
143 | [ | ||
144 | AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) | ||
145 | AC_CHECK_FUNCS_ONCE([fcntl]) | ||
146 | if test $ac_cv_func_fcntl = no; then | ||
147 | HAVE_FCNTL=0 | ||
148 | else | ||
149 | REPLACE_FCNTL=1 | ||
150 | fi | ||
151 | ]) | ||