Return to netscope.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / lib / isc |
1.1 ! misho 1: /* ! 2: * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") ! 3: * Copyright (C) 2002 Internet Software Consortium. ! 4: * ! 5: * Permission to use, copy, modify, and/or distribute this software for any ! 6: * purpose with or without fee is hereby granted, provided that the above ! 7: * copyright notice and this permission notice appear in all copies. ! 8: * ! 9: * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ! 10: * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ! 11: * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ! 12: * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ! 13: * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ! 14: * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ! 15: * PERFORMANCE OF THIS SOFTWARE. ! 16: */ ! 17: ! 18: /*! \file */ ! 19: ! 20: #if defined(LIBC_SCCS) && !defined(lint) ! 21: static char rcsid[] = ! 22: "$Id: netscope.c,v 1.13 2007/06/19 23:47:17 tbox Exp $"; ! 23: #endif /* LIBC_SCCS and not lint */ ! 24: ! 25: #include <config.h> ! 26: ! 27: #include <isc/string.h> ! 28: #include <isc/net.h> ! 29: #include <isc/netscope.h> ! 30: #include <isc/result.h> ! 31: ! 32: isc_result_t ! 33: isc_netscope_pton(int af, char *scopename, void *addr, isc_uint32_t *zoneid) { ! 34: char *ep; ! 35: #ifdef ISC_PLATFORM_HAVEIFNAMETOINDEX ! 36: unsigned int ifid; ! 37: #endif ! 38: struct in6_addr *in6; ! 39: isc_uint32_t zone; ! 40: isc_uint64_t llz; ! 41: ! 42: /* at this moment, we only support AF_INET6 */ ! 43: if (af != AF_INET6) ! 44: return (ISC_R_FAILURE); ! 45: ! 46: in6 = (struct in6_addr *)addr; ! 47: ! 48: /* ! 49: * Basically, "names" are more stable than numeric IDs in terms of ! 50: * renumbering, and are more preferred. However, since there is no ! 51: * standard naming convention and APIs to deal with the names. Thus, ! 52: * we only handle the case of link-local addresses, for which we use ! 53: * interface names as link names, assuming one to one mapping between ! 54: * interfaces and links. ! 55: */ ! 56: #ifdef ISC_PLATFORM_HAVEIFNAMETOINDEX ! 57: if (IN6_IS_ADDR_LINKLOCAL(in6) && ! 58: (ifid = if_nametoindex((const char *)scopename)) != 0) ! 59: zone = (isc_uint32_t)ifid; ! 60: else { ! 61: #endif ! 62: llz = isc_string_touint64(scopename, &ep, 10); ! 63: if (ep == scopename) ! 64: return (ISC_R_FAILURE); ! 65: ! 66: /* check overflow */ ! 67: zone = (isc_uint32_t)(llz & 0xffffffffUL); ! 68: if (zone != llz) ! 69: return (ISC_R_FAILURE); ! 70: #ifdef ISC_PLATFORM_HAVEIFNAMETOINDEX ! 71: } ! 72: #endif ! 73: ! 74: *zoneid = zone; ! 75: return (ISC_R_SUCCESS); ! 76: }