Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 27 Dec 2013 02:49:04 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r259930 - user/ae/inet6/lib/libjail
Message-ID:  <201312270249.rBR2n4gF003530@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 <sys/sysctl.h>
 
 #include <arpa/inet.h>
+#include <net/if.h>
 #include <netinet/in.h>
+#include <netdb.h>
 
 #include <errno.h>
 #include <inttypes.h>
@@ -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),



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201312270249.rBR2n4gF003530>