configure.ac 27.9 KB
Newer Older
Niels Möller's avatar
Niels Möller committed
1
dnl Process this file with autoconf to produce a configure script.
2
AC_INIT([lsh], [2.9-exp], [bug-lsh@gnu.org]) 
Niels Möller's avatar
Niels Möller committed
3
AC_PREREQ(2.52)
4
AC_CONFIG_SRCDIR([src/lsh.c])
5 6 7
# Needed to stop autoconf from looking for files in parent directories.
AC_CONFIG_AUX_DIR([.])
	
8
AM_INIT_AUTOMAKE
9
AM_CONFIG_HEADER(config.h)
Niels Möller's avatar
Niels Möller committed
10

11 12 13 14 15 16 17 18 19 20 21 22
# We want an absolute path to the source-dir.
case "$srcdir" in
    /*)
    ;;
    *)
	oldsrcdir="$srcdir"
	srcdir="`cd \"$srcdir\";pwd`"
	AC_MSG_WARN([ Converted $oldsrcdir to $srcdir,
If this does not work, please use an absolute path to the configure script. ])
    ;;
esac

23
# src/rsync relies on lsh's definitions of WRITE_UINT32 etc.
24
# CPPFLAGS="$CPPFLAGS -I$srcdir/src -DLSH"
25

26 27 28 29
# GNU libc defaults to supplying the ISO C library functions only. 
# initgroups() and strsignal() are extensions; the _GNU_SOURCE define
# enables these extensions.
# Enable it on all systems; no problems have been reported with it so far.
Niels Möller's avatar
Niels Möller committed
30

31
AC_GNU_SOURCE
Niels Möller's avatar
Niels Möller committed
32

33
# Check options
34
AC_ARG_ENABLE(debug_alloc,
35
  AC_HELP_STRING([--enable-debug-alloc], [Enable memory allocation sanity checks]),,
36
  [enable_debug_alloc=no])
37 38 39

AH_TEMPLATE([DEBUG_ALLOC],
	    [Define to enable sanity checking on memory allocation and casting])
40
if test x$enable_debug_alloc = xyes ; then
41 42 43
  AC_DEFINE(DEBUG_ALLOC)
fi

44
AC_ARG_ENABLE(debug_trace,
45
  AC_HELP_STRING([--enable-debug-trace], [Enable tracing support]),,
46
  [enable_debug_trace=no])
47

48
AH_TEMPLATE([DEBUG_TRACE], [Define to enable tracing])
49
if test x$enable_debug_trace = xyes ; then
50 51 52
  AC_DEFINE(DEBUG_TRACE)
fi

Niels Möller's avatar
Niels Möller committed
53
AC_ARG_ENABLE(gcov,
54
  AC_HELP_STRING([--enable-gcov], [Instrument for gcov (requires a modern gcc)]),,
Niels Möller's avatar
Niels Möller committed
55 56
  [enable_gcov=no])

Niels Möller's avatar
Niels Möller committed
57 58 59 60 61
AC_ARG_ENABLE(profiling,
  AC_HELP_STRING([--enable-profiling], [Instrument for gprof profiling]),,
  [enable_profiling=no])


62
AC_ARG_WITH(zlib,
63
  AC_HELP_STRING([--without-zlib], [Don't use zlib compression]),,
64
  [with_zlib=yes])
65

66 67 68 69 70 71 72 73 74 75
AC_ARG_WITH(tcpwrappers,
  AC_HELP_STRING([--with-tcpwrappers], 
                [Use tcp-wrappers for filtering connections]),
  [if test -z "$withval"; then 
    with_tcpwrappers=yes; 
  else 
    with_tcpwrappers="$withval";
  fi],
  [with_tcpwrappers=no])

76 77
# Checking this variable is delayed until we have checked if zlib is
# actually available.
78

79
AC_ARG_ENABLE(pty,
80
  AC_HELP_STRING([--without-pty], [Disable pty support]),,
81
  [enable_pty=yes])
82

83
AH_TEMPLATE([WITH_PTY_SUPPORT], [Define to enable pty support])
84
if test x$enable_pty = xyes ; then
85 86 87
  AC_DEFINE(WITH_PTY_SUPPORT)
fi

88
AC_ARG_ENABLE(srp,
89
  AC_HELP_STRING([--disable-srp], [Disable the (experimental) support for SRP]),,
90 91
  [enable_srp=yes])

92 93 94 95
AC_ARG_ENABLE(gss,
  AC_HELP_STRING([--disable-gss], [Disable the (experimental) support for GSS]),,
  [enable_gss=yes])

96
AC_ARG_ENABLE(kerberos,
97
  AC_HELP_STRING([--disable-kerberos], [Don't support kerberos]),,
98
  [enable_kerberos=yes])
99

100 101 102 103
AC_ARG_ENABLE(pam,
  AC_HELP_STRING([--disable-pam], [Don't support PAM]),,
  [enable_pam=yes])

104
AH_TEMPLATE([WITH_SRP], [Define if SRP should be supported])
105 106
if test x$enable_srp = xyes ; then
  AC_DEFINE(WITH_SRP)
107
  SRP_PROGRAM=srp-gen
108 109
fi

110 111
AC_SUBST(SRP_PROGRAM)

112 113 114 115 116 117 118 119 120 121 122 123
AC_ARG_ENABLE(initgroups_workaround,
  AC_HELP_STRING([--enable-initgroups-workaround],
		 [Use a special initgroups for supporting more groups]),,
  [enable_initgroups_workaround=no])

AH_TEMPLATE([INITGROUPS_WORKAROUND],
	    [Define to enable the initgroups workaround])
if test x$enable_initgroups_workaround = xyes ; then
  AC_DEFINE(INITGROUPS_WORKAROUND)
fi


124
AC_ARG_ENABLE(tcp_forward,
125
  AC_HELP_STRING([--disable-tcp-forward], [Disable tcp forwarding]),,
126
  [enable_tcp_forward=yes])
127

128
AH_TEMPLATE([WITH_TCP_FORWARD], [Define to enable tcp forwarding])
129
if test x$enable_tcp_forward = xyes ; then
130 131
  AC_DEFINE(WITH_TCP_FORWARD)
fi
132

133
AC_ARG_ENABLE(x11_forward,
134
  AC_HELP_STRING([--disable-x11-forward], [Disable x11 forwarding (proxy only)]),,
135
  [enable_x11_forward=yes])
136

137
AH_TEMPLATE([WITH_X11_FORWARD], [Define to enable x11 forwarding])
138
if test x$enable_x11_forward = xyes ; then
139 140 141
  AC_DEFINE(WITH_X11_FORWARD)
fi

142
AC_ARG_ENABLE(agent_forward,
143
  AC_HELP_STRING([--disable-agent-forward], [Disable auth-agent forwarding (proxy only)]),,
144 145
  [with_agent_forward=yes])

146 147
AH_TEMPLATE([WITH_AGENT_FORWARD],
	    [Define to enable authentication agent forwarding])
148
if test x$disable_agent_forward = xyes ; then
149 150 151
  AC_DEFINE(WITH_AGENT_FORWARD)
fi

152
AC_ARG_WITH(scheme,
153
  AC_HELP_STRING([[--with-scheme[=PROGRAM]]], [Use a particular scheme implementation]),,
154
  [with_scheme=])
155 156

AC_ARG_WITH(system-argp,
157 158
  AC_HELP_STRING([--with-system-argp], [Use the argp parser in libc]),,
  [with_system_argp=no])
159

160
# IPv6 support
161
AC_ARG_ENABLE(ipv6,
162
  AC_HELP_STRING([--disable-ipv6], [Disable IPv6 support]),,
163 164
  [enable_ipv6=yes])

165
# utmp/wtmp logging 
166
AC_ARG_ENABLE(utmp,
167
  AC_HELP_STRING([--disable-utmp], [Disable utmp and wtmp support]),,
168 169
  [enable_utmp=yes])

170
AC_ARG_WITH(include-path,
171
  AC_HELP_STRING([--with-include-path], [A colon-separated list of directories to search for include files]),,
172 173 174
  [with_include_path=''])

if test x$with_include_path != x ; then
175
  CPPFLAGS="$CPPFLAGS -I`echo $with_include_path | sed 's/:/ -I/g'`"
176 177
fi

178
AC_ARG_WITH(lib-path,
179
  AC_HELP_STRING([--with-lib-path], [A colon-separated list of directories to search for libraries]),,
180 181 182
  [with_lib_path=''])

if test x$with_lib_path != x ; then
183
  LDFLAGS="$LDFLAGS -L`echo $with_lib_path | sed 's/:/ -L/g'`"
184 185 186 187 188 189 190 191 192
fi

LSH_RPATH_INIT([`echo $with_lib_path | sed 's/:/ /g'` \
    `echo $exec_prefix | sed "s@^NONE@$prefix/lib@g" | sed "s@^NONE@$ac_default_prefix/lib@g"` \
    /usr/local/lib /sw/local/lib /sw/lib \
    /usr/gnu/lib /opt/gnu/lib /sw/gnu/lib /usr/freeware/lib /usr/pkg/lib])

dnl echo RPATH_CANDIDATE_DIRS = $RPATH_CANDIDATE_DIRS

193
# Checks for programs.
Niels Möller's avatar
Niels Möller committed
194 195
AC_PROG_CC
AC_PROG_MAKE_SET
Niels Möller's avatar
Niels Möller committed
196
AC_PROG_RANLIB
197
AM_PROG_CC_STDC
Niels Möller's avatar
Niels Möller committed
198

199
if test "x$am_cv_prog_cc_stdc" = xno ; then
200
  AC_MSG_ERROR([the C compiler doesn't handle ANSI-C])
201 202
fi

203 204
# Use a particular scheme implementation?
if test x$with_scheme != x ; then
205 206 207 208 209 210 211 212 213
  # If an absolute path is given, don't AC_PATH_PROG but just use it
  if grep "^/" > /dev/null <<EOF
$with_scheme 
EOF  
  then
    SCHEME_PROGRAM="$with_scheme" 
  else
    AC_PATH_PROG(SCHEME_PROGRAM, $with_scheme,, $PATH)
  fi
214
else  
215
  AC_PATH_PROGS(SCHEME_PROGRAM, guile scsh,, $PATH)
216
fi
217

218
if test "x$SCHEME_PROGRAM" = x ; then
219 220
  AC_MSG_WARN([No scheme implementation found.
This is fine as long as you don't modify the source files.])
221 222 223
  SCHEME_PROGRAM=false
fi

224 225 226
SCHEME_NAME=`basename $SCHEME_PROGRAM`
AC_SUBST(SCHEME_NAME)

227 228 229 230 231 232 233 234 235 236
if test "x$GROFF" = x; then
  AC_PATH_PROG(GROFF, groff,, $PATH)
fi
AC_ARG_VAR(GROFF, groff)

if test "x$M4" = x; then
  AC_PATH_PROG(M4, m4, m4)
fi
AC_ARG_VAR(M4, M4 macro processor)

237

238
# Checks for header files.
Niels Möller's avatar
Niels Möller committed
239
AC_HEADER_STDC
240

241 242 243
# We don't look in gmp2 anymore, as we need gmp-3.1 or better.
AC_CHECK_HEADERS(gmp.h,,
  AC_MSG_ERROR([gmp.h not found]))
244
  
245
AC_CHECK_HEADERS(fcntl.h strings.h sys/time.h unistd.h)
246
AC_CHECK_HEADERS(shadow.h)
247

248 249 250
if test x$with_zlib = xyes; then
  AC_CHECK_HEADERS(zlib.h,, [with_zlib=no])
fi
251
AC_CHECK_HEADERS(libutil.h)
252
AC_CHECK_HEADERS(crypt.h)
253 254
AC_CHECK_HEADERS(pty.h)
AC_CHECK_HEADERS(stropts.h)
255
AC_CHECK_HEADERS(syslog.h)
256
AC_CHECK_HEADERS(argp.h)
257
AC_CHECK_HEADERS(sys/resource.h)
Niels Möller's avatar
Niels Möller committed
258
AC_CHECK_HEADERS(sys/filio.h)
Niels Möller's avatar
Niels Möller committed
259
AC_CHECK_HEADERS(ucred.h)
260

261
AC_CHECK_HEADERS(utmp.h, [have_utmp_h=yes], [have_utmp_h=no])
262
AC_CHECK_HEADERS(utmpx.h, [have_utmpx_h=yes], [have_utmpx_h=no])
263

264 265 266 267
dnl With current autoconfs we can't check for struct ut_tv with
dnl AC_CHECK_MEMBERS, but we can check for sub members. Leave the
dnl ut_tv check for clarity.

268
if test x$have_utmp_h = xyes; then
269 270 271 272 273
  # Currently, no support for pure bsd systems where login(3) and
  # friends are the only library functions for updating the utmp and
  # wtmp data. FIXME: Don't do this if we're going to use the the utmpx
  # functions instead.
  AC_CHECK_FUNC([pututline],,[enable_utmp=no])
274 275 276
  AC_CHECK_MEMBERS([struct utmp.ut_host,
		    struct utmp.ut_name,
		    struct utmp.ut_user,
277 278
		    struct utmp.ut_time,
		    struct utmp.ut_tv,
279
		    struct utmp.ut_tv.tv_sec,
280 281 282
		    struct utmp.ut_id,
		    struct utmp.ut_syslen,
		    struct utmp.ut_session,
283 284
		    struct utmp.ut_pid,
		    struct utmp.ut_exit,
285
		    struct utmp.ut_exit.e_termination,
286 287
		    struct utmp.ut_exit.__e_termination,
		    struct utmp.ut_exit.ut_termination,
288 289
		    struct utmp.ut_addr,
		    struct utmp.ut_addr_v6],,,
290 291 292 293
[# if HAVE_SYS_TYPES_H
#  include <sys/types.h>
# #endif
# if HAVE_UTMP_H
294 295
#  include <utmp.h>
# endif
296 297
])
fi
298

299 300 301 302 303 304 305
if test x$have_utmpx_h = xyes; then
  AC_CHECK_MEMBERS([struct utmpx.ut_host,
		    struct utmpx.ut_name,
		    struct utmpx.ut_user,
		    struct utmpx.ut_time,
		    struct utmpx.ut_id,
		    struct utmpx.ut_tv,
306
		    struct utmpx.ut_tv.tv_sec,
307 308 309 310
		    struct utmpx.ut_syslen,
		    struct utmpx.ut_session,
		    struct utmpx.ut_pid,
		    struct utmpx.ut_exit,
311
		    struct utmpx.ut_exit.e_termination,
312 313
		    struct utmpx.ut_exit.__e_termination,
		    struct utmpx.ut_exit.ut_termination,
314 315 316
		    struct utmpx.ut_addr,
		    struct utmpx.ut_addr_v6],,,
[# if HAVE_UTMPX_H
317 318 319
#  include <utmpx.h>
# endif
])
320
fi
321

322 323 324 325 326
AH_TEMPLATE([WITH_UTMP], [For utmp support])
if test x$enable_utmp = xyes ; then
  AC_DEFINE(WITH_UTMP)
fi

327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355
AH_TEMPLATE([WITH_GSS_K5], [Whether to use gss K5 authorization (Heimdal/MIT)])
if test x$enable_gss != xno; then
  if test x$enable_gss = xk5; then
    AC_CHECK_PROG(KRB5CONFIG, krb5-config, krb5-config, no)
    if test x$KRB5CONFIG != xno; then
      CPPFLAGS="$CPPFLAGS `$KRB5CONFIG --cflags gssapi`"
      LIBS="$LIBS `$KRB5CONFIG --libs gssapi`"
      AC_CHECK_HEADERS([gssapi.h gssapi/gssapi.h gssapi/gssapi_generic.h])
      AC_DEFINE(WITH_GSS_K5)
      AC_CHECK_DECL(GSS_C_NT_HOSTBASED_SERVICE,, [
	AC_DEFINE(GSS_C_NT_HOSTBASED_SERVICE,
		gss_nt_service_name,
		[Work around buggy MIT library])], [
#ifdef HAVE_GSSAPI_H
#include <gssapi.h>
#endif
#ifdef HAVE_GSSAPI_GSSAPI_H
#include <gssapi/gssapi.h>
#endif
#ifdef HAVE_GSSAPI_GSSAPI_GENERIC_H
#include <gssapi/gssapi_generic.h>
#endif
])
    fi
  else
    AC_CHECK_HEADERS(gss.h,, [enable_gss=no])
    AC_CHECK_LIB(gss, gss_check_version,, [enable_gss=no])
  fi
fi
356

357 358 359 360
if test x$enable_kerberos = xyes; then
  AC_CHECK_HEADERS(krb5.h,, [enable_kerberos=no])
fi

361 362 363 364
if test x$enable_pam = xyes; then
  AC_CHECK_HEADERS(security/pam_appl.h,, [enable_pam=no])
fi

365 366
# Some systems (in particular, Unixware) doesn't have socklen_t, but
# uses size_t. Falling back to int will cause some warnings.
367

368 369
# AC_CHECK_TYPE doesn't work, probably because the type in
# question is not defined in sys/types.h.
370

371
LSH_TYPE_SOCKLEN_T
372

373 374
# Checks for libraries

375 376 377 378
AC_CHECK_LIB(gmp, __gmpz_getlimbn,,
    [AC_MSG_ERROR(
    [GNU MP not found, or not 3.1 or up, see http://www.swox.com/gmp.])])

379 380
LSH_RPATH_FIX

Niels Möller's avatar
Niels Möller committed
381 382 383 384 385
AC_CHECK_LIB([oop], [oop_sys_new],,
  [AC_MSG_ERROR([liboop is missing. Get liboop from http://www.liboop.org])])

LSH_RPATH_FIX

386 387 388 389
if test x$with_zlib = xyes; then
  AC_CHECK_LIB(z, inflate,, [with_zlib=no])
fi

390 391 392 393
if test x$with_zlib = xyes; then
  LSH_RPATH_FIX
fi

394 395 396 397 398
# FIXME: Should we let people use --with-tcpwrappers=/here/they/are?

if test x$with_tcpwrappers = xyes; then
  AC_CHECK_LIB(wrap, request_init,, 
  [
399
      AC_MSG_WARN([Failed to link libwrap, you might try adding -lsocket to LDFLAGS])
400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417
      with_tcpwrappers=no
  ])

  AC_CHECK_HEADER(tcpd.h,, [with_tcpwrappers=no])

  if test x$with_tcpwrappers = xno; then
    AC_MSG_WARN([Failed to find a working tcpwrappers setup, disabling wrappers])
  fi
fi

if test x$with_tcpwrappers = xyes; then
  LSH_RPATH_FIX
  AC_DEFINE(WITH_TCPWRAPPERS,1,[Whatever to use tcpwrappers])
else
  AC_DEFINE(WITH_TCPWRAPPERS,0,[Whatever to use tcpwrappers])
fi


418
# X11 stuff. We only need libXau.
419
# FIXME: Use AC_PATH_XTRA instead? 
420 421 422
AC_PATH_X

if test -z "$no_x" ; then
423
  if test -n "$x_includes" ; then
424
    CPPFLAGS="$CPPFLAGS -I$x_includes"
425
  fi
426
  if test -n "$x_libraries" ; then
427 428
    LDFLAGS="$LDFLAGS -L$x_libraries"
    LSH_RPATH_ADD($x_libraries)
429
  fi
430 431 432 433 434 435
fi

AC_CHECK_HEADERS(X11/Xauth.h)
AC_CHECK_LIB(Xau, XauGetAuthByAddr)
LSH_RPATH_FIX

Pontus Freyhult's avatar
Pontus Freyhult committed
436 437 438 439 440 441 442 443 444 445 446 447
AC_ARG_VAR(XAUTH_PROGRAM, Program used to handle .Xauthority-files by lshd)

if test -z "$XAUTH_PROGRAM"; then
  AC_PATH_PROG(XAUTH_PROGRAM, xauth,, /usr/X11R6/bin:/usr/openwin/bin:/usr/X/bin:/usr/X11/bin:/usr/bin:/usr/bin/X:/usr/bin/X11)
fi

if test -z "$XAUTH_PROGRAM"; then
  AC_MSG_WARN(Couldn't find xauth, try passing XAUTH_PROGRAM=/path/to/xauth to configure)
else
  AC_DEFINE_UNQUOTED(XAUTH_PROGRAM, "$XAUTH_PROGRAM", Program used by lshd to handle .Xauthority-files)
fi

448 449
# Move these checks for system libraries earlier, before checks for
# gmp, liboop etc
450

451 452 453
# glibc has a nis-library "libnsl", which we don't need. So use
# AC_SEARCH_LIBS rather than AC_CHECK_LIB.
AC_SEARCH_LIBS(gethostbyname, nsl)
454
AC_SEARCH_LIBS(inet_ntop, nsl)
455 456 457 458 459 460
AC_CHECK_LIB(socket, setsockopt)

AC_CHECK_LIB(crypt, crypt)
AC_CHECK_LIB(xnet, inet_addr)
# logwtmp is also in libutil
AC_CHECK_LIB(util, openpty)
461

462
# This macro is new in autoconf-2.13
463
AC_SEARCH_LIBS(syslog, bsd socket inet, [AC_DEFINE(HAVE_SYSLOG)])
464

465
AH_TEMPLATE([WITH_ZLIB], [Define if zlib should be used])
466
# Should we use zlib?
467 468 469 470
if test x$with_zlib = xyes ; then
  AC_DEFINE(WITH_ZLIB)
fi

471 472 473 474 475 476
AH_TEMPLATE([WITH_GSS], [Define if gss should be used])
# Should we use gss?
if test x$enable_gss != xno ; then
  AC_DEFINE(WITH_GSS)
fi

477 478 479 480 481
# The kerberos libraries are needed only to support the
# krb-check-passwd program, so we put them $KRB_LIBS, not in the
# ordinary $LIBS.

if test x$enable_kerberos = xyes; then
482 483 484 485
  LSH_CHECK_KRB_LIB(roken, strlcpy)
  LSH_CHECK_KRB_LIB(resolv, dn_expand)
  LSH_CHECK_KRB_LIB(des, des_cbc_encrypt)
  LSH_CHECK_KRB_LIB(asn1, der_get_octet_string)
486 487 488
  # Check for krb5_cc_gen_new too?
  # krb5_verify_user_lrealm seems to be unique to heimdal
  LSH_CHECK_KRB_LIB(krb5, krb5_verify_user_lrealm,, [enable_kerberos=no])
489 490
fi

491
AH_TEMPLATE([WITH_KERBEROS], [For kerberos])
492 493 494 495 496 497 498 499
if test x$enable_kerberos = xyes; then
  AC_DEFINE(WITH_KERBEROS)
  KRB_PROGRAM=lsh-krb-checkpw
fi

AC_SUBST(KRB_LIBS)
AC_SUBST(KRB_PROGRAM)

500 501
AH_TEMPLATE([WITH_PAM], [For PAM])
if test x$enable_pam = xyes; then
502 503 504 505 506 507 508 509
  AC_CHECK_LIB(pam,pam_start,, enable_pam=no )

  if test x$enable_pam = xyes; then
    AC_DEFINE(WITH_PAM)
    PAM_PROGRAM=lsh-pam-checkpw
  else
    AC_MSG_WARN([pam_start not found in libpam, disabling PAM])
  fi
510 511 512 513
fi

AC_SUBST(PAM_PROGRAM)

514
AH_TEMPLATE([WITH_GCOV], [Use gcov])
Niels Möller's avatar
Niels Möller committed
515 516
if test "x$enable_gcov" = "xyes"; then
  CFLAGS="$CFLAGS -ftest-coverage -fprofile-arcs"
517
  AC_DEFINE(WITH_GCOV)
Niels Möller's avatar
Niels Möller committed
518 519
fi

Niels Möller's avatar
Niels Möller committed
520 521 522 523
if test "x$enable_profiling" = "xyes"; then
  CFLAGS="$CFLAGS -pg"
fi

524
# Checks for typedefs, structures, and compiler characteristics.
525
AC_C_CONST
526
AC_C_INLINE
527
AC_TYPE_UID_T
Niels Möller's avatar
Niels Möller committed
528
AC_TYPE_SIZE_T
529 530
AC_HEADER_TIME

531
# Needed by the supplied memcmp.c
Niels Möller's avatar
Niels Möller committed
532 533
AC_C_BIGENDIAN

534
# FIXME: We should check that a pid_t fits in an int
Niels Möller's avatar
Niels Möller committed
535
	
536
# Checks for library functions.
537

538 539 540
LSH_FUNC_ALLOCA
LSH_FUNC_STRERROR
LSH_FUNC_STRSIGNAL
541 542
AC_FUNC_MEMCMP
AC_FUNC_VPRINTF
543
AC_CHECK_FUNCS(select socket strtol alarm)
544
AC_CHECK_FUNCS(getrusage gettimeofday)
545
AC_CHECK_FUNCS(getspnam)
546
AC_CHECK_FUNCS(vsnprintf inet_aton)
547
AC_CHECK_FUNCS(openpty)
548
AC_CHECK_FUNCS(cfmakeraw)
549
AC_CHECK_FUNCS(logwtmp login logout pututline pututxline updwtmp updwtmpx)
550
AC_CHECK_FUNCS(getaddrinfo getnameinfo gai_strerror)
551
AC_CHECK_FUNCS(setrlimit getdtablesize)
552 553
AC_FUNC_GETPGRP
AC_CHECK_FUNCS(syslog)
554

555 556 557 558 559 560 561 562 563 564
# HP-UX doesn't have seteuid
AC_CHECK_FUNCS(seteuid setresuid)

AH_BOTTOM(
[#if !HAVE_SETEUID
# if HAVE_SETRESUID
#  define seteuid(uid) setresuid(-1, (uid), -1)
# endif
#endif])

565
# FIXME: Is there a better way in autoconf 2.50?
566 567 568 569 570 571 572 573 574
AC_CACHE_CHECK([if netdb.h defines AI_NUMERICHOST],
  lsh_cv_sys_ai_numerichost,
  [AC_EGREP_CPP(yes,
    [#include <netdb.h>
     #ifdef AI_NUMERICHOST
     yes
     #endif
    ], lsh_cv_sys_ai_numerichost=yes,
       lsh_cv_sys_ai_numerichost=no)])
575 576

AH_TEMPLATE([HAVE_AI_NUMERICHOST], [Define if AI_NUMERICHOST exists])
577 578 579 580
if test x$lsh_cv_sys_ai_numerichost = xyes ; then
  AC_DEFINE(HAVE_AI_NUMERICHOST)
fi

581
# Test if the libc includes a good enough argp.
582
# FIXME: Doesn't check for the argp-help bug.
583
if test x$with_system_argp = xyes ; then
584
  LSH_LIB_ARGP(,with_system_argp=no)
585 586
fi

587 588 589
# We don't use LIBOBJS for this, as the LIBOBJS are added to
# liblsh.a, and we can't add an archive to an archive.
LIBARGP=""
590
DOTDOT_LIBARGP=""
591
if test x$with_system_argp = xno ; then
Niels Möller's avatar
Niels Möller committed
592
  # FIXME: Perhaps it's better to use an absolute path?
593
  LIBARGP="argp/libargp.a"
594 595
  # Needed for linking in src/testsuite.
  DOTDOT_LIBARGP="../argp/libargp.a"
596
fi
597

598
AC_SUBST(LIBARGP)
599
AC_SUBST(DOTDOT_LIBARGP)
600

601
# Check for broken shutdown
602 603
AC_CACHE_CHECK(for working shutdown on AF_UNIX sockets,
	       lsh_cv_func_shutdown_works_on_unix_sockets,
604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630
[
AC_TRY_RUN([
#include <stdio.h>

#include <errno.h>

#include <sys/types.h>
#include <sys/socket.h>

#include <signal.h>

#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif

/* Creates a one-way socket connection. Returns 1 on success, 0 on
 * failure. fds[0] is for reading, fds[1] for writing (like for the
 * pipe() system call). */
