e57ec8c5016d781ccbe9785898fd7c6df887d99fTinderbox User/*
a8f6b2aa46f882c7c680b7bdab1dfb78a76787eaMark Andrews * Copyright (C) 2002, 2004-2007, 2016 Internet Systems Consortium, Inc. ("ISC")
5347c0fcb04eaea19d9f39795646239f487c6207Tinderbox User *
5347c0fcb04eaea19d9f39795646239f487c6207Tinderbox User * This Source Code Form is subject to the terms of the Mozilla Public
5347c0fcb04eaea19d9f39795646239f487c6207Tinderbox User * License, v. 2.0. If a copy of the MPL was not distributed with this
a8f6b2aa46f882c7c680b7bdab1dfb78a76787eaMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
a8f6b2aa46f882c7c680b7bdab1dfb78a76787eaMark Andrews */
a8f6b2aa46f882c7c680b7bdab1dfb78a76787eaMark Andrews
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User/*! \file */
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater#if defined(LIBC_SCCS) && !defined(lint)
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox Userstatic char rcsid[] =
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User "$Id: netscope.c,v 1.13 2007/06/19 23:47:17 tbox Exp $";
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater#endif /* LIBC_SCCS and not lint */
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User#include <config.h>
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User#include <isc/string.h>
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User#include <isc/net.h>
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User#include <isc/netscope.h>
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User#include <isc/result.h>
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox Userisc_result_t
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox Userisc_netscope_pton(int af, char *scopename, void *addr, isc_uint32_t *zoneid) {
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User char *ep;
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User#ifdef ISC_PLATFORM_HAVEIFNAMETOINDEX
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User unsigned int ifid;
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User#endif
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User struct in6_addr *in6;
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User isc_uint32_t zone;
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater isc_uint64_t llz;
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater /* at this moment, we only support AF_INET6 */
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater if (af != AF_INET6)
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User return (ISC_R_FAILURE);
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User in6 = (struct in6_addr *)addr;
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater
a8f6b2aa46f882c7c680b7bdab1dfb78a76787eaMark Andrews /*
5d4460c9b5fc57a46790ed99448eb11d05318edfAutomatic Updater * Basically, "names" are more stable than numeric IDs in terms of
fd2597f75693a2279fdf588bd40dfe2407c42028Tinderbox User * renumbering, and are more preferred. However, since there is no
e57ec8c5016d781ccbe9785898fd7c6df887d99fTinderbox User * standard naming convention and APIs to deal with the names. Thus,
a8f6b2aa46f882c7c680b7bdab1dfb78a76787eaMark Andrews * we only handle the case of link-local addresses, for which we use
a8f6b2aa46f882c7c680b7bdab1dfb78a76787eaMark Andrews * interface names as link names, assuming one to one mapping between
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater * interfaces and links.
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User */
a8f6b2aa46f882c7c680b7bdab1dfb78a76787eaMark Andrews#ifdef ISC_PLATFORM_HAVEIFNAMETOINDEX
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater if (IN6_IS_ADDR_LINKLOCAL(in6) &&
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater (ifid = if_nametoindex((const char *)scopename)) != 0)
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User zone = (isc_uint32_t)ifid;
a8f6b2aa46f882c7c680b7bdab1dfb78a76787eaMark Andrews else {
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater#endif
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater llz = isc_string_touint64(scopename, &ep, 10);
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User if (ep == scopename)
a8f6b2aa46f882c7c680b7bdab1dfb78a76787eaMark Andrews return (ISC_R_FAILURE);
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User
a8f6b2aa46f882c7c680b7bdab1dfb78a76787eaMark Andrews /* check overflow */
548a24c3d36837aa5f0e64f7bb8c7308909ffa89Tinderbox User zone = (isc_uint32_t)(llz & 0xffffffffUL);
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater if (zone != llz)
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User return (ISC_R_FAILURE);
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater#ifdef ISC_PLATFORM_HAVEIFNAMETOINDEX
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater }
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater#endif
852ccdd42a71550c974111b49415204ffeca6573Automatic Updater
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User *zoneid = zone;
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User return (ISC_R_SUCCESS);
548a24c3d36837aa5f0e64f7bb8c7308909ffa89Tinderbox User}
2eeb74d1cf5355dd98f6d507a10086e16bb08c4bTinderbox User