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>