#include "tcp_internal.h"
int tcp_sock_create (const struct addrinfo *addr, error_t *err)
{
int sock;
// create a new socket using addr->ai_family/socktype/protocol
if ((sock = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol)) < 0)
JUMP_SET_ERROR_ERRNO(err, ERR_SOCKET);
return sock;
error:
return -ERROR_CODE(err);
}
err_t tcp_sock_error (evutil_socket_t sock, error_t *err)
{
int optval;
socklen_t optlen;
RESET_ERROR(err);
// init params
optval = 0;
optlen = sizeof(optval);
// read error code
if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &optval, &optlen))
RETURN_SET_ERROR_ERRNO(err, ERR_GETSOCKOPT);
// sanity-check optlen... not sure if this is sensible
if (optlen != sizeof(optval))
RETURN_SET_ERROR_EXTRA(err, ERR_GETSOCKOPT, EINVAL);
// then store the system error code
ERROR_EXTRA(err) = optval;
// ok
return SUCCESS;
}