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>
/* 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);