static int make_pipe(int *fds)
{

#ifndef SHUT_RD
#define SHUT_RD 0
#define SHUT_WR 1
#define SHUT_RDWR 2
#endif

631
  if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) < 0)
632 633 634 635 636 637 638 639
    {
      fprintf(stderr, "socketpair() failed: %s\n", strerror(errno));
      return 0;
    }
  fprintf(stderr, "Created socket pair. Using fd:s %d <-- %d\n", fds[0], fds[1]);

  if(shutdown(fds[0], SHUT_WR) < 0)
    {
640 641
      fprintf(stderr, "shutdown(%d, SHUT_WR) failed: %s\n",
	      fds[0], strerror(errno));
642 643 644 645
      return 0;
    }
  if (shutdown(fds[1], SHUT_RD) < 0)
    {
646 647
      fprintf(stderr, "shutdown(%d, SHUT_RD) failed: %s\n",
	      fds[1], strerror(errno));
648 649 650 651 652 653 654 655 656 657 658 659 660 661 662
      return 0;
    }

  return 1;
}

int main(int argc, char **argv)
{
  int fds[2];
  
  if (!make_pipe(fds))
    exit(1);

  if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
    {
663
      fprintf(stderr, "signal failed.\n");
664 665 666 667 668 669 670 671 672
      exit(1);
    }

  if ( (write(fds[1], "foo", 3) < 0)
       && (errno == EPIPE))
    exit(1);

  exit(0);
}
673 674 675
], lsh_cv_func_shutdown_works_on_unix_sockets=yes,
   lsh_cv_func_shutdown_works_on_unix_sockets=no,
   lsh_cv_func_shutdown_works_on_unix_sockets=yes)])
