1998-12-21 10:56:39 +00:00
|
|
|
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
1998-12-21 10:52:47 +00:00
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* This package is an SSL implementation written
|
|
|
|
* by Eric Young (eay@cryptsoft.com).
|
|
|
|
* The implementation was written so as to conform with Netscapes SSL.
|
2015-01-22 03:40:55 +00:00
|
|
|
*
|
1998-12-21 10:52:47 +00:00
|
|
|
* This library is free for commercial and non-commercial use as long as
|
|
|
|
* the following conditions are aheared to. The following conditions
|
|
|
|
* apply to all code found in this distribution, be it the RC4, RSA,
|
|
|
|
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
|
|
|
* included with this distribution is covered by the same copyright terms
|
|
|
|
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
2015-01-22 03:40:55 +00:00
|
|
|
*
|
1998-12-21 10:52:47 +00:00
|
|
|
* Copyright remains Eric Young's, and as such any Copyright notices in
|
|
|
|
* the code are not to be removed.
|
|
|
|
* If this package is used in a product, Eric Young should be given attribution
|
|
|
|
* as the author of the parts of the library used.
|
|
|
|
* This can be in the form of a textual message at program startup or
|
|
|
|
* in documentation (online or textual) provided with the package.
|
2015-01-22 03:40:55 +00:00
|
|
|
*
|
1998-12-21 10:52:47 +00:00
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
|
|
* must display the following acknowledgement:
|
|
|
|
* "This product includes cryptographic software written by
|
|
|
|
* Eric Young (eay@cryptsoft.com)"
|
|
|
|
* The word 'cryptographic' can be left out if the rouines from the library
|
|
|
|
* being used are not cryptographic related :-).
|
2015-01-22 03:40:55 +00:00
|
|
|
* 4. If you include any Windows specific code (or a derivative thereof) from
|
1998-12-21 10:52:47 +00:00
|
|
|
* the apps directory (application code) you must include an acknowledgement:
|
|
|
|
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
2015-01-22 03:40:55 +00:00
|
|
|
*
|
1998-12-21 10:52:47 +00:00
|
|
|
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
2015-01-22 03:40:55 +00:00
|
|
|
*
|
1998-12-21 10:52:47 +00:00
|
|
|
* The licence and distribution terms for any publically available version or
|
|
|
|
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
|
|
|
* copied and put under another distribution licence
|
|
|
|
* [including the GNU Public Licence.]
|
|
|
|
*/
|
Big apps cleanup (option-parsing, etc)
This is merges the old "rsalz-monolith" branch over to master. The biggest
change is that option parsing switch from cascasding 'else if strcmp("-foo")'
to a utility routine and somethin akin to getopt. Also, an error in the
command line no longer prints the full summary; use -help (or --help :)
for that. There have been many other changes and code-cleanup, see
bullet list below.
Special thanks to Matt for the long and detailed code review.
TEMPORARY:
For now, comment out CRYPTO_mem_leaks() at end of main
Tickets closed:
RT3515: Use 3DES in pkcs12 if built with no-rc2
RT1766: s_client -reconnect and -starttls broke
RT2932: Catch write errors
RT2604: port should be 'unsigned short'
RT2983: total_bytes undeclared #ifdef RENEG
RT1523: Add -nocert to fix output in x509 app
RT3508: Remove unused variable introduced by b09eb24
RT3511: doc fix; req default serial is random
RT1325,2973: Add more extensions to c_rehash
RT2119,3407: Updated to dgst.pod
RT2379: Additional typo fix
RT2693: Extra include of string.h
RT2880: HFS is case-insensitive filenames
RT3246: req command prints version number wrong
Other changes; incompatibilities marked with *:
Add SCSV support
Add -misalign to speed command
Make dhparam, dsaparam, ecparam, x509 output C in proper style
Make some internal ocsp.c functions void
Only display cert usages with -help in verify
Use global bio_err, remove "BIO*err" parameter from functions
For filenames, - always means stdin (or stdout as appropriate)
Add aliases for -des/aes "wrap" ciphers.
*Remove support for IISSGC (server gated crypto)
*The undocumented OCSP -header flag is now "-header name=value"
*Documented the OCSP -header flag
Reviewed-by: Matt Caswell <matt@openssl.org>
2015-04-24 19:26:15 +00:00
|
|
|
/* ====================================================================
|
|
|
|
* Copyright (c) 199-2015 The OpenSSL Project. All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
*
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
*
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in
|
|
|
|
* the documentation and/or other materials provided with the
|
|
|
|
* distribution.
|
|
|
|
*
|
|
|
|
* 3. All advertising materials mentioning features or use of this
|
|
|
|
* software must display the following acknowledgment:
|
|
|
|
* "This product includes software developed by the OpenSSL Project
|
|
|
|
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
|
|
|
*
|
|
|
|
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
|
|
|
* endorse or promote products derived from this software without
|
|
|
|
* prior written permission. For written permission, please contact
|
|
|
|
* licensing@OpenSSL.org.
|
|
|
|
*
|
|
|
|
* 5. Products derived from this software may not be called "OpenSSL"
|
|
|
|
* nor may "OpenSSL" appear in their names without prior written
|
|
|
|
* permission of the OpenSSL Project.
|
|
|
|
*
|
|
|
|
* 6. Redistributions of any form whatsoever must retain the following
|
|
|
|
* acknowledgment:
|
|
|
|
* "This product includes software developed by the OpenSSL Project
|
|
|
|
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
|
|
|
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
|
|
|
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
|
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
|
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
|
|
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
* ====================================================================
|
|
|
|
*/
|
1998-12-21 10:52:47 +00:00
|
|
|
|
Big apps cleanup (option-parsing, etc)
This is merges the old "rsalz-monolith" branch over to master. The biggest
change is that option parsing switch from cascasding 'else if strcmp("-foo")'
to a utility routine and somethin akin to getopt. Also, an error in the
command line no longer prints the full summary; use -help (or --help :)
for that. There have been many other changes and code-cleanup, see
bullet list below.
Special thanks to Matt for the long and detailed code review.
TEMPORARY:
For now, comment out CRYPTO_mem_leaks() at end of main
Tickets closed:
RT3515: Use 3DES in pkcs12 if built with no-rc2
RT1766: s_client -reconnect and -starttls broke
RT2932: Catch write errors
RT2604: port should be 'unsigned short'
RT2983: total_bytes undeclared #ifdef RENEG
RT1523: Add -nocert to fix output in x509 app
RT3508: Remove unused variable introduced by b09eb24
RT3511: doc fix; req default serial is random
RT1325,2973: Add more extensions to c_rehash
RT2119,3407: Updated to dgst.pod
RT2379: Additional typo fix
RT2693: Extra include of string.h
RT2880: HFS is case-insensitive filenames
RT3246: req command prints version number wrong
Other changes; incompatibilities marked with *:
Add SCSV support
Add -misalign to speed command
Make dhparam, dsaparam, ecparam, x509 output C in proper style
Make some internal ocsp.c functions void
Only display cert usages with -help in verify
Use global bio_err, remove "BIO*err" parameter from functions
For filenames, - always means stdin (or stdout as appropriate)
Add aliases for -des/aes "wrap" ciphers.
*Remove support for IISSGC (server gated crypto)
*The undocumented OCSP -header flag is now "-header name=value"
*Documented the OCSP -header flag
Reviewed-by: Matt Caswell <matt@openssl.org>
2015-04-24 19:26:15 +00:00
|
|
|
/* socket-related functions used by s_client and s_server */
|
1999-07-28 23:25:59 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <signal.h>
|
|
|
|
|
2015-01-22 03:40:55 +00:00
|
|
|
/*
|
|
|
|
* With IPv6, it looks like Digital has mixed up the proper order of
|
|
|
|
* recursive header file inclusion, resulting in the compiler complaining
|
|
|
|
* that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which is
|
|
|
|
* needed to have fileno() declared correctly... So let's define u_int
|
|
|
|
*/
|
2001-02-20 08:13:47 +00:00
|
|
|
#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
|
2015-01-22 03:40:55 +00:00
|
|
|
# define __U_INT
|
1999-05-13 11:37:32 +00:00
|
|
|
typedef unsigned int u_int;
|
|
|
|
#endif
|
|
|
|
|
2002-11-28 08:04:36 +00:00
|
|
|
#ifndef OPENSSL_NO_SOCK
|
|
|
|
|
2016-02-02 23:47:42 +00:00
|
|
|
# define USE_SOCKETS
|
|
|
|
# include "apps.h"
|
|
|
|
# undef USE_SOCKETS
|
|
|
|
# include "s_apps.h"
|
2005-06-13 03:23:50 +00:00
|
|
|
|
2016-02-02 23:47:42 +00:00
|
|
|
# include <openssl/bio.h>
|
|
|
|
# include <openssl/err.h>
|
2000-03-12 23:27:14 +00:00
|
|
|
|
2016-02-02 23:47:42 +00:00
|
|
|
/*
|
|
|
|
* init_client - helper routine to set up socket communication
|
|
|
|
* @sock: pointer to storage of resulting socket.
|
|
|
|
* @host: the host name or path (for AF_UNIX) to connect to.
|
|
|
|
* @port: the port to connect to (ignored for AF_UNIX).
|
|
|
|
* @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
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
* If the host has more than one address, it will try them one by one until
|
|
|
|
* a successful connection is established. The resulting socket will be
|
|
|
|
* found in *sock on success, it will be given INVALID_SOCKET otherwise.
|
|
|
|
*
|
|
|
|
* Returns 1 on success, 0 on failure.
|
|
|
|
*/
|
|
|
|
int init_client(int *sock, const char *host, const char *port,
|
|
|
|
int family, int type)
|
2015-01-22 03:40:55 +00:00
|
|
|
{
|
2016-02-02 23:47:42 +00:00
|
|
|
BIO_ADDRINFO *res = NULL;
|
|
|
|
const BIO_ADDRINFO *ai = NULL;
|
|
|
|
int ret;
|
2003-11-28 13:10:58 +00:00
|
|
|
|
2016-02-02 23:47:42 +00:00
|
|
|
if (!BIO_sock_init())
|
|
|
|
return 0;
|
2015-01-22 03:40:55 +00:00
|
|
|
|
2016-02-02 23:47:42 +00:00
|
|
|
ret = BIO_lookup(host, port, BIO_LOOKUP_CLIENT, family, type, &res);
|
|
|
|
if (ret == 0) {
|
|
|
|
ERR_print_errors(bio_err);
|
|
|
|
return 0;
|
2015-01-22 03:40:55 +00:00
|
|
|
}
|
|
|
|
|
2016-02-02 23:47:42 +00:00
|
|
|
ret = 0;
|
|
|
|
for (ai = res; ai != NULL; ai = BIO_ADDRINFO_next(ai)) {
|
|
|
|
int protocol = (type == SOCK_STREAM ? IPPROTO_TCP : IPPROTO_UDP);
|
|
|
|
# ifdef AF_UNIX
|
|
|
|
if (BIO_ADDRINFO_family(ai) == AF_UNIX)
|
|
|
|
protocol = 0;
|
Big apps cleanup (option-parsing, etc)
This is merges the old "rsalz-monolith" branch over to master. The biggest
change is that option parsing switch from cascasding 'else if strcmp("-foo")'
to a utility routine and somethin akin to getopt. Also, an error in the
command line no longer prints the full summary; use -help (or --help :)
for that. There have been many other changes and code-cleanup, see
bullet list below.
Special thanks to Matt for the long and detailed code review.
TEMPORARY:
For now, comment out CRYPTO_mem_leaks() at end of main
Tickets closed:
RT3515: Use 3DES in pkcs12 if built with no-rc2
RT1766: s_client -reconnect and -starttls broke
RT2932: Catch write errors
RT2604: port should be 'unsigned short'
RT2983: total_bytes undeclared #ifdef RENEG
RT1523: Add -nocert to fix output in x509 app
RT3508: Remove unused variable introduced by b09eb24
RT3511: doc fix; req default serial is random
RT1325,2973: Add more extensions to c_rehash
RT2119,3407: Updated to dgst.pod
RT2379: Additional typo fix
RT2693: Extra include of string.h
RT2880: HFS is case-insensitive filenames
RT3246: req command prints version number wrong
Other changes; incompatibilities marked with *:
Add SCSV support
Add -misalign to speed command
Make dhparam, dsaparam, ecparam, x509 output C in proper style
Make some internal ocsp.c functions void
Only display cert usages with -help in verify
Use global bio_err, remove "BIO*err" parameter from functions
For filenames, - always means stdin (or stdout as appropriate)
Add aliases for -des/aes "wrap" ciphers.
*Remove support for IISSGC (server gated crypto)
*The undocumented OCSP -header flag is now "-header name=value"
*Documented the OCSP -header flag
Reviewed-by: Matt Caswell <matt@openssl.org>
2015-04-24 19:26:15 +00:00
|
|
|
# endif
|
2016-02-02 23:47:42 +00:00
|
|
|
/* Admitedly, these checks are quite paranoid, we should
|
|
|
|
not get anything in the BIO_ADDRINFO chain that we haven't
|
|
|
|
asked for */
|
|
|
|
OPENSSL_assert((family == AF_UNSPEC || family == BIO_ADDRINFO_family(res))
|
2016-02-10 19:23:40 +00:00
|
|
|
&& (type == 0 || type == BIO_ADDRINFO_socktype(res)));
|
2016-02-02 23:47:42 +00:00
|
|
|
|
|
|
|
*sock = BIO_socket(BIO_ADDRINFO_family(ai), BIO_ADDRINFO_socktype(ai),
|
2016-02-10 19:54:48 +00:00
|
|
|
protocol, 0);
|
2016-02-02 23:47:42 +00:00
|
|
|
if (*sock == INVALID_SOCKET) {
|
|
|
|
/* Maybe the kernel doesn't support the socket family, even if
|
|
|
|
* BIO_lookup() added it in the returned result...
|
|
|
|
*/
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (!BIO_connect(*sock, BIO_ADDRINFO_address(ai), 0)) {
|
|
|
|
BIO_closesocket(*sock);
|
|
|
|
*sock = INVALID_SOCKET;
|
|
|
|
continue;
|
2015-01-22 03:40:55 +00:00
|
|
|
}
|
|
|
|
|
2016-02-02 23:47:42 +00:00
|
|
|
/* Success, don't try any more addresses */
|
|
|
|
break;
|
2015-01-22 03:40:55 +00:00
|
|
|
}
|
|
|
|
|
2016-02-02 23:47:42 +00:00
|
|
|
if (*sock == INVALID_SOCKET) {
|
|
|
|
ERR_print_errors(bio_err);
|
|
|
|
} else {
|
|
|
|
ret = 1;
|
2015-01-22 03:40:55 +00:00
|
|
|
}
|
2016-02-02 23:47:42 +00:00
|
|
|
BIO_ADDRINFO_free(res);
|
|
|
|
return ret;
|
2015-01-22 03:40:55 +00:00
|
|
|
}
|
s_client/s_server: support unix domain sockets
The "-unix <path>" argument allows s_server and s_client to use a unix
domain socket in the filesystem instead of IPv4 ("-connect", "-port",
"-accept", etc). If s_server exits gracefully, such as when "-naccept"
is used and the requested number of SSL/TLS connections have occurred,
then the domain socket file is removed. On ctrl-C, it is likely that
the stale socket file will be left over, such that s_server would
normally fail to restart with the same arguments. For this reason,
s_server also supports an "-unlink" option, which will clean up any
stale socket file before starting.
If you have any reason to want encrypted IPC within an O/S instance,
this concept might come in handy. Otherwise it just demonstrates that
there is nothing about SSL/TLS that limits it to TCP/IP in any way.
(There might also be benchmarking and profiling use in this path, as
unix domain sockets are much lower overhead than connecting over local
IP addresses).
Signed-off-by: Geoff Thorpe <geoff@openssl.org>
2014-04-26 05:22:54 +00:00
|
|
|
|
2016-02-02 23:47:42 +00:00
|
|
|
/*
|
|
|
|
* do_server - helper routine to perform a server operation
|
|
|
|
* @accept_sock: pointer to storage of resulting socket.
|
|
|
|
* @host: the host name or path (for AF_UNIX) to connect to.
|
|
|
|
* @port: the port to connect to (ignored for AF_UNIX).
|
|
|
|
* @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
|
|
|
|
* @cb: pointer to a function that receives the accepted socket and
|
|
|
|
* should perform the communication with the connecting client.
|
|
|
|
* @context: pointer to memory that's passed verbatim to the cb function.
|
|
|
|
* @naccept: number of times an incoming connect should be accepted. If -1,
|
|
|
|
* unlimited number.
|
|
|
|
*
|
|
|
|
* This will create a socket and use it to listen to a host:port, or if
|
|
|
|
* family == AF_UNIX, to the path found in host, then start accepting
|
|
|
|
* incoming connections and run cb on the resulting socket.
|
|
|
|
*
|
|
|
|
* 0 on failure, something other on success.
|
|
|
|
*/
|
|
|
|
int do_server(int *accept_sock, const char *host, const char *port,
|
|
|
|
int family, int type,
|
|
|
|
int (*cb) (const char *hostname, int s, int stype,
|
2015-01-22 03:40:55 +00:00
|
|
|
unsigned char *context), unsigned char *context,
|
|
|
|
int naccept)
|
|
|
|
{
|
2016-02-02 23:47:42 +00:00
|
|
|
int asock = 0;
|
2015-01-22 03:40:55 +00:00
|
|
|
int sock;
|
|
|
|
int i;
|
2016-02-02 23:47:42 +00:00
|
|
|
BIO_ADDRINFO *res = NULL;
|
|
|
|
int ret = 0;
|
|
|
|
int protocol = (type == SOCK_STREAM ? IPPROTO_TCP : IPPROTO_UDP);
|
|
|
|
|
|
|
|
if (!BIO_sock_init())
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if (!BIO_lookup(host, port, BIO_LOOKUP_SERVER, family, type, &res)) {
|
|
|
|
ERR_print_errors(bio_err);
|
|
|
|
return 0;
|
|
|
|
}
|
2015-01-22 03:40:55 +00:00
|
|
|
|
2016-02-02 23:47:42 +00:00
|
|
|
# ifdef AF_UNIX
|
|
|
|
if (BIO_ADDRINFO_family(res) == AF_UNIX)
|
|
|
|
protocol = 0;
|
|
|
|
# endif
|
|
|
|
/* Admitedly, these checks are quite paranoid, we should
|
|
|
|
not get anything in the BIO_ADDRINFO chain that we haven't
|
|
|
|
asked for */
|
|
|
|
OPENSSL_assert((family == AF_UNSPEC || family == BIO_ADDRINFO_family(res))
|
2016-02-10 19:23:40 +00:00
|
|
|
&& (type == 0 || type == BIO_ADDRINFO_socktype(res)));
|
2016-02-02 23:47:42 +00:00
|
|
|
|
|
|
|
asock = BIO_socket(BIO_ADDRINFO_family(res), BIO_ADDRINFO_socktype(res),
|
2016-02-10 19:54:48 +00:00
|
|
|
protocol, 0);
|
2016-02-02 23:47:42 +00:00
|
|
|
if (asock == INVALID_SOCKET
|
|
|
|
|| !BIO_listen(asock, BIO_ADDRINFO_address(res), BIO_SOCK_REUSEADDR)) {
|
|
|
|
BIO_ADDRINFO_free(res);
|
|
|
|
ERR_print_errors(bio_err);
|
|
|
|
if (asock != INVALID_SOCKET)
|
|
|
|
BIO_closesocket(asock);
|
|
|
|
goto end;
|
|
|
|
}
|
2015-01-22 03:40:55 +00:00
|
|
|
|
2016-02-02 23:47:42 +00:00
|
|
|
BIO_ADDRINFO_free(res);
|
|
|
|
|
|
|
|
if (accept_sock != NULL) {
|
|
|
|
*accept_sock = asock;
|
2015-01-22 03:40:55 +00:00
|
|
|
}
|
|
|
|
for (;;) {
|
2016-02-02 23:47:42 +00:00
|
|
|
BIO_ADDR *accepted_addr = NULL;
|
|
|
|
char *name = NULL;
|
2015-01-22 03:40:55 +00:00
|
|
|
if (type == SOCK_STREAM) {
|
2016-02-02 23:47:42 +00:00
|
|
|
if ((accepted_addr = BIO_ADDR_new()) == NULL) {
|
|
|
|
BIO_closesocket(asock);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
redoit:
|
|
|
|
sock = BIO_accept_ex(asock, accepted_addr, 0);
|
|
|
|
if (sock < 0) {
|
|
|
|
if (BIO_sock_should_retry(ret)) {
|
|
|
|
goto redoit;
|
|
|
|
} else {
|
|
|
|
ERR_print_errors(bio_err);
|
|
|
|
BIO_ADDR_free(accepted_addr);
|
|
|
|
SHUTDOWN(asock);
|
|
|
|
break;
|
|
|
|
}
|
2015-01-22 03:40:55 +00:00
|
|
|
}
|
2016-02-02 23:47:42 +00:00
|
|
|
} else {
|
|
|
|
sock = asock;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* accepted_addr is NULL if we're dealing with SOCK_DGRAM
|
|
|
|
* this means that for SOCK_DGRAM, name will be NULL
|
|
|
|
*/
|
|
|
|
if (accepted_addr != NULL) {
|
|
|
|
#ifdef AF_UNIX
|
|
|
|
if (family == AF_UNIX)
|
|
|
|
name = BIO_ADDR_path_string(accepted_addr);
|
|
|
|
else
|
|
|
|
#endif
|
|
|
|
name = BIO_ADDR_hostname_string(accepted_addr, 0);
|
|
|
|
}
|
2015-01-22 03:40:55 +00:00
|
|
|
i = (*cb) (name, sock, type, context);
|
2015-05-01 14:02:07 +00:00
|
|
|
OPENSSL_free(name);
|
2016-02-02 23:47:42 +00:00
|
|
|
BIO_ADDR_free(accepted_addr);
|
2015-01-22 03:40:55 +00:00
|
|
|
if (type == SOCK_STREAM)
|
|
|
|
SHUTDOWN2(sock);
|
|
|
|
if (naccept != -1)
|
|
|
|
naccept--;
|
|
|
|
if (i < 0 || naccept == 0) {
|
2016-02-02 23:47:42 +00:00
|
|
|
SHUTDOWN2(asock);
|
|
|
|
ret = i;
|
|
|
|
break;
|
2015-01-22 03:40:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
end:
|
2016-02-02 23:47:42 +00:00
|
|
|
# ifdef AF_UNIX
|
|
|
|
if (family == AF_UNIX)
|
|
|
|
unlink(host);
|
2015-01-22 03:40:55 +00:00
|
|
|
# endif
|
2016-02-02 23:47:42 +00:00
|
|
|
return ret;
|
2015-01-22 03:40:55 +00:00
|
|
|
}
|
1998-12-21 10:52:47 +00:00
|
|
|
|
2016-02-02 23:47:42 +00:00
|
|
|
#endif /* OPENSSL_NO_SOCK */
|