More work on AIO subsystem

Signed-off-by: Martin Sustrik <sustrik@250bpm.com>
diff --git a/src/utils/aio.c b/src/utils/aio.c
index 3fe2f5a..0db6b28 100644
--- a/src/utils/aio.c
+++ b/src/utils/aio.c
@@ -407,6 +407,7 @@
     int rc;
     int event;
     struct sp_poller_hndl *hndl;
+    int newsock;
 
     /*  Wait for new item. */
     rc = sp_poller_wait (&self->poller, timeout, &event, &hndl);
@@ -481,6 +482,20 @@
     if (event == SP_POLLER_IN) {
 
         if ((*usock)->in.op == SP_USOCK_INOP_ACCEPT) {
+            newsock = accept ((*usock)->parent->s, NULL, NULL);
+            if (newsock == -1) {
+
+                /*  Make sure this is a network error,
+                    not a programming error. */
+                errno_assert (errno == ECONNABORTED ||
+                    errno == EPROTO || errno == ENOBUFS || errno == EMFILE ||
+                    errno == ENFILE || errno == ENOMEM);
+
+                /*  Do nothing, wait for new connections. */
+                return -ETIMEDOUT;
+            }
+
+            /*  TODO: Intialise the usock. */
             sp_assert (0);
         }
 
@@ -541,6 +556,10 @@
 {
     int rc;
 
+    /*  If there's out operation already in progress, fail. */
+    sp_assert (self->out.op == SP_USOCK_OUTOP_NONE);
+    self->out.op = SP_USOCK_OUTOP_CONNECT;
+
     rc = connect (self->s, addr, addrlen) ;
 
     /*  Move the operation to the worker thread. */
@@ -604,10 +623,14 @@
         sp_usock_tune (usock);
         return 0;
     }
-
+ 
+    /*  If there's an in operaton in progress, fail. */
+    sp_assert (self->out.op == SP_USOCK_OUTOP_NONE);
 
     /*  Move the operation to the worker thread. */
     if (errno == EAGAIN || errno == EWOULDBLOCK) {
+        usock->parent = self;
+        self->in.op = SP_USOCK_INOP_ACCEPT;
         sp_cp_post (self->cp, SP_USOCK_ACCEPT, (void*) self);
         return -EINPROGRESS;
     }
diff --git a/src/utils/aio.h b/src/utils/aio.h
index 7df3e5d..8cb8078 100644
--- a/src/utils/aio.h
+++ b/src/utils/aio.h
@@ -111,6 +111,7 @@
     int protocol;
     struct sp_cp *cp;
     struct sp_poller_hndl hndl;
+    struct sp_usock *parent;
     struct {
         int op;
         void *buf;
diff --git a/tests/tcp.c b/tests/tcp.c
index e793c3e..a99f0de 100644
--- a/tests/tcp.c
+++ b/tests/tcp.c
@@ -47,10 +47,8 @@
     errno_assert (rc >= 0);
     sc = sp_socket (AF_SP, SP_PAIR);
     errno_assert (sc != -1);
-#if 0
     rc = sp_connect (sc, "tcp://127.0.0.1:5555");
     errno_assert (rc >= 0);
-#endif
 
     rc = sp_send (sc, "ABC", 3, 0);
     errno_assert (rc >= 0);