| dnl Process this file with autoconf to produce a configure script. |
| |
| m4_include([../../../config/override.m4]) |
| |
| AC_INIT(rlfe.c) |
| AC_CONFIG_HEADER(config.h) |
| VERSION=0.4 |
| AC_SUBST(VERSION) |
| |
| dnl |
| dnl Define some useful macros |
| dnl |
| AC_DEFUN([AC_PROGRAM_SOURCE], |
| [AC_REQUIRE([AC_PROG_CPP])AC_PROVIDE([$0])cat > conftest.c <<EOF |
| #include "confdefs.h" |
| [$1] |
| _CUT_HERE_ |
| [$2] |
| EOF |
| eval "$ac_cpp conftest.c 2>&5 | sed -e '1,/_CUT_HERE_/d' -e 's/ //g' > conftest.out" |
| . ./conftest.out |
| rm -f conftest* |
| ])dnl |
| dnl |
| define(AC_NOTE, |
| [echo "$1" 1>&AC_FD_MSG |
| ])dnl |
| |
| old_CFLAGS="$CFLAGS" |
| AC_PROG_CC |
| AC_PROG_CPP |
| AC_PROG_GCC_TRADITIONAL |
| AC_ISC_POSIX |
| |
| AC_TRY_RUN(main(){exit(0);},,[ |
| if test $CC != cc ; then |
| AC_NOTE(Your $CC failed - restarting with CC=cc) |
| AC_NOTE() |
| CC=cc |
| export CC |
| exec $0 $configure_args |
| fi |
| ]) |
| |
| AC_TRY_RUN(main(){exit(0);},, |
| exec 5>&2 |
| eval $ac_link |
| AC_NOTE(CC=$CC; CFLAGS=$CFLAGS; LIBS=$LIBS;) |
| AC_NOTE($ac_compile) |
| AC_MSG_ERROR(Can't run the compiler - sorry)) |
| |
| AC_TRY_RUN([ |
| main() |
| { |
| int __something_strange_(); |
| __something_strange_(0); |
| } |
| ],AC_MSG_ERROR(Your compiler does not set the exit status - sorry)) |
| |
| AC_PROG_AWK |
| |
| if test -f etc/toolcheck; then |
| AC_CHECKING(for buggy tools) |
| sh etc/toolcheck 1>&AC_FD_MSG |
| fi |
| |
| dnl |
| dnl **** special unix variants **** |
| dnl |
| |
| AC_CHECKING(for System V) |
| AC_TRY_COMPILE( |
| [#include <sys/types.h> |
| #include <signal.h> |
| #include <fcntl.h>], [int x = SIGCHLD | FNDELAY;], , AC_DEFINE(SYSV)) |
| |
| AC_CHECKING(for Solaris 2.x) |
| AC_EGREP_CPP(yes, |
| [#if defined(SVR4) && defined(sun) |
| yes |
| #endif |
| ], LIBS="$LIBS -lsocket -lnsl -lkstat") |
| |
| dnl |
| dnl **** select() **** |
| dnl |
| |
| AC_CHECKING(select) |
| AC_TRY_LINK(,[select(0, 0, 0, 0, 0);],, |
| LIBS="$LIBS -lnet -lnsl" |
| AC_CHECKING(select with $LIBS) |
| AC_TRY_LINK(,[select(0, 0, 0, 0, 0);],, |
| AC_MSG_ERROR(!!! no select - no screen)) |
| ) |
| dnl |
| dnl **** check the select implementation **** |
| dnl |
| |
| AC_CHECKING(select return value) |
| AC_TRY_RUN([ |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| #include <fcntl.h> |
| |
| char *nam = "/tmp/conftest$$"; |
| |
| #ifdef NAMEDPIPE |
| |
| #ifndef O_NONBLOCK |
| #define O_NONBLOCK O_NDELAY |
| #endif |
| #ifndef S_IFIFO |
| #define S_IFIFO 0010000 |
| #endif |
| |
| |
| main() |
| { |
| #ifdef FD_SET |
| fd_set f; |
| #else |
| int f; |
| #endif |
| |
| #ifdef __FreeBSD__ |
| /* From Andrew A. Chernov (ache@astral.msk.su): |
| * opening RDWR fifo fails in BSD 4.4, but select return values are |
| * right. |
| */ |
| exit(0); |
| #endif |
| (void)alarm(5); |
| #ifdef POSIX |
| if (mkfifo(nam, 0777)) |
| #else |
| if (mknod(nam, S_IFIFO|0777, 0)) |
| #endif |
| exit(1); |
| close(0); |
| if (open(nam, O_RDWR | O_NONBLOCK)) |
| exit(1); |
| if (write(0, "TEST", 4) == -1) |
| exit(1); |
| |
| #else |
| |
| #include <sys/types.h> |
| #include <sys/socket.h> |
| #include <sys/un.h> |
| |
| main() |
| { |
| int s1, s2, l; |
| struct sockaddr_un a; |
| #ifdef FD_SET |
| fd_set f; |
| #else |
| int f; |
| #endif |
| |
| (void)alarm(5); |
| if ((s1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) |
| exit(1); |
| a.sun_family = AF_UNIX; |
| strcpy(a.sun_path, nam); |
| (void) unlink(nam); |
| if (bind(s1, (struct sockaddr *) &a, strlen(nam)+2) == -1) |
| exit(1); |
| if (listen(s1, 2)) |
| exit(1); |
| if (fork() == 0) |
| { |
| if ((s2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) |
| kill(getppid(), 3); |
| (void)connect(s2, (struct sockaddr *)&a, strlen(nam) + 2); |
| if (write(s2, "HELLO", 5) == -1) |
| kill(getppid(), 3); |
| exit(0); |
| } |
| l = sizeof(a); |
| close(0); |
| if (accept(s1, (struct sockaddr *)&a, &l)) |
| exit(1); |
| #endif |
| |
| |
| #ifdef FD_SET |
| FD_SET(0, &f); |
| #else |
| f = 1; |
| #endif |
| if (select(1, &f, 0, 0, 0) == -1) |
| exit(1); |
| if (select(1, &f, &f, 0, 0) != 2) |
| exit(1); |
| exit(0); |
| } |
| ],AC_NOTE(- select is ok), |
| AC_NOTE(- select can't count) AC_DEFINE(SELECT_BROKEN)) |
| |
| dnl |
| dnl **** termcap or terminfo **** |
| dnl |
| AC_CHECKING(for tgetent) |
| AC_TRY_LINK(,tgetent((char *)0, (char *)0);,, |
| olibs="$LIBS" |
| LIBS="-lcurses $olibs" |
| AC_CHECKING(libcurses) |
| AC_TRY_LINK(,[ |
| #ifdef __hpux |
| __sorry_hpux_libcurses_is_totally_broken_in_10_10(); |
| #else |
| tgetent((char *)0, (char *)0); |
| #endif |
| ],, |
| LIBS="-ltermcap $olibs" |
| AC_CHECKING(libtermcap) |
| AC_TRY_LINK(,tgetent((char *)0, (char *)0);,, |
| LIBS="-ltermlib $olibs" |
| AC_CHECKING(libtermlib) |
| AC_TRY_LINK(,tgetent((char *)0, (char *)0);,, |
| LIBS="-lncurses $olibs" |
| AC_CHECKING(libncurses) |
| AC_TRY_LINK(,tgetent((char *)0, (char *)0);,, |
| AC_MSG_ERROR(!!! no tgetent - no screen)))))) |
| |
| AC_TRY_RUN([ |
| main() |
| { |
| exit(strcmp(tgoto("%p1%d", 0, 1), "1") ? 0 : 1); |
| }], AC_NOTE(- you use the termcap database), |
| AC_NOTE(- you use the terminfo database) AC_DEFINE(TERMINFO)) |
| AC_CHECKING(ospeed) |
| AC_TRY_LINK(extern short ospeed;,ospeed=5;,,AC_DEFINE(NEED_OSPEED)) |
| |
| dnl |
| dnl **** PTY specific things **** |
| dnl |
| AC_CHECKING(for /dev/ptc) |
| if test -r /dev/ptc; then |
| AC_DEFINE(HAVE_DEV_PTC) |
| fi |
| |
| AC_CHECKING(for SVR4 ptys) |
| sysvr4ptys= |
| if test -c /dev/ptmx ; then |
| AC_TRY_LINK([],[ptsname(0);grantpt(0);unlockpt(0);],[AC_DEFINE(HAVE_SVR4_PTYS) |
| sysvr4ptys=1]) |
| fi |
| |
| AC_CHECK_FUNCS(getpt) |
| |
| dnl check for openpty() |
| if test -z "$sysvr4ptys"; then |
| AC_CHECK_FUNCS(openpty,, |
| [AC_CHECK_LIB(util,openpty, [AC_DEFINE(HAVE_OPENPTY)] [LIBS="$LIBS -lutil"])]) |
| fi |
| |
| AC_CHECKING(for ptyranges) |
| if test -d /dev/ptym ; then |
| pdir='/dev/ptym' |
| else |
| pdir='/dev' |
| fi |
| dnl SCO uses ptyp%d |
| AC_EGREP_CPP(yes, |
| [#ifdef M_UNIX |
| yes; |
| #endif |
| ], ptys=`echo /dev/ptyp??`, ptys=`echo $pdir/pty??`) |
| dnl if test -c /dev/ptyp19; then |
| dnl ptys=`echo /dev/ptyp??` |
| dnl else |
| dnl ptys=`echo $pdir/pty??` |
| dnl fi |
| if test "$ptys" != "$pdir/pty??" ; then |
| p0=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\).$/\1/g' | sort -u | tr -d '\012'` |
| p1=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\)$/\1/g' | sort -u | tr -d '\012'` |
| AC_DEFINE_UNQUOTED(PTYRANGE0,"$p0") |
| AC_DEFINE_UNQUOTED(PTYRANGE1,"$p1") |
| fi |
| |
| dnl **** pty mode/group handling **** |
| dnl |
| dnl support provided by Luke Mewburn <lm@rmit.edu.au>, 931222 |
| AC_ARG_WITH(pty-mode, [ --with-pty-mode=mode default mode for ptys], [ ptymode="${withval}" ]) |
| AC_ARG_WITH(pty-group, [ --with-pty-group=group default group for ptys], [ ptygrp="${withval}" ]) |
| test -n "$ptymode" || ptymode=0620 |
| if test -n "$ptygrp" ; then |
| AC_DEFINE_UNQUOTED(PTYMODE, $ptymode) |
| AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp) |
| else |
| |
| AC_CHECKING(default tty permissions/group) |
| rm -f conftest_grp |
| AC_TRY_RUN([ |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| #include <stdio.h> |
| main() |
| { |
| struct stat sb; |
| char *x,*ttyname(); |
| int om, m; |
| FILE *fp; |
| |
| if (!(x = ttyname(0))) exit(1); |
| if (stat(x, &sb)) exit(1); |
| om = sb.st_mode; |
| if (om & 002) exit(0); |
| m = system("mesg y"); |
| if (m == -1 || m == 127) exit(1); |
| if (stat(x, &sb)) exit(1); |
| m = sb.st_mode; |
| if (chmod(x, om)) exit(1); |
| if (m & 002) exit(0); |
| if (sb.st_gid == getgid()) exit(1); |
| if (!(fp=fopen("conftest_grp", "w"))) |
| exit(1); |
| fprintf(fp, "%d\n", sb.st_gid); |
| fclose(fp); |
| exit(0); |
| } |
| ],[ |
| if test -f conftest_grp; then |
| ptygrp=`cat conftest_grp` |
| AC_NOTE([- pty mode: $ptymode, group: $ptygrp]) |
| AC_DEFINE_UNQUOTED(PTYMODE, $ptymode) |
| AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp) |
| else |
| AC_NOTE(- ptys are world accessable) |
| fi |
| ],[ |
| WRITEPATH='' |
| XTERMPATH='' |
| AC_PATH_PROG(WRITEPATH, write) |
| AC_PATH_PROG(XTERMPATH, xterm) |
| found= |
| if test -n "$WRITEPATH$XTERMPATH"; then |
| findfollow= |
| lsfollow= |
| found=`find $WRITEPATH $XTERMPATH -follow -print 2>/dev/null` |
| if test -n "$found"; then |
| findfollow=-follow |
| lsfollow=L |
| fi |
| if test -n "$XTERMPATH"; then |
| ptygrpn=`ls -l$lsfollow $XTERMPATH | sed -n -e 1p | $AWK '{print $4}'` |
| if test tty != "$ptygrpn"; then |
| XTERMPATH= |
| fi |
| fi |
| fi |
| if test -n "$WRITEPATH$XTERMPATH"; then |
| found=`find $WRITEPATH $XTERMPATH $findfollow -perm -2000 -print` |
| if test -n "$found"; then |
| ptygrp=`ls -ln$lsfollow $found | sed -n -e 1p | $AWK '{print $4}'` |
| AC_NOTE([- pty mode: $ptymode, group: $ptygrp]) |
| AC_DEFINE_UNQUOTED(PTYMODE, $ptymode) |
| AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp) |
| else |
| AC_NOTE(- ptys are world accessable) |
| fi |
| else |
| AC_NOTE(- can't determine - assume ptys are world accessable) |
| fi |
| ] |
| ) |
| rm -f conftest_grp |
| fi |
| |
| dnl |
| dnl **** signal handling **** |
| dnl |
| if test -n "$posix" ; then |
| |
| dnl POSIX has reliable signals with void return type. |
| AC_NOTE(assuming posix signal definition) |
| AC_DEFINE(SIGVOID) |
| |
| else |
| |
| AC_CHECKING(return type of signal handlers) |
| AC_TRY_COMPILE( |
| [#include <sys/types.h> |
| #include <signal.h> |
| #ifdef signal |
| #undef signal |
| #endif |
| extern void (*signal ()) ();], [int i;], AC_DEFINE(SIGVOID)) |
| AC_CHECKING(sigset) |
| AC_TRY_LINK([ |
| #include <sys/types.h> |
| #include <signal.h> |
| ],[ |
| #ifdef SIGVOID |
| sigset(0, (void (*)())0); |
| #else |
| sigset(0, (int (*)())0); |
| #endif |
| ], AC_DEFINE(USESIGSET)) |
| AC_CHECKING(signal implementation) |
| AC_TRY_RUN([ |
| #include <sys/types.h> |
| #include <signal.h> |
| |
| #ifndef SIGCLD |
| #define SIGCLD SIGCHLD |
| #endif |
| #ifdef USESIGSET |
| #define signal sigset |
| #endif |
| |
| int got; |
| |
| #ifdef SIGVOID |
| void |
| #endif |
| hand() |
| { |
| got++; |
| } |
| |
| main() |
| { |
| /* on hpux we use sigvec to get bsd signals */ |
| #ifdef __hpux |
| (void)signal(SIGCLD, hand); |
| kill(getpid(), SIGCLD); |
| kill(getpid(), SIGCLD); |
| if (got < 2) |
| exit(1); |
| #endif |
| exit(0); |
| } |
| ],,AC_DEFINE(SYSVSIGS)) |
| |
| fi |
| |
| AC_CHECK_HEADERS(sys/stropts.h sys/wait.h) |
| |
| AC_OUTPUT(Makefile) |