From patchwork Thu Sep 29 10:27:27 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Hajnoczi X-Patchwork-Id: 16137 Received: (qmail 79480 invoked by alias); 29 Sep 2016 10:27:36 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 79385 invoked by uid 89); 29 Sep 2016 10:27:35 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.9 required=5.0 tests=BAYES_00, KAM_LAZY_DOMAIN_SECURITY, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=72, 6, cid, libidn, advised X-HELO: mx1.redhat.com From: Stefan Hajnoczi To: libc-alpha@sourceware.org Cc: Jorgen Hansen , Stefan Hajnoczi Subject: [RFC PATCH 1/2] getnameinfo: Add AF_VSOCK support Date: Thu, 29 Sep 2016 11:27:27 +0100 Message-Id: <1475144848-4446-2-git-send-email-stefanha@redhat.com> In-Reply-To: <1475144848-4446-1-git-send-email-stefanha@redhat.com> References: <1475144848-4446-1-git-send-email-stefanha@redhat.com> Allow getnameinfo(3) to understand AF_VSOCK sockaddrs. There is no name resolution for AF_VSOCK so it's just a matter of formatting the fields. The AF_VSOCK address family has been available in Linux since 3.9. It allows virtual machines and hypervisors to communicate over a zero-configuration transport without Ethernet or IP. Signed-off-by: Stefan Hajnoczi --- inet/getnameinfo.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/inet/getnameinfo.c b/inet/getnameinfo.c index 283da55..b5bc10e 100644 --- a/inet/getnameinfo.c +++ b/inet/getnameinfo.c @@ -72,6 +72,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +/* TODO This uapi kernel header is needed for struct sockaddr_vm. Do I need to + * import/reimplement the header for glibc? + */ +#ifdef AF_VSOCK +#include +#endif /* AF_VSOCK */ + #ifdef HAVE_LIBIDN # include extern int __idna_to_unicode_lzlz (const char *input, char **output, @@ -412,6 +419,22 @@ gni_host_local (struct scratch_buffer *tmpbuf, return checked_copy (host, hostlen, "localhost"); } +#ifdef AF_VSOCK +/* Convert AF_VSOCK socket address, host part. */ +static int +gni_host_vsock (struct scratch_buffer *tmpbuf, + const struct sockaddr *sa, socklen_t addrlen, + char *host, socklen_t hostlen, int flags) +{ + const struct sockaddr_vm *svm = (const struct sockaddr_vm *) sa; + + if ((flags & NI_NAMEREQD) && !(flags & NI_NUMERICHOST)) + return EAI_NONAME; + + return CHECKED_SNPRINTF (host, hostlen, "%u", svm->svm_cid); +} +#endif /* AF_VSOCK */ + /* Convert the host part of an AF_LOCAK socket address. */ static int gni_host (struct scratch_buffer *tmpbuf, @@ -427,6 +450,11 @@ gni_host (struct scratch_buffer *tmpbuf, case AF_LOCAL: return gni_host_local (tmpbuf, sa, addrlen, host, hostlen, flags); +#ifdef AF_VSOCK + case AF_VSOCK: + return gni_host_vsock (tmpbuf, sa, addrlen, host, hostlen, flags); +#endif /* AF_VSOCK */ + default: return EAI_FAMILY; } @@ -479,6 +507,20 @@ gni_serv_local (struct scratch_buffer *tmpbuf, (serv, servlen, ((const struct sockaddr_un *) sa)->sun_path); } +#ifdef AF_VSOCK +/* Convert service to string, AF_VSOCK variant. */ +static int +gni_serv_vsock (struct scratch_buffer *tmpbuf, + const struct sockaddr *sa, socklen_t addrlen, + char *serv, socklen_t servlen, int flags) +{ + const struct sockaddr_vm *svm = (const struct sockaddr_vm *) sa; + + return CHECKED_SNPRINTF (serv, servlen, "%u", svm->svm_port); +} +#endif /* AF_VSOCK */ + + /* Convert service to string, dispatching to the implementations above. */ static int @@ -493,6 +535,10 @@ gni_serv (struct scratch_buffer *tmpbuf, return gni_serv_inet (tmpbuf, sa, addrlen, serv, servlen, flags); case AF_LOCAL: return gni_serv_local (tmpbuf, sa, addrlen, serv, servlen, flags); +#ifdef AF_VSOCK + case AF_VSOCK: + return gni_serv_vsock (tmpbuf, sa, addrlen, serv, servlen, flags); +#endif /* AF_VSOCK */ default: return EAI_FAMILY; } @@ -530,6 +576,12 @@ getnameinfo (const struct sockaddr *sa, socklen_t addrlen, char *host, if (addrlen < sizeof (struct sockaddr_in6)) return EAI_FAMILY; break; +#ifdef AF_VSOCK + case AF_VSOCK: + if (addrlen < sizeof (struct sockaddr_vm)) + return EAI_FAMILY; + break; +#endif /* AF_VSOCK */ default: return EAI_FAMILY; }