src/lib/tcp.c
author Tero Marttila <terom@fixme.fi>
Thu, 28 May 2009 01:17:36 +0300
branchnew-lib-errors
changeset 219 cefec18b8268
parent 177 src/tcp.c@a74b55104fb9
permissions -rw-r--r--
some of the lib/transport stuff compiles
#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;
}