From 71eea07a95ecdbd8f91b449cd6ba12f306309d61 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Thu, 8 Mar 2012 17:59:46 +0100 Subject: [PATCH] unix: add support for receiving UNIX sockets Until now, all received file descriptors were reported as being UV_TCP streams: AF_INET/AF_INET6 sockets of type SOCK_STREAM. This commit adds support for AF_UNIX/AF_FILE sockets (UV_NAMED_PIPE in libuv nomenclature). Support for UV_UDP handles (AF_INET/AF_INET6 sockets of type SOCK_DGRAM) still needs to be implemented. --- src/unix/stream.c | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/src/unix/stream.c b/src/unix/stream.c index 111bbc2d..b5ade16a 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); }