src/tcp.c
branchnew-lib-errors
changeset 219 cefec18b8268
parent 218 5229a5d098b2
equal deleted inserted replaced
218:5229a5d098b2 219:cefec18b8268
     1 #include "tcp_internal.h"
       
     2 
       
     3 int tcp_sock_create (const struct addrinfo *addr, error_t *err)
       
     4 {
       
     5     int sock;
       
     6 
       
     7     // create a new socket using addr->ai_family/socktype/protocol
       
     8     if ((sock = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol)) < 0)
       
     9         JUMP_SET_ERROR_ERRNO(err, ERR_SOCKET);
       
    10 
       
    11     return sock;
       
    12 
       
    13 error:
       
    14     return -ERROR_CODE(err);    
       
    15 }
       
    16 
       
    17 err_t tcp_sock_error (evutil_socket_t sock, error_t *err)
       
    18 {
       
    19     int optval;
       
    20     socklen_t optlen;
       
    21 
       
    22     RESET_ERROR(err);
       
    23 
       
    24     // init params
       
    25     optval = 0;
       
    26     optlen = sizeof(optval);
       
    27 
       
    28     // read error code
       
    29     if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &optval, &optlen))
       
    30         RETURN_SET_ERROR_ERRNO(err, ERR_GETSOCKOPT);
       
    31     
       
    32     // sanity-check optlen... not sure if this is sensible
       
    33     if (optlen != sizeof(optval))
       
    34         RETURN_SET_ERROR_EXTRA(err, ERR_GETSOCKOPT, EINVAL);
       
    35     
       
    36     // then store the system error code
       
    37     ERROR_EXTRA(err) = optval;
       
    38 
       
    39     // ok
       
    40     return SUCCESS;
       
    41 }
       
    42 
       
    43