NAME
BIO_get_host_ip
,
BIO_get_port
,
BIO_get_accept_socket
,
BIO_accept
, BIO_sock_error
,
BIO_sock_non_fatal_error
,
BIO_sock_should_retry
,
BIO_socket_nbio
,
BIO_set_tcp_ndelay
—
wrappers for socket
operations
SYNOPSIS
#include
<openssl/bio.h>
int
BIO_get_host_ip
(const char
*hostname, unsigned char *in_addr_buffer);
int
BIO_get_port
(const char
*servname, unsigned short *port);
int
BIO_get_accept_socket
(char
*host_port, int bind_mode);
int
BIO_accept
(int socket,
char **addr);
int
BIO_sock_error
(int
socket);
int
BIO_sock_non_fatal_error
(int
errnum);
int
BIO_sock_should_retry
(int
retval);
int
BIO_socket_nbio
(int
socket, int
mode);
int
BIO_set_tcp_ndelay
(int
socket, int
on);
DESCRIPTION
BIO_get_host_ip
()
looks up one IPv4 address for the given hostname using
getaddrinfo(3) and writes the first returned IPv4 address into
*in_addr_buffer. The caller is responsible for
providing a buffer that is at least
sizeof
(in_addr_t)
bytes long. After a successful call, the caller needs to cast
in_addr_buffer to (in_addr_t
*).
BIO_get_port
()
looks up servname in the
services(5) database using
getaddrinfo(3) and stores the associated port number at the location
specified by the port argument.
BIO_get_accept_socket
()
creates an IPv4 TCP socket and
listen(2)s
for incoming connections. The string host_port is
parsed. If it contains a colon, the substring before the colon is
interpreted as a local hostname of the interface to
bind(2) to. If
the hostname is empty, consists of a single asterisk ("*:..."), or
if there is no colon, INADDR_ANY
is used instead of
a local hostname. The rest of the string host_port, or
the whole string if it contains no colon, is treated as a service name. The
hostname and the service name are converted to a local IP address and port
number using getaddrinfo(3). If bind_mode is the
constant BIO_BIND_REUSEADDR
, allowing local address
reuse is attempted using
setsockopt(2) with an argument of
SO_REUSEADDR
before calling
bind(2).
BIO_accept
()
calls accept(2) to receive one connection on the
socket. When it receives a connection, it
free(3)s
*addr, and if it is an IPv4 connection, it allocates a
new string, writes the peer IP address in dotted decimal form, a colon, and
the decimal port number into the string, and stores a pointer to the string
in *addr. For other address families or if
getnameinfo(3) or memory allocation fails,
*addr is set to NULL
but
BIO_accept
() succeeds anyway.
BIO_sock_error
()
retrieves, clears, and returns the error status code of the
socket by calling
getsockopt(2) with arguments SOL_SOCKET
and
SO_ERROR
.
BIO_sock_non_fatal_error
()
determines whether the error status code errnum
represents a recoverable error.
BIO_sock_should_retry
()
determines whether a recoverable error occurred by inspecting both
errno(2) and
retval, which is supposed to usually be the return
value of a previously called function like
BIO_accept
(),
BIO_read(3), or
BIO_write(3).
If mode is non-zero,
BIO_socket_nbio
()
switches the socket to non-blocking mode using
fcntl(2). If
mode is 0, it switches to blocking mode.
BIO_set_tcp_ndelay
()
sets the TCP_NODELAY
option on the
socket if on is 1 or clears it
if on is 0; see
tcp(4) for
details.
RETURN VALUES
BIO_get_host_ip
(),
BIO_get_port
(), and
BIO_socket_nbio
() return 1 on success or 0 on
failure.
BIO_get_accept_socket
() returns the file
descriptor of the newly created listening socket or -1 if
host_port is NULL
, no service
is specified, or
getaddrinfo(3), socket(2), bind(2), listen(2), or memory allocation fails.
BIO_accept
() returns the file descriptor
of the received connection, -1 on fatal errors, that is, when
addr is NULL
or
accept(2)
fails fatally, or -2 when accept(2) fails in a non-fatal way and might succeed when
retried later.
BIO_sock_error
() returns an error status
code like EAGAIN
,
ECONNABORTED
, ECONNREFUSED
,
ECONNRESET
, ELOOP
,
EMSGSIZE
, ENOBUFS
,
ENOTCONN
, EPIPE
,
ETIMEDOUT
, or others, 0 if the
socket is not in an error state, or 1 if
getsockopt(2) fails.
BIO_sock_non_fatal_error
() returns 1 if
errnum is EAGAIN
,
EALREADY
, EINPROGRESS
,
EINTR
, or ENOTCONN
and 0
otherwise, even if errnum is 0.
BIO_sock_should_retry
() returns 1 if
BIO_sock_non_fatal_error
(errno)
is 1 and retval is either 0 or -1, or 0 otherwise.
BIO_set_tcp_ndelay
() returns 0 on success
or -1 on failure.
ERRORS
If BIO_get_host_ip
(),
BIO_get_port
(), or
BIO_get_accept_socket
() fail or
BIO_accept
() fails fatally, the following
diagnostics can be retrieved with
ERR_get_error(3),
ERR_GET_REASON(3), and
ERR_reason_error_string(3):
BIO_R_ACCEPT_ERROR
"accept error"- accept(2) failed fatally in
BIO_accept
(). BIO_R_BAD_HOSTNAME_LOOKUP
"bad hostname lookup"- getaddrinfo(3) failed or hostname was
NULL
inBIO_get_host_ip
(), or getaddrinfo(3) failed inBIO_get_accept_socket
(). BIO_R_INVALID_ARGUMENT
"invalid argument"- getaddrinfo(3) failed in
BIO_get_port
(). ERR_R_MALLOC_FAILURE
"malloc failure"- Memory allocation failed in
BIO_get_accept_socket
(), orBIO_accept
() succeeded but was unable to allocate memory for *addr. ForBIO_accept
(), the returned file descriptor is valid, and communication with the peer can be attempted using it. BIO_R_NO_PORT_SPECIFIED
"no port specified"- The servname argument was
NULL
inBIO_get_port
(), or host_port wasNULL
or ended after the first colon inBIO_get_accept_socket
(). BIO_R_NULL_PARAMETER
"null parameter"- The addr argument was
NULL
inBIO_accept
(). BIO_R_UNABLE_TO_BIND_SOCKET
"unable to bind socket"- bind(2)
failed in
BIO_get_accept_socket
(). BIO_R_UNABLE_TO_CREATE_SOCKET
"unable to create socket"- socket(2) failed in
BIO_get_accept_socket
(). BIO_R_UNABLE_TO_LISTEN_SOCKET
"unable to listen socket"- listen(2) failed in
BIO_get_accept_socket
().
SEE ALSO
bind(2), connect(2), errno(2), fcntl(2), getsockopt(2), listen(2), sigaction(2), socket(2), BIO_new(3), BIO_read(3), getaddrinfo(3), ip(4), tcp(4)
HISTORY
BIO_sock_should_retry
() first appeared in
SSLeay 0.6.5 and the other functions except
BIO_socket_nbio
() in SSLeay 0.8.0. They have all
been available since OpenBSD 2.4.
BIO_socket_nbio
() first appeared in SSLeay
0.9.1 and has been available since OpenBSD 2.6.