summaryrefslogtreecommitdiffstats
path: root/apps/s_socket.c
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2017-04-20 09:57:12 +0100
committerMatt Caswell <matt@openssl.org>2017-04-25 11:13:39 +0100
commit8ccc237720d59cdf249c2c901d19f1fec739e66e (patch)
treeb3f7f237e2d39280e1356445c4e69440a4b02b0a /apps/s_socket.c
parent72d0bc84de394e93f7d756a997c0d42a4ae35058 (diff)
Add a -sctp option to s_client
Reviewed-by: Richard Levitte <levitte@openssl.org> (Merged from https://github.com/openssl/openssl/pull/3286)
Diffstat (limited to 'apps/s_socket.c')
-rw-r--r--apps/s_socket.c29
1 files changed, 26 insertions, 3 deletions
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;