1dnl
2dnl Bash specific tests
3dnl
4dnl Some derived from PDKSH 5.1.3 autoconf tests
5dnl
6
7AC_DEFUN(BASH_C_LONG_LONG,
8[AC_CACHE_CHECK(for long long, ac_cv_c_long_long,
9[if test "$GCC" = yes; then
10  ac_cv_c_long_long=yes
11else
12AC_TRY_RUN([
13int
14main()
15{
16long long foo = 0;
17exit(sizeof(long long) < sizeof(long));
18}
19], ac_cv_c_long_long=yes, ac_cv_c_long_long=no)
20fi])
21if test $ac_cv_c_long_long = yes; then
22  AC_DEFINE(HAVE_LONG_LONG, 1, [Define if the `long long' type works.])
23fi
24])
25
26dnl
27dnl This is very similar to AC_C_LONG_DOUBLE, with the fix for IRIX
28dnl (< changed to <=) added.
29dnl
30AC_DEFUN(BASH_C_LONG_DOUBLE,
31[AC_CACHE_CHECK(for long double, ac_cv_c_long_double,
32[if test "$GCC" = yes; then
33  ac_cv_c_long_double=yes
34else
35AC_TRY_RUN([
36int
37main()
38{
39  /* The Stardent Vistra knows sizeof(long double), but does not
40     support it. */
41  long double foo = 0.0;
42  /* On Ultrix 4.3 cc, long double is 4 and double is 8.  */
43  /* On IRIX 5.3, the compiler converts long double to double with a warning,
44     but compiles this successfully. */
45  exit(sizeof(long double) <= sizeof(double));
46}
47], ac_cv_c_long_double=yes, ac_cv_c_long_double=no)
48fi])
49if test $ac_cv_c_long_double = yes; then
50  AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if the `long double' type works.])
51fi
52])
53
54dnl
55dnl Check for <inttypes.h>.  This is separated out so that it can be
56dnl AC_REQUIREd.
57dnl
58dnl BASH_HEADER_INTTYPES
59AC_DEFUN(BASH_HEADER_INTTYPES,
60[
61 AC_CHECK_HEADERS(inttypes.h)
62])
63
64dnl
65dnl check for typedef'd symbols in header files, but allow the caller to
66dnl specify the include files to be checked in addition to the default
67dnl
68dnl BASH_CHECK_TYPE(TYPE, HEADERS, DEFAULT[, VALUE-IF-FOUND])
69AC_DEFUN(BASH_CHECK_TYPE,
70[
71AC_REQUIRE([AC_HEADER_STDC])dnl
72AC_REQUIRE([BASH_HEADER_INTTYPES])
73AC_MSG_CHECKING(for $1)
74AC_CACHE_VAL(bash_cv_type_$1,
75[AC_EGREP_CPP($1, [#include <sys/types.h>
76#if STDC_HEADERS
77#include <stdlib.h>
78#include <stddef.h>
79#endif
80#if HAVE_INTTYPES_H
81#include <inttypes.h>
82#endif
83$2
84], bash_cv_type_$1=yes, bash_cv_type_$1=no)])
85AC_MSG_RESULT($bash_cv_type_$1)
86ifelse($#, 4, [if test $bash_cv_type_$1 = yes; then
87	AC_DEFINE($4)
88	fi])
89if test $bash_cv_type_$1 = no; then
90  AC_DEFINE_UNQUOTED($1, $3)
91fi
92])
93
94dnl
95dnl BASH_CHECK_DECL(FUNC)
96dnl
97dnl Check for a declaration of FUNC in stdlib.h and inttypes.h like
98dnl AC_CHECK_DECL
99dnl
100AC_DEFUN(BASH_CHECK_DECL,
101[
102AC_REQUIRE([AC_HEADER_STDC])
103AC_REQUIRE([BASH_HEADER_INTTYPES])
104AC_CACHE_CHECK([for declaration of $1], bash_cv_decl_$1,
105[AC_TRY_LINK(
106[
107#if STDC_HEADERS
108#  include <stdlib.h>
109#endif
110#if HAVE_INTTYPES_H
111#  include <inttypes.h>
112#endif
113],
114[return !$1;],
115bash_cv_decl_$1=yes, bash_cv_decl_$1=no)])
116bash_tr_func=HAVE_DECL_`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
117if test $bash_cv_decl_$1 = yes; then
118  AC_DEFINE_UNQUOTED($bash_tr_func, 1)
119else
120  AC_DEFINE_UNQUOTED($bash_tr_func, 0)
121fi
122])
123
124AC_DEFUN(BASH_DECL_PRINTF,
125[AC_MSG_CHECKING(for declaration of printf in <stdio.h>)
126AC_CACHE_VAL(bash_cv_printf_declared,
127[AC_TRY_RUN([
128#include <stdio.h>
129#ifdef __STDC__
130typedef int (*_bashfunc)(const char *, ...);
131#else
132typedef int (*_bashfunc)();
133#endif
134main()
135{
136_bashfunc pf;
137pf = (_bashfunc) printf;
138exit(pf == 0);
139}
140], bash_cv_printf_declared=yes, bash_cv_printf_declared=no,
141   [AC_MSG_WARN(cannot check printf declaration if cross compiling -- defaulting to yes)
142    bash_cv_printf_declared=yes]
143)])
144AC_MSG_RESULT($bash_cv_printf_declared)
145if test $bash_cv_printf_declared = yes; then
146AC_DEFINE(PRINTF_DECLARED)
147fi
148])
149
150AC_DEFUN(BASH_DECL_SBRK,
151[AC_MSG_CHECKING(for declaration of sbrk in <unistd.h>)
152AC_CACHE_VAL(bash_cv_sbrk_declared,
153[AC_EGREP_HEADER(sbrk, unistd.h,
154 bash_cv_sbrk_declared=yes, bash_cv_sbrk_declared=no)])
155AC_MSG_RESULT($bash_cv_sbrk_declared)
156if test $bash_cv_sbrk_declared = yes; then
157AC_DEFINE(SBRK_DECLARED)
158fi
159])
160
161dnl
162dnl Check for sys_siglist[] or _sys_siglist[]
163dnl
164AC_DEFUN(BASH_DECL_UNDER_SYS_SIGLIST,
165[AC_MSG_CHECKING([for _sys_siglist in signal.h or unistd.h])
166AC_CACHE_VAL(bash_cv_decl_under_sys_siglist,
167[AC_TRY_COMPILE([
168#include <sys/types.h>
169#include <signal.h>
170#ifdef HAVE_UNISTD_H
171#include <unistd.h>
172#endif], [ char *msg = _sys_siglist[2]; ],
173  bash_cv_decl_under_sys_siglist=yes, bash_cv_decl_under_sys_siglist=no,
174  [AC_MSG_WARN(cannot check for _sys_siglist[] if cross compiling -- defaulting to no)])])dnl
175AC_MSG_RESULT($bash_cv_decl_under_sys_siglist)
176if test $bash_cv_decl_under_sys_siglist = yes; then
177AC_DEFINE(UNDER_SYS_SIGLIST_DECLARED)
178fi
179])
180
181AC_DEFUN(BASH_UNDER_SYS_SIGLIST,
182[AC_REQUIRE([BASH_DECL_UNDER_SYS_SIGLIST])
183AC_MSG_CHECKING([for _sys_siglist in system C library])
184AC_CACHE_VAL(bash_cv_under_sys_siglist,
185[AC_TRY_RUN([
186#include <sys/types.h>
187#include <signal.h>
188#ifdef HAVE_UNISTD_H
189#include <unistd.h>
190#endif
191#ifndef UNDER_SYS_SIGLIST_DECLARED
192extern char *_sys_siglist[];
193#endif
194main()
195{
196char *msg = (char *)_sys_siglist[2];
197exit(msg == 0);
198}],
199	bash_cv_under_sys_siglist=yes, bash_cv_under_sys_siglist=no,
200	[AC_MSG_WARN(cannot check for _sys_siglist[] if cross compiling -- defaulting to no)
201	 bash_cv_under_sys_siglist=no])])
202AC_MSG_RESULT($bash_cv_under_sys_siglist)
203if test $bash_cv_under_sys_siglist = yes; then
204AC_DEFINE(HAVE_UNDER_SYS_SIGLIST)
205fi
206])
207
208AC_DEFUN(BASH_SYS_SIGLIST,
209[AC_REQUIRE([AC_DECL_SYS_SIGLIST])
210AC_MSG_CHECKING([for sys_siglist in system C library])
211AC_CACHE_VAL(bash_cv_sys_siglist,
212[AC_TRY_RUN([
213#include <sys/types.h>
214#include <signal.h>
215#ifdef HAVE_UNISTD_H
216#include <unistd.h>
217#endif
218#ifndef SYS_SIGLIST_DECLARED
219extern char *sys_siglist[];
220#endif
221main()
222{
223char *msg = sys_siglist[2];
224exit(msg == 0);
225}],
226	bash_cv_sys_siglist=yes, bash_cv_sys_siglist=no,
227	[AC_MSG_WARN(cannot check for sys_siglist if cross compiling -- defaulting to no)
228	 bash_cv_sys_siglist=no])])
229AC_MSG_RESULT($bash_cv_sys_siglist)
230if test $bash_cv_sys_siglist = yes; then
231AC_DEFINE(HAVE_SYS_SIGLIST)
232fi
233])
234
235dnl Check for the various permutations of sys_siglist and make sure we
236dnl compile in siglist.o if they're not defined
237AC_DEFUN(BASH_CHECK_SYS_SIGLIST, [
238AC_REQUIRE([BASH_SYS_SIGLIST])
239AC_REQUIRE([BASH_DECL_UNDER_SYS_SIGLIST])
240AC_REQUIRE([BASH_FUNC_STRSIGNAL])
241if test "$bash_cv_sys_siglist" = no && test "$bash_cv_under_sys_siglist" = no && test "$bash_cv_have_strsignal" = no; then
242  SIGLIST_O=siglist.o
243else
244  SIGLIST_O=
245fi
246AC_SUBST([SIGLIST_O])
247])
248
249dnl Check for sys_errlist[] and sys_nerr, check for declaration
250AC_DEFUN(BASH_SYS_ERRLIST,
251[AC_MSG_CHECKING([for sys_errlist and sys_nerr])
252AC_CACHE_VAL(bash_cv_sys_errlist,
253[AC_TRY_LINK([#include <errno.h>],
254[extern char *sys_errlist[];
255 extern int sys_nerr;
256 char *msg = sys_errlist[sys_nerr - 1];],
257    bash_cv_sys_errlist=yes, bash_cv_sys_errlist=no)])dnl
258AC_MSG_RESULT($bash_cv_sys_errlist)
259if test $bash_cv_sys_errlist = yes; then
260AC_DEFINE(HAVE_SYS_ERRLIST)
261fi
262])
263
264dnl
265dnl Check if dup2() does not clear the close on exec flag
266dnl
267AC_DEFUN(BASH_FUNC_DUP2_CLOEXEC_CHECK,
268[AC_MSG_CHECKING(if dup2 fails to clear the close-on-exec flag)
269AC_CACHE_VAL(bash_cv_dup2_broken,
270[AC_TRY_RUN([
271#include <sys/types.h>
272#include <fcntl.h>
273main()
274{
275  int fd1, fd2, fl;
276  fd1 = open("/dev/null", 2);
277  if (fcntl(fd1, 2, 1) < 0)
278    exit(1);
279  fd2 = dup2(fd1, 1);
280  if (fd2 < 0)
281    exit(2);
282  fl = fcntl(fd2, 1, 0);
283  /* fl will be 1 if dup2 did not reset the close-on-exec flag. */
284  exit(fl != 1);
285}
286], bash_cv_dup2_broken=yes, bash_cv_dup2_broken=no,
287    [AC_MSG_WARN(cannot check dup2 if cross compiling -- defaulting to no)
288     bash_cv_dup2_broken=no])
289])
290AC_MSG_RESULT($bash_cv_dup2_broken)
291if test $bash_cv_dup2_broken = yes; then
292AC_DEFINE(DUP2_BROKEN)
293fi
294])
295
296AC_DEFUN(BASH_FUNC_STRSIGNAL,
297[AC_MSG_CHECKING([for the existence of strsignal])
298AC_CACHE_VAL(bash_cv_have_strsignal,
299[AC_TRY_LINK([#include <sys/types.h>
300#include <signal.h>],
301[char *s = (char *)strsignal(2);],
302 bash_cv_have_strsignal=yes, bash_cv_have_strsignal=no)])
303AC_MSG_RESULT($bash_cv_have_strsignal)
304if test $bash_cv_have_strsignal = yes; then
305AC_DEFINE(HAVE_STRSIGNAL)
306fi
307])
308
309dnl Check to see if opendir will open non-directories (not a nice thing)
310AC_DEFUN(BASH_FUNC_OPENDIR_CHECK,
311[AC_REQUIRE([AC_HEADER_DIRENT])dnl
312AC_MSG_CHECKING(if opendir() opens non-directories)
313AC_CACHE_VAL(bash_cv_opendir_not_robust,
314[AC_TRY_RUN([
315#include <stdio.h>
316#include <sys/types.h>
317#include <fcntl.h>
318#ifdef HAVE_UNISTD_H
319# include <unistd.h>
320#endif /* HAVE_UNISTD_H */
321#if defined(HAVE_DIRENT_H)
322# include <dirent.h>
323#else
324# define dirent direct
325# ifdef HAVE_SYS_NDIR_H
326#  include <sys/ndir.h>
327# endif /* SYSNDIR */
328# ifdef HAVE_SYS_DIR_H
329#  include <sys/dir.h>
330# endif /* SYSDIR */
331# ifdef HAVE_NDIR_H
332#  include <ndir.h>
333# endif
334#endif /* HAVE_DIRENT_H */
335main()
336{
337DIR *dir;
338int fd, err;
339err = mkdir("/tmp/bash-aclocal", 0700);
340if (err < 0) {
341  perror("mkdir");
342  exit(1);
343}
344unlink("/tmp/bash-aclocal/not_a_directory");
345fd = open("/tmp/bash-aclocal/not_a_directory", O_WRONLY|O_CREAT|O_EXCL, 0666);
346write(fd, "\n", 1);
347close(fd);
348dir = opendir("/tmp/bash-aclocal/not_a_directory");
349unlink("/tmp/bash-aclocal/not_a_directory");
350rmdir("/tmp/bash-aclocal");
351exit (dir == 0);
352}], bash_cv_opendir_not_robust=yes,bash_cv_opendir_not_robust=no,
353    [AC_MSG_WARN(cannot check opendir if cross compiling -- defaulting to no)
354     bash_cv_opendir_not_robust=no]
355)])
356AC_MSG_RESULT($bash_cv_opendir_not_robust)
357if test $bash_cv_opendir_not_robust = yes; then
358AC_DEFINE(OPENDIR_NOT_ROBUST)
359fi
360])
361
362dnl
363AC_DEFUN(BASH_TYPE_SIGHANDLER,
364[AC_MSG_CHECKING([whether signal handlers are of type void])
365AC_CACHE_VAL(bash_cv_void_sighandler,
366[AC_TRY_COMPILE([#include <sys/types.h>
367#include <signal.h>
368#ifdef signal
369#undef signal
370#endif
371#ifdef __cplusplus
372extern "C"
373#endif
374void (*signal ()) ();],
375[int i;], bash_cv_void_sighandler=yes, bash_cv_void_sighandler=no)])dnl
376AC_MSG_RESULT($bash_cv_void_sighandler)
377if test $bash_cv_void_sighandler = yes; then
378AC_DEFINE(VOID_SIGHANDLER)
379fi
380])
381
382dnl
383dnl A signed 16-bit integer quantity
384dnl
385AC_DEFUN(BASH_TYPE_BITS16_T,
386[
387if test "$ac_cv_sizeof_short" = 2; then
388  AC_CHECK_TYPE(bits16_t, short)
389elif test "$ac_cv_sizeof_char" = 2; then
390  AC_CHECK_TYPE(bits16_t, char)
391else
392  AC_CHECK_TYPE(bits16_t, short)
393fi
394])
395
396dnl
397dnl An unsigned 16-bit integer quantity
398dnl
399AC_DEFUN(BASH_TYPE_U_BITS16_T,
400[
401if test "$ac_cv_sizeof_short" = 2; then
402  AC_CHECK_TYPE(u_bits16_t, unsigned short)
403elif test "$ac_cv_sizeof_char" = 2; then
404  AC_CHECK_TYPE(u_bits16_t, unsigned char)
405else
406  AC_CHECK_TYPE(u_bits16_t, unsigned short)
407fi
408])
409
410dnl
411dnl A signed 32-bit integer quantity
412dnl
413AC_DEFUN(BASH_TYPE_BITS32_T,
414[
415if test "$ac_cv_sizeof_int" = 4; then
416  AC_CHECK_TYPE(bits32_t, int)
417elif test "$ac_cv_sizeof_long" = 4; then
418  AC_CHECK_TYPE(bits32_t, long)
419else
420  AC_CHECK_TYPE(bits32_t, int)
421fi
422])
423
424dnl
425dnl An unsigned 32-bit integer quantity
426dnl
427AC_DEFUN(BASH_TYPE_U_BITS32_T,
428[
429if test "$ac_cv_sizeof_int" = 4; then
430  AC_CHECK_TYPE(u_bits32_t, unsigned int)
431elif test "$ac_cv_sizeof_long" = 4; then
432  AC_CHECK_TYPE(u_bits32_t, unsigned long)
433else
434  AC_CHECK_TYPE(u_bits32_t, unsigned int)
435fi
436])
437
438AC_DEFUN(BASH_TYPE_PTRDIFF_T,
439[
440if test "$ac_cv_sizeof_int" = "$ac_cv_sizeof_char_p"; then
441  AC_CHECK_TYPE(ptrdiff_t, int)
442elif test "$ac_cv_sizeof_long" = "$ac_cv_sizeof_char_p"; then
443  AC_CHECK_TYPE(ptrdiff_t, long)
444elif test "$ac_cv_type_long_long" = yes && test "$ac_cv_sizeof_long_long" = "$ac_cv_sizeof_char_p"; then
445  AC_CHECK_TYPE(ptrdiff_t, [long long])
446else
447  AC_CHECK_TYPE(ptrdiff_t, int)
448fi
449])
450
451dnl
452dnl A signed 64-bit quantity
453dnl
454AC_DEFUN(BASH_TYPE_BITS64_T,
455[
456if test "$ac_cv_sizeof_char_p" = 8; then
457  AC_CHECK_TYPE(bits64_t, char *)
458elif test "$ac_cv_sizeof_double" = 8; then
459  AC_CHECK_TYPE(bits64_t, double)
460elif test -n "$ac_cv_type_long_long" && test "$ac_cv_sizeof_long_long" = 8; then
461  AC_CHECK_TYPE(bits64_t, [long long])
462elif test "$ac_cv_sizeof_long" = 8; then
463  AC_CHECK_TYPE(bits64_t, long)
464else
465  AC_CHECK_TYPE(bits64_t, double)
466fi
467])
468
469AC_DEFUN(BASH_TYPE_LONG_LONG,
470[
471AC_CACHE_CHECK([for long long], bash_cv_type_long_long,
472[AC_TRY_LINK([
473long long ll = 1; int i = 63;],
474[
475long long llm = (long long) -1;
476return ll << i | ll >> i | llm / ll | llm % ll;
477], bash_cv_type_long_long='long long', bash_cv_type_long_long='long')])
478if test "$bash_cv_type_long_long" = 'long long'; then
479  AC_DEFINE(HAVE_LONG_LONG, 1)
480fi
481])
482
483AC_DEFUN(BASH_TYPE_UNSIGNED_LONG_LONG,
484[
485AC_CACHE_CHECK([for unsigned long long], bash_cv_type_unsigned_long_long,
486[AC_TRY_LINK([
487unsigned long long ull = 1; int i = 63;],
488[
489unsigned long long ullmax = (unsigned long long) -1;
490return ull << i | ull >> i | ullmax / ull | ullmax % ull;
491], bash_cv_type_unsigned_long_long='unsigned long long',
492   bash_cv_type_unsigned_long_long='unsigned long')])
493if test "$bash_cv_type_unsigned_long_long" = 'unsigned long long'; then
494  AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1)
495fi
496])
497
498dnl
499dnl Type of struct rlimit fields: some systems (OSF/1, NetBSD, RISC/os 5.0)
500dnl have a rlim_t, others (4.4BSD based systems) use quad_t, others use
501dnl long and still others use int (HP-UX 9.01, SunOS 4.1.3).  To simplify
502dnl matters, this just checks for rlim_t, quad_t, or long.
503dnl
504AC_DEFUN(BASH_TYPE_RLIMIT,
505[AC_MSG_CHECKING(for size and type of struct rlimit fields)
506AC_CACHE_VAL(bash_cv_type_rlimit,
507[AC_TRY_COMPILE([#include <sys/types.h>
508#include <sys/resource.h>],
509[rlim_t xxx;], bash_cv_type_rlimit=rlim_t,[
510AC_TRY_RUN([
511#include <sys/types.h>
512#include <sys/time.h>
513#include <sys/resource.h>
514main()
515{
516#ifdef HAVE_QUAD_T
517  struct rlimit rl;
518  if (sizeof(rl.rlim_cur) == sizeof(quad_t))
519    exit(0);
520#endif
521  exit(1);
522}], bash_cv_type_rlimit=quad_t, bash_cv_type_rlimit=long,
523        [AC_MSG_WARN(cannot check quad_t if cross compiling -- defaulting to long)
524         bash_cv_type_rlimit=long])])
525])
526AC_MSG_RESULT($bash_cv_type_rlimit)
527if test $bash_cv_type_rlimit = quad_t; then
528AC_DEFINE(RLIMTYPE, quad_t)
529elif test $bash_cv_type_rlimit = rlim_t; then
530AC_DEFINE(RLIMTYPE, rlim_t)
531fi
532])
533
534AC_DEFUN(BASH_FUNC_LSTAT,
535[dnl Cannot use AC_CHECK_FUNCS(lstat) because Linux defines lstat() as an
536dnl inline function in <sys/stat.h>.
537AC_CACHE_CHECK([for lstat], bash_cv_func_lstat,
538[AC_TRY_LINK([
539#include <sys/types.h>
540#include <sys/stat.h>
541],[ lstat(".",(struct stat *)0); ],
542bash_cv_func_lstat=yes, bash_cv_func_lstat=no)])
543if test $bash_cv_func_lstat = yes; then
544  AC_DEFINE(HAVE_LSTAT)
545fi
546])
547
548AC_DEFUN(BASH_FUNC_INET_ATON,
549[
550AC_CACHE_CHECK([for inet_aton], bash_cv_func_inet_aton,
551[AC_TRY_LINK([
552#include <sys/types.h>
553#include <netinet/in.h>
554#include <arpa/inet.h>
555struct in_addr ap;], [ inet_aton("127.0.0.1", &ap); ],
556bash_cv_func_inet_aton=yes, bash_cv_func_inet_aton=no)])
557if test $bash_cv_func_inet_aton = yes; then
558  AC_DEFINE(HAVE_INET_ATON)
559else
560  AC_LIBOBJ(inet_aton)
561fi
562])
563
564AC_DEFUN(BASH_FUNC_GETENV,
565[AC_MSG_CHECKING(to see if getenv can be redefined)
566AC_CACHE_VAL(bash_cv_getenv_redef,
567[AC_TRY_RUN([
568#ifdef HAVE_UNISTD_H
569#  include <unistd.h>
570#endif
571#ifndef __STDC__
572#  ifndef const
573#    define const
574#  endif
575#endif
576char *
577getenv (name)
578#if defined (__linux__) || defined (__bsdi__) || defined (convex)
579     const char *name;
580#else
581     char const *name;
582#endif /* !__linux__ && !__bsdi__ && !convex */
583{
584return "42";
585}
586main()
587{
588char *s;
589/* The next allows this program to run, but does not allow bash to link
590   when it redefines getenv.  I'm not really interested in figuring out
591   why not. */
592#if defined (NeXT)
593exit(1);
594#endif
595s = getenv("ABCDE");
596exit(s == 0);	/* force optimizer to leave getenv in */
597}
598], bash_cv_getenv_redef=yes, bash_cv_getenv_redef=no,
599   [AC_MSG_WARN(cannot check getenv redefinition if cross compiling -- defaulting to yes)
600    bash_cv_getenv_redef=yes]
601)])
602AC_MSG_RESULT($bash_cv_getenv_redef)
603if test $bash_cv_getenv_redef = yes; then
604AC_DEFINE(CAN_REDEFINE_GETENV)
605fi
606])
607
608# We should check for putenv before calling this
609AC_DEFUN(BASH_FUNC_STD_PUTENV,
610[
611AC_REQUIRE([AC_HEADER_STDC])
612AC_REQUIRE([AC_C_PROTOTYPES])
613AC_CACHE_CHECK([for standard-conformant putenv declaration], bash_cv_std_putenv,
614[AC_TRY_LINK([
615#if STDC_HEADERS
616#include <stdlib.h>
617#include <stddef.h>
618#endif
619#ifndef __STDC__
620#  ifndef const
621#    define const
622#  endif
623#endif
624#ifdef PROTOTYPES
625extern int putenv (char *);
626#else
627extern int putenv ();
628#endif
629],
630[return (putenv == 0);],
631bash_cv_std_putenv=yes, bash_cv_std_putenv=no
632)])
633if test $bash_cv_std_putenv = yes; then
634AC_DEFINE(HAVE_STD_PUTENV)
635fi
636])
637
638# We should check for unsetenv before calling this
639AC_DEFUN(BASH_FUNC_STD_UNSETENV,
640[
641AC_REQUIRE([AC_HEADER_STDC])
642AC_REQUIRE([AC_C_PROTOTYPES])
643AC_CACHE_CHECK([for standard-conformant unsetenv declaration], bash_cv_std_unsetenv,
644[AC_TRY_LINK([
645#if STDC_HEADERS
646#include <stdlib.h>
647#include <stddef.h>
648#endif
649#ifndef __STDC__
650#  ifndef const
651#    define const
652#  endif
653#endif
654#ifdef PROTOTYPES
655extern int unsetenv (const char *);
656#else
657extern int unsetenv ();
658#endif
659],
660[return (unsetenv == 0);],
661bash_cv_std_unsetenv=yes, bash_cv_std_unsetenv=no
662)])
663if test $bash_cv_std_unsetenv = yes; then
664AC_DEFINE(HAVE_STD_UNSETENV)
665fi
666])
667
668AC_DEFUN(BASH_FUNC_ULIMIT_MAXFDS,
669[AC_MSG_CHECKING(whether ulimit can substitute for getdtablesize)
670AC_CACHE_VAL(bash_cv_ulimit_maxfds,
671[AC_TRY_RUN([
672main()
673{
674long maxfds = ulimit(4, 0L);
675exit (maxfds == -1L);
676}
677], bash_cv_ulimit_maxfds=yes, bash_cv_ulimit_maxfds=no,
678   [AC_MSG_WARN(cannot check ulimit if cross compiling -- defaulting to no)
679    bash_cv_ulimit_maxfds=no]
680)])
681AC_MSG_RESULT($bash_cv_ulimit_maxfds)
682if test $bash_cv_ulimit_maxfds = yes; then
683AC_DEFINE(ULIMIT_MAXFDS)
684fi
685])
686
687AC_DEFUN(BASH_FUNC_GETCWD,
688[AC_MSG_CHECKING([if getcwd() calls popen()])
689AC_CACHE_VAL(bash_cv_getcwd_calls_popen,
690[AC_TRY_RUN([
691#include <stdio.h>
692#ifdef HAVE_UNISTD_H
693#include <unistd.h>
694#endif
695
696#ifndef __STDC__
697#ifndef const
698#define const
699#endif
700#endif
701
702int popen_called;
703
704FILE *
705popen(command, type)
706     const char *command;
707     const char *type;
708{
709	popen_called = 1;
710	return (FILE *)NULL;
711}
712
713FILE *_popen(command, type)
714     const char *command;
715     const char *type;
716{
717  return (popen (command, type));
718}
719
720int
721pclose(stream)
722FILE *stream;
723{
724	return 0;
725}
726
727int
728_pclose(stream)
729FILE *stream;
730{
731	return 0;
732}
733
734main()
735{
736	char	lbuf[32];
737	popen_called = 0;
738	getcwd(lbuf, 32);
739	exit (popen_called);
740}
741], bash_cv_getcwd_calls_popen=no, bash_cv_getcwd_calls_popen=yes,
742   [AC_MSG_WARN(cannot check whether getcwd calls popen if cross compiling -- defaulting to no)
743    bash_cv_getcwd_calls_popen=no]
744)])
745AC_MSG_RESULT($bash_cv_getcwd_calls_popen)
746if test $bash_cv_getcwd_calls_popen = yes; then
747AC_DEFINE(GETCWD_BROKEN)
748AC_LIBOBJ(getcwd)
749fi
750])
751
752dnl
753dnl This needs BASH_CHECK_SOCKLIB, but since that's not called on every
754dnl system, we can't use AC_PREREQ
755dnl
756AC_DEFUN(BASH_FUNC_GETHOSTBYNAME,
757[if test "X$bash_cv_have_gethostbyname" = "X"; then
758_bash_needmsg=yes
759else
760AC_MSG_CHECKING(for gethostbyname in socket library)
761_bash_needmsg=
762fi
763AC_CACHE_VAL(bash_cv_have_gethostbyname,
764[AC_TRY_LINK([#include <netdb.h>],
765[ struct hostent *hp;
766  hp = gethostbyname("localhost");
767], bash_cv_have_gethostbyname=yes, bash_cv_have_gethostbyname=no)]
768)
769if test "X$_bash_needmsg" = Xyes; then
770    AC_MSG_CHECKING(for gethostbyname in socket library)
771fi
772AC_MSG_RESULT($bash_cv_have_gethostbyname)
773if test "$bash_cv_have_gethostbyname" = yes; then
774AC_DEFINE(HAVE_GETHOSTBYNAME)
775fi
776])
777
778AC_DEFUN(BASH_FUNC_FNMATCH_EXTMATCH,
779[AC_MSG_CHECKING(if fnmatch does extended pattern matching with FNM_EXTMATCH)
780AC_CACHE_VAL(bash_cv_fnm_extmatch,
781[AC_TRY_RUN([
782#include <fnmatch.h>
783
784main()
785{
786#ifdef FNM_EXTMATCH
787  exit (0);
788#else
789  exit (1);
790#endif
791}
792], bash_cv_fnm_extmatch=yes, bash_cv_fnm_extmatch=no,
793    [AC_MSG_WARN(cannot check FNM_EXTMATCH if cross compiling -- defaulting to no)
794     bash_cv_fnm_extmatch=no])
795])
796AC_MSG_RESULT($bash_cv_fnm_extmatch)
797if test $bash_cv_fnm_extmatch = yes; then
798AC_DEFINE(HAVE_LIBC_FNM_EXTMATCH)
799fi
800])
801
802AC_DEFUN(BASH_FUNC_POSIX_SETJMP,
803[AC_REQUIRE([BASH_SYS_SIGNAL_VINTAGE])
804AC_MSG_CHECKING(for presence of POSIX-style sigsetjmp/siglongjmp)
805AC_CACHE_VAL(bash_cv_func_sigsetjmp,
806[AC_TRY_RUN([
807#ifdef HAVE_UNISTD_H
808#include <unistd.h>
809#endif
810#include <sys/types.h>
811#include <signal.h>
812#include <setjmp.h>
813
814main()
815{
816#if !defined (_POSIX_VERSION) || !defined (HAVE_POSIX_SIGNALS)
817exit (1);
818#else
819
820int code;
821sigset_t set, oset;
822sigjmp_buf xx;
823
824/* get the mask */
825sigemptyset(&set);
826sigemptyset(&oset);
827sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &set);
828sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &oset);
829
830/* save it */
831code = sigsetjmp(xx, 1);
832if (code)
833  exit(0);	/* could get sigmask and compare to oset here. */
834
835/* change it */
836sigaddset(&set, SIGINT);
837sigprocmask(SIG_BLOCK, &set, (sigset_t *)NULL);
838
839/* and siglongjmp */
840siglongjmp(xx, 10);
841exit(1);
842#endif
843}], bash_cv_func_sigsetjmp=present, bash_cv_func_sigsetjmp=missing,
844    [AC_MSG_WARN(cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to missing)
845     bash_cv_func_sigsetjmp=missing]
846)])
847AC_MSG_RESULT($bash_cv_func_sigsetjmp)
848if test $bash_cv_func_sigsetjmp = present; then
849AC_DEFINE(HAVE_POSIX_SIGSETJMP)
850fi
851])
852
853AC_DEFUN(BASH_FUNC_STRCOLL,
854[
855AC_MSG_CHECKING(whether or not strcoll and strcmp differ)
856AC_CACHE_VAL(bash_cv_func_strcoll_broken,
857[AC_TRY_RUN([
858#include <stdio.h>
859#if defined (HAVE_LOCALE_H)
860#include <locale.h>
861#endif
862
863main(c, v)
864int     c;
865char    *v[];
866{
867        int     r1, r2;
868        char    *deflocale, *defcoll;
869
870#ifdef HAVE_SETLOCALE
871        deflocale = setlocale(LC_ALL, "");
872	defcoll = setlocale(LC_COLLATE, "");
873#endif
874
875#ifdef HAVE_STRCOLL
876	/* These two values are taken from tests/glob-test. */
877        r1 = strcoll("abd", "aXd");
878#else
879	r1 = 0;
880#endif
881        r2 = strcmp("abd", "aXd");
882
883	/* These two should both be greater than 0.  It is permissible for
884	   a system to return different values, as long as the sign is the
885	   same. */
886
887        /* Exit with 1 (failure) if these two values are both > 0, since
888	   this tests whether strcoll(3) is broken with respect to strcmp(3)
889	   in the default locale. */
890	exit (r1 > 0 && r2 > 0);
891}
892], bash_cv_func_strcoll_broken=yes, bash_cv_func_strcoll_broken=no,
893   [AC_MSG_WARN(cannot check strcoll if cross compiling -- defaulting to no)
894    bash_cv_func_strcoll_broken=no]
895)])
896AC_MSG_RESULT($bash_cv_func_strcoll_broken)
897if test $bash_cv_func_strcoll_broken = yes; then
898AC_DEFINE(STRCOLL_BROKEN)
899fi
900])
901
902AC_DEFUN(BASH_FUNC_PRINTF_A_FORMAT,
903[AC_MSG_CHECKING([for printf floating point output in hex notation])
904AC_CACHE_VAL(bash_cv_printf_a_format,
905[AC_TRY_RUN([
906#include <stdio.h>
907#include <string.h>
908
909int
910main()
911{
912	double y = 0.0;
913	char abuf[1024];
914
915	sprintf(abuf, "%A", y);
916	exit(strchr(abuf, 'P') == (char *)0);
917}
918], bash_cv_printf_a_format=yes, bash_cv_printf_a_format=no,
919   [AC_MSG_WARN(cannot check printf if cross compiling -- defaulting to no)
920    bash_cv_printf_a_format=no]
921)])
922AC_MSG_RESULT($bash_cv_printf_a_format)
923if test $bash_cv_printf_a_format = yes; then
924AC_DEFINE(HAVE_PRINTF_A_FORMAT)
925fi
926])
927
928AC_DEFUN(BASH_STRUCT_TERMIOS_LDISC,
929[
930AC_CHECK_MEMBER(struct termios.c_line, AC_DEFINE(TERMIOS_LDISC), ,[
931#include <sys/types.h>
932#include <termios.h>
933])
934])
935
936AC_DEFUN(BASH_STRUCT_TERMIO_LDISC,
937[
938AC_CHECK_MEMBER(struct termio.c_line, AC_DEFINE(TERMIO_LDISC), ,[
939#include <sys/types.h>
940#include <termio.h>
941])
942])
943
944dnl
945dnl Like AC_STRUCT_ST_BLOCKS, but doesn't muck with LIBOBJS
946dnl
947dnl sets bash_cv_struct_stat_st_blocks
948dnl
949dnl unused for now; we'll see how AC_CHECK_MEMBERS works
950dnl
951AC_DEFUN(BASH_STRUCT_ST_BLOCKS,
952[
953AC_MSG_CHECKING([for struct stat.st_blocks])
954AC_CACHE_VAL(bash_cv_struct_stat_st_blocks,
955[AC_TRY_COMPILE(
956[
957#include <sys/types.h>
958#include <sys/stat.h>
959],
960[
961main()
962{
963static struct stat a;
964if (a.st_blocks) return 0;
965return 0;
966}
967], bash_cv_struct_stat_st_blocks=yes, bash_cv_struct_stat_st_blocks=no)
968])
969AC_MSG_RESULT($bash_cv_struct_stat_st_blocks)
970if test "$bash_cv_struct_stat_st_blocks" = "yes"; then
971AC_DEFINE(HAVE_STRUCT_STAT_ST_BLOCKS)
972fi
973])
974
975AC_DEFUN(BASH_CHECK_LIB_TERMCAP,
976[
977if test "X$bash_cv_termcap_lib" = "X"; then
978_bash_needmsg=yes
979else
980AC_MSG_CHECKING(which library has the termcap functions)
981_bash_needmsg=
982fi
983AC_CACHE_VAL(bash_cv_termcap_lib,
984[AC_CHECK_LIB(termcap, tgetent, bash_cv_termcap_lib=libtermcap,
985    [AC_CHECK_LIB(tinfo, tgetent, bash_cv_termcap_lib=libtinfo,
986        [AC_CHECK_LIB(curses, tgetent, bash_cv_termcap_lib=libcurses,
987	    [AC_CHECK_LIB(ncurses, tgetent, bash_cv_termcap_lib=libncurses,
988	        bash_cv_termcap_lib=gnutermcap)])])])])
989if test "X$_bash_needmsg" = "Xyes"; then
990AC_MSG_CHECKING(which library has the termcap functions)
991fi
992AC_MSG_RESULT(using $bash_cv_termcap_lib)
993if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then
994LDFLAGS="$LDFLAGS -L./lib/termcap"
995TERMCAP_LIB="./lib/termcap/libtermcap.a"
996TERMCAP_DEP="./lib/termcap/libtermcap.a"
997elif test $bash_cv_termcap_lib = libtermcap && test -z "$prefer_curses"; then
998TERMCAP_LIB=-ltermcap
999TERMCAP_DEP=
1000elif test $bash_cv_termcap_lib = libtinfo; then
1001TERMCAP_LIB=-ltinfo
1002TERMCAP_DEP=
1003elif test $bash_cv_termcap_lib = libncurses; then
1004TERMCAP_LIB=-lncurses
1005TERMCAP_DEP=
1006else
1007TERMCAP_LIB=-lcurses
1008TERMCAP_DEP=
1009fi
1010])
1011
1012dnl
1013dnl Check for the presence of getpeername in libsocket.
1014dnl If libsocket is present, check for libnsl and add it to LIBS if
1015dnl it's there, since most systems with libsocket require linking
1016dnl with libnsl as well.  This should only be called if getpeername
1017dnl was not found in libc.
1018dnl
1019dnl NOTE: IF WE FIND GETPEERNAME, WE ASSUME THAT WE HAVE BIND/CONNECT
1020dnl	  AS WELL
1021dnl
1022AC_DEFUN(BASH_CHECK_LIB_SOCKET,
1023[
1024if test "X$bash_cv_have_socklib" = "X"; then
1025_bash_needmsg=
1026else
1027AC_MSG_CHECKING(for socket library)
1028_bash_needmsg=yes
1029fi
1030AC_CACHE_VAL(bash_cv_have_socklib,
1031[AC_CHECK_LIB(socket, getpeername,
1032        bash_cv_have_socklib=yes, bash_cv_have_socklib=no, -lnsl)])
1033if test "X$_bash_needmsg" = Xyes; then
1034  AC_MSG_RESULT($bash_cv_have_socklib)
1035  _bash_needmsg=
1036fi
1037if test $bash_cv_have_socklib = yes; then
1038  # check for libnsl, add it to LIBS if present
1039  if test "X$bash_cv_have_libnsl" = "X"; then
1040    _bash_needmsg=
1041  else
1042    AC_MSG_CHECKING(for libnsl)
1043    _bash_needmsg=yes
1044  fi
1045  AC_CACHE_VAL(bash_cv_have_libnsl,
1046	   [AC_CHECK_LIB(nsl, t_open,
1047		 bash_cv_have_libnsl=yes, bash_cv_have_libnsl=no)])
1048  if test "X$_bash_needmsg" = Xyes; then
1049    AC_MSG_RESULT($bash_cv_have_libnsl)
1050    _bash_needmsg=
1051  fi
1052  if test $bash_cv_have_libnsl = yes; then
1053    LIBS="-lsocket -lnsl $LIBS"
1054  else
1055    LIBS="-lsocket $LIBS"
1056  fi
1057  AC_DEFINE(HAVE_LIBSOCKET)
1058  AC_DEFINE(HAVE_GETPEERNAME)
1059fi
1060])
1061
1062AC_DEFUN(BASH_STRUCT_DIRENT_D_INO,
1063[AC_REQUIRE([AC_HEADER_DIRENT])
1064AC_MSG_CHECKING(if struct dirent has a d_ino member)
1065AC_CACHE_VAL(bash_cv_dirent_has_dino,
1066[AC_TRY_COMPILE([
1067#include <stdio.h>
1068#include <sys/types.h>
1069#ifdef HAVE_UNISTD_H
1070# include <unistd.h>
1071#endif /* HAVE_UNISTD_H */
1072#if defined(HAVE_DIRENT_H)
1073# include <dirent.h>
1074#else
1075# define dirent direct
1076# ifdef HAVE_SYS_NDIR_H
1077#  include <sys/ndir.h>
1078# endif /* SYSNDIR */
1079# ifdef HAVE_SYS_DIR_H
1080#  include <sys/dir.h>
1081# endif /* SYSDIR */
1082# ifdef HAVE_NDIR_H
1083#  include <ndir.h>
1084# endif
1085#endif /* HAVE_DIRENT_H */
1086],[
1087struct dirent d; int z; z = d.d_ino;
1088], bash_cv_dirent_has_dino=yes, bash_cv_dirent_has_dino=no)])
1089AC_MSG_RESULT($bash_cv_dirent_has_dino)
1090if test $bash_cv_dirent_has_dino = yes; then
1091AC_DEFINE(STRUCT_DIRENT_HAS_D_INO)
1092fi
1093])
1094
1095AC_DEFUN(BASH_STRUCT_DIRENT_D_FILENO,
1096[AC_REQUIRE([AC_HEADER_DIRENT])
1097AC_MSG_CHECKING(if struct dirent has a d_fileno member)
1098AC_CACHE_VAL(bash_cv_dirent_has_d_fileno,
1099[AC_TRY_COMPILE([
1100#include <stdio.h>
1101#include <sys/types.h>
1102#ifdef HAVE_UNISTD_H
1103# include <unistd.h>
1104#endif /* HAVE_UNISTD_H */
1105#if defined(HAVE_DIRENT_H)
1106# include <dirent.h>
1107#else
1108# define dirent direct
1109# ifdef HAVE_SYS_NDIR_H
1110#  include <sys/ndir.h>
1111# endif /* SYSNDIR */
1112# ifdef HAVE_SYS_DIR_H
1113#  include <sys/dir.h>
1114# endif /* SYSDIR */
1115# ifdef HAVE_NDIR_H
1116#  include <ndir.h>
1117# endif
1118#endif /* HAVE_DIRENT_H */
1119],[
1120struct dirent d; int z; z = d.d_fileno;
1121], bash_cv_dirent_has_d_fileno=yes, bash_cv_dirent_has_d_fileno=no)])
1122AC_MSG_RESULT($bash_cv_dirent_has_d_fileno)
1123if test $bash_cv_dirent_has_d_fileno = yes; then
1124AC_DEFINE(STRUCT_DIRENT_HAS_D_FILENO)
1125fi
1126])
1127
1128AC_DEFUN(BASH_STRUCT_TIMEVAL,
1129[AC_MSG_CHECKING(for struct timeval in sys/time.h and time.h)
1130AC_CACHE_VAL(bash_cv_struct_timeval,
1131[
1132AC_EGREP_HEADER(struct timeval, sys/time.h,
1133		bash_cv_struct_timeval=yes,
1134		AC_EGREP_HEADER(struct timeval, time.h,
1135			bash_cv_struct_timeval=yes,
1136			bash_cv_struct_timeval=no))
1137])
1138AC_MSG_RESULT($bash_cv_struct_timeval)
1139if test $bash_cv_struct_timeval = yes; then
1140  AC_DEFINE(HAVE_TIMEVAL)
1141fi
1142])
1143
1144AC_DEFUN(BASH_STRUCT_WINSIZE,
1145[AC_MSG_CHECKING(for struct winsize in sys/ioctl.h and termios.h)
1146AC_CACHE_VAL(bash_cv_struct_winsize_header,
1147[AC_TRY_COMPILE([#include <sys/types.h>
1148#include <sys/ioctl.h>], [struct winsize x;],
1149  bash_cv_struct_winsize_header=ioctl_h,
1150  [AC_TRY_COMPILE([#include <sys/types.h>
1151#include <termios.h>], [struct winsize x;],
1152  bash_cv_struct_winsize_header=termios_h, bash_cv_struct_winsize_header=other)
1153])])
1154if test $bash_cv_struct_winsize_header = ioctl_h; then
1155  AC_MSG_RESULT(sys/ioctl.h)
1156  AC_DEFINE(STRUCT_WINSIZE_IN_SYS_IOCTL)
1157elif test $bash_cv_struct_winsize_header = termios_h; then
1158  AC_MSG_RESULT(termios.h)
1159  AC_DEFINE(STRUCT_WINSIZE_IN_TERMIOS)
1160else
1161  AC_MSG_RESULT(not found)
1162fi
1163])
1164
1165dnl Check type of signal routines (posix, 4.2bsd, 4.1bsd or v7)
1166AC_DEFUN(BASH_SYS_SIGNAL_VINTAGE,
1167[AC_REQUIRE([AC_TYPE_SIGNAL])
1168AC_MSG_CHECKING(for type of signal functions)
1169AC_CACHE_VAL(bash_cv_signal_vintage,
1170[
1171  AC_TRY_LINK([#include <signal.h>],[
1172    sigset_t ss;
1173    struct sigaction sa;
1174    sigemptyset(&ss); sigsuspend(&ss);
1175    sigaction(SIGINT, &sa, (struct sigaction *) 0);
1176    sigprocmask(SIG_BLOCK, &ss, (sigset_t *) 0);
1177  ], bash_cv_signal_vintage=posix,
1178  [
1179    AC_TRY_LINK([#include <signal.h>], [
1180	int mask = sigmask(SIGINT);
1181	sigsetmask(mask); sigblock(mask); sigpause(mask);
1182    ], bash_cv_signal_vintage=4.2bsd,
1183    [
1184      AC_TRY_LINK([
1185	#include <signal.h>
1186	RETSIGTYPE foo() { }], [
1187		int mask = sigmask(SIGINT);
1188		sigset(SIGINT, foo); sigrelse(SIGINT);
1189		sighold(SIGINT); sigpause(SIGINT);
1190        ], bash_cv_signal_vintage=svr3, bash_cv_signal_vintage=v7
1191    )]
1192  )]
1193)
1194])
1195AC_MSG_RESULT($bash_cv_signal_vintage)
1196if test "$bash_cv_signal_vintage" = posix; then
1197AC_DEFINE(HAVE_POSIX_SIGNALS)
1198elif test "$bash_cv_signal_vintage" = "4.2bsd"; then
1199AC_DEFINE(HAVE_BSD_SIGNALS)
1200elif test "$bash_cv_signal_vintage" = svr3; then
1201AC_DEFINE(HAVE_USG_SIGHOLD)
1202fi
1203])
1204
1205dnl Check if the pgrp of setpgrp() can't be the pid of a zombie process.
1206AC_DEFUN(BASH_SYS_PGRP_SYNC,
1207[AC_REQUIRE([AC_FUNC_GETPGRP])
1208AC_MSG_CHECKING(whether pgrps need synchronization)
1209AC_CACHE_VAL(bash_cv_pgrp_pipe,
1210[AC_TRY_RUN([
1211#ifdef HAVE_UNISTD_H
1212#  include <unistd.h>
1213#endif
1214main()
1215{
1216# ifdef GETPGRP_VOID
1217#  define getpgID()	getpgrp()
1218# else
1219#  define getpgID()	getpgrp(0)
1220#  define setpgid(x,y)	setpgrp(x,y)
1221# endif
1222	int pid1, pid2, fds[2];
1223	int status;
1224	char ok;
1225
1226	switch (pid1 = fork()) {
1227	  case -1:
1228	    exit(1);
1229	  case 0:
1230	    setpgid(0, getpid());
1231	    exit(0);
1232	}
1233	setpgid(pid1, pid1);
1234
1235	sleep(2);	/* let first child die */
1236
1237	if (pipe(fds) < 0)
1238	  exit(2);
1239
1240	switch (pid2 = fork()) {
1241	  case -1:
1242	    exit(3);
1243	  case 0:
1244	    setpgid(0, pid1);
1245	    ok = getpgID() == pid1;
1246	    write(fds[1], &ok, 1);
1247	    exit(0);
1248	}
1249	setpgid(pid2, pid1);
1250
1251	close(fds[1]);
1252	if (read(fds[0], &ok, 1) != 1)
1253	  exit(4);
1254	wait(&status);
1255	wait(&status);
1256	exit(ok ? 0 : 5);
1257}
1258], bash_cv_pgrp_pipe=no,bash_cv_pgrp_pipe=yes,
1259   [AC_MSG_WARN(cannot check pgrp synchronization if cross compiling -- defaulting to no)
1260    bash_cv_pgrp_pipe=no])
1261])
1262AC_MSG_RESULT($bash_cv_pgrp_pipe)
1263if test $bash_cv_pgrp_pipe = yes; then
1264AC_DEFINE(PGRP_PIPE)
1265fi
1266])
1267
1268AC_DEFUN(BASH_SYS_REINSTALL_SIGHANDLERS,
1269[AC_REQUIRE([AC_TYPE_SIGNAL])
1270AC_REQUIRE([BASH_SYS_SIGNAL_VINTAGE])
1271AC_MSG_CHECKING([if signal handlers must be reinstalled when invoked])
1272AC_CACHE_VAL(bash_cv_must_reinstall_sighandlers,
1273[AC_TRY_RUN([
1274#include <signal.h>
1275#ifdef HAVE_UNISTD_H
1276#include <unistd.h>
1277#endif
1278
1279typedef RETSIGTYPE sigfunc();
1280
1281int nsigint;
1282
1283#ifdef HAVE_POSIX_SIGNALS
1284sigfunc *
1285set_signal_handler(sig, handler)
1286     int sig;
1287     sigfunc *handler;
1288{
1289  struct sigaction act, oact;
1290  act.sa_handler = handler;
1291  act.sa_flags = 0;
1292  sigemptyset (&act.sa_mask);
1293  sigemptyset (&oact.sa_mask);
1294  sigaction (sig, &act, &oact);
1295  return (oact.sa_handler);
1296}
1297#else
1298#define set_signal_handler(s, h) signal(s, h)
1299#endif
1300
1301RETSIGTYPE
1302sigint(s)
1303int s;
1304{
1305  nsigint++;
1306}
1307
1308main()
1309{
1310	nsigint = 0;
1311	set_signal_handler(SIGINT, sigint);
1312	kill((int)getpid(), SIGINT);
1313	kill((int)getpid(), SIGINT);
1314	exit(nsigint != 2);
1315}
1316], bash_cv_must_reinstall_sighandlers=no, bash_cv_must_reinstall_sighandlers=yes,
1317   [AC_MSG_WARN(cannot check signal handling if cross compiling -- defaulting to no)
1318    bash_cv_must_reinstall_sighandlers=no]
1319)])
1320AC_MSG_RESULT($bash_cv_must_reinstall_sighandlers)
1321if test $bash_cv_must_reinstall_sighandlers = yes; then
1322AC_DEFINE(MUST_REINSTALL_SIGHANDLERS)
1323fi
1324])
1325
1326dnl check that some necessary job control definitions are present
1327AC_DEFUN(BASH_SYS_JOB_CONTROL_MISSING,
1328[AC_REQUIRE([BASH_SYS_SIGNAL_VINTAGE])
1329AC_MSG_CHECKING(for presence of necessary job control definitions)
1330AC_CACHE_VAL(bash_cv_job_control_missing,
1331[AC_TRY_RUN([
1332#include <sys/types.h>
1333#ifdef HAVE_SYS_WAIT_H
1334#include <sys/wait.h>
1335#endif
1336#ifdef HAVE_UNISTD_H
1337#include <unistd.h>
1338#endif
1339#include <signal.h>
1340
1341/* Add more tests in here as appropriate. */
1342main()
1343{
1344/* signal type */
1345#if !defined (HAVE_POSIX_SIGNALS) && !defined (HAVE_BSD_SIGNALS)
1346exit(1);
1347#endif
1348
1349/* signals and tty control. */
1350#if !defined (SIGTSTP) || !defined (SIGSTOP) || !defined (SIGCONT)
1351exit (1);
1352#endif
1353
1354/* process control */
1355#if !defined (WNOHANG) || !defined (WUNTRACED)
1356exit(1);
1357#endif
1358
1359/* Posix systems have tcgetpgrp and waitpid. */
1360#if defined (_POSIX_VERSION) && !defined (HAVE_TCGETPGRP)
1361exit(1);
1362#endif
1363
1364#if defined (_POSIX_VERSION) && !defined (HAVE_WAITPID)
1365exit(1);
1366#endif
1367
1368/* Other systems have TIOCSPGRP/TIOCGPRGP and wait3. */
1369#if !defined (_POSIX_VERSION) && !defined (HAVE_WAIT3)
1370exit(1);
1371#endif
1372
1373exit(0);
1374}], bash_cv_job_control_missing=present, bash_cv_job_control_missing=missing,
1375    [AC_MSG_WARN(cannot check job control if cross-compiling -- defaulting to missing)
1376     bash_cv_job_control_missing=missing]
1377)])
1378AC_MSG_RESULT($bash_cv_job_control_missing)
1379if test $bash_cv_job_control_missing = missing; then
1380AC_DEFINE(JOB_CONTROL_MISSING)
1381fi
1382])
1383
1384dnl check whether named pipes are present
1385dnl this requires a previous check for mkfifo, but that is awkward to specify
1386AC_DEFUN(BASH_SYS_NAMED_PIPES,
1387[AC_MSG_CHECKING(for presence of named pipes)
1388AC_CACHE_VAL(bash_cv_sys_named_pipes,
1389[AC_TRY_RUN([
1390#include <sys/types.h>
1391#include <sys/stat.h>
1392#ifdef HAVE_UNISTD_H
1393#include <unistd.h>
1394#endif
1395
1396/* Add more tests in here as appropriate. */
1397main()
1398{
1399int fd, err;
1400
1401#if defined (HAVE_MKFIFO)
1402exit (0);
1403#endif
1404
1405#if !defined (S_IFIFO) && (defined (_POSIX_VERSION) && !defined (S_ISFIFO))
1406exit (1);
1407#endif
1408
1409#if defined (NeXT)
1410exit (1);
1411#endif
1412err = mkdir("/tmp/bash-aclocal", 0700);
1413if (err < 0) {
1414  perror ("mkdir");
1415  exit(1);
1416}
1417fd = mknod ("/tmp/bash-aclocal/sh-np-autoconf", 0666 | S_IFIFO, 0);
1418if (fd == -1) {
1419  rmdir ("/tmp/bash-aclocal");
1420  exit (1);
1421}
1422close(fd);
1423unlink ("/tmp/bash-aclocal/sh-np-autoconf");
1424rmdir ("/tmp/bash-aclocal");
1425exit(0);
1426}], bash_cv_sys_named_pipes=present, bash_cv_sys_named_pipes=missing,
1427    [AC_MSG_WARN(cannot check for named pipes if cross-compiling -- defaulting to missing)
1428     bash_cv_sys_named_pipes=missing]
1429)])
1430AC_MSG_RESULT($bash_cv_sys_named_pipes)
1431if test $bash_cv_sys_named_pipes = missing; then
1432AC_DEFINE(NAMED_PIPES_MISSING)
1433fi
1434])
1435
1436AC_DEFUN(BASH_SYS_DEFAULT_MAIL_DIR,
1437[AC_MSG_CHECKING(for default mail directory)
1438AC_CACHE_VAL(bash_cv_mail_dir,
1439[if test -d /var/mail; then
1440   bash_cv_mail_dir=/var/mail
1441 elif test -d /var/spool/mail; then
1442   bash_cv_mail_dir=/var/spool/mail
1443 elif test -d /usr/mail; then
1444   bash_cv_mail_dir=/usr/mail
1445 elif test -d /usr/spool/mail; then
1446   bash_cv_mail_dir=/usr/spool/mail
1447 else
1448   bash_cv_mail_dir=unknown
1449 fi
1450])
1451AC_MSG_RESULT($bash_cv_mail_dir)
1452AC_DEFINE_UNQUOTED(DEFAULT_MAIL_DIRECTORY, "$bash_cv_mail_dir")
1453])
1454
1455AC_DEFUN(BASH_HAVE_TIOCGWINSZ,
1456[AC_MSG_CHECKING(for TIOCGWINSZ in sys/ioctl.h)
1457AC_CACHE_VAL(bash_cv_tiocgwinsz_in_ioctl,
1458[AC_TRY_COMPILE([#include <sys/types.h>
1459#include <sys/ioctl.h>], [int x = TIOCGWINSZ;],
1460  bash_cv_tiocgwinsz_in_ioctl=yes,bash_cv_tiocgwinsz_in_ioctl=no)])
1461AC_MSG_RESULT($bash_cv_tiocgwinsz_in_ioctl)
1462if test $bash_cv_tiocgwinsz_in_ioctl = yes; then
1463AC_DEFINE(GWINSZ_IN_SYS_IOCTL)
1464fi
1465])
1466
1467AC_DEFUN(BASH_HAVE_TIOCSTAT,
1468[AC_MSG_CHECKING(for TIOCSTAT in sys/ioctl.h)
1469AC_CACHE_VAL(bash_cv_tiocstat_in_ioctl,
1470[AC_TRY_COMPILE([#include <sys/types.h>
1471#include <sys/ioctl.h>], [int x = TIOCSTAT;],
1472  bash_cv_tiocstat_in_ioctl=yes,bash_cv_tiocstat_in_ioctl=no)])
1473AC_MSG_RESULT($bash_cv_tiocstat_in_ioctl)
1474if test $bash_cv_tiocstat_in_ioctl = yes; then
1475AC_DEFINE(TIOCSTAT_IN_SYS_IOCTL)
1476fi
1477])
1478
1479AC_DEFUN(BASH_HAVE_FIONREAD,
1480[AC_MSG_CHECKING(for FIONREAD in sys/ioctl.h)
1481AC_CACHE_VAL(bash_cv_fionread_in_ioctl,
1482[AC_TRY_COMPILE([#include <sys/types.h>
1483#include <sys/ioctl.h>], [int x = FIONREAD;],
1484  bash_cv_fionread_in_ioctl=yes,bash_cv_fionread_in_ioctl=no)])
1485AC_MSG_RESULT($bash_cv_fionread_in_ioctl)
1486if test $bash_cv_fionread_in_ioctl = yes; then
1487AC_DEFINE(FIONREAD_IN_SYS_IOCTL)
1488fi
1489])
1490
1491dnl
1492dnl See if speed_t is declared in <sys/types.h>.  Some versions of linux
1493dnl require a definition of speed_t each time <termcap.h> is included,
1494dnl but you can only get speed_t if you include <termios.h> (on some
1495dnl versions) or <sys/types.h> (on others).
1496dnl
1497AC_DEFUN(BASH_CHECK_SPEED_T,
1498[AC_MSG_CHECKING(for speed_t in sys/types.h)
1499AC_CACHE_VAL(bash_cv_speed_t_in_sys_types,
1500[AC_TRY_COMPILE([#include <sys/types.h>], [speed_t x;],
1501  bash_cv_speed_t_in_sys_types=yes,bash_cv_speed_t_in_sys_types=no)])
1502AC_MSG_RESULT($bash_cv_speed_t_in_sys_types)
1503if test $bash_cv_speed_t_in_sys_types = yes; then
1504AC_DEFINE(SPEED_T_IN_SYS_TYPES)
1505fi
1506])
1507
1508AC_DEFUN(BASH_CHECK_GETPW_FUNCS,
1509[AC_MSG_CHECKING(whether getpw functions are declared in pwd.h)
1510AC_CACHE_VAL(bash_cv_getpw_declared,
1511[AC_EGREP_CPP(getpwuid,
1512[
1513#include <sys/types.h>
1514#ifdef HAVE_UNISTD_H
1515#  include <unistd.h>
1516#endif
1517#include <pwd.h>
1518],
1519bash_cv_getpw_declared=yes,bash_cv_getpw_declared=no)])
1520AC_MSG_RESULT($bash_cv_getpw_declared)
1521if test $bash_cv_getpw_declared = yes; then
1522AC_DEFINE(HAVE_GETPW_DECLS)
1523fi
1524])
1525
1526AC_DEFUN(BASH_CHECK_DEV_FD,
1527[AC_MSG_CHECKING(whether /dev/fd is available)
1528AC_CACHE_VAL(bash_cv_dev_fd,
1529[if test -d /dev/fd  && test -r /dev/fd/0; then
1530   bash_cv_dev_fd=standard
1531 elif test -d /proc/self/fd && test -r /proc/self/fd/0; then
1532   bash_cv_dev_fd=whacky
1533 else
1534   bash_cv_dev_fd=absent
1535 fi
1536])
1537AC_MSG_RESULT($bash_cv_dev_fd)
1538if test $bash_cv_dev_fd = "standard"; then
1539  AC_DEFINE(HAVE_DEV_FD)
1540  AC_DEFINE(DEV_FD_PREFIX, "/dev/fd/")
1541elif test $bash_cv_dev_fd = "whacky"; then
1542  AC_DEFINE(HAVE_DEV_FD)
1543  AC_DEFINE(DEV_FD_PREFIX, "/proc/self/fd/")
1544fi
1545])
1546
1547AC_DEFUN(BASH_CHECK_DEV_STDIN,
1548[AC_MSG_CHECKING(whether /dev/stdin stdout stderr are available)
1549AC_CACHE_VAL(bash_cv_dev_stdin,
1550[if test -d /dev/fd && test -r /dev/stdin; then
1551   bash_cv_dev_stdin=present
1552 elif test -d /proc/self/fd && test -r /dev/stdin; then
1553   bash_cv_dev_stdin=present
1554 else
1555   bash_cv_dev_stdin=absent
1556 fi
1557])
1558AC_MSG_RESULT($bash_cv_dev_stdin)
1559if test $bash_cv_dev_stdin = "present"; then
1560  AC_DEFINE(HAVE_DEV_STDIN)
1561fi
1562])
1563
1564dnl
1565dnl Check if HPUX needs _KERNEL defined for RLIMIT_* definitions
1566dnl
1567AC_DEFUN(BASH_CHECK_KERNEL_RLIMIT,
1568[AC_MSG_CHECKING([whether $host_os needs _KERNEL for RLIMIT defines])
1569AC_CACHE_VAL(bash_cv_kernel_rlimit,
1570[AC_TRY_COMPILE([
1571#include <sys/types.h>
1572#include <sys/resource.h>
1573],
1574[
1575  int f;
1576  f = RLIMIT_DATA;
1577], bash_cv_kernel_rlimit=no,
1578[AC_TRY_COMPILE([
1579#include <sys/types.h>
1580#define _KERNEL
1581#include <sys/resource.h>
1582#undef _KERNEL
1583],
1584[
1585	int f;
1586        f = RLIMIT_DATA;
1587], bash_cv_kernel_rlimit=yes, bash_cv_kernel_rlimit=no)]
1588)])
1589AC_MSG_RESULT($bash_cv_kernel_rlimit)
1590if test $bash_cv_kernel_rlimit = yes; then
1591AC_DEFINE(RLIMIT_NEEDS_KERNEL)
1592fi
1593])
1594
1595dnl
1596dnl Check for 64-bit off_t -- used for malloc alignment
1597dnl
1598dnl C does not allow duplicate case labels, so the compile will fail if
1599dnl sizeof(off_t) is > 4.
1600dnl
1601AC_DEFUN(BASH_CHECK_OFF_T_64,
1602[AC_CACHE_CHECK(for 64-bit off_t, bash_cv_off_t_64,
1603AC_TRY_COMPILE([
1604#ifdef HAVE_UNISTD_H
1605#include <unistd.h>
1606#endif
1607#include <sys/types.h>
1608],[
1609switch (0) case 0: case (sizeof (off_t) <= 4):;
1610], bash_cv_off_t_64=no, bash_cv_off_t_64=yes))
1611if test $bash_cv_off_t_64 = yes; then
1612        AC_DEFINE(HAVE_OFF_T_64)
1613fi])
1614
1615AC_DEFUN(BASH_CHECK_RTSIGS,
1616[AC_MSG_CHECKING(for unusable real-time signals due to large values)
1617AC_CACHE_VAL(bash_cv_unusable_rtsigs,
1618[AC_TRY_RUN([
1619#include <sys/types.h>
1620#include <signal.h>
1621
1622#ifndef NSIG
1623#  define NSIG 64
1624#endif
1625
1626main ()
1627{
1628  int n_sigs = 2 * NSIG;
1629#ifdef SIGRTMIN
1630  int rtmin = SIGRTMIN;
1631#else
1632  int rtmin = 0;
1633#endif
1634
1635  exit(rtmin < n_sigs);
1636}], bash_cv_unusable_rtsigs=yes, bash_cv_unusable_rtsigs=no,
1637    [AC_MSG_WARN(cannot check real-time signals if cross compiling -- defaulting to yes)
1638     bash_cv_unusable_rtsigs=yes]
1639)])
1640AC_MSG_RESULT($bash_cv_unusable_rtsigs)
1641if test $bash_cv_unusable_rtsigs = yes; then
1642AC_DEFINE(UNUSABLE_RT_SIGNALS)
1643fi
1644])
1645
1646dnl
1647dnl check for availability of multibyte characters and functions
1648dnl
1649AC_DEFUN(BASH_CHECK_MULTIBYTE,
1650[
1651AC_CHECK_HEADERS(wctype.h)
1652AC_CHECK_HEADERS(wchar.h)
1653AC_CHECK_HEADERS(langinfo.h)
1654
1655AC_CHECK_FUNC(mbrtowc, AC_DEFINE(HAVE_MBRTOWC))
1656AC_CHECK_FUNC(mbsrtowcs, AC_DEFINE(HAVE_MBSRTOWCS))
1657AC_CHECK_FUNC(wcwidth, AC_DEFINE(HAVE_WCWIDTH))
1658if test "$ac_cv_func_wcwidth" = no && test "$ac_cv_header_wchar_h" = yes; then
1659  WCWIDTH_OBJ=wcwidth.o
1660else
1661  WCWIDTH_OBJ=
1662fi
1663AC_SUBST(WCWIDTH_OBJ)
1664
1665AC_CACHE_CHECK([for mbstate_t], bash_cv_have_mbstate_t,
1666[AC_TRY_RUN([
1667#include <wchar.h>
1668int
1669main ()
1670{
1671  mbstate_t ps;
1672  return 0;
1673}], bash_cv_have_mbstate_t=yes,  bash_cv_have_mbstate_t=no)])
1674if test $bash_cv_have_mbstate_t = yes; then
1675	AC_DEFINE(HAVE_MBSTATE_T)
1676fi
1677
1678AC_CACHE_CHECK([for nl_langinfo and CODESET], bash_cv_langinfo_codeset,
1679[AC_TRY_LINK(
1680[#include <langinfo.h>],
1681[char* cs = nl_langinfo(CODESET);],
1682bash_cv_langinfo_codeset=yes, bash_cv_langinfo_codeset=no)])
1683if test $bash_cv_langinfo_codeset = yes; then
1684  AC_DEFINE(HAVE_LANGINFO_CODESET)
1685fi
1686
1687])
1688
1689dnl need: prefix exec_prefix libdir includedir CC TERMCAP_LIB
1690dnl require:
1691dnl	AC_PROG_CC
1692dnl	BASH_CHECK_LIB_TERMCAP
1693
1694AC_DEFUN(RL_LIB_READLINE_VERSION,
1695[
1696AC_REQUIRE([BASH_CHECK_LIB_TERMCAP])
1697
1698AC_MSG_CHECKING([version of installed readline library])
1699
1700# What a pain in the ass this is.
1701
1702# save cpp and ld options
1703_save_CFLAGS="$CFLAGS"
1704_save_LDFLAGS="$LDFLAGS"
1705_save_LIBS="$LIBS"
1706
1707# Don't set ac_cv_rl_prefix if the caller has already assigned a value.  This
1708# allows the caller to do something like $_rl_prefix=$withval if the user
1709# specifies --with-installed-readline=PREFIX as an argument to configure
1710
1711if test -z "$ac_cv_rl_prefix"; then
1712test "x$prefix" = xNONE && ac_cv_rl_prefix=$ac_default_prefix || ac_cv_rl_prefix=${prefix}
1713fi
1714
1715eval ac_cv_rl_includedir=${ac_cv_rl_prefix}/include
1716eval ac_cv_rl_libdir=${ac_cv_rl_prefix}/lib
1717
1718LIBS="$LIBS -lreadline ${TERMCAP_LIB}"
1719CFLAGS="$CFLAGS -I${ac_cv_rl_includedir}"
1720LDFLAGS="$LDFLAGS -L${ac_cv_rl_libdir}"
1721
1722AC_TRY_RUN([
1723#include <stdio.h>
1724#include <readline/readline.h>
1725
1726main()
1727{
1728	FILE *fp;
1729	fp = fopen("conftest.rlv", "w");
1730	if (fp == 0) exit(1);
1731	fprintf(fp, "%s\n", rl_library_version ? rl_library_version : "0.0");
1732	fclose(fp);
1733	exit(0);
1734}
1735],
1736ac_cv_rl_version=`cat conftest.rlv`,
1737ac_cv_rl_version='0.0',
1738ac_cv_rl_version='4.2')
1739
1740CFLAGS="$_save_CFLAGS"
1741LDFLAGS="$_save_LDFLAGS"
1742LIBS="$_save_LIBS"
1743
1744RL_MAJOR=0
1745RL_MINOR=0
1746
1747# (
1748case "$ac_cv_rl_version" in
17492*|3*|4*|5*|6*|7*|8*|9*)
1750	RL_MAJOR=`echo $ac_cv_rl_version | sed 's:\..*$::'`
1751	RL_MINOR=`echo $ac_cv_rl_version | sed -e 's:^.*\.::' -e 's:[[a-zA-Z]]*$::'`
1752	;;
1753esac
1754
1755# (((
1756case $RL_MAJOR in
1757[[0-9][0-9]])	_RL_MAJOR=$RL_MAJOR ;;
1758[[0-9]])	_RL_MAJOR=0$RL_MAJOR ;;
1759*)		_RL_MAJOR=00 ;;
1760esac
1761
1762# (((
1763case $RL_MINOR in
1764[[0-9][0-9]])	_RL_MINOR=$RL_MINOR ;;
1765[[0-9]])	_RL_MINOR=0$RL_MINOR ;;
1766*)		_RL_MINOR=00 ;;
1767esac
1768
1769RL_VERSION="0x${_RL_MAJOR}${_RL_MINOR}"
1770
1771# Readline versions greater than 4.2 have these defines in readline.h
1772
1773if test $ac_cv_rl_version = '0.0' ; then
1774	AC_MSG_WARN([Could not test version of installed readline library.])
1775elif test $RL_MAJOR -gt 4 || { test $RL_MAJOR = 4 && test $RL_MINOR -gt 2 ; } ; then
1776	# set these for use by the caller
1777	RL_PREFIX=$ac_cv_rl_prefix
1778	RL_LIBDIR=$ac_cv_rl_libdir
1779	RL_INCLUDEDIR=$ac_cv_rl_includedir
1780	AC_MSG_RESULT($ac_cv_rl_version)
1781else
1782
1783AC_DEFINE_UNQUOTED(RL_READLINE_VERSION, $RL_VERSION, [encoded version of the installed readline library])
1784AC_DEFINE_UNQUOTED(RL_VERSION_MAJOR, $RL_MAJOR, [major version of installed readline library])
1785AC_DEFINE_UNQUOTED(RL_VERSION_MINOR, $RL_MINOR, [minor version of installed readline library])
1786
1787AC_SUBST(RL_VERSION)
1788AC_SUBST(RL_MAJOR)
1789AC_SUBST(RL_MINOR)
1790
1791# set these for use by the caller
1792RL_PREFIX=$ac_cv_rl_prefix
1793RL_LIBDIR=$ac_cv_rl_libdir
1794RL_INCLUDEDIR=$ac_cv_rl_includedir
1795
1796AC_MSG_RESULT($ac_cv_rl_version)
1797
1798fi
1799])
1800