676

677 678
AH_TEMPLATE([SHUTDOWN_WORKS_WITH_UNIX_SOCKETS],
	    [Define to indicate that shutdown seems to work properly])
679
if test x$lsh_cv_func_shutdown_works_on_unix_sockets = xyes ; then
680 681 682
    AC_DEFINE(SHUTDOWN_WORKS_WITH_UNIX_SOCKETS)
fi

683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740
AC_CACHE_CHECK(
  [for working UNIX98 ptys],
  lsh_cv_sys_unix98_ptys,
  AC_TRY_RUN([
  /* Try to obtain a working UNIX98-style pty master and slave */
  /* Based on example code from the GNU C library documentation */
  #include <stdlib.h>	/* EXIT_FAILURE, EXIT_SUCCESS, ptsname */
  #include <unistd.h>	/* close(2) */
  
  #include <sys/types.h>	/* open(2) */
  #include <sys/stat.h>	/* - " -   */
  #ifdef HAVE_FCNTL_H
  #  include <fcntl.h>	/* - " -   */
  #endif
  #ifdef HAVE_STROPTS_H
  #  include <stropts.h>	/* isastream() */
  #endif
  
  int main(int argc, char* argv[]) {
    int master, slave;
    char *name;
  
    master = open("/dev/ptmx", O_RDWR); /* PTY master multiplex */
    if (master < 0) {
  	  exit(EXIT_FAILURE);
    }
  
    if (grantpt(master) < 0 || unlockpt(master) < 0)
      goto close_master;
    name = ptsname(master);
    if (name == NULL)
      goto close_master;
  
    slave = open(name, O_RDWR);
    if (slave == -1)
      goto close_master;
  
  #ifdef HAVE_STROPTS_H
    if (isastream(slave))
      {
  	if (ioctl(slave, I_PUSH, "ptem") < 0
  	    || ioctl(slave, I_PUSH, "ldterm") < 0)
  	  goto close_slave;
      }
  #endif
  
    exit(0);
  
  close_slave:
    close (slave);
  
  close_master:
    close (master);
    exit(1);
  }
  ],
  [lsh_cv_sys_unix98_ptys=yes],
  [lsh_cv_sys_unix98_ptys=no],
741
  # Pessimistic default for cross compilation.
742 743
  [lsh_cv_sys_unix98_ptys=no]))

