diff options
author | Raimo Niskanen <[email protected]> | 2011-09-16 11:18:49 +0200 |
---|---|---|
committer | Raimo Niskanen <[email protected]> | 2011-11-17 12:11:03 +0100 |
commit | e6b246fa68a6ae09f1fab60086a20caf9a4f4f19 (patch) | |
tree | 872d3e9518e9c7896c5cfee9d504acb93f10184d | |
parent | d661742424dfa8ecbc2797845b810383c356b268 (diff) | |
download | otp-e6b246fa68a6ae09f1fab60086a20caf9a4f4f19.tar.gz otp-e6b246fa68a6ae09f1fab60086a20caf9a4f4f19.tar.bz2 otp-e6b246fa68a6ae09f1fab60086a20caf9a4f4f19.zip |
erts: Use SCTP functions in default libs
On e.g FreeBSD the functions sctp_bindx() and sctp_peeloff() do not require
any extra linkage library flags and there is no dynamic lib to load
for them; use configure to find them.
-rw-r--r-- | erts/configure.in | 1 | ||||
-rw-r--r-- | erts/emulator/drivers/common/inet_drv.c | 35 |
2 files changed, 24 insertions, 12 deletions
diff --git a/erts/configure.in b/erts/configure.in index fafa1c7e92..f75c6580df 100644 --- a/erts/configure.in +++ b/erts/configure.in @@ -1496,6 +1496,7 @@ if test "x$enable_sctp" = "xyes" ; then #include <sys/socket.h> #endif ]) + AC_CHECK_FUNCS([sctp_bindx sctp_peeloff]) AC_CHECK_DECLS([SCTP_UNORDERED, SCTP_ADDR_OVER, SCTP_ABORT, SCTP_EOF, SCTP_SENDALL, SCTP_ADDR_CONFIRMED], [], [], [#if HAVE_SYS_SOCKET_H diff --git a/erts/emulator/drivers/common/inet_drv.c b/erts/emulator/drivers/common/inet_drv.c index bab31951a5..097fe78e19 100644 --- a/erts/emulator/drivers/common/inet_drv.c +++ b/erts/emulator/drivers/common/inet_drv.c @@ -294,7 +294,6 @@ static unsigned long one_value = 1; # define sctp_adaptation_layer_event sctp_adaption_layer_event #endif -static void *h_libsctp = NULL; #ifdef __GNUC__ static typeof(sctp_bindx) *p_sctp_bindx = NULL; static typeof(sctp_peeloff) *p_sctp_peeloff = NULL; @@ -3467,20 +3466,32 @@ static int inet_init() /* Check the size of SCTP AssocID -- currently both this driver and the Erlang part require 32 bit: */ ASSERT(sizeof(sctp_assoc_t)==ASSOC_ID_LEN); -# ifndef LIBSCTP -# error LIBSCTP not defined -# endif - if (erts_sys_ddll_open_noext(STRINGIFY(LIBSCTP), &h_libsctp, NULL) == 0) { - void *ptr; - if (erts_sys_ddll_sym(h_libsctp, "sctp_bindx", &ptr) == 0) { - p_sctp_bindx = ptr; - inet_init_sctp(); - add_driver_entry(&sctp_inet_driver_entry); - if (erts_sys_ddll_sym(h_libsctp, "sctp_peeloff", &ptr) == 0) { - p_sctp_peeloff = ptr; +# if defined(HAVE_SCTP_BINDX) && defined (HAVE_SCTP_PEELOFF) + p_sctp_bindx = sctp_bindx; + p_sctp_peeloff = sctp_peeloff; + inet_init_sctp(); + add_driver_entry(&sctp_inet_driver_entry); +# else +# ifndef LIBSCTP +# error LIBSCTP not defined +# endif + { + static void *h_libsctp = NULL; + + if (erts_sys_ddll_open_noext(STRINGIFY(LIBSCTP), &h_libsctp, NULL) + == 0) { + void *ptr; + if (erts_sys_ddll_sym(h_libsctp, "sctp_bindx", &ptr) == 0) { + p_sctp_bindx = ptr; + inet_init_sctp(); + add_driver_entry(&sctp_inet_driver_entry); + if (erts_sys_ddll_sym(h_libsctp, "sctp_peeloff", &ptr) == 0) { + p_sctp_peeloff = ptr; + } } } } +# endif #endif /* remove the dummy inet driver */ |