socket-util: Clarify EAGAIN error code for make_unix_socket().
authorBen Pfaff <blp@nicira.com>
Sat, 12 Dec 2009 00:59:44 +0000 (16:59 -0800)
committerBen Pfaff <blp@nicira.com>
Sat, 12 Dec 2009 00:59:44 +0000 (16:59 -0800)
make_unix_socket() can return EAGAIN in rare circumstances, e.g. when the
server's socket listen queue is full.  A lot of OVS callers interpret
EAGAIN as a "try again" error code, but in this case it means that the
attempt to create the socket failed.  So munge EAGAIN into another error
code to prevent that misinterpretation.

lib/socket-util.c

index e6a6c70ef836b9a370bd9fffb64fc7cf3844b409..ed19013020cb8dae903ab91ec128819de6f7b57d 100644 (file)
@@ -249,6 +249,7 @@ make_unix_socket(int style, bool nonblock, bool passcred UNUSED,
         make_sockaddr_un(connect_path, &un, &un_len);
         if (connect(fd, (struct sockaddr*) &un, un_len)
             && errno != EINPROGRESS) {
+            printf("connect failed with %s\n", strerror(errno));
             goto error;
         }
     }
@@ -265,10 +266,10 @@ make_unix_socket(int style, bool nonblock, bool passcred UNUSED,
     return fd;
 
 error:
+    error = errno == EAGAIN ? EPROTO : errno;
     if (bind_path) {
         fatal_signal_remove_file_to_unlink(bind_path);
     }
-    error = errno;
     close(fd);
     return -error;
 }