744 745
AH_TEMPLATE([HAVE_UNIX98_PTYS],
	    [Define if a we have working UNIX98 pty handling])
746 747
if test x$lsh_cv_sys_unix98_ptys = xyes; then
  AC_DEFINE(HAVE_UNIX98_PTYS)
748 749
else
  AC_MSG_WARN([No support for UNIX98 PTYs. PTY support disabled.])
750
fi
751

Niels Möller's avatar
Niels Möller committed
752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774
# Check that FIONREAD exists, works, and uses an argument of type int, not long.  
AC_CACHE_CHECK(
  [for FIONREAD with int argument],
  lsh_cv_sys_ioctl_fionread_int,
[AC_TRY_RUN([
#include <errno.h>
#include <fcntl.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#if HAVE_SYS_FILIO_H
#include <sys/filio.h>
#endif
int main(int argc, char **argv)
{
#ifdef FIONREAD
  union {
    int i[2];
    long l;
  } val;

  int fds[2];
775
  int res;
Niels Möller's avatar
Niels Möller committed
776 777 778 779 780 781 782 783 784 785

  if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) < 0)
    {
      printf("socketpair failed: errno = %d.\n", errno);
      return 1;
    }
    
  val.i[0] = 0xdeadbeaf;
  val.i[1] = 0xdeadbeaf;

786 787 788 789 790 791 792 793 794 795
  do 
    res = write(fds[1], "xxx", 3);
  while (res < 0 && errno == EINTR);

  if (res != 3)
    {
      printf("write failed: errno = %d.\n", errno);
      return 1;
    }
  
Niels Möller's avatar
Niels Möller committed
796 797 798 799 800
  if (ioctl(fds[0], FIONREAD, val.i) < 0)
    {
      printf("ioctl FIONREAD failed: errno = %d.\n", errno);
      return 1;
    }
801
  if (val.i[0] == 3 && val.i[1] == 0xdeadbeaf)
Niels Möller's avatar
Niels Möller committed
802 803 804 805 806 807 808 809 810 811 812 813 814 815
    return 0;
#endif
  return 1;
}
], lsh_cv_sys_ioctl_fionread_int=yes,
   lsh_cv_sys_ioctl_fionread_int=no,
   lsh_cv_sys_ioctl_fionread_int=no)])

