diff options
Diffstat (limited to 'src/core/ext/filters/client_channel/parse_address.cc')
-rw-r--r-- | src/core/ext/filters/client_channel/parse_address.cc | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/core/ext/filters/client_channel/parse_address.cc b/src/core/ext/filters/client_channel/parse_address.cc index 707beb8876..c737f53d01 100644 --- a/src/core/ext/filters/client_channel/parse_address.cc +++ b/src/core/ext/filters/client_channel/parse_address.cc @@ -26,6 +26,10 @@ #include <string.h> #ifdef GRPC_HAVE_UNIX_SOCKET #include <sys/un.h> +#ifdef GRPC_HAVE_LINUX_VSOCK +#include <sys/socket.h> +#include <linux/vm_sockets.h> +#endif /* GRPC_HAVE_LINUX_VSOCK */ #endif #include <grpc/support/alloc.h> @@ -63,6 +67,32 @@ bool grpc_parse_unix(const grpc_uri* uri, #endif /* GRPC_HAVE_UNIX_SOCKET */ +#if defined(GRPC_HAVE_UNIX_SOCKET) && defined(GRPC_HAVE_LINUX_VSOCK) + +bool grpc_parse_vsock(const grpc_uri* uri, + grpc_resolved_address* resolved_addr) { + memset(resolved_addr, 0, sizeof(*resolved_addr)); + struct sockaddr_vm *vm = + reinterpret_cast<struct sockaddr_vm *>(resolved_addr->addr); + + if (sscanf(uri->path, "%u:%u", &vm->svm_cid, &vm->svm_port) != 2) { + return false; + } + vm->svm_family = AF_VSOCK; + + resolved_addr->len = static_cast<socklen_t>(sizeof(*vm)); + return true; +} + +#else /* defined(GRPC_HAVE_UNIX_SOCKET) && defined(GRPC_HAVE_LINUX_VSOCK) */ + +bool grpc_parse_vsock(const grpc_uri* uri, + grpc_resolved_address* resolved_addr) { + abort(); +} + +#endif /* defined(GRPC_HAVE_UNIX_SOCKET) && defined(GRPC_HAVE_LINUX_VSOCK) */ + bool grpc_parse_ipv4_hostport(const char* hostport, grpc_resolved_address* addr, bool log_errors) { bool success = false; @@ -200,6 +230,8 @@ bool grpc_parse_uri(const grpc_uri* uri, grpc_resolved_address* resolved_addr) { return grpc_parse_ipv4(uri, resolved_addr); } else if (strcmp("ipv6", uri->scheme) == 0) { return grpc_parse_ipv6(uri, resolved_addr); + } else if (strcmp("vsock", uri->scheme) == 0) { + return grpc_parse_vsock(uri, resolved_addr); } gpr_log(GPR_ERROR, "Can't parse scheme '%s'", uri->scheme); return false; |