1: dnl Process this file with autoconf to produce a configure script.
2:
3: AC_INIT(rlfe.c)
4: AC_CONFIG_HEADER(config.h)
5: VERSION=0.4
6: AC_SUBST(VERSION)
7:
8: dnl
9: dnl Define some useful macros
10: dnl
11: AC_DEFUN([AC_PROGRAM_SOURCE],
12: [AC_REQUIRE([AC_PROG_CPP])AC_PROVIDE([$0])cat > conftest.c <<EOF
13: #include "confdefs.h"
14: [$1]
15: _CUT_HERE_
16: [$2]
17: EOF
18: eval "$ac_cpp conftest.c 2>&5 | sed -e '1,/_CUT_HERE_/d' -e 's/ //g' > conftest.out"
19: . ./conftest.out
20: rm -f conftest*
21: ])dnl
22: dnl
23: define(AC_NOTE,
24: [echo "$1" 1>&AC_FD_MSG
25: ])dnl
26:
27: old_CFLAGS="$CFLAGS"
28: AC_PROG_CC
29: AC_PROG_CPP
30: AC_PROG_GCC_TRADITIONAL
31: AC_ISC_POSIX
32:
33: AC_TRY_RUN(main(){exit(0);},,[
34: if test $CC != cc ; then
35: AC_NOTE(Your $CC failed - restarting with CC=cc)
36: AC_NOTE()
37: CC=cc
38: export CC
39: exec $0 $configure_args
40: fi
41: ])
42:
43: AC_TRY_RUN(main(){exit(0);},,
44: exec 5>&2
45: eval $ac_link
46: AC_NOTE(CC=$CC; CFLAGS=$CFLAGS; LIBS=$LIBS;)
47: AC_NOTE($ac_compile)
48: AC_MSG_ERROR(Can't run the compiler - sorry))
49:
50: AC_TRY_RUN([
51: main()
52: {
53: int __something_strange_();
54: __something_strange_(0);
55: }
56: ],AC_MSG_ERROR(Your compiler does not set the exit status - sorry))
57:
58: AC_PROG_AWK
59:
60: if test -f etc/toolcheck; then
61: AC_CHECKING(for buggy tools)
62: sh etc/toolcheck 1>&AC_FD_MSG
63: fi
64:
65: dnl
66: dnl **** special unix variants ****
67: dnl
68:
69: AC_CHECKING(for System V)
70: AC_TRY_COMPILE(
71: [#include <sys/types.h>
72: #include <signal.h>
73: #include <fcntl.h>], [int x = SIGCHLD | FNDELAY;], , AC_DEFINE(SYSV))
74:
75: AC_CHECKING(for Solaris 2.x)
76: AC_EGREP_CPP(yes,
77: [#if defined(SVR4) && defined(sun)
78: yes
79: #endif
80: ], LIBS="$LIBS -lsocket -lnsl -lkstat")
81:
82: dnl
83: dnl **** select() ****
84: dnl
85:
86: AC_CHECKING(select)
87: AC_TRY_LINK(,[select(0, 0, 0, 0, 0);],,
88: LIBS="$LIBS -lnet -lnsl"
89: AC_CHECKING(select with $LIBS)
90: AC_TRY_LINK(,[select(0, 0, 0, 0, 0);],,
91: AC_MSG_ERROR(!!! no select - no screen))
92: )
93: dnl
94: dnl **** check the select implementation ****
95: dnl
96:
97: AC_CHECKING(select return value)
98: AC_TRY_RUN([
99: #include <sys/types.h>
100: #include <sys/stat.h>
101: #include <fcntl.h>
102:
103: char *nam = "/tmp/conftest$$";
104:
105: #ifdef NAMEDPIPE
106:
107: #ifndef O_NONBLOCK
108: #define O_NONBLOCK O_NDELAY
109: #endif
110: #ifndef S_IFIFO
111: #define S_IFIFO 0010000
112: #endif
113:
114:
115: main()
116: {
117: #ifdef FD_SET
118: fd_set f;
119: #else
120: int f;
121: #endif
122:
123: #ifdef __FreeBSD__
124: /* From Andrew A. Chernov (ache@astral.msk.su):
125: * opening RDWR fifo fails in BSD 4.4, but select return values are
126: * right.
127: */
128: exit(0);
129: #endif
130: (void)alarm(5);
131: #ifdef POSIX
132: if (mkfifo(nam, 0777))
133: #else
134: if (mknod(nam, S_IFIFO|0777, 0))
135: #endif
136: exit(1);
137: close(0);
138: if (open(nam, O_RDWR | O_NONBLOCK))
139: exit(1);
140: if (write(0, "TEST", 4) == -1)
141: exit(1);
142:
143: #else
144:
145: #include <sys/types.h>
146: #include <sys/socket.h>
147: #include <sys/un.h>
148:
149: main()
150: {
151: int s1, s2, l;
152: struct sockaddr_un a;
153: #ifdef FD_SET
154: fd_set f;
155: #else
156: int f;
157: #endif
158:
159: (void)alarm(5);
160: if ((s1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
161: exit(1);
162: a.sun_family = AF_UNIX;
163: strcpy(a.sun_path, nam);
164: (void) unlink(nam);
165: if (bind(s1, (struct sockaddr *) &a, strlen(nam)+2) == -1)
166: exit(1);
167: if (listen(s1, 2))
168: exit(1);
169: if (fork() == 0)
170: {
171: if ((s2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
172: kill(getppid(), 3);
173: (void)connect(s2, (struct sockaddr *)&a, strlen(nam) + 2);
174: if (write(s2, "HELLO", 5) == -1)
175: kill(getppid(), 3);
176: exit(0);
177: }
178: l = sizeof(a);
179: close(0);
180: if (accept(s1, (struct sockaddr *)&a, &l))
181: exit(1);
182: #endif
183:
184:
185: #ifdef FD_SET
186: FD_SET(0, &f);
187: #else
188: f = 1;
189: #endif
190: if (select(1, &f, 0, 0, 0) == -1)
191: exit(1);
192: if (select(1, &f, &f, 0, 0) != 2)
193: exit(1);
194: exit(0);
195: }
196: ],AC_NOTE(- select is ok),
197: AC_NOTE(- select can't count) AC_DEFINE(SELECT_BROKEN))
198:
199: dnl
200: dnl **** termcap or terminfo ****
201: dnl
202: AC_CHECKING(for tgetent)
203: AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
204: olibs="$LIBS"
205: LIBS="-lcurses $olibs"
206: AC_CHECKING(libcurses)
207: AC_TRY_LINK(,[
208: #ifdef __hpux
209: __sorry_hpux_libcurses_is_totally_broken_in_10_10();
210: #else
211: tgetent((char *)0, (char *)0);
212: #endif
213: ],,
214: LIBS="-ltermcap $olibs"
215: AC_CHECKING(libtermcap)
216: AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
217: LIBS="-ltermlib $olibs"
218: AC_CHECKING(libtermlib)
219: AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
220: LIBS="-lncurses $olibs"
221: AC_CHECKING(libncurses)
222: AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
223: AC_MSG_ERROR(!!! no tgetent - no screen))))))
224:
225: AC_TRY_RUN([
226: extern char *tgoto();
227: main()
228: {
229: exit(strcmp(tgoto("%p1%d", 0, 1), "1") ? 0 : 1);
230: }], AC_NOTE(- you use the termcap database),
231: AC_NOTE(- you use the terminfo database) AC_DEFINE(TERMINFO))
232: AC_CHECKING(ospeed)
233: AC_TRY_LINK(extern short ospeed;,ospeed=5;,,AC_DEFINE(NEED_OSPEED))
234:
235: dnl
236: dnl **** PTY specific things ****
237: dnl
238: AC_CHECKING(for /dev/ptc)
239: if test -r /dev/ptc; then
240: AC_DEFINE(HAVE_DEV_PTC)
241: fi
242:
243: AC_CHECKING(for SVR4 ptys)
244: sysvr4ptys=
245: if test -c /dev/ptmx ; then
246: AC_TRY_LINK([],[ptsname(0);grantpt(0);unlockpt(0);],[AC_DEFINE(HAVE_SVR4_PTYS)
247: sysvr4ptys=1])
248: fi
249:
250: AC_CHECK_FUNCS(getpt)
251:
252: dnl check for openpty()
253: if test -z "$sysvr4ptys"; then
254: AC_CHECK_FUNCS(openpty,,
255: [AC_CHECK_LIB(util,openpty, [AC_DEFINE(HAVE_OPENPTY)] [LIBS="$LIBS -lutil"])])
256: fi
257:
258: AC_CHECKING(for ptyranges)
259: if test -d /dev/ptym ; then
260: pdir='/dev/ptym'
261: else
262: pdir='/dev'
263: fi
264: dnl SCO uses ptyp%d
265: AC_EGREP_CPP(yes,
266: [#ifdef M_UNIX
267: yes;
268: #endif
269: ], ptys=`echo /dev/ptyp??`, ptys=`echo $pdir/pty??`)
270: dnl if test -c /dev/ptyp19; then
271: dnl ptys=`echo /dev/ptyp??`
272: dnl else
273: dnl ptys=`echo $pdir/pty??`
274: dnl fi
275: if test "$ptys" != "$pdir/pty??" ; then
276: p0=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\).$/\1/g' | sort -u | tr -d '\012'`
277: p1=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\)$/\1/g' | sort -u | tr -d '\012'`
278: AC_DEFINE_UNQUOTED(PTYRANGE0,"$p0")
279: AC_DEFINE_UNQUOTED(PTYRANGE1,"$p1")
280: fi
281:
282: dnl **** pty mode/group handling ****
283: dnl
284: dnl support provided by Luke Mewburn <lm@rmit.edu.au>, 931222
285: AC_ARG_WITH(pty-mode, [ --with-pty-mode=mode default mode for ptys], [ ptymode="${withval}" ])
286: AC_ARG_WITH(pty-group, [ --with-pty-group=group default group for ptys], [ ptygrp="${withval}" ])
287: test -n "$ptymode" || ptymode=0620
288: if test -n "$ptygrp" ; then
289: AC_DEFINE_UNQUOTED(PTYMODE, $ptymode)
290: AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp)
291: else
292:
293: AC_CHECKING(default tty permissions/group)
294: rm -f conftest_grp
295: AC_TRY_RUN([
296: #include <sys/types.h>
297: #include <sys/stat.h>
298: #include <stdio.h>
299: main()
300: {
301: struct stat sb;
302: char *x,*ttyname();
303: int om, m;
304: FILE *fp;
305:
306: if (!(x = ttyname(0))) exit(1);
307: if (stat(x, &sb)) exit(1);
308: om = sb.st_mode;
309: if (om & 002) exit(0);
310: m = system("mesg y");
311: if (m == -1 || m == 127) exit(1);
312: if (stat(x, &sb)) exit(1);
313: m = sb.st_mode;
314: if (chmod(x, om)) exit(1);
315: if (m & 002) exit(0);
316: if (sb.st_gid == getgid()) exit(1);
317: if (!(fp=fopen("conftest_grp", "w")))
318: exit(1);
319: fprintf(fp, "%d\n", sb.st_gid);
320: fclose(fp);
321: exit(0);
322: }
323: ],[
324: if test -f conftest_grp; then
325: ptygrp=`cat conftest_grp`
326: AC_NOTE([- pty mode: $ptymode, group: $ptygrp])
327: AC_DEFINE_UNQUOTED(PTYMODE, $ptymode)
328: AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp)
329: else
330: AC_NOTE(- ptys are world accessable)
331: fi
332: ],[
333: WRITEPATH=''
334: XTERMPATH=''
335: AC_PATH_PROG(WRITEPATH, write)
336: AC_PATH_PROG(XTERMPATH, xterm)
337: found=
338: if test -n "$WRITEPATH$XTERMPATH"; then
339: findfollow=
340: lsfollow=
341: found=`find $WRITEPATH $XTERMPATH -follow -print 2>/dev/null`
342: if test -n "$found"; then
343: findfollow=-follow
344: lsfollow=L
345: fi
346: if test -n "$XTERMPATH"; then
347: ptygrpn=`ls -l$lsfollow $XTERMPATH | sed -n -e 1p | $AWK '{print $4}'`
348: if test tty != "$ptygrpn"; then
349: XTERMPATH=
350: fi
351: fi
352: fi
353: if test -n "$WRITEPATH$XTERMPATH"; then
354: found=`find $WRITEPATH $XTERMPATH $findfollow -perm -2000 -print`
355: if test -n "$found"; then
356: ptygrp=`ls -ln$lsfollow $found | sed -n -e 1p | $AWK '{print $4}'`
357: AC_NOTE([- pty mode: $ptymode, group: $ptygrp])
358: AC_DEFINE_UNQUOTED(PTYMODE, $ptymode)
359: AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp)
360: else
361: AC_NOTE(- ptys are world accessable)
362: fi
363: else
364: AC_NOTE(- can't determine - assume ptys are world accessable)
365: fi
366: ]
367: )
368: rm -f conftest_grp
369: fi
370:
371: dnl
372: dnl **** signal handling ****
373: dnl
374: if test -n "$posix" ; then
375:
376: dnl POSIX has reliable signals with void return type.
377: AC_NOTE(assuming posix signal definition)
378: AC_DEFINE(SIGVOID)
379:
380: else
381:
382: AC_CHECKING(return type of signal handlers)
383: AC_TRY_COMPILE(
384: [#include <sys/types.h>
385: #include <signal.h>
386: #ifdef signal
387: #undef signal
388: #endif
389: extern void (*signal ()) ();], [int i;], AC_DEFINE(SIGVOID))
390: AC_CHECKING(sigset)
391: AC_TRY_LINK([
392: #include <sys/types.h>
393: #include <signal.h>
394: ],[
395: #ifdef SIGVOID
396: sigset(0, (void (*)())0);
397: #else
398: sigset(0, (int (*)())0);
399: #endif
400: ], AC_DEFINE(USESIGSET))
401: AC_CHECKING(signal implementation)
402: AC_TRY_RUN([
403: #include <sys/types.h>
404: #include <signal.h>
405:
406: #ifndef SIGCLD
407: #define SIGCLD SIGCHLD
408: #endif
409: #ifdef USESIGSET
410: #define signal sigset
411: #endif
412:
413: int got;
414:
415: #ifdef SIGVOID
416: void
417: #endif
418: hand()
419: {
420: got++;
421: }
422:
423: main()
424: {
425: /* on hpux we use sigvec to get bsd signals */
426: #ifdef __hpux
427: (void)signal(SIGCLD, hand);
428: kill(getpid(), SIGCLD);
429: kill(getpid(), SIGCLD);
430: if (got < 2)
431: exit(1);
432: #endif
433: exit(0);
434: }
435: ],,AC_DEFINE(SYSVSIGS))
436:
437: fi
438:
439: AC_CHECK_HEADERS(sys/stropts.h sys/wait.h sgtty.h sys/select.h)
440: AC_CHECK_HEADERS(term.h)
441:
442: AC_OUTPUT(Makefile)
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>