author | Tero Marttila <terom@fixme.fi> |
Thu, 28 May 2009 01:17:36 +0300 | |
branch | new-lib-errors |
changeset 219 | cefec18b8268 |
parent 177 | src/tcp.c@a74b55104fb9 |
permissions | -rw-r--r-- |
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 |