AH_TEMPLATE([HAVE_IOCTL_FIONREAD],
	    [Define if the FIONREAD ioctl works, and uses an argument of type int])
if test x$lsh_cv_sys_ioctl_fionread_int = xyes; then
  AC_DEFINE([HAVE_IOCTL_FIONREAD])
fi

816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043
# Check that credentials passing work
AC_CACHE_CHECK(
  [for credentials passing],
  lsh_cv_sys_ucred_passing,
[AC_TRY_RUN([
/* For CMSG_SPACE and friends on Solaris */
#define _XPG4_2

#include <errno.h>
#include <stdio.h>
#include <string.h>

/* Linux: For struct ucred */
#include <sys/types.h>
#include <sys/socket.h>

/* Solaris ucred support */
#if HAVE_UCRED_H
#include <ucred.h>
#endif

int main (int argc, char **argv)
{
  int pipe[2];
  int type;
  struct msghdr hdr;
  struct cmsghdr *cmsg;
  struct iovec io;
  void *creds_buf;
  size_t creds_size;
  size_t creds_space;
  int controllen;
  char buf[3];
  int res;
  int yes = 1;

#ifdef SO_RECVUCRED
  /* Solaris' ucred passing works with SOCK_DGRAM sockets only */
  type = SOCK_DGRAM;
#else
  type = SOCK_STREAM;
#endif
  if (socketpair(AF_UNIX, type, 0, pipe) < 0)
    {
      printf("socketpair failed: errno = %d.\n", errno);
      return 1;
    }

#if defined (SO_PASSCRED)
  /* For Linux */
  if (setsockopt(pipe[1], SOL_SOCKET, SO_PASSCRED,
  		   &yes, sizeof(yes)) < 0)
    {
      printf("setsockopt SO_PASSCRED failed: %d.\n", errno);
      return 1;
    }
#elif defined (SO_RECVUCRED)
  /* Solaris */
  if (setsockopt(pipe[1], SOL_SOCKET, SO_RECVUCRED,
  		   &yes, sizeof(yes)) < 0)
    {
      printf("setsockopt SO_RECVUCRED failed: %d.\n", errno);
      return 1;
    }
#endif

#ifdef SCM_CREDENTIALS
  creds_size = sizeof(struct ucred);
#else
  creds_size = 0;
#endif

  creds_space = CMSG_SPACE(creds_size);
  creds_buf = malloc(creds_space);
  if (creds_space && !creds_buf)
    {
      printf("malloc failed\n");
      return 1;
    }

  io.iov_base = (void *) "foo";
  io.iov_len = 3;
  
  hdr.msg_name = NULL;
  hdr.msg_namelen = 0;
  hdr.msg_iov = &io;
  hdr.msg_iovlen = 1;
  hdr.msg_controllen = creds_space;
  hdr.msg_control = creds_buf;

#ifdef SCM_CREDENTIALS
  /* Linux style credentials */
  cmsg = CMSG_FIRSTHDR(&hdr);
  
  {
    struct ucred *creds;

    cmsg->cmsg_level = SOL_SOCKET;
    cmsg->cmsg_type = SCM_CREDENTIALS;
    cmsg->cmsg_len = CMSG_LEN(sizeof(*creds));

    creds = (struct ucred *) CMSG_DATA(cmsg);
    creds->pid = getpid();
    creds->uid = getuid();
    creds->gid = getgid();

    hdr.msg_controllen = CMSG_SPACE(sizeof(*creds));
  }
#else
  hdr.msg_controllen = 0;
#endif 

  do
    res = sendmsg(pipe[0], &hdr, 0);
  while (res < 0 && errno == EINTR);

  if (res < 0)
    {
      printf("sendmsg failed: errno = %d.\n", errno);
      return 1;
    }
  
  memset(buf, 0, sizeof(buf));
  if (creds_space)
    memset(creds_buf, 0, creds_space);

  io.iov_base = (void *) buf;
  io.iov_len = sizeof(buf);

  hdr.msg_name = NULL;
  hdr.msg_namelen = 0;
  hdr.msg_iov = &io;
  hdr.msg_iovlen = 1;
  hdr.msg_controllen = creds_space;
  hdr.msg_control = creds_buf;
  
  do
    res = recvmsg(pipe[1], &hdr, 0);
  while (res < 0 && errno == EINTR);

  if (res < 0)
    {
      printf("recvmsg failed: errno = %d.\n", errno);
      return 1;
    }

  if (res != 3)
    {
      printf("recvmsg returned unexpected count\n");
      return 1;
    }

  if (memcmp (buf, "foo", 3) != 0)
    {
      printf("recvmsg returned unexpected data\n");
      return 1;
    }

  /* Process ancillary data */
  for (cmsg = CMSG_FIRSTHDR(&hdr); cmsg; cmsg = CMSG_NXTHDR(&hdr, cmsg))
    {
      pid_t pid;
      uid_t uid;
      gid_t gid;

      if (cmsg->cmsg_level != SOL_SOCKET)
	continue;
      switch (cmsg->cmsg_type)
	{
#if defined (SCM_CREDENTIALS)
	case SCM_CREDENTIALS:
	  {
	    struct ucred *creds;
	    if (cmsg->cmsg_len != CMSG_LEN(sizeof(*creds)))
	      continue;

	    creds = (struct ucred *) CMSG_DATA(cmsg);
	    pid = creds->pid;
	    uid = creds->uid;
	    gid = creds->gid;

	  got_creds:
	    if (pid != getpid())
	      {
	        printf("Received unexpected pid %d\n", (int) pid);
		return 1;
	      }
	    if (uid != getuid())
	      {
	        printf("Received unexpected uid %d\n", (int) uid);
		return 1;
	      }
	    if (gid != getgid())
	      {
	        printf("Received unexpected gid %d\n", (int) gid);
		return 1;
	      }
	    /* Success! */
	    return 0;
	  }
#elif defined (SCM_UCRED)
	case SCM_UCRED:
	  {
	    ucred_t *creds;

	    creds = (ucred_t *) CMSG_DATA(cmsg);
	    pid = ucred_getpid(creds);
	    uid = ucred_geteuid(creds);
	    gid = ucred_getegid(creds);

	    goto got_creds;
	  }	    
#endif
	}
    }
  printf("No creds received.\n");
  return 1;
} 
], lsh_cv_sys_ucred_passing=yes,
   lsh_cv_sys_ucred_passing=no,
   lsh_cv_sys_ucred_passing=no)])

