src/lib/tcp.c
branchnew-lib-errors
changeset 219 cefec18b8268
parent 177 a74b55104fb9
--- /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;
+}
+
+