From owner-svn-src-user@FreeBSD.ORG Fri Dec 27 02:49:05 2013 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 41C578CF; Fri, 27 Dec 2013 02:49:05 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 2224E1652; Fri, 27 Dec 2013 02:49:05 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id rBR2n56d003531; Fri, 27 Dec 2013 02:49:05 GMT (envelope-from ae@svn.freebsd.org) Received: (from ae@localhost) by svn.freebsd.org (8.14.7/8.14.7/Submit) id rBR2n4gF003530; Fri, 27 Dec 2013 02:49:04 GMT (envelope-from ae@svn.freebsd.org) Message-Id: <201312270249.rBR2n4gF003530@svn.freebsd.org> From: "Andrey V. Elsukov" Date: Fri, 27 Dec 2013 02:49:04 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r259930 - user/ae/inet6/lib/libjail X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 27 Dec 2013 02:49:05 -0000 Author: ae Date: Fri Dec 27 02:49:04 2013 New Revision: 259930 URL: http://svnweb.freebsd.org/changeset/base/259930 Log: Use struct sockaddr_in6 instead of in6_addr in libjail. Modified: user/ae/inet6/lib/libjail/jail.c Modified: user/ae/inet6/lib/libjail/jail.c ============================================================================== --- user/ae/inet6/lib/libjail/jail.c Fri Dec 27 02:43:53 2013 (r259929) +++ user/ae/inet6/lib/libjail/jail.c Fri Dec 27 02:49:04 2013 (r259930) @@ -34,7 +34,9 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include +#include #include #include @@ -293,6 +295,7 @@ jailparam_init(struct jailparam *jp, con int jailparam_import(struct jailparam *jp, const char *value) { + struct addrinfo hints, *res; char *p, *ep, *tvalue; const char *avalue; int i, nval, fw; @@ -410,9 +413,11 @@ jailparam_import(struct jailparam *jp, c } break; case JPS_IN6_ADDR: - if (inet_pton(AF_INET6, tvalue, - &((struct in6_addr *)jp->jp_value)[i]) != 1) - { + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET6; + hints.ai_flags = AI_NUMERICHOST; + if (getaddrinfo(tvalue, NULL, &hints, + &res) != 0) { snprintf(jail_errmsg, JAIL_ERRMSGLEN, "%s: not an IPv6 address: %s", @@ -420,6 +425,10 @@ jailparam_import(struct jailparam *jp, c errno = EINVAL; goto error; } + memcpy(&((struct sockaddr_in6 *) + jp->jp_value)[i], res->ai_addr, + res->ai_addrlen); + freeaddrinfo(res); break; default: goto unknown_type; @@ -723,11 +732,12 @@ jailparam_get(struct jailparam *jp, unsi char * jailparam_export(struct jailparam *jp) { + struct sockaddr_in6 *sa6; size_t *valuelens; char *value, *tvalue, **values; size_t valuelen; int i, nval, ival; - char valbuf[INET6_ADDRSTRLEN]; + char valbuf[INET6_ADDRSTRLEN + IF_NAMESIZE + 1]; if ((jp->jp_ctltype & CTLTYPE) == CTLTYPE_STRING) { value = strdup(jp->jp_value); @@ -796,11 +806,13 @@ jailparam_export(struct jailparam *jp) } break; case JPS_IN6_ADDR: - if (inet_ntop(AF_INET6, - &((struct in6_addr *)jp->jp_value)[i], - valbuf, sizeof(valbuf)) == NULL) { - strerror_r(errno, jail_errmsg, - JAIL_ERRMSGLEN); + sa6 = &((struct sockaddr_in6 *)jp->jp_value)[i]; + if ((errno = getnameinfo((struct sockaddr *)sa6, + sa6->sin6_len, valbuf, sizeof(valbuf), + NULL, 0, NI_NUMERICHOST)) != 0) { + snprintf(jail_errmsg, JAIL_ERRMSGLEN, + "getnameinfo: %s", + gai_strerror(errno)); return (NULL); } break; @@ -969,9 +981,9 @@ jailparam_type(struct jailparam *jp) if (!strcmp(desc.s, "S,in_addr")) { jp->jp_structtype = JPS_IN_ADDR; jp->jp_valuelen = sizeof(struct in_addr); - } else if (!strcmp(desc.s, "S,in6_addr")) { + } else if (!strcmp(desc.s, "S,sockaddr_in6")) { jp->jp_structtype = JPS_IN6_ADDR; - jp->jp_valuelen = sizeof(struct in6_addr); + jp->jp_valuelen = sizeof(struct sockaddr_in6); } else { desclen = 0; if (sysctl(mib + 2, miblen / sizeof(int),