--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib/tcp.c Thu May 28 01:17:36 2009 +0300
@@ -0,0 +1,43 @@
+#include "tcp_internal.h"
+
+int tcp_sock_create (const struct addrinfo *addr, error_t *err)
+{
+ int sock;
+
+ // create a new socket using addr->ai_family/socktype/protocol
+ if ((sock = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol)) < 0)
+ JUMP_SET_ERROR_ERRNO(err, ERR_SOCKET);
+
+ return sock;
+
+error:
+ return -ERROR_CODE(err);
+}
+
+err_t tcp_sock_error (evutil_socket_t sock, error_t *err)
+{
+ int optval;
+ socklen_t optlen;
+
+ RESET_ERROR(err);
+
+ // init params
+ optval = 0;
+ optlen = sizeof(optval);
+
+ // read error code
+ if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &optval, &optlen))
+ RETURN_SET_ERROR_ERRNO(err, ERR_GETSOCKOPT);
+
+ // sanity-check optlen... not sure if this is sensible
+ if (optlen != sizeof(optval))
+ RETURN_SET_ERROR_EXTRA(err, ERR_GETSOCKOPT, EINVAL);
+
+ // then store the system error code
+ ERROR_EXTRA(err) = optval;
+
+ // ok
+ return SUCCESS;
+}
+
+