terom@177: #include "tcp_internal.h" terom@177: terom@177: int tcp_sock_create (const struct addrinfo *addr, error_t *err) terom@177: { terom@177: int sock; terom@177: terom@177: // create a new socket using addr->ai_family/socktype/protocol terom@177: if ((sock = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol)) < 0) terom@177: JUMP_SET_ERROR_ERRNO(err, ERR_SOCKET); terom@177: terom@177: return sock; terom@177: terom@177: error: terom@177: return -ERROR_CODE(err); terom@177: } terom@177: terom@177: err_t tcp_sock_error (evutil_socket_t sock, error_t *err) terom@177: { terom@177: int optval; terom@177: socklen_t optlen; terom@177: terom@177: RESET_ERROR(err); terom@177: terom@177: // init params terom@177: optval = 0; terom@177: optlen = sizeof(optval); terom@177: terom@177: // read error code terom@177: if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &optval, &optlen)) terom@177: RETURN_SET_ERROR_ERRNO(err, ERR_GETSOCKOPT); terom@177: terom@177: // sanity-check optlen... not sure if this is sensible terom@177: if (optlen != sizeof(optval)) terom@177: RETURN_SET_ERROR_EXTRA(err, ERR_GETSOCKOPT, EINVAL); terom@177: terom@177: // then store the system error code terom@177: ERROR_EXTRA(err) = optval; terom@177: terom@177: // ok terom@177: return SUCCESS; terom@177: } terom@177: terom@177: