~zulcss/samba/server-dailies-3.4

« back to all changes in this revision

Viewing changes to lib/replace/libreplace_network.m4

  • Committer: Chuck Short
  • Date: 2010-09-28 20:38:39 UTC
  • Revision ID: zulcss@ubuntu.com-20100928203839-pgjulytsi9ue63x1
Initial version

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
AC_DEFUN_ONCE(AC_LIBREPLACE_NETWORK_CHECKS,
 
2
[
 
3
echo "LIBREPLACE_NETWORK_CHECKS: START"
 
4
 
 
5
AC_DEFINE(LIBREPLACE_NETWORK_CHECKS, 1, [LIBREPLACE_NETWORK_CHECKS were used])
 
6
LIBREPLACE_NETWORK_OBJS=""
 
7
LIBREPLACE_NETWORK_LIBS=""
 
8
 
 
9
AC_CHECK_HEADERS(sys/socket.h netinet/in.h netdb.h arpa/inet.h)
 
10
AC_CHECK_HEADERS(netinet/in_systm.h)
 
11
AC_CHECK_HEADERS([netinet/ip.h], [], [],[
 
12
        #include <sys/types.h>
 
13
        #ifdef HAVE_NETINET_IN_H
 
14
        #include <netinet/in.h>
 
15
        #endif
 
16
        #ifdef HAVE_NETINET_IN_SYSTM_H
 
17
        #include <netinet/in_systm.h>
 
18
        #endif
 
19
])
 
20
AC_CHECK_HEADERS(netinet/tcp.h netinet/in_ip.h)
 
21
AC_CHECK_HEADERS(sys/sockio.h sys/un.h)
 
22
AC_CHECK_HEADERS(sys/uio.h)
 
23
 
 
24
dnl we need to check that net/if.h really can be used, to cope with hpux
 
25
dnl where including it always fails
 
26
AC_CACHE_CHECK([for usable net/if.h],libreplace_cv_USABLE_NET_IF_H,[
 
27
        AC_COMPILE_IFELSE([AC_LANG_SOURCE([
 
28
                AC_INCLUDES_DEFAULT
 
29
                #if HAVE_SYS_SOCKET_H
 
30
                # include <sys/socket.h>
 
31
                #endif
 
32
                #include <net/if.h>
 
33
                int main(void) {return 0;}])],
 
34
                [libreplace_cv_USABLE_NET_IF_H=yes],
 
35
                [libreplace_cv_USABLE_NET_IF_H=no]
 
36
        )
 
37
])
 
38
if test x"$libreplace_cv_USABLE_NET_IF_H" = x"yes";then
 
39
        AC_DEFINE(HAVE_NET_IF_H, 1, usability of net/if.h)
 
40
fi
 
41
 
 
42
AC_HAVE_TYPE([socklen_t],[#include <sys/socket.h>])
 
43
AC_HAVE_TYPE([sa_family_t],[#include <sys/socket.h>])
 
44
AC_HAVE_TYPE([struct addrinfo], [#include <netdb.h>])
 
45
AC_HAVE_TYPE([struct sockaddr], [#include <sys/socket.h>])
 
46
AC_HAVE_TYPE([struct sockaddr_storage], [
 
47
#include <sys/socket.h>
 
48
#include <sys/types.h>
 
49
#include <netinet/in.h>
 
50
])
 
51
AC_HAVE_TYPE([struct sockaddr_in6], [
 
52
#include <sys/socket.h>
 
53
#include <sys/types.h>
 
54
#include <netinet/in.h>
 
55
])
 
56
 
 
57
if test x"$ac_cv_type_struct_sockaddr_storage" = x"yes"; then
 
58
AC_CHECK_MEMBER(struct sockaddr_storage.ss_family,
 
59
                AC_DEFINE(HAVE_SS_FAMILY, 1, [Defined if struct sockaddr_storage has ss_family field]),,
 
60
                [
 
61
#include <sys/socket.h>
 
62
#include <sys/types.h>
 
63
#include <netinet/in.h>
 
64
                ])
 
65
 
 
66
if test x"$ac_cv_member_struct_sockaddr_storage_ss_family" != x"yes"; then
 
67
AC_CHECK_MEMBER(struct sockaddr_storage.__ss_family,
 
68
                AC_DEFINE(HAVE___SS_FAMILY, 1, [Defined if struct sockaddr_storage has __ss_family field]),,
 
69
                [
 
70
#include <sys/socket.h>
 
71
#include <sys/types.h>
 
72
#include <netinet/in.h>
 
73
                ])
 
74
fi
 
75
fi
 
76
 
 
77
AC_CACHE_CHECK([for sin_len in sock],libreplace_cv_HAVE_SOCK_SIN_LEN,[
 
78
        AC_TRY_COMPILE(
 
79
                [
 
80
#include <sys/types.h>
 
81
#include <sys/socket.h>
 
82
#include <netinet/in.h>
 
83
                ],[
 
84
struct sockaddr_in sock; sock.sin_len = sizeof(sock);
 
85
                ],[
 
86
                libreplace_cv_HAVE_SOCK_SIN_LEN=yes
 
87
                ],[
 
88
                libreplace_cv_HAVE_SOCK_SIN_LEN=no
 
89
                ])
 
90
])
 
91
if test x"$libreplace_cv_HAVE_SOCK_SIN_LEN" = x"yes"; then
 
92
        AC_DEFINE(HAVE_SOCK_SIN_LEN,1,[Whether the sockaddr_in struct has a sin_len property])
 
93
fi
 
94
 
 
95
############################################
 
96
# check for unix domain sockets
 
97
AC_CACHE_CHECK([for unix domain sockets],libreplace_cv_HAVE_UNIXSOCKET,[
 
98
        AC_TRY_COMPILE([
 
99
#include <sys/types.h>
 
100
#include <stdlib.h>
 
101
#include <stddef.h>
 
102
#include <sys/socket.h>
 
103
#include <sys/un.h>
 
104
                ],[
 
105
struct sockaddr_un sunaddr;
 
106
sunaddr.sun_family = AF_UNIX;
 
107
                ],[
 
108
                libreplace_cv_HAVE_UNIXSOCKET=yes
 
109
                ],[
 
110
                libreplace_cv_HAVE_UNIXSOCKET=no
 
111
                ])
 
112
])
 
113
if test x"$libreplace_cv_HAVE_UNIXSOCKET" = x"yes"; then
 
114
        AC_DEFINE(HAVE_UNIXSOCKET,1,[If we need to build with unixscoket support])
 
115
fi
 
116
 
 
117
dnl The following test is roughl taken from the cvs sources.
 
118
dnl
 
119
dnl If we can't find connect, try looking in -lsocket, -lnsl, and -linet.
 
120
dnl The Irix 5 libc.so has connect and gethostbyname, but Irix 5 also has
 
121
dnl libsocket.so which has a bad implementation of gethostbyname (it
 
122
dnl only looks in /etc/hosts), so we only look for -lsocket if we need
 
123
dnl it.
 
124
AC_CHECK_FUNCS(connect)
 
125
if test x"$ac_cv_func_connect" = x"no"; then
 
126
        AC_CHECK_LIB_EXT(nsl_s, LIBREPLACE_NETWORK_LIBS, connect)
 
127
        AC_CHECK_LIB_EXT(nsl, LIBREPLACE_NETWORK_LIBS, connect)
 
128
        AC_CHECK_LIB_EXT(socket, LIBREPLACE_NETWORK_LIBS, connect)
 
129
        AC_CHECK_LIB_EXT(inet, LIBREPLACE_NETWORK_LIBS, connect)
 
130
        dnl We can't just call AC_CHECK_FUNCS(connect) here,
 
131
        dnl because the value has been cached.
 
132
        if test x"$ac_cv_lib_ext_nsl_s_connect" = x"yes" ||
 
133
                test x"$ac_cv_lib_ext_nsl_connect" = x"yes" ||
 
134
                test x"$ac_cv_lib_ext_socket_connect" = x"yes" ||
 
135
                test x"$ac_cv_lib_ext_inet_connect" = x"yes"
 
136
        then
 
137
                AC_DEFINE(HAVE_CONNECT,1,[Whether the system has connect()])
 
138
        fi
 
139
fi
 
140
 
 
141
AC_CHECK_FUNCS(gethostbyname)
 
142
if test x"$ac_cv_func_gethostbyname" = x"no"; then
 
143
        AC_CHECK_LIB_EXT(nsl_s, LIBREPLACE_NETWORK_LIBS, gethostbyname)
 
144
        AC_CHECK_LIB_EXT(nsl, LIBREPLACE_NETWORK_LIBS, gethostbyname)
 
145
        AC_CHECK_LIB_EXT(socket, LIBREPLACE_NETWORK_LIBS, gethostbyname)
 
146
        dnl We can't just call AC_CHECK_FUNCS(gethostbyname) here,
 
147
        dnl because the value has been cached.
 
148
        if test x"$ac_cv_lib_ext_nsl_s_gethostbyname" = x"yes" ||
 
149
                test x"$ac_cv_lib_ext_nsl_gethostbyname" = x"yes" ||
 
150
                test x"$ac_cv_lib_ext_socket_gethostbyname" = x"yes"
 
151
        then
 
152
                AC_DEFINE(HAVE_GETHOSTBYNAME,1,
 
153
                          [Whether the system has gethostbyname()])
 
154
        fi
 
155
fi
 
156
 
 
157
dnl HP-UX has if_nametoindex in -lipv6
 
158
AC_CHECK_FUNCS(if_nametoindex)
 
159
if test x"$ac_cv_func_if_nametoindex" = x"no"; then
 
160
        AC_CHECK_LIB_EXT(ipv6, LIBREPLACE_NETWORK_LIBS, if_nametoindex)
 
161
        dnl We can't just call AC_CHECK_FUNCS(if_nametoindex) here,
 
162
        dnl because the value has been cached.
 
163
        if test x"$ac_cv_lib_ext_ipv6_if_nametoindex" = x"yes"
 
164
        then
 
165
                AC_DEFINE(HAVE_IF_NAMETOINDEX, 1,
 
166
                          [Whether the system has if_nametoindex()])
 
167
        fi
 
168
fi
 
169
 
 
170
# The following tests need LIBS="${LIBREPLACE_NETWORK_LIBS}"
 
171
old_LIBS=$LIBS
 
172
LIBS="${LIBREPLACE_NETWORK_LIBS}"
 
173
libreplace_SAVE_CPPFLAGS="$CPPFLAGS"
 
174
CPPFLAGS="$CPPFLAGS -I$libreplacedir"
 
175
 
 
176
AC_CHECK_FUNCS(socketpair,[],[LIBREPLACE_NETWORK_OBJS="${LIBREPLACE_NETWORK_OBJS} socketpair.o"])
 
177
 
 
178
AC_CACHE_CHECK([for broken inet_ntoa],libreplace_cv_REPLACE_INET_NTOA,[
 
179
AC_TRY_RUN([
 
180
#include <stdio.h>
 
181
#include <unistd.h>
 
182
#include <sys/types.h>
 
183
#include <netinet/in.h>
 
184
#ifdef HAVE_ARPA_INET_H
 
185
#include <arpa/inet.h>
 
186
#endif
 
187
main() { struct in_addr ip; ip.s_addr = 0x12345678;
 
188
if (strcmp(inet_ntoa(ip),"18.52.86.120") &&
 
189
    strcmp(inet_ntoa(ip),"120.86.52.18")) { exit(0); }
 
190
exit(1);}],
 
191
           libreplace_cv_REPLACE_INET_NTOA=yes,libreplace_cv_REPLACE_INET_NTOA=no,libreplace_cv_REPLACE_INET_NTOA=cross)])
 
192
 
 
193
AC_CHECK_FUNCS(inet_ntoa,[],[libreplace_cv_REPLACE_INET_NTOA=yes])
 
194
if test x"$libreplace_cv_REPLACE_INET_NTOA" = x"yes"; then
 
195
    AC_DEFINE(REPLACE_INET_NTOA,1,[Whether inet_ntoa should be replaced])
 
196
    LIBREPLACE_NETWORK_OBJS="${LIBREPLACE_NETWORK_OBJS} inet_ntoa.o"
 
197
fi
 
198
 
 
199
AC_CHECK_FUNCS(inet_aton,[],[LIBREPLACE_NETWORK_OBJS="${LIBREPLACE_NETWORK_OBJS} inet_aton.o"])
 
200
 
 
201
AC_CHECK_FUNCS(inet_ntop,[],[LIBREPLACE_NETWORK_OBJS="${LIBREPLACE_NETWORK_OBJS} inet_ntop.o"])
 
202
 
 
203
AC_CHECK_FUNCS(inet_pton,[],[LIBREPLACE_NETWORK_OBJS="${LIBREPLACE_NETWORK_OBJS} inet_pton.o"])
 
204
 
 
205
dnl test for getaddrinfo/getnameinfo
 
206
AC_CACHE_CHECK([for getaddrinfo],libreplace_cv_HAVE_GETADDRINFO,[
 
207
AC_TRY_LINK([
 
208
#include <sys/types.h>
 
209
#if STDC_HEADERS
 
210
#include <stdlib.h>
 
211
#include <stddef.h>
 
212
#endif
 
213
#include <sys/socket.h>
 
214
#include <netdb.h>],
 
215
[
 
216
struct sockaddr sa;
 
217
struct addrinfo *ai = NULL;
 
218
int ret = getaddrinfo(NULL, NULL, NULL, &ai);
 
219
if (ret != 0) {
 
220
        const char *es = gai_strerror(ret);
 
221
}
 
222
freeaddrinfo(ai);
 
223
ret = getnameinfo(&sa, sizeof(sa),
 
224
                NULL, 0,
 
225
                NULL, 0, 0);
 
226
 
 
227
],
 
228
libreplace_cv_HAVE_GETADDRINFO=yes,libreplace_cv_HAVE_GETADDRINFO=no)])
 
229
if test x"$libreplace_cv_HAVE_GETADDRINFO" = x"yes"; then
 
230
        AC_DEFINE(HAVE_GETADDRINFO,1,[Whether the system has getaddrinfo])
 
231
        AC_DEFINE(HAVE_GETNAMEINFO,1,[Whether the system has getnameinfo])
 
232
        AC_DEFINE(HAVE_FREEADDRINFO,1,[Whether the system has freeaddrinfo])
 
233
        AC_DEFINE(HAVE_GAI_STRERROR,1,[Whether the system has gai_strerror])
 
234
else
 
235
        LIBREPLACE_NETWORK_OBJS="${LIBREPLACE_NETWORK_OBJS} getaddrinfo.o"
 
236
fi
 
237
 
 
238
AC_CHECK_HEADERS([ifaddrs.h])
 
239
 
 
240
dnl Used when getifaddrs is not available
 
241
AC_CHECK_MEMBERS([struct sockaddr.sa_len], 
 
242
         [AC_DEFINE(HAVE_SOCKADDR_SA_LEN, 1, [Whether struct sockaddr has a sa_len member])],
 
243
         [],
 
244
         [#include <sys/socket.h>])
 
245
 
 
246
dnl test for getifaddrs and freeifaddrs
 
247
AC_CACHE_CHECK([for getifaddrs and freeifaddrs],libreplace_cv_HAVE_GETIFADDRS,[
 
248
AC_TRY_LINK([
 
249
#include <sys/types.h>
 
250
#if STDC_HEADERS
 
251
#include <stdlib.h>
 
252
#include <stddef.h>
 
253
#endif
 
254
#include <sys/socket.h>
 
255
#include <netinet/in.h>
 
256
#include <arpa/inet.h>
 
257
#include <ifaddrs.h>
 
258
#include <netdb.h>],
 
259
[
 
260
struct ifaddrs *ifp = NULL;
 
261
int ret = getifaddrs (&ifp);
 
262
freeifaddrs(ifp);
 
263
],
 
264
libreplace_cv_HAVE_GETIFADDRS=yes,libreplace_cv_HAVE_GETIFADDRS=no)])
 
265
if test x"$libreplace_cv_HAVE_GETIFADDRS" = x"yes"; then
 
266
    AC_DEFINE(HAVE_GETIFADDRS,1,[Whether the system has getifaddrs])
 
267
    AC_DEFINE(HAVE_FREEIFADDRS,1,[Whether the system has freeifaddrs])
 
268
        AC_DEFINE(HAVE_STRUCT_IFADDRS,1,[Whether struct ifaddrs is available])
 
269
fi
 
270
 
 
271
##################
 
272
# look for a method of finding the list of network interfaces
 
273
iface=no;
 
274
AC_CACHE_CHECK([for iface getifaddrs],libreplace_cv_HAVE_IFACE_GETIFADDRS,[
 
275
AC_TRY_RUN([
 
276
#define HAVE_IFACE_GETIFADDRS 1
 
277
#define NO_CONFIG_H 1
 
278
#define AUTOCONF_TEST 1
 
279
#define SOCKET_WRAPPER_NOT_REPLACE
 
280
#include "$libreplacedir/replace.c"
 
281
#include "$libreplacedir/inet_ntop.c"
 
282
#include "$libreplacedir/snprintf.c"
 
283
#include "$libreplacedir/getifaddrs.c"
 
284
#define getifaddrs_test main
 
285
#include "$libreplacedir/test/getifaddrs.c"],
 
286
           libreplace_cv_HAVE_IFACE_GETIFADDRS=yes,libreplace_cv_HAVE_IFACE_GETIFADDRS=no,libreplace_cv_HAVE_IFACE_GETIFADDRS=cross)])
 
287
if test x"$libreplace_cv_HAVE_IFACE_GETIFADDRS" = x"yes"; then
 
288
    iface=yes;AC_DEFINE(HAVE_IFACE_GETIFADDRS,1,[Whether iface getifaddrs is available])
 
289
else
 
290
        LIBREPLACE_NETWORK_OBJS="${LIBREPLACE_NETWORK_OBJS} getifaddrs.o"
 
291
fi
 
292
 
 
293
 
 
294
if test $iface = no; then
 
295
AC_CACHE_CHECK([for iface AIX],libreplace_cv_HAVE_IFACE_AIX,[
 
296
AC_TRY_RUN([
 
297
#define HAVE_IFACE_AIX 1
 
298
#define NO_CONFIG_H 1
 
299
#define AUTOCONF_TEST 1
 
300
#undef _XOPEN_SOURCE_EXTENDED
 
301
#define SOCKET_WRAPPER_NOT_REPLACE
 
302
#include "$libreplacedir/replace.c"
 
303
#include "$libreplacedir/inet_ntop.c"
 
304
#include "$libreplacedir/snprintf.c"
 
305
#include "$libreplacedir/getifaddrs.c"
 
306
#define getifaddrs_test main
 
307
#include "$libreplacedir/test/getifaddrs.c"],
 
308
           libreplace_cv_HAVE_IFACE_AIX=yes,libreplace_cv_HAVE_IFACE_AIX=no,libreplace_cv_HAVE_IFACE_AIX=cross)])
 
309
if test x"$libreplace_cv_HAVE_IFACE_AIX" = x"yes"; then
 
310
    iface=yes;AC_DEFINE(HAVE_IFACE_AIX,1,[Whether iface AIX is available])
 
311
fi
 
312
fi
 
313
 
 
314
 
 
315
if test $iface = no; then
 
316
AC_CACHE_CHECK([for iface ifconf],libreplace_cv_HAVE_IFACE_IFCONF,[
 
317
AC_TRY_RUN([
 
318
#define HAVE_IFACE_IFCONF 1
 
319
#define NO_CONFIG_H 1
 
320
#define AUTOCONF_TEST 1
 
321
#define SOCKET_WRAPPER_NOT_REPLACE
 
322
#include "$libreplacedir/replace.c"
 
323
#include "$libreplacedir/inet_ntop.c"
 
324
#include "$libreplacedir/snprintf.c"
 
325
#include "$libreplacedir/getifaddrs.c"
 
326
#define getifaddrs_test main
 
327
#include "$libreplacedir/test/getifaddrs.c"],
 
328
           libreplace_cv_HAVE_IFACE_IFCONF=yes,libreplace_cv_HAVE_IFACE_IFCONF=no,libreplace_cv_HAVE_IFACE_IFCONF=cross)])
 
329
if test x"$libreplace_cv_HAVE_IFACE_IFCONF" = x"yes"; then
 
330
    iface=yes;AC_DEFINE(HAVE_IFACE_IFCONF,1,[Whether iface ifconf is available])
 
331
fi
 
332
fi
 
333
 
 
334
if test $iface = no; then
 
335
AC_CACHE_CHECK([for iface ifreq],libreplace_cv_HAVE_IFACE_IFREQ,[
 
336
AC_TRY_RUN([
 
337
#define HAVE_IFACE_IFREQ 1
 
338
#define NO_CONFIG_H 1
 
339
#define AUTOCONF_TEST 1
 
340
#define SOCKET_WRAPPER_NOT_REPLACE
 
341
#include "$libreplacedir/replace.c"
 
342
#include "$libreplacedir/inet_ntop.c"
 
343
#include "$libreplacedir/snprintf.c"
 
344
#include "$libreplacedir/getifaddrs.c"
 
345
#define getifaddrs_test main
 
346
#include "$libreplacedir/test/getifaddrs.c"],
 
347
           libreplace_cv_HAVE_IFACE_IFREQ=yes,libreplace_cv_HAVE_IFACE_IFREQ=no,libreplace_cv_HAVE_IFACE_IFREQ=cross)])
 
348
if test x"$libreplace_cv_HAVE_IFACE_IFREQ" = x"yes"; then
 
349
    iface=yes;AC_DEFINE(HAVE_IFACE_IFREQ,1,[Whether iface ifreq is available])
 
350
fi
 
351
fi
 
352
 
 
353
dnl test for ipv6
 
354
AC_CACHE_CHECK([for ipv6 support],libreplace_cv_HAVE_IPV6,[
 
355
        AC_TRY_LINK([
 
356
#include <stdlib.h> /* for NULL */
 
357
#include <sys/socket.h>
 
358
#include <sys/types.h>
 
359
#include <netdb.h>
 
360
#include <netinet/in.h>
 
361
                ],
 
362
                [
 
363
struct sockaddr_storage sa_store;
 
364
struct addrinfo *ai = NULL;
 
365
struct in6_addr in6addr;
 
366
int idx = if_nametoindex("iface1");
 
367
int s = socket(AF_INET6, SOCK_STREAM, 0);
 
368
int ret = getaddrinfo(NULL, NULL, NULL, &ai);
 
369
if (ret != 0) {
 
370
        const char *es = gai_strerror(ret);
 
371
}
 
372
freeaddrinfo(ai);
 
373
                ],[
 
374
                libreplace_cv_HAVE_IPV6=yes
 
375
                ],[
 
376
                libreplace_cv_HAVE_IPV6=no
 
377
                ])
 
378
])
 
379
if test x"$libreplace_cv_HAVE_IPV6" = x"yes"; then
 
380
    AC_DEFINE(HAVE_IPV6,1,[Whether the system has IPv6 support])
 
381
fi
 
382
 
 
383
LIBS=$old_LIBS
 
384
CPPFLAGS="$libreplace_SAVE_CPPFLAGS"
 
385
 
 
386
LIBREPLACEOBJ="${LIBREPLACEOBJ} ${LIBREPLACE_NETWORK_OBJS}"
 
387
 
 
388
echo "LIBREPLACE_NETWORK_CHECKS: END"
 
389
]) dnl end AC_LIBREPLACE_NETWORK_CHECKS