port: shutdown(2) can return ENOTCONN on FreeBSD
authorMichael Jeanson <mjeanson@efficios.com>
Mon, 9 Nov 2020 16:40:37 +0000 (11:40 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 28 Oct 2022 15:56:51 +0000 (11:56 -0400)
On FreeBSD shutdown(2) will return ENOTCONN when called on a
disconnected socket which is not the case on Linux. It will however
still run the shutdown code on the socket and wakeup threads waiting on
the socket, so we can safely ignore this specific error.

For more details see this bug report:

https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=227259

Change-Id: I0046382ab996060f940dd1283d18447792cf1fd3
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/common/unix.cpp

index 0a1b1a5a54354beb1b759a7a95d6b6953d340ed2..0548aaccbab6fccce6f98093cf7c98cceca4ebf7 100644 (file)
@@ -379,7 +379,16 @@ int lttcomm_close_unix_sock(int sock)
        /* Shutdown receptions and transmissions */
        ret = shutdown(sock, SHUT_RDWR);
        if (ret < 0) {
-               PERROR("shutdown");
+               /*
+                * The socket is already disconnected, don't error out.
+                * This doesn't happen on Linux, but it does on FreeBSD, see:
+                * https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=227259
+                */
+               if (errno == ENOTCONN) {
+                       ret = 0;
+               } else {
+                       PERROR("shutdown");
+               }
        }
 
        closeret = close(sock);
This page took 0.02671 seconds and 4 git commands to generate.