AH_TEMPLATE([HAVE_SOCKET_CREDENTIALS_PASSING],
	    [Define if credentials passing over unix sockets work])
if test x$lsh_cv_sys_ucred_passing = xyes; then
  AC_DEFINE([HAVE_SOCKET_CREDENTIALS_PASSING])
fi

1044
LSH_GCC_ATTRIBUTES
1045

1046
AC_MSG_CHECKING(for BSD pty names)
Niels Möller's avatar
Niels Möller committed
1047

1048 1049 1050 1051 1052
AH_TEMPLATE([PTY_BSD_SCHEME_FIRST_CHARS],
	    [Possible first characters in a /dev/ptyXX name])
AH_TEMPLATE([PTY_BSD_SCHEME_SECOND_CHARS],
	    [Possible second characters in a /dev/ptyXX name])

1053
# FIXME: What is most portable, tr -d '\n' or tr -d '\012' ?
1054 1055
AC_DEFINE_UNQUOTED(PTY_BSD_SCHEME_FIRST_CHARS, "`ls /dev/pty* | cut -c 9-9 | uniq | tr -d '\n'`")
AC_DEFINE_UNQUOTED(PTY_BSD_SCHEME_SECOND_CHARS, "`ls /dev/pty* | cut -c 10-10 | sort | uniq | tr -d '\n'`")
1056

