equal
deleted
inserted
replaced
|
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 |