From 8ccc237720d59cdf249c2c901d19f1fec739e66e Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Thu, 20 Apr 2017 09:57:12 +0100 Subject: Add a -sctp option to s_client Reviewed-by: Richard Levitte (Merged from https://github.com/openssl/openssl/pull/3286) --- apps/s_socket.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) (limited to 'apps/s_socket.c') diff --git a/apps/s_socket.c b/apps/s_socket.c index 97dc9afffb..04f3e6741c 100644 --- a/apps/s_socket.c +++ b/apps/s_socket.c @@ -44,6 +44,7 @@ typedef unsigned int u_int; * @family: desired socket family, may be AF_INET, AF_INET6, AF_UNIX or * AF_UNSPEC * @type: socket type, must be SOCK_STREAM or SOCK_DGRAM + * @protocol: socket protocol, e.g. IPPROTO_TCP or IPPROTO_UDP (or 0 for any) * * This will create a socket and use it to connect to a host:port, or if * family == AF_UNIX, to the path found in host. @@ -55,7 +56,7 @@ typedef unsigned int u_int; * Returns 1 on success, 0 on failure. */ int init_client(int *sock, const char *host, const char *port, - int family, int type) + int family, int type, int protocol) { BIO_ADDRINFO *res = NULL; const BIO_ADDRINFO *ai = NULL; @@ -64,7 +65,8 @@ int init_client(int *sock, const char *host, const char *port, if (!BIO_sock_init()) return 0; - ret = BIO_lookup(host, port, BIO_LOOKUP_CLIENT, family, type, &res); + ret = BIO_lookup_ex(host, port, BIO_LOOKUP_CLIENT, family, type, protocol, + &res); if (ret == 0) { ERR_print_errors(bio_err); return 0; @@ -76,7 +78,9 @@ int init_client(int *sock, const char *host, const char *port, * anything in the BIO_ADDRINFO chain that we haven't * asked for. */ OPENSSL_assert((family == AF_UNSPEC || family == BIO_ADDRINFO_family(res)) - && (type == 0 || type == BIO_ADDRINFO_socktype(res))); + && (type == 0 || type == BIO_ADDRINFO_socktype(res)) + && (protocol == 0 + || protocol == BIO_ADDRINFO_protocol(res))); *sock = BIO_socket(BIO_ADDRINFO_family(ai), BIO_ADDRINFO_socktype(ai), BIO_ADDRINFO_protocol(res), 0); @@ -86,6 +90,25 @@ int init_client(int *sock, const char *host, const char *port, */ continue; } + +#ifndef OPENSSL_NO_SCTP + if (protocol == IPPROTO_SCTP) { + /* + * For SCTP we have to set various options on the socket prior to + * connecting. This is done automatically by BIO_new_dgram_sctp(). + * We don't actually need the created BIO though so we free it again + * immediately. + */ + BIO *tmpbio = BIO_new_dgram_sctp(*sock, BIO_NOCLOSE); + + if (tmpbio == NULL) { + ERR_print_errors(bio_err); + return 0; + } + BIO_free(tmpbio); + } +#endif + if (!BIO_connect(*sock, BIO_ADDRINFO_address(ai), 0)) { BIO_closesocket(*sock); *sock = INVALID_SOCKET; -- cgit v1.2.3