From nobody Sun Feb 8 10:50:09 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1564671689; cv=none; d=zoho.com; s=zohoarc; b=AXrRw2ENEs7Dn6Rq4Wv2tXZpXpffC71TnUt3IudlarCG9z/v8vMeBRbRrh5zede6EbYbMrCU/FTIGf4OST7fe1mJ3BRm0LotkjaquXdcN3W8Hm4rmVhkDMrIvOCWUKxhSlWNcjBs3xb3V2ZQs1DNNSDV8ysM9ikZEqEe8yAPv40= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1564671689; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=al0wOHIHU7Qoq6IKNTmfqotp4sCVf/Ga3HAbjEyTN9k=; b=lXvAcodEoIDcckMVCxlWSr0x4PtL35kRWpbFxdixg6G6mqEFPChImbxHItt5WdLvQNMbMvEUZAhWUW/9wxce4TFY9srEujvK+FE+e1nwD+aqU8rDtNipT97xjMHd+o0R6gznlwh0VVqEV+I1IUDEAws1Hkhz3/MyKGeckV9Y8Vs= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1564671689415995.5965463295402; Thu, 1 Aug 2019 08:01:29 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 25E70F0D12; Thu, 1 Aug 2019 15:01:28 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id DFD2160A9F; Thu, 1 Aug 2019 15:01:27 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 8B6131973C; Thu, 1 Aug 2019 15:01:27 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x71F1ND6032251 for ; Thu, 1 Aug 2019 11:01:23 -0400 Received: by smtp.corp.redhat.com (Postfix) id 2546919698; Thu, 1 Aug 2019 15:01:23 +0000 (UTC) Received: from domokun.gsslab.fab.redhat.com (dhcp-94.gsslab.fab.redhat.com [10.33.9.94]) by smtp.corp.redhat.com (Postfix) with ESMTP id 886DD19697; Thu, 1 Aug 2019 15:01:22 +0000 (UTC) From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Date: Thu, 1 Aug 2019 16:00:17 +0100 Message-Id: <20190801150019.10519-16-berrange@redhat.com> In-Reply-To: <20190801150019.10519-1-berrange@redhat.com> References: <20190801150019.10519-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 15/17] nss: directly use getnameinfo/getaddrinfo X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 01 Aug 2019 15:01:28 +0000 (UTC) Use the plain libc socket APIs to avoid a dependancy on the main libvirt code from the nss module. Signed-off-by: Daniel P. Berrang=C3=A9 --- tools/nss/libvirt_nss.c | 36 ++++++++++++++++------ tools/nss/libvirt_nss_leases.c | 56 +++++++++++++++++++++++++--------- 2 files changed, 69 insertions(+), 23 deletions(-) diff --git a/tools/nss/libvirt_nss.c b/tools/nss/libvirt_nss.c index 47d2ba9435..2719e19cda 100644 --- a/tools/nss/libvirt_nss.c +++ b/tools/nss/libvirt_nss.c @@ -38,7 +38,6 @@ =20 #include "viralloc.h" #include "virtime.h" -#include "virsocketaddr.h" #include "configmake.h" =20 #include "libvirt_nss_leases.h" @@ -474,25 +473,45 @@ aiforaf(const char *name, int af, struct addrinfo *pa= i, struct addrinfo **aip) =20 addrList =3D resolved.h_addr_list; while (*addrList) { - virSocketAddr sa; - char *ipAddr =3D NULL; + union { + struct sockaddr sa; + struct sockaddr_in sin; + struct sockaddr_in6 sin6; + } sa; + socklen_t salen; void *address =3D *addrList; + char host[NI_MAXHOST]; + char port[NI_MAXSERV]; =20 memset(&sa, 0, sizeof(sa)); if (resolved.h_addrtype =3D=3D AF_INET) { - virSocketAddrSetIPv4AddrNetOrder(&sa, *((uint32_t *) address)); + sa.sin.sin_family =3D AF_INET; + memcpy(&sa.sin.sin_addr.s_addr, + address, + FAMILY_ADDRESS_SIZE(AF_INET)); + salen =3D sizeof(sa.sin); } else { - virSocketAddrSetIPv6AddrNetOrder(&sa, address); + sa.sin6.sin6_family =3D AF_INET6; + memcpy(&sa.sin6.sin6_addr.s6_addr, + address, + FAMILY_ADDRESS_SIZE(AF_INET6)); + salen =3D sizeof(sa.sin6); } =20 - ipAddr =3D virSocketAddrFormat(&sa); + if ((err =3D getnameinfo(&sa.sa, salen, + host, sizeof(host), + port, sizeof(port), + NI_NUMERICHOST | NI_NUMERICSERV)) !=3D 0) { + ERROR("Cannot convert socket address to string: %s", + gai_strerror(err)); + continue; + } =20 hints =3D *pai; hints.ai_flags =3D AI_NUMERICHOST; hints.ai_family =3D af; =20 - if (getaddrinfo(ipAddr, NULL, &hints, &res0)) { - VIR_FREE(ipAddr); + if (getaddrinfo(host, NULL, &hints, &res0)) { addrList++; continue; } @@ -504,7 +523,6 @@ aiforaf(const char *name, int af, struct addrinfo *pai,= struct addrinfo **aip) while ((*aip)->ai_next) *aip =3D (*aip)->ai_next; =20 - VIR_FREE(ipAddr); addrList++; } } diff --git a/tools/nss/libvirt_nss_leases.c b/tools/nss/libvirt_nss_leases.c index 44089af313..803b14cc55 100644 --- a/tools/nss/libvirt_nss_leases.c +++ b/tools/nss/libvirt_nss_leases.c @@ -30,7 +30,6 @@ =20 #include "libvirt_nss_leases.h" #include "libvirt_nss.h" -#include "virsocketaddr.h" #include "viralloc.h" =20 enum { @@ -69,18 +68,47 @@ appendAddr(const char *name ATTRIBUTE_UNUSED, long long expirytime, int af) { - virSocketAddr sa; int family; size_t i; + struct addrinfo hints =3D {0}; + struct addrinfo *res =3D NULL; + union { + struct sockaddr sa; + struct sockaddr_in sin; + struct sockaddr_in6 sin6; + } sa; + unsigned char addr[16]; + int err; =20 DEBUG("IP address: %s", ipAddr); - if (virSocketAddrParse(&sa, ipAddr, AF_UNSPEC) < 0) { - ERROR("Unable to parse %s", ipAddr); + + hints.ai_family =3D AF_UNSPEC; + hints.ai_flags =3D AI_NUMERICHOST; + + if ((err =3D getaddrinfo(ipAddr, NULL, &hints, &res)) !=3D 0) { + ERROR("Cannot parse socket address '%s': %s", + ipAddr, gai_strerror(err)); + return -1; + } + + if (!res) { + ERROR("No resolved address for '%s'", ipAddr); return -1; } + family =3D res->ai_family; + memcpy(&sa, res->ai_addr, res->ai_addrlen); + freeaddrinfo(res); + + if (family =3D=3D AF_INET) { + memcpy(addr, &sa.sin.sin_addr, sizeof(sa.sin.sin_addr)); + } else if (family =3D=3D AF_INET6) { + memcpy(addr, &sa.sin6.sin6_addr, sizeof(sa.sin6.sin6_addr)); + } else { + DEBUG("Skipping unexpected family %d", family); + return 0; + } =20 - family =3D VIR_SOCKET_ADDR_FAMILY(&sa); - if (af !=3D AF_UNSPEC && af !=3D family) { + if (af !=3D AF_UNSPEC && af !=3D family) { DEBUG("Skipping address which family is %d, %d requested", family,= af); return 0; } @@ -88,15 +116,15 @@ appendAddr(const char *name ATTRIBUTE_UNUSED, for (i =3D 0; i < *ntmpAddress; i++) { if (family =3D=3D AF_INET) { if (memcmp((*tmpAddress)[i].addr, - &sa.data.inet4.sin_addr.s_addr, - sizeof(sa.data.inet4.sin_addr.s_addr)) =3D=3D 0) { + &sa.sin.sin_addr, + sizeof(sa.sin.sin_addr)) =3D=3D 0) { DEBUG("IP address already in the list"); return 0; } } else { if (memcmp((*tmpAddress)[i].addr, - &sa.data.inet6.sin6_addr.s6_addr, - sizeof(sa.data.inet6.sin6_addr.s6_addr)) =3D=3D 0) { + &sa.sin6.sin6_addr, + sizeof(sa.sin6.sin6_addr)) =3D=3D 0) { DEBUG("IP address already in the list"); return 0; } @@ -112,12 +140,12 @@ appendAddr(const char *name ATTRIBUTE_UNUSED, (*tmpAddress)[*ntmpAddress].af =3D family; if (family =3D=3D AF_INET) memcpy((*tmpAddress)[*ntmpAddress].addr, - &sa.data.inet4.sin_addr.s_addr, - sizeof(sa.data.inet4.sin_addr.s_addr)); + &sa.sin.sin_addr, + sizeof(sa.sin.sin_addr)); else memcpy((*tmpAddress)[*ntmpAddress].addr, - &sa.data.inet6.sin6_addr.s6_addr, - sizeof(sa.data.inet6.sin6_addr.s6_addr)); + &sa.sin6.sin6_addr, + sizeof(sa.sin6.sin6_addr)); (*ntmpAddress)++; return 0; } --=20 2.21.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list