diff --git a/src/modules/module-raop/rtsp-client.c b/src/modules/module-raop/rtsp-client.c index fae71977c..574f9f3e4 100644 --- a/src/modules/module-raop/rtsp-client.c +++ b/src/modules/module-raop/rtsp-client.c @@ -445,7 +445,12 @@ on_source_io(void *data, int fd, uint32_t mask) int res; if (mask & (SPA_IO_ERR | SPA_IO_HUP)) { - res = -EPIPE; + socklen_t len = sizeof(res); + if ((mask & SPA_IO_HUP) || + getsockopt(fd, SOL_SOCKET, SO_ERROR, &res, &len) < 0) + res = -EPIPE; + else + res = -res; goto error; } if (mask & SPA_IO_IN) { diff --git a/src/modules/module-sendspin/websocket.c b/src/modules/module-sendspin/websocket.c index b6ddf629f..e0d5a717d 100644 --- a/src/modules/module-sendspin/websocket.c +++ b/src/modules/module-sendspin/websocket.c @@ -712,7 +712,12 @@ on_source_io(void *data, int fd, uint32_t mask) conn->refcount++; if (mask & (SPA_IO_ERR | SPA_IO_HUP)) { - res = -EPIPE; + socklen_t len = sizeof(res); + if ((mask & SPA_IO_HUP) || + getsockopt(fd, SOL_SOCKET, SO_ERROR, &res, &len) < 0) + res = -EPIPE; + else + res = -res; goto error; } if (mask & SPA_IO_IN) { diff --git a/src/modules/module-snapcast-discover.c b/src/modules/module-snapcast-discover.c index 2561a7304..0e9fef1a1 100644 --- a/src/modules/module-snapcast-discover.c +++ b/src/modules/module-snapcast-discover.c @@ -381,7 +381,12 @@ on_source_io(void *data, int fd, uint32_t mask) int res; if (mask & (SPA_IO_ERR | SPA_IO_HUP)) { - res = -EPIPE; + socklen_t len = sizeof(res); + if ((mask & SPA_IO_HUP) || + getsockopt(fd, SOL_SOCKET, SO_ERROR, &res, &len) < 0) + res = -EPIPE; + else + res = -res; goto error; } if (mask & SPA_IO_IN) {