diff --git a/mongoose.c b/mongoose.c
index 1b411a1a0a5faec28cc57c0ff5e55b0eb7eb8c72..c0ecc218e6fee1875ce8a610d75a6492015c838c 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -176,6 +176,10 @@ struct ll { struct ll *prev, *next; };
 #define MONGOOSE_USE_IDLE_TIMEOUT_SECONDS 30
 #endif
 
+#ifdef MONGOOSE_NO_SOCKETPAIR
+#define MONGOOSE_NO_CGI
+#endif
+
 #ifdef MONGOOSE_ENABLE_DEBUG
 #define DBG(x) do { printf("%-20s ", __func__); printf x; putchar('\n'); \
   fflush(stdout); } while(0)
@@ -3843,7 +3847,10 @@ unsigned int mg_poll_server(struct mg_server *server, int milliseconds) {
 
     // Accept new connections
     if (FD_ISSET(server->listening_sock, &read_set)) {
-      while ((conn = accept_new_connection(server)) != NULL) {
+      // We're not looping here, and accepting just one connection at
+      // a time. The reason is that eCos does not respect non-blocking
+      // flag on a listening socket and hangs in a loop.
+      if ((conn = accept_new_connection(server)) != NULL) {
         conn->birth_time = conn->last_activity_time = current_time;
       }
     }
@@ -4198,11 +4205,13 @@ struct mg_server *mg_create_server(void *server_data) {
 
   LINKED_LIST_INIT(&server->active_connections);
 
+#ifndef MONGOOSE_NO_SOCKETPAIR
   // Create control socket pair. Do it in a loop to protect from
   // interrupted syscalls in mg_socketpair().
   do {
     mg_socketpair(server->ctl);
   } while (server->ctl[0] == INVALID_SOCKET);
+#endif
 
 #ifdef MONGOOSE_USE_SSL
   SSL_library_init();