1057
# FIXME: How can we test if the bsd scheme is likely to work?
1058
AH_TEMPLATE([PTY_BSD_SCHEME], [Traditional BSD pty handling])
1059 1060 1061
AC_DEFINE(PTY_BSD_SCHEME)
AC_MSG_RESULT([done])

1062
# IPv6 support
1063 1064

if test x$enable_ipv6 = xyes ; then
1065
  if test x$ac_cv_func_getaddrinfo != xyes ; then
1066 1067
    AC_MSG_WARN([getaddrinfo not found. Disabling IPv6 support])
    enable_ipv6=no
1068
  elif test x$ac_cv_func_gai_strerror != xyes ; then
1069 1070
    AC_MSG_WARN([gai_strerror not found. Disabling IPv6 support])
    enable_ipv6=no
1071
  elif test x$lsh_cv_sys_ai_numerichost != xyes ; then
1072 1073
    AC_MSG_WARN([AI_NUMERICHOST not defined. Disabling IPv6 support])
    enable_ipv6=no
1074 1075 1076
  fi
fi

1077
AH_TEMPLATE([WITH_IPV6], [For Ipv6 support])
1078
if test x$enable_ipv6 = xyes ; then
1079 1080 1081
  AC_DEFINE(WITH_IPV6)
fi

1082
AC_CONFIG_SUBDIRS(src/argp)
1083
AC_CONFIG_SUBDIRS(src/nettle)
1084
AC_CONFIG_SUBDIRS(src/spki)
1085
AC_CONFIG_SUBDIRS(src/sftp)
1086

1087 1088
# Set these flags *last*, or else the test programs won't compile
if test x$GCC = xyes ; then
1089 1090 1091 1092 1093 1094
  # Using -ggdb3 makes (some versions of) Redhat's gcc-2.96 dump core
  if "$CC" --version | grep '^2\.96$' 1>/dev/null 2>&1; then
    true
  else
    CFLAGS="$CFLAGS -ggdb3"
  fi
1095
  # FIXME: It would be better to actually test if this option works and/or is needed.
Niels Möller's avatar
Niels Möller committed
1096
  # Or perhaps use -funsigned-char.
1097 1098 1099
  if "$CC" --version | grep 'gcc.* 4\.' 1>/dev/null 2>&1; then
    CFLAGS="$CFLAGS -Wno-pointer-sign"
  fi
1100 1101 1102
  CFLAGS="$CFLAGS -Wall -W \
  -Wmissing-prototypes -Wmissing-declarations -Wstrict-prototypes \
  -Wpointer-arith -Wbad-function-cast -Wnested-externs"
1103

1104 1105
# Don't enable -Wcast-align as it results in tons of warnings in the
# DES code. And when using stdio.
1106 1107
# Don't enable -Waggregate-return, as that causes warnings for glibc
# inttypes.h.
1108

1109
fi
Niels Möller's avatar
Niels Möller committed
1110

Niels Möller's avatar
Niels Möller committed
1111
# Used by contrib/solpkg.sh.in.
1112 1113 1114 1115
AC_SUBST(BUILD_ARCH, `uname -p`)
AC_SUBST(BUILD_OSSYS,`uname -s`)
AC_SUBST(BUILD_OSREV,`uname -r`)

1116
AC_CONFIG_FILES([Makefile doc/Makefile misc/Makefile
1117
	  src/Makefile src/scm/Makefile
1118
	  src/testsuite/Makefile src/rsync/Makefile
1119
	  contrib/Makefile contrib/lsh.spec contrib/solpkg.sh])
1120
AC_OUTPUT