00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #if defined(LIBC_SCCS) && !defined(lint)
00021 static char rcsid[] =
00022 "$Id: netscope.c,v 1.13 2007/06/19 23:47:17 tbox Exp $";
00023 #endif
00024
00025 #include <config.h>
00026
00027 #include <isc/string.h>
00028 #include <isc/net.h>
00029 #include <isc/netscope.h>
00030 #include <isc/result.h>
00031
00032 isc_result_t
00033 isc_netscope_pton(int af, char *scopename, void *addr, isc_uint32_t *zoneid) {
00034 char *ep;
00035 #ifdef ISC_PLATFORM_HAVEIFNAMETOINDEX
00036 unsigned int ifid;
00037 #endif
00038 struct in6_addr *in6;
00039 isc_uint32_t zone;
00040 isc_uint64_t llz;
00041
00042
00043 if (af != AF_INET6)
00044 return (ISC_R_FAILURE);
00045
00046 in6 = (struct in6_addr *)addr;
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 #ifdef ISC_PLATFORM_HAVEIFNAMETOINDEX
00057 if (IN6_IS_ADDR_LINKLOCAL(in6) &&
00058 (ifid = if_nametoindex((const char *)scopename)) != 0)
00059 zone = (isc_uint32_t)ifid;
00060 else {
00061 #endif
00062 llz = isc_string_touint64(scopename, &ep, 10);
00063 if (ep == scopename)
00064 return (ISC_R_FAILURE);
00065
00066
00067 zone = (isc_uint32_t)(llz & 0xffffffffUL);
00068 if (zone != llz)
00069 return (ISC_R_FAILURE);
00070 #ifdef ISC_PLATFORM_HAVEIFNAMETOINDEX
00071 }
00072 #endif
00073
00074 *zoneid = zone;
00075 return (ISC_R_SUCCESS);
00076 }