diff --git a/src/unix/stream.c b/src/unix/stream.c index 111bbc2de..b5ade16ad 100644 --- a/src/unix/stream.c +++ b/src/unix/stream.c @@ -22,14 +22,17 @@ #include "uv.h" #include "internal.h" -#include -#include -#include +#include #include #include -#include +#include +#include -#include +#include +#include +#include +#include +#include static void uv__stream_connect(uv_stream_t*); @@ -513,6 +516,28 @@ static void uv__write_callbacks(uv_stream_t* stream) { } +static uv_handle_type uv__handle_type(int fd) { + struct sockaddr_storage ss; + socklen_t len; + + memset(&ss, 0, sizeof(ss)); + len = sizeof(ss); + + if (getsockname(fd, (struct sockaddr*)&ss, &len)) + return UV_UNKNOWN_HANDLE; + + switch (ss.ss_family) { + case AF_UNIX: + return UV_NAMED_PIPE; + case AF_INET: + case AF_INET6: + return UV_TCP; + } + + return UV_UNKNOWN_HANDLE; +} + + static void uv__read(uv_stream_t* stream) { uv_buf_t buf; ssize_t nread; @@ -633,7 +658,8 @@ static void uv__read(uv_stream_t* stream) { if (stream->accepted_fd >= 0) { - stream->read2_cb((uv_pipe_t*)stream, nread, buf, UV_TCP); + stream->read2_cb((uv_pipe_t*)stream, nread, buf, + uv__handle_type(stream->accepted_fd)); } else { stream->read2_cb((uv_pipe_t*)stream, nread, buf, UV_UNKNOWN_HANDLE); }