1dnl OpenSSH-specific autoconf macros
2dnl
3
4dnl OSSH_CHECK_CFLAG_COMPILE(check_flag[, define_flag])
5dnl Check that $CC accepts a flag 'check_flag'. If it is supported append
6dnl 'define_flag' to $CFLAGS. If 'define_flag' is not specified, then append
7dnl 'check_flag'.
8AC_DEFUN([OSSH_CHECK_CFLAG_COMPILE], [{
9	AC_MSG_CHECKING([if $CC supports compile flag $1])
10	saved_CFLAGS="$CFLAGS"
11	CFLAGS="$CFLAGS $WERROR $1"
12	_define_flag="$2"
13	test "x$_define_flag" = "x" && _define_flag="$1"
14	AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
15#include <stdlib.h>
16#include <stdio.h>
17int main(int argc, char **argv) {
18	/* Some math to catch -ftrapv problems in the toolchain */
19	int i = 123 * argc, j = 456 + argc, k = 789 - argc;
20	float l = i * 2.1;
21	double m = l / 0.5;
22	long long int n = argc * 12345LL, o = 12345LL * (long long int)argc;
23	printf("%d %d %d %f %f %lld %lld\n", i, j, k, l, m, n, o);
24	exit(0);
25}
26	]])],
27		[
28if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null
29then
30		AC_MSG_RESULT([no])
31		CFLAGS="$saved_CFLAGS"
32else
33		AC_MSG_RESULT([yes])
34		 CFLAGS="$saved_CFLAGS $_define_flag"
35fi],
36		[ AC_MSG_RESULT([no])
37		  CFLAGS="$saved_CFLAGS" ]
38	)
39}])
40
41dnl OSSH_CHECK_CFLAG_LINK(check_flag[, define_flag])
42dnl Check that $CC accepts a flag 'check_flag'. If it is supported append
43dnl 'define_flag' to $CFLAGS. If 'define_flag' is not specified, then append
44dnl 'check_flag'.
45AC_DEFUN([OSSH_CHECK_CFLAG_LINK], [{
46	AC_MSG_CHECKING([if $CC supports compile flag $1 and linking succeeds])
47	saved_CFLAGS="$CFLAGS"
48	CFLAGS="$CFLAGS $WERROR $1"
49	_define_flag="$2"
50	test "x$_define_flag" = "x" && _define_flag="$1"
51	AC_LINK_IFELSE([AC_LANG_SOURCE([[
52#include <stdlib.h>
53#include <stdio.h>
54int main(int argc, char **argv) {
55	/* Some math to catch -ftrapv problems in the toolchain */
56	int i = 123 * argc, j = 456 + argc, k = 789 - argc;
57	float l = i * 2.1;
58	double m = l / 0.5;
59	long long int n = argc * 12345LL, o = 12345LL * (long long int)argc;
60	long long int p = n * o;
61	printf("%d %d %d %f %f %lld %lld %lld\n", i, j, k, l, m, n, o, p);
62	exit(0);
63}
64	]])],
65		[
66if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null
67then
68		AC_MSG_RESULT([no])
69		CFLAGS="$saved_CFLAGS"
70else
71		AC_MSG_RESULT([yes])
72		 CFLAGS="$saved_CFLAGS $_define_flag"
73fi],
74		[ AC_MSG_RESULT([no])
75		  CFLAGS="$saved_CFLAGS" ]
76	)
77}])
78
79dnl OSSH_CHECK_LDFLAG_LINK(check_flag[, define_flag])
80dnl Check that $LD accepts a flag 'check_flag'. If it is supported append
81dnl 'define_flag' to $LDFLAGS. If 'define_flag' is not specified, then append
82dnl 'check_flag'.
83AC_DEFUN([OSSH_CHECK_LDFLAG_LINK], [{
84	AC_MSG_CHECKING([if $LD supports link flag $1])
85	saved_LDFLAGS="$LDFLAGS"
86	LDFLAGS="$LDFLAGS $WERROR $1"
87	_define_flag="$2"
88	test "x$_define_flag" = "x" && _define_flag="$1"
89	AC_LINK_IFELSE([AC_LANG_SOURCE([[
90#include <stdlib.h>
91#include <stdio.h>
92int main(int argc, char **argv) {
93	/* Some math to catch -ftrapv problems in the toolchain */
94	int i = 123 * argc, j = 456 + argc, k = 789 - argc;
95	float l = i * 2.1;
96	double m = l / 0.5;
97	long long int n = argc * 12345LL, o = 12345LL * (long long int)argc;
98	long long p = n * o;
99	printf("%d %d %d %f %f %lld %lld %lld\n", i, j, k, l, m, n, o, p);
100	exit(0);
101}
102		]])],
103		[
104if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null
105then
106		  AC_MSG_RESULT([no])
107		  LDFLAGS="$saved_LDFLAGS"
108else
109		  AC_MSG_RESULT([yes])
110		  LDFLAGS="$saved_LDFLAGS $_define_flag"
111fi		],
112		[ AC_MSG_RESULT([no])
113		  LDFLAGS="$saved_LDFLAGS" ]
114	)
115}])
116
117dnl OSSH_CHECK_HEADER_FOR_FIELD(field, header, symbol)
118dnl Does AC_EGREP_HEADER on 'header' for the string 'field'
119dnl If found, set 'symbol' to be defined. Cache the result.
120dnl TODO: This is not foolproof, better to compile and read from there
121AC_DEFUN(OSSH_CHECK_HEADER_FOR_FIELD, [
122# look for field '$1' in header '$2'
123	dnl This strips characters illegal to m4 from the header filename
124	ossh_safe=`echo "$2" | sed 'y%./+-%__p_%'`
125	dnl
126	ossh_varname="ossh_cv_$ossh_safe""_has_"$1
127	AC_MSG_CHECKING(for $1 field in $2)
128	AC_CACHE_VAL($ossh_varname, [
129		AC_EGREP_HEADER($1, $2, [ dnl
130			eval "$ossh_varname=yes" dnl
131		], [ dnl
132			eval "$ossh_varname=no" dnl
133		]) dnl
134	])
135	ossh_result=`eval 'echo $'"$ossh_varname"`
136	if test -n "`echo $ossh_varname`"; then
137		AC_MSG_RESULT($ossh_result)
138		if test "x$ossh_result" = "xyes"; then
139			AC_DEFINE($3, 1, [Define if you have $1 in $2])
140		fi
141	else
142		AC_MSG_RESULT(no)
143	fi
144])
145
146dnl Check for socklen_t: historically on BSD it is an int, and in
147dnl POSIX 1g it is a type of its own, but some platforms use different
148dnl types for the argument to getsockopt, getpeername, etc.  So we
149dnl have to test to find something that will work.
150AC_DEFUN([TYPE_SOCKLEN_T],
151[
152   AC_CHECK_TYPE([socklen_t], ,[
153      AC_MSG_CHECKING([for socklen_t equivalent])
154      AC_CACHE_VAL([curl_cv_socklen_t_equiv],
155      [
156	 # Systems have either "struct sockaddr *" or
157	 # "void *" as the second argument to getpeername
158	 curl_cv_socklen_t_equiv=
159	 for arg2 in "struct sockaddr" void; do
160	    for t in int size_t unsigned long "unsigned long"; do
161	       AC_TRY_COMPILE([
162		  #include <sys/types.h>
163		  #include <sys/socket.h>
164
165		  int getpeername (int, $arg2 *, $t *);
166	       ],[
167		  $t len;
168		  getpeername(0,0,&len);
169	       ],[
170		  curl_cv_socklen_t_equiv="$t"
171		  break
172	       ])
173	    done
174	 done
175
176	 if test "x$curl_cv_socklen_t_equiv" = x; then
177	    AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
178	 fi
179      ])
180      AC_MSG_RESULT($curl_cv_socklen_t_equiv)
181      AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv,
182			[type to use in place of socklen_t if not defined])],
183      [#include <sys/types.h>
184#include <sys/socket.h>])
185])
186
187