mirror of
https://git.hardenedbsd.org/hardenedbsd/HardenedBSD.git
synced 2024-12-30 15:38:06 +01:00
1097 lines
27 KiB
Plaintext
1097 lines
27 KiB
Plaintext
dnl
|
|
dnl Bash specific tests
|
|
dnl
|
|
dnl Some derived from PDKSH 5.1.3 autoconf tests
|
|
dnl
|
|
dnl
|
|
dnl Check if dup2() does not clear the close on exec flag
|
|
dnl
|
|
AC_DEFUN(BASH_DUP2_CLOEXEC_CHECK,
|
|
[AC_MSG_CHECKING(if dup2 fails to clear the close-on-exec flag)
|
|
AC_CACHE_VAL(bash_cv_dup2_broken,
|
|
[AC_TRY_RUN([
|
|
#include <sys/types.h>
|
|
#include <fcntl.h>
|
|
main()
|
|
{
|
|
int fd1, fd2, fl;
|
|
fd1 = open("/dev/null", 2);
|
|
if (fcntl(fd1, 2, 1) < 0)
|
|
exit(1);
|
|
fd2 = dup2(fd1, 1);
|
|
if (fd2 < 0)
|
|
exit(2);
|
|
fl = fcntl(fd2, 1, 0);
|
|
/* fl will be 1 if dup2 did not reset the close-on-exec flag. */
|
|
exit(fl != 1);
|
|
}
|
|
], bash_cv_dup2_broken=yes, bash_cv_dup2_broken=no,
|
|
AC_MSG_ERROR(cannot check dup2 if cross compiling))
|
|
])
|
|
AC_MSG_RESULT($bash_cv_dup2_broken)
|
|
if test $bash_cv_dup2_broken = yes; then
|
|
AC_DEFINE(DUP2_BROKEN)
|
|
fi
|
|
])
|
|
|
|
dnl Check type of signal routines (posix, 4.2bsd, 4.1bsd or v7)
|
|
AC_DEFUN(BASH_SIGNAL_CHECK,
|
|
[AC_REQUIRE([AC_TYPE_SIGNAL])
|
|
AC_MSG_CHECKING(for type of signal functions)
|
|
AC_CACHE_VAL(bash_cv_signal_vintage,
|
|
[
|
|
AC_TRY_LINK([#include <signal.h>],[
|
|
sigset_t ss;
|
|
struct sigaction sa;
|
|
sigemptyset(&ss); sigsuspend(&ss);
|
|
sigaction(SIGINT, &sa, (struct sigaction *) 0);
|
|
sigprocmask(SIG_BLOCK, &ss, (sigset_t *) 0);
|
|
], bash_cv_signal_vintage=posix,
|
|
[
|
|
AC_TRY_LINK([#include <signal.h>], [
|
|
int mask = sigmask(SIGINT);
|
|
sigsetmask(mask); sigblock(mask); sigpause(mask);
|
|
], bash_cv_signal_vintage=4.2bsd,
|
|
[
|
|
AC_TRY_LINK([
|
|
#include <signal.h>
|
|
RETSIGTYPE foo() { }], [
|
|
int mask = sigmask(SIGINT);
|
|
sigset(SIGINT, foo); sigrelse(SIGINT);
|
|
sighold(SIGINT); sigpause(SIGINT);
|
|
], bash_cv_signal_vintage=svr3, bash_cv_signal_vintage=v7
|
|
)]
|
|
)]
|
|
)
|
|
])
|
|
AC_MSG_RESULT($bash_cv_signal_vintage)
|
|
if test "$bash_cv_signal_vintage" = posix; then
|
|
AC_DEFINE(HAVE_POSIX_SIGNALS)
|
|
elif test "$bash_cv_signal_vintage" = "4.2bsd"; then
|
|
AC_DEFINE(HAVE_BSD_SIGNALS)
|
|
elif test "$bash_cv_signal_vintage" = svr3; then
|
|
AC_DEFINE(HAVE_USG_SIGHOLD)
|
|
fi
|
|
])
|
|
|
|
dnl Check if the pgrp of setpgrp() can't be the pid of a zombie process.
|
|
AC_DEFUN(BASH_PGRP_SYNC,
|
|
[AC_REQUIRE([AC_FUNC_GETPGRP])
|
|
AC_MSG_CHECKING(whether pgrps need synchronization)
|
|
AC_CACHE_VAL(bash_cv_pgrp_pipe,
|
|
[AC_TRY_RUN([
|
|
#ifdef HAVE_UNISTD_H
|
|
# include <unistd.h>
|
|
#endif
|
|
main()
|
|
{
|
|
# ifdef GETPGRP_VOID
|
|
# define getpgID() getpgrp()
|
|
# else
|
|
# define getpgID() getpgrp(0)
|
|
# define setpgid(x,y) setpgrp(x,y)
|
|
# endif
|
|
int pid1, pid2, fds[2];
|
|
int status;
|
|
char ok;
|
|
|
|
switch (pid1 = fork()) {
|
|
case -1:
|
|
exit(1);
|
|
case 0:
|
|
setpgid(0, getpid());
|
|
exit(0);
|
|
}
|
|
setpgid(pid1, pid1);
|
|
|
|
sleep(2); /* let first child die */
|
|
|
|
if (pipe(fds) < 0)
|
|
exit(2);
|
|
|
|
switch (pid2 = fork()) {
|
|
case -1:
|
|
exit(3);
|
|
case 0:
|
|
setpgid(0, pid1);
|
|
ok = getpgID() == pid1;
|
|
write(fds[1], &ok, 1);
|
|
exit(0);
|
|
}
|
|
setpgid(pid2, pid1);
|
|
|
|
close(fds[1]);
|
|
if (read(fds[0], &ok, 1) != 1)
|
|
exit(4);
|
|
wait(&status);
|
|
wait(&status);
|
|
exit(ok ? 0 : 5);
|
|
}
|
|
], bash_cv_pgrp_pipe=no,bash_cv_pgrp_pipe=yes,
|
|
AC_MSG_ERROR(cannot check pgrp synchronization if cross compiling))
|
|
])
|
|
AC_MSG_RESULT($bash_cv_pgrp_pipe)
|
|
if test $bash_cv_pgrp_pipe = yes; then
|
|
AC_DEFINE(PGRP_PIPE)
|
|
fi
|
|
])
|
|
|
|
dnl
|
|
dnl check for typedef'd symbols in header files, but allow the caller to
|
|
dnl specify the include files to be checked in addition to the default
|
|
dnl
|
|
dnl BASH_CHECK_TYPE(TYPE, HEADERS, DEFAULT[, VALUE-IF-FOUND])
|
|
AC_DEFUN(BASH_CHECK_TYPE,
|
|
[AC_REQUIRE([AC_HEADER_STDC])dnl
|
|
AC_MSG_CHECKING(for $1)
|
|
AC_CACHE_VAL(bash_cv_type_$1,
|
|
[AC_EGREP_CPP($1, [#include <sys/types.h>
|
|
#if STDC_HEADERS
|
|
#include <stdlib.h>
|
|
#endif
|
|
$2
|
|
], bash_cv_type_$1=yes, bash_cv_type_$1=no)])
|
|
AC_MSG_RESULT($bash_cv_type_$1)
|
|
ifelse($#, 4, [if test $bash_cv_type_$1 = yes; then
|
|
AC_DEFINE($4)
|
|
fi])
|
|
if test $bash_cv_type_$1 = no; then
|
|
AC_DEFINE($1, $3)
|
|
fi
|
|
])
|
|
|
|
dnl
|
|
dnl Type of struct rlimit fields: some systems (OSF/1, NetBSD, RISC/os 5.0)
|
|
dnl have a rlim_t, others (4.4BSD based systems) use quad_t, others use
|
|
dnl long and still others use int (HP-UX 9.01, SunOS 4.1.3). To simplify
|
|
dnl matters, this just checks for rlim_t, quad_t, or long.
|
|
dnl
|
|
AC_DEFUN(BASH_RLIMIT_TYPE,
|
|
[AC_MSG_CHECKING(for size and type of struct rlimit fields)
|
|
AC_CACHE_VAL(bash_cv_type_rlimit,
|
|
[AC_TRY_COMPILE([#include <sys/types.h>],
|
|
[rlim_t xxx;], bash_cv_type_rlimit=rlim_t,[
|
|
AC_TRY_RUN([
|
|
#include <sys/types.h>
|
|
#include <sys/time.h>
|
|
#include <sys/resource.h>
|
|
main()
|
|
{
|
|
#ifdef HAVE_QUAD_T
|
|
struct rlimit rl;
|
|
if (sizeof(rl.rlim_cur) == sizeof(quad_t))
|
|
exit(0);
|
|
#endif
|
|
exit(1);
|
|
}], bash_cv_type_rlimit=quad_t, bash_cv_type_rlimit=long,
|
|
AC_MSG_ERROR(cannot check quad_t if cross compiling))])
|
|
])
|
|
AC_MSG_RESULT($bash_cv_type_rlimit)
|
|
if test $bash_cv_type_rlimit = quad_t; then
|
|
AC_DEFINE(RLIMTYPE, quad_t)
|
|
elif test $bash_cv_type_rlimit = rlim_t; then
|
|
AC_DEFINE(RLIMTYPE, rlim_t)
|
|
fi
|
|
])
|
|
|
|
dnl
|
|
dnl Check for sys_siglist[] or _sys_siglist[]
|
|
dnl
|
|
AC_DEFUN(BASH_UNDER_SYS_SIGLIST,
|
|
[AC_MSG_CHECKING([for _sys_siglist in system C library])
|
|
AC_CACHE_VAL(bash_cv_under_sys_siglist,
|
|
[AC_TRY_RUN([
|
|
#include <sys/types.h>
|
|
#include <signal.h>
|
|
#ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
#endif
|
|
#ifndef _sys_siglist
|
|
extern char *_sys_siglist[];
|
|
#endif
|
|
main()
|
|
{
|
|
char *msg = _sys_siglist[2];
|
|
exit(msg == 0);
|
|
}],
|
|
bash_cv_under_sys_siglist=yes, bash_cv_under_sys_siglist=no,
|
|
AC_MSG_ERROR(cannot check for _sys_siglist[] if cross compiling))])dnl
|
|
AC_MSG_RESULT($bash_cv_under_sys_siglist)
|
|
if test $bash_cv_under_sys_siglist = yes; then
|
|
AC_DEFINE(HAVE_UNDER_SYS_SIGLIST)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_SYS_SIGLIST,
|
|
[AC_REQUIRE([AC_DECL_SYS_SIGLIST])
|
|
AC_MSG_CHECKING([for sys_siglist in system C library])
|
|
AC_CACHE_VAL(bash_cv_sys_siglist,
|
|
[AC_TRY_RUN([
|
|
#include <sys/types.h>
|
|
#include <signal.h>
|
|
#ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
#endif
|
|
#ifndef SYS_SIGLIST_DECLARED
|
|
extern char *sys_siglist[];
|
|
#endif
|
|
main()
|
|
{
|
|
char *msg = sys_siglist[2];
|
|
exit(msg == 0);
|
|
}],
|
|
bash_cv_sys_siglist=yes, bash_cv_sys_siglist=no,
|
|
AC_MSG_ERROR(cannot check for sys_siglist if cross compiling))])dnl
|
|
AC_MSG_RESULT($bash_cv_sys_siglist)
|
|
if test $bash_cv_sys_siglist = yes; then
|
|
AC_DEFINE(HAVE_SYS_SIGLIST)
|
|
fi
|
|
])
|
|
|
|
dnl Check for sys_errlist[] and sys_nerr, check for declaration
|
|
AC_DEFUN(BASH_SYS_ERRLIST,
|
|
[AC_MSG_CHECKING([for sys_errlist and sys_nerr])
|
|
AC_CACHE_VAL(bash_cv_sys_errlist,
|
|
[AC_TRY_LINK([#include <errno.h>],
|
|
[extern char *sys_errlist[];
|
|
extern int sys_nerr;
|
|
char *msg = sys_errlist[sys_nerr - 1];],
|
|
bash_cv_sys_errlist=yes, bash_cv_sys_errlist=no)])dnl
|
|
AC_MSG_RESULT($bash_cv_sys_errlist)
|
|
if test $bash_cv_sys_errlist = yes; then
|
|
AC_DEFINE(HAVE_SYS_ERRLIST)
|
|
fi
|
|
])
|
|
|
|
dnl Check to see if opendir will open non-directories (not a nice thing)
|
|
AC_DEFUN(BASH_FUNC_OPENDIR_CHECK,
|
|
[AC_REQUIRE([AC_HEADER_DIRENT])dnl
|
|
AC_MSG_CHECKING(if opendir() opens non-directories)
|
|
AC_CACHE_VAL(bash_cv_opendir_not_robust,
|
|
[AC_TRY_RUN([
|
|
#include <stdio.h>
|
|
#include <sys/types.h>
|
|
#include <fcntl.h>
|
|
#ifdef HAVE_UNISTD_H
|
|
# include <unistd.h>
|
|
#endif /* HAVE_UNISTD_H */
|
|
#if defined(HAVE_DIRENT_H)
|
|
# include <dirent.h>
|
|
#else
|
|
# define dirent direct
|
|
# ifdef HAVE_SYS_NDIR_H
|
|
# include <sys/ndir.h>
|
|
# endif /* SYSNDIR */
|
|
# ifdef HAVE_SYS_DIR_H
|
|
# include <sys/dir.h>
|
|
# endif /* SYSDIR */
|
|
# ifdef HAVE_NDIR_H
|
|
# include <ndir.h>
|
|
# endif
|
|
#endif /* HAVE_DIRENT_H */
|
|
main()
|
|
{
|
|
DIR *dir;
|
|
int fd;
|
|
unlink("/tmp/not_a_directory");
|
|
fd = open("/tmp/not_a_directory", O_WRONLY|O_CREAT, 0666);
|
|
write(fd, "\n", 1);
|
|
close(fd);
|
|
dir = opendir("/tmp/not_a_directory");
|
|
unlink("/tmp/not_a_directory");
|
|
exit (dir == 0);
|
|
}], bash_cv_opendir_not_robust=yes,bash_cv_opendir_not_robust=no,
|
|
AC_MSG_ERROR(cannot check opendir if cross compiling))])
|
|
AC_MSG_RESULT($bash_cv_opendir_not_robust)
|
|
if test $bash_cv_opendir_not_robust = yes; then
|
|
AC_DEFINE(OPENDIR_NOT_ROBUST)
|
|
fi
|
|
])
|
|
|
|
dnl
|
|
AC_DEFUN(BASH_TYPE_SIGHANDLER,
|
|
[AC_MSG_CHECKING([whether signal handlers are of type void])
|
|
AC_CACHE_VAL(bash_cv_void_sighandler,
|
|
[AC_TRY_COMPILE([#include <sys/types.h>
|
|
#include <signal.h>
|
|
#ifdef signal
|
|
#undef signal
|
|
#endif
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
#endif
|
|
void (*signal ()) ();],
|
|
[int i;], bash_cv_void_sighandler=yes, bash_cv_void_sighandler=no)])dnl
|
|
AC_MSG_RESULT($bash_cv_void_sighandler)
|
|
if test $bash_cv_void_sighandler = yes; then
|
|
AC_DEFINE(VOID_SIGHANDLER)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_FUNC_STRSIGNAL,
|
|
[AC_MSG_CHECKING([for the existance of strsignal])
|
|
AC_CACHE_VAL(bash_cv_have_strsignal,
|
|
[AC_TRY_LINK([#include <sys/types.h>
|
|
#include <signal.h>],
|
|
[char *s = (char *)strsignal(2);],
|
|
bash_cv_have_strsignal=yes, bash_cv_have_strsignal=no)])
|
|
AC_MSG_RESULT($bash_cv_have_strsignal)
|
|
if test $bash_cv_have_strsignal = yes; then
|
|
AC_DEFINE(HAVE_STRSIGNAL)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_FUNC_LSTAT,
|
|
[dnl Cannot use AC_CHECK_FUNCS(lstat) because Linux defines lstat() as an
|
|
dnl inline function in <sys/stat.h>.
|
|
AC_CACHE_CHECK([for lstat], bash_cv_func_lstat,
|
|
[AC_TRY_LINK([
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
],[ lstat("",(struct stat *)0); ],
|
|
bash_cv_func_lstat=yes, bash_cv_func_lstat=no)])
|
|
if test $bash_cv_func_lstat = yes; then
|
|
AC_DEFINE(HAVE_LSTAT)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_STRUCT_TERMIOS_LDISC,
|
|
[AC_MSG_CHECKING([for a c_line member of struct termios])
|
|
AC_CACHE_VAL(bash_cv_termios_ldisc,
|
|
[AC_TRY_COMPILE([#include <sys/types.h>
|
|
#include <termios.h>],[struct termios t; int i; i = t.c_line;],
|
|
bash_cv_termios_ldisc=yes, bash_cv_termios_ldisc=no)])dnl
|
|
AC_MSG_RESULT($bash_cv_termios_ldisc)
|
|
if test $bash_cv_termios_ldisc = yes; then
|
|
AC_DEFINE(TERMIOS_LDISC)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_STRUCT_TERMIO_LDISC,
|
|
[AC_MSG_CHECKING([for a c_line member of struct termio])
|
|
AC_CACHE_VAL(bash_cv_termio_ldisc,
|
|
[AC_TRY_COMPILE([#include <sys/types.h>
|
|
#include <termio.h>],[struct termio t; int i; i = t.c_line;],
|
|
bash_cv_termio_ldisc=yes, bash_cv_termio_ldisc=no)])dnl
|
|
AC_MSG_RESULT($bash_cv_termio_ldisc)
|
|
if test $bash_cv_termio_ldisc = yes; then
|
|
AC_DEFINE(TERMIO_LDISC)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_FUNC_GETENV,
|
|
[AC_MSG_CHECKING(to see if getenv can be redefined)
|
|
AC_CACHE_VAL(bash_cv_getenv_redef,
|
|
[AC_TRY_RUN([
|
|
#ifdef HAVE_UNISTD_H
|
|
# include <unistd.h>
|
|
#endif
|
|
#ifndef __STDC__
|
|
# ifndef const
|
|
# define const
|
|
# endif
|
|
#endif
|
|
char *
|
|
getenv (name)
|
|
#if defined (__linux__) || defined (__bsdi__) || defined (convex)
|
|
const char *name;
|
|
#else
|
|
char const *name;
|
|
#endif /* !__linux__ && !__bsdi__ && !convex */
|
|
{
|
|
return "42";
|
|
}
|
|
main()
|
|
{
|
|
char *s;
|
|
/* The next allows this program to run, but does not allow bash to link
|
|
when it redefines getenv. I'm not really interested in figuring out
|
|
why not. */
|
|
#if defined (NeXT)
|
|
exit(1);
|
|
#endif
|
|
s = getenv("ABCDE");
|
|
exit(s == 0); /* force optimizer to leave getenv in */
|
|
}
|
|
], bash_cv_getenv_redef=yes, bash_cv_getenv_redef=no,
|
|
AC_MSG_ERROR(cannot check getenv redefinition if cross compiling))])
|
|
AC_MSG_RESULT($bash_cv_getenv_redef)
|
|
if test $bash_cv_getenv_redef = yes; then
|
|
AC_DEFINE(CAN_REDEFINE_GETENV)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_FUNC_PRINTF,
|
|
[AC_MSG_CHECKING(for declaration of printf in <stdio.h>)
|
|
AC_CACHE_VAL(bash_cv_printf_declared,
|
|
[AC_TRY_RUN([
|
|
#include <stdio.h>
|
|
#ifdef __STDC__
|
|
typedef int (*_bashfunc)(const char *, ...);
|
|
#else
|
|
typedef int (*_bashfunc)();
|
|
#endif
|
|
main()
|
|
{
|
|
_bashfunc pf;
|
|
pf = printf;
|
|
exit(pf == 0);
|
|
}
|
|
],bash_cv_printf_declared=yes, bash_cv_printf_declared=no,
|
|
AC_MSG_ERROR(cannot check printf declaration if cross compiling))])
|
|
AC_MSG_RESULT($bash_cv_printf_declared)
|
|
if test $bash_cv_printf_declared = yes; then
|
|
AC_DEFINE(PRINTF_DECLARED)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_FUNC_ULIMIT_MAXFDS,
|
|
[AC_MSG_CHECKING(whether ulimit can substitute for getdtablesize)
|
|
AC_CACHE_VAL(bash_cv_ulimit_maxfds,
|
|
[AC_TRY_RUN([
|
|
main()
|
|
{
|
|
long maxfds = ulimit(4, 0L);
|
|
exit (maxfds == -1L);
|
|
}
|
|
],bash_cv_ulimit_maxfds=yes, bash_cv_ulimit_maxfds=no,
|
|
AC_MSG_ERROR(cannot check ulimit if cross compiling))])
|
|
AC_MSG_RESULT($bash_cv_ulimit_maxfds)
|
|
if test $bash_cv_ulimit_maxfds = yes; then
|
|
AC_DEFINE(ULIMIT_MAXFDS)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_CHECK_LIB_TERMCAP,
|
|
[
|
|
if test "X$bash_cv_termcap_lib" = "X"; then
|
|
_bash_needmsg=yes
|
|
else
|
|
AC_MSG_CHECKING(which library has the termcap functions)
|
|
_bash_needmsg=
|
|
fi
|
|
AC_CACHE_VAL(bash_cv_termcap_lib,
|
|
[AC_CHECK_LIB(termcap, tgetent, bash_cv_termcap_lib=libtermcap,
|
|
[AC_CHECK_LIB(curses, tgetent, bash_cv_termcap_lib=libcurses,
|
|
[AC_CHECK_LIB(ncurses, tgetent, bash_cv_termcap_lib=libncurses,
|
|
bash_cv_termcap_lib=gnutermcap)])])])
|
|
if test "X$_bash_needmsg" = "Xyes"; then
|
|
AC_MSG_CHECKING(which library has the termcap functions)
|
|
fi
|
|
AC_MSG_RESULT(using $bash_cv_termcap_lib)
|
|
if test $bash_cv_termcap_lib = gnutermcap; then
|
|
LDFLAGS="$LDFLAGS -L./lib/termcap"
|
|
TERMCAP_LIB="./lib/termcap/libtermcap.a"
|
|
TERMCAP_DEP="./lib/termcap/libtermcap.a"
|
|
elif test $bash_cv_termcap_lib = libtermcap && test -z "$prefer_curses"; then
|
|
TERMCAP_LIB=-ltermcap
|
|
TERMCAP_DEP=
|
|
elif test $bash_cv_termcap_lib = libncurses; then
|
|
TERMCAP_LIB=-lncurses
|
|
TERMCAP_DEP=
|
|
else
|
|
TERMCAP_LIB=-lcurses
|
|
TERMCAP_DEP=
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_FUNC_GETCWD,
|
|
[AC_MSG_CHECKING([if getcwd() calls popen()])
|
|
AC_CACHE_VAL(bash_cv_getcwd_calls_popen,
|
|
[AC_TRY_RUN([
|
|
#include <stdio.h>
|
|
#ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
#ifndef __STDC__
|
|
#ifndef const
|
|
#define const
|
|
#endif
|
|
#endif
|
|
|
|
int popen_called;
|
|
|
|
FILE *
|
|
popen(command, type)
|
|
const char *command;
|
|
const char *type;
|
|
{
|
|
popen_called = 1;
|
|
return (FILE *)NULL;
|
|
}
|
|
|
|
FILE *_popen(command, type)
|
|
const char *command;
|
|
const char *type;
|
|
{
|
|
return (popen (command, type));
|
|
}
|
|
|
|
int
|
|
pclose(stream)
|
|
FILE *stream;
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
_pclose(stream)
|
|
FILE *stream;
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
main()
|
|
{
|
|
char lbuf[32];
|
|
popen_called = 0;
|
|
getcwd(lbuf, 32);
|
|
exit (popen_called);
|
|
}
|
|
], bash_cv_getcwd_calls_popen=no, bash_cv_getcwd_calls_popen=yes,
|
|
AC_MSG_ERROR(cannot check whether getcwd calls popen if cross compiling))])
|
|
AC_MSG_RESULT($bash_cv_getcwd_calls_popen)
|
|
if test $bash_cv_getcwd_calls_popen = yes; then
|
|
AC_DEFINE(GETCWD_BROKEN)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_STRUCT_DIRENT_D_INO,
|
|
[AC_REQUIRE([AC_HEADER_DIRENT])
|
|
AC_MSG_CHECKING(if struct dirent has a d_ino member)
|
|
AC_CACHE_VAL(bash_cv_dirent_has_dino,
|
|
[AC_TRY_COMPILE([
|
|
#include <stdio.h>
|
|
#include <sys/types.h>
|
|
#ifdef HAVE_UNISTD_H
|
|
# include <unistd.h>
|
|
#endif /* HAVE_UNISTD_H */
|
|
#if defined(HAVE_DIRENT_H)
|
|
# include <dirent.h>
|
|
#else
|
|
# define dirent direct
|
|
# ifdef HAVE_SYS_NDIR_H
|
|
# include <sys/ndir.h>
|
|
# endif /* SYSNDIR */
|
|
# ifdef HAVE_SYS_DIR_H
|
|
# include <sys/dir.h>
|
|
# endif /* SYSDIR */
|
|
# ifdef HAVE_NDIR_H
|
|
# include <ndir.h>
|
|
# endif
|
|
#endif /* HAVE_DIRENT_H */
|
|
],[
|
|
struct dirent d; int z; z = d.d_ino;
|
|
], bash_cv_dirent_has_dino=yes, bash_cv_dirent_has_dino=no)])
|
|
AC_MSG_RESULT($bash_cv_dirent_has_dino)
|
|
if test $bash_cv_dirent_has_dino = yes; then
|
|
AC_DEFINE(STRUCT_DIRENT_HAS_D_INO)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_STRUCT_DIRENT_D_FILENO,
|
|
[AC_REQUIRE([AC_HEADER_DIRENT])
|
|
AC_MSG_CHECKING(if struct dirent has a d_fileno member)
|
|
AC_CACHE_VAL(bash_cv_dirent_has_d_fileno,
|
|
[AC_TRY_COMPILE([
|
|
#include <stdio.h>
|
|
#include <sys/types.h>
|
|
#ifdef HAVE_UNISTD_H
|
|
# include <unistd.h>
|
|
#endif /* HAVE_UNISTD_H */
|
|
#if defined(HAVE_DIRENT_H)
|
|
# include <dirent.h>
|
|
#else
|
|
# define dirent direct
|
|
# ifdef HAVE_SYS_NDIR_H
|
|
# include <sys/ndir.h>
|
|
# endif /* SYSNDIR */
|
|
# ifdef HAVE_SYS_DIR_H
|
|
# include <sys/dir.h>
|
|
# endif /* SYSDIR */
|
|
# ifdef HAVE_NDIR_H
|
|
# include <ndir.h>
|
|
# endif
|
|
#endif /* HAVE_DIRENT_H */
|
|
],[
|
|
struct dirent d; int z; z = d.d_fileno;
|
|
], bash_cv_dirent_has_d_fileno=yes, bash_cv_dirent_has_d_fileno=no)])
|
|
AC_MSG_RESULT($bash_cv_dirent_has_d_fileno)
|
|
if test $bash_cv_dirent_has_d_fileno = yes; then
|
|
AC_DEFINE(STRUCT_DIRENT_HAS_D_FILENO)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_REINSTALL_SIGHANDLERS,
|
|
[AC_REQUIRE([AC_TYPE_SIGNAL])
|
|
AC_REQUIRE([BASH_SIGNAL_CHECK])
|
|
AC_MSG_CHECKING([if signal handlers must be reinstalled when invoked])
|
|
AC_CACHE_VAL(bash_cv_must_reinstall_sighandlers,
|
|
[AC_TRY_RUN([
|
|
#include <signal.h>
|
|
#ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
typedef RETSIGTYPE sigfunc();
|
|
|
|
int nsigint;
|
|
|
|
#ifdef HAVE_POSIX_SIGNALS
|
|
sigfunc *
|
|
set_signal_handler(sig, handler)
|
|
int sig;
|
|
sigfunc *handler;
|
|
{
|
|
struct sigaction act, oact;
|
|
act.sa_handler = handler;
|
|
act.sa_flags = 0;
|
|
sigemptyset (&act.sa_mask);
|
|
sigemptyset (&oact.sa_mask);
|
|
sigaction (sig, &act, &oact);
|
|
return (oact.sa_handler);
|
|
}
|
|
#else
|
|
#define set_signal_handler(s, h) signal(s, h)
|
|
#endif
|
|
|
|
RETSIGTYPE
|
|
sigint(s)
|
|
int s;
|
|
{
|
|
nsigint++;
|
|
}
|
|
|
|
main()
|
|
{
|
|
nsigint = 0;
|
|
set_signal_handler(SIGINT, sigint);
|
|
kill((int)getpid(), SIGINT);
|
|
kill((int)getpid(), SIGINT);
|
|
exit(nsigint != 2);
|
|
}
|
|
], bash_cv_must_reinstall_sighandlers=no, bash_cv_must_reinstall_sighandlers=yes,
|
|
AC_MSG_ERROR(cannot check signal handling if cross compiling))])
|
|
AC_MSG_RESULT($bash_cv_must_reinstall_sighandlers)
|
|
if test $bash_cv_must_reinstall_sighandlers = yes; then
|
|
AC_DEFINE(MUST_REINSTALL_SIGHANDLERS)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_FUNC_SBRK_DECLARED,
|
|
[AC_MSG_CHECKING(for declaration of sbrk in <unistd.h>)
|
|
AC_CACHE_VAL(bash_cv_sbrk_declared,
|
|
[AC_EGREP_HEADER(sbrk, unistd.h,
|
|
bash_cv_sbrk_declared=yes, bash_cv_sbrk_declared=no)])
|
|
AC_MSG_RESULT($bash_cv_sbrk_declared)
|
|
if test $bash_cv_sbrk_declared = yes; then
|
|
AC_DEFINE(SBRK_DECLARED)
|
|
fi
|
|
])
|
|
|
|
dnl check that some necessary job control definitions are present
|
|
AC_DEFUN(BASH_JOB_CONTROL_MISSING,
|
|
[AC_REQUIRE([BASH_SIGNAL_CHECK])
|
|
AC_MSG_CHECKING(for presence of necessary job control definitions)
|
|
AC_CACHE_VAL(bash_cv_job_control_missing,
|
|
[AC_TRY_RUN([
|
|
#include <sys/types.h>
|
|
#ifdef HAVE_SYS_WAIT_H
|
|
#include <sys/wait.h>
|
|
#endif
|
|
#ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
#endif
|
|
#include <signal.h>
|
|
|
|
/* Add more tests in here as appropriate. */
|
|
main()
|
|
{
|
|
/* signal type */
|
|
#if !defined (HAVE_POSIX_SIGNALS) && !defined (HAVE_BSD_SIGNALS)
|
|
exit(1);
|
|
#endif
|
|
|
|
/* signals and tty control. */
|
|
#if !defined (SIGTSTP) || !defined (SIGSTOP) || !defined (SIGCONT)
|
|
exit (1);
|
|
#endif
|
|
|
|
/* process control */
|
|
#if !defined (WNOHANG) || !defined (WUNTRACED)
|
|
exit(1);
|
|
#endif
|
|
|
|
/* Posix systems have tcgetpgrp and waitpid. */
|
|
#if defined (_POSIX_VERSION) && !defined (HAVE_TCGETPGRP)
|
|
exit(1);
|
|
#endif
|
|
|
|
#if defined (_POSIX_VERSION) && !defined (HAVE_WAITPID)
|
|
exit(1);
|
|
#endif
|
|
|
|
/* Other systems have TIOCSPGRP/TIOCGPRGP and wait3. */
|
|
#if !defined (_POSIX_VERSION) && !defined (HAVE_WAIT3)
|
|
exit(1);
|
|
#endif
|
|
|
|
exit(0);
|
|
}],bash_cv_job_control_missing=present, bash_cv_job_control_missing=missing,
|
|
AC_MSG_ERROR(cannot check job control if cross-compiling))
|
|
])
|
|
AC_MSG_RESULT($bash_cv_job_control_missing)
|
|
if test $bash_cv_job_control_missing = missing; then
|
|
AC_DEFINE(JOB_CONTROL_MISSING)
|
|
fi
|
|
])
|
|
|
|
dnl check whether named pipes are present
|
|
dnl this requires a previous check for mkfifo, but that is awkward to specify
|
|
AC_DEFUN(BASH_SYS_NAMED_PIPES,
|
|
[AC_MSG_CHECKING(for presence of named pipes)
|
|
AC_CACHE_VAL(bash_cv_sys_named_pipes,
|
|
[AC_TRY_RUN([
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
/* Add more tests in here as appropriate. */
|
|
main()
|
|
{
|
|
int fd;
|
|
|
|
#if defined (HAVE_MKFIFO)
|
|
exit (0);
|
|
#endif
|
|
|
|
#if !defined (S_IFIFO) && (defined (_POSIX_VERSION) && !defined (S_ISFIFO))
|
|
exit (1);
|
|
#endif
|
|
|
|
#if defined (NeXT)
|
|
exit (1);
|
|
#endif
|
|
|
|
fd = mknod ("/tmp/sh-np-autoconf", 0666 | S_IFIFO, 0);
|
|
if (fd == -1)
|
|
exit (1);
|
|
close(fd);
|
|
unlink ("/tmp/sh-np-autoconf");
|
|
exit(0);
|
|
}],bash_cv_sys_named_pipes=present, bash_cv_sys_named_pipes=missing,
|
|
AC_MSG_ERROR(cannot check for named pipes if cross-compiling))
|
|
])
|
|
AC_MSG_RESULT($bash_cv_sys_named_pipes)
|
|
if test $bash_cv_sys_named_pipes = missing; then
|
|
AC_DEFINE(NAMED_PIPES_MISSING)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_FUNC_POSIX_SETJMP,
|
|
[AC_REQUIRE([BASH_SIGNAL_CHECK])
|
|
AC_MSG_CHECKING(for presence of POSIX-style sigsetjmp/siglongjmp)
|
|
AC_CACHE_VAL(bash_cv_func_sigsetjmp,
|
|
[AC_TRY_RUN([
|
|
#ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
#endif
|
|
#include <sys/types.h>
|
|
#include <signal.h>
|
|
#include <setjmp.h>
|
|
|
|
main()
|
|
{
|
|
#if !defined (_POSIX_VERSION) || !defined (HAVE_POSIX_SIGNALS)
|
|
exit (1);
|
|
#else
|
|
|
|
int code;
|
|
sigset_t set, oset;
|
|
sigjmp_buf xx;
|
|
|
|
/* get the mask */
|
|
sigemptyset(&set);
|
|
sigemptyset(&oset);
|
|
sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &set);
|
|
sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &oset);
|
|
|
|
/* save it */
|
|
code = sigsetjmp(xx, 1);
|
|
if (code)
|
|
exit(0); /* could get sigmask and compare to oset here. */
|
|
|
|
/* change it */
|
|
sigaddset(&set, SIGINT);
|
|
sigprocmask(SIG_BLOCK, &set, (sigset_t *)NULL);
|
|
|
|
/* and siglongjmp */
|
|
siglongjmp(xx, 10);
|
|
exit(1);
|
|
#endif
|
|
}],bash_cv_func_sigsetjmp=present, bash_cv_func_sigsetjmp=missing,
|
|
AC_MSG_ERROR(cannot check for sigsetjmp/siglongjmp if cross-compiling))
|
|
])
|
|
AC_MSG_RESULT($bash_cv_func_sigsetjmp)
|
|
if test $bash_cv_func_sigsetjmp = present; then
|
|
AC_DEFINE(HAVE_POSIX_SIGSETJMP)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_HAVE_TIOCGWINSZ,
|
|
[AC_MSG_CHECKING(for TIOCGWINSZ in sys/ioctl.h)
|
|
AC_CACHE_VAL(bash_cv_tiocgwinsz_in_ioctl,
|
|
[AC_TRY_COMPILE([#include <sys/types.h>
|
|
#include <sys/ioctl.h>], [int x = TIOCGWINSZ;],
|
|
bash_cv_tiocgwinsz_in_ioctl=yes,bash_cv_tiocgwinsz_in_ioctl=no)])
|
|
AC_MSG_RESULT($bash_cv_tiocgwinsz_in_ioctl)
|
|
if test $bash_cv_tiocgwinsz_in_ioctl = yes; then
|
|
AC_DEFINE(GWINSZ_IN_SYS_IOCTL)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_STRUCT_WINSIZE,
|
|
[AC_MSG_CHECKING(for struct winsize in sys/ioctl.h)
|
|
AC_CACHE_VAL(bash_cv_struct_winsize_in_ioctl,
|
|
[AC_TRY_COMPILE([#include <sys/types.h>
|
|
#include <sys/ioctl.h>], [struct winsize x;],
|
|
bash_cv_struct_winsize_in_ioctl=yes,bash_cv_struct_winsize_in_ioctl=no)])
|
|
AC_MSG_RESULT($bash_cv_struct_winsize_in_ioctl)
|
|
if test $bash_cv_struct_winsize_in_ioctl = yes; then
|
|
AC_DEFINE(STRUCT_WINSIZE_IN_SYS_IOCTL)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_HAVE_TIOCSTAT,
|
|
[AC_MSG_CHECKING(for TIOCSTAT in sys/ioctl.h)
|
|
AC_CACHE_VAL(bash_cv_tiocstat_in_ioctl,
|
|
[AC_TRY_COMPILE([#include <sys/types.h>
|
|
#include <sys/ioctl.h>], [int x = TIOCSTAT;],
|
|
bash_cv_tiocstat_in_ioctl=yes,bash_cv_tiocstat_in_ioctl=no)])
|
|
AC_MSG_RESULT($bash_cv_tiocstat_in_ioctl)
|
|
if test $bash_cv_tiocstat_in_ioctl = yes; then
|
|
AC_DEFINE(TIOCSTAT_IN_SYS_IOCTL)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_HAVE_FIONREAD,
|
|
[AC_MSG_CHECKING(for FIONREAD in sys/ioctl.h)
|
|
AC_CACHE_VAL(bash_cv_fionread_in_ioctl,
|
|
[AC_TRY_COMPILE([#include <sys/types.h>
|
|
#include <sys/ioctl.h>], [int x = FIONREAD;],
|
|
bash_cv_fionread_in_ioctl=yes,bash_cv_fionread_in_ioctl=no)])
|
|
AC_MSG_RESULT($bash_cv_fionread_in_ioctl)
|
|
if test $bash_cv_fionread_in_ioctl = yes; then
|
|
AC_DEFINE(FIONREAD_IN_SYS_IOCTL)
|
|
fi
|
|
])
|
|
|
|
dnl
|
|
dnl See if speed_t is declared in <sys/types.h>. Some versions of linux
|
|
dnl require a definition of speed_t each time <termcap.h> is included,
|
|
dnl but you can only get speed_t if you include <termios.h> (on some
|
|
dnl versions) or <sys/types.h> (on others).
|
|
dnl
|
|
AC_DEFUN(BASH_MISC_SPEED_T,
|
|
[AC_MSG_CHECKING(for speed_t in sys/types.h)
|
|
AC_CACHE_VAL(bash_cv_speed_t_in_sys_types,
|
|
[AC_TRY_COMPILE([#include <sys/types.h>], [speed_t x;],
|
|
bash_cv_speed_t_in_sys_types=yes,bash_cv_speed_t_in_sys_types=no)])
|
|
AC_MSG_RESULT($bash_cv_speed_t_in_sys_types)
|
|
if test $bash_cv_speed_t_in_sys_types = yes; then
|
|
AC_DEFINE(SPEED_T_IN_SYS_TYPES)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_CHECK_GETPW_FUNCS,
|
|
[AC_MSG_CHECKING(whether programs are able to redeclare getpw functions)
|
|
AC_CACHE_VAL(bash_cv_can_redecl_getpw,
|
|
[AC_TRY_COMPILE([#include <sys/types.h>
|
|
#include <pwd.h>
|
|
extern struct passwd *getpwent();], [struct passwd *z; z = getpwent();],
|
|
bash_cv_can_redecl_getpw=yes,bash_cv_can_redecl_getpw=no)])
|
|
AC_MSG_RESULT($bash_cv_can_redecl_getpw)
|
|
if test $bash_cv_can_redecl_getpw = no; then
|
|
AC_DEFINE(HAVE_GETPW_DECLS)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_CHECK_DEV_FD,
|
|
[AC_MSG_CHECKING(whether /dev/fd is available)
|
|
AC_CACHE_VAL(bash_cv_dev_fd,
|
|
[if test -d /dev/fd && test -r /dev/fd/0; then
|
|
bash_cv_dev_fd=standard
|
|
elif test -d /proc/self/fd && test -r /proc/self/fd/0; then
|
|
bash_cv_dev_fd=whacky
|
|
else
|
|
bash_cv_dev_fd=absent
|
|
fi
|
|
])
|
|
AC_MSG_RESULT($bash_cv_dev_fd)
|
|
if test $bash_cv_dev_fd = "standard"; then
|
|
AC_DEFINE(HAVE_DEV_FD)
|
|
AC_DEFINE(DEV_FD_PREFIX, "/dev/fd/")
|
|
elif test $bash_cv_dev_fd = "whacky"; then
|
|
AC_DEFINE(HAVE_DEV_FD)
|
|
AC_DEFINE(DEV_FD_PREFIX, "/proc/self/fd/")
|
|
fi
|
|
])
|
|
|
|
dnl
|
|
dnl Check for the presence of getpeername (the only networking function
|
|
dnl bash currently requires) in libsocket. If libsocket is present,
|
|
dnl check for libnsl and add it to LIBS if it's there, since most
|
|
dnl systems with libsocket require linking with libnsl as well.
|
|
dnl This should only be called if getpeername was not found in libc.
|
|
dnl
|
|
AC_DEFUN(BASH_CHECK_SOCKLIB,
|
|
[
|
|
if test "X$bash_cv_have_socklib" = "X"; then
|
|
_bash_needmsg=
|
|
else
|
|
AC_MSG_CHECKING(for socket library)
|
|
_bash_needmsg=yes
|
|
fi
|
|
AC_CACHE_VAL(bash_cv_have_socklib,
|
|
[AC_CHECK_LIB(socket, getpeername,
|
|
bash_cv_have_socklib=yes, bash_cv_have_socklib=no, -lnsl)])
|
|
if test "X$_bash_needmsg" = Xyes; then
|
|
AC_MSG_RESULT($bash_cv_have_socklib)
|
|
_bash_needmsg=
|
|
fi
|
|
if test $bash_cv_have_socklib = yes; then
|
|
# check for libnsl, add it to LIBS if present
|
|
if test "X$bash_cv_have_libnsl" = "X"; then
|
|
_bash_needmsg=
|
|
else
|
|
AC_MSG_CHECKING(for libnsl)
|
|
_bash_needmsg=yes
|
|
fi
|
|
AC_CACHE_VAL(bash_cv_have_libnsl,
|
|
[AC_CHECK_LIB(nsl, t_open,
|
|
bash_cv_have_libnsl=yes, bash_cv_have_libnsl=no)])
|
|
if test "X$_bash_needmsg" = Xyes; then
|
|
AC_MSG_RESULT($bash_cv_have_libnsl)
|
|
_bash_needmsg=
|
|
fi
|
|
if test $bash_cv_have_libnsl = yes; then
|
|
LIBS="-lsocket -lnsl $LIBS"
|
|
else
|
|
LIBS="-lsocket $LIBS"
|
|
fi
|
|
AC_DEFINE(HAVE_LIBSOCKET)
|
|
AC_DEFINE(HAVE_GETPEERNAME)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_DEFAULT_MAIL_DIR,
|
|
[AC_MSG_CHECKING(for default mail directory)
|
|
AC_CACHE_VAL(bash_cv_mail_dir,
|
|
[if test -d /var/mail; then
|
|
bash_cv_mail_dir=/var/mail
|
|
elif test -d /usr/mail; then
|
|
bash_cv_mail_dir=/usr/mail
|
|
elif test -d /usr/spool/mail; then
|
|
bash_cv_mail_dir=/usr/spool/mail
|
|
elif test -d /var/spool/mail; then
|
|
bash_cv_mail_dir=/var/spool/mail
|
|
else
|
|
bash_cv_mail_dir=unknown
|
|
fi
|
|
])
|
|
AC_MSG_RESULT($bash_cv_mail_dir)
|
|
if test $bash_cv_mail_dir = "/var/mail"; then
|
|
AC_DEFINE(DEFAULT_MAIL_DIRECTORY, "/var/mail")
|
|
elif test $bash_cv_mail_dir = "/usr/mail"; then
|
|
AC_DEFINE(DEFAULT_MAIL_DIRECTORY, "/usr/mail")
|
|
elif test $bash_cv_mail_dir = "/var/spool/mail"; then
|
|
AC_DEFINE(DEFAULT_MAIL_DIRECTORY, "/var/spool/mail")
|
|
elif test $bash_cv_mail_dir = "/usr/spool/mail"; then
|
|
AC_DEFINE(DEFAULT_MAIL_DIRECTORY, "/usr/spool/mail")
|
|
else
|
|
AC_DEFINE(DEFAULT_MAIL_DIRECTORY, "unknown")
|
|
fi
|
|
])
|
|
|
|
dnl
|
|
dnl Check if HPUX needs _KERNEL defined for RLIMIT_* definitions
|
|
dnl
|
|
AC_DEFUN(BASH_KERNEL_RLIMIT_CHECK,
|
|
[AC_MSG_CHECKING([whether $host_os needs _KERNEL for RLIMIT defines])
|
|
AC_CACHE_VAL(bash_cv_kernel_rlimit,
|
|
[AC_TRY_COMPILE([
|
|
#include <sys/types.h>
|
|
#include <sys/resource.h>
|
|
],
|
|
[
|
|
int f;
|
|
f = RLIMIT_DATA;
|
|
], bash_cv_kernel_rlimit=no,
|
|
[AC_TRY_COMPILE([
|
|
#include <sys/types.h>
|
|
#define _KERNEL
|
|
#include <sys/resource.h>
|
|
#undef _KERNEL
|
|
],
|
|
[
|
|
int f;
|
|
f = RLIMIT_DATA;
|
|
], bash_cv_kernel_rlimit=yes, bash_cv_kernel_rlimit=no)]
|
|
)])
|
|
AC_MSG_RESULT($bash_cv_kernel_rlimit)
|
|
if test $bash_cv_kernel_rlimit = yes; then
|
|
AC_DEFINE(RLIMIT_NEEDS_KERNEL)
|
|
fi
|
|
])
|
|
|
|
AC_DEFUN(BASH_FUNC_STRCOLL,
|
|
[
|
|
AC_MSG_CHECKING(whether or not strcoll and strcmp differ)
|
|
AC_CACHE_VAL(bash_cv_func_strcoll_broken,
|
|
[AC_TRY_RUN([
|
|
#include <stdio.h>
|
|
#if defined (HAVE_LOCALE_H)
|
|
#include <locale.h>
|
|
#endif
|
|
|
|
main(c, v)
|
|
int c;
|
|
char *v[];
|
|
{
|
|
int r1, r2;
|
|
char *deflocale, *defcoll;
|
|
|
|
#ifdef HAVE_SETLOCALE
|
|
deflocale = setlocale(LC_ALL, "");
|
|
defcoll = setlocale(LC_COLLATE, "");
|
|
#endif
|
|
|
|
#ifdef HAVE_STRCOLL
|
|
/* These two values are taken from tests/glob-test. */
|
|
r1 = strcoll("abd", "aXd");
|
|
#else
|
|
r1 = 0;
|
|
#endif
|
|
r2 = strcmp("abd", "aXd");
|
|
|
|
/* These two should both be greater than 0. It is permissible for
|
|
a system to return different values, as long as the sign is the
|
|
same. */
|
|
|
|
/* Exit with 1 (failure) if these two values are both > 0, since
|
|
this tests whether strcoll(3) is broken with respect to strcmp(3)
|
|
in the default locale. */
|
|
exit (r1 > 0 && r2 > 0);
|
|
}
|
|
], bash_cv_func_strcoll_broken=yes, bash_cv_func_strcoll_broken=no,
|
|
AC_MSG_ERROR(cannot check strcoll if cross compiling))
|
|
])
|
|
AC_MSG_RESULT($bash_cv_func_strcoll_broken)
|
|
if test $bash_cv_func_strcoll_broken = yes; then
|
|
AC_DEFINE(STRCOLL_BROKEN)
|
|
fi
|
|
])
|