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
177
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include "tcp_internal.h"
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
int tcp_sock_create (const struct addrinfo *addr, error_t *err)
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
{
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
    int sock;
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
    // create a new socket using addr->ai_family/socktype/protocol
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
    if ((sock = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol)) < 0)
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
        JUMP_SET_ERROR_ERRNO(err, ERR_SOCKET);
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
    return sock;
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
error:
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    return -ERROR_CODE(err);    
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
}
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
err_t tcp_sock_error (evutil_socket_t sock, error_t *err)
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
{
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
    int optval;
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    socklen_t optlen;
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
    RESET_ERROR(err);
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    // init params
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
    optval = 0;
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
    optlen = sizeof(optval);
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    // read error code
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
    if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &optval, &optlen))
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
        RETURN_SET_ERROR_ERRNO(err, ERR_GETSOCKOPT);
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
    // sanity-check optlen... not sure if this is sensible
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
    if (optlen != sizeof(optval))
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
        RETURN_SET_ERROR_EXTRA(err, ERR_GETSOCKOPT, EINVAL);
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
    
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
    // then store the system error code
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
    ERROR_EXTRA(err) = optval;
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
    // ok
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    return SUCCESS;
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
}
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
a74b55104fb9 rename sock_tcp to tcp_{transport,client}, fix irc_net_connect to use log_err/tcp_connect
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43