00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <config.h>
00023
00024 #include <string.h>
00025
00026 #include <isc/result.h>
00027 #include <isc/netaddr.h>
00028 #include <isc/sockaddr.h>
00029
00030 #include <lwres/lwres.h>
00031
00032 #include <named/lwaddr.h>
00033
00034
00035
00036
00037 isc_result_t
00038 lwaddr_netaddr_fromlwresaddr(isc_netaddr_t *na, lwres_addr_t *la) {
00039 if (la->family != LWRES_ADDRTYPE_V4 && la->family != LWRES_ADDRTYPE_V6)
00040 return (ISC_R_FAMILYNOSUPPORT);
00041
00042 if (la->family == LWRES_ADDRTYPE_V4) {
00043 struct in_addr ina;
00044 memmove(&ina.s_addr, la->address, 4);
00045 isc_netaddr_fromin(na, &ina);
00046 } else {
00047 struct in6_addr ina6;
00048 memmove(&ina6.s6_addr, la->address, 16);
00049 isc_netaddr_fromin6(na, &ina6);
00050 }
00051 return (ISC_R_SUCCESS);
00052 }
00053
00054 isc_result_t
00055 lwaddr_sockaddr_fromlwresaddr(isc_sockaddr_t *sa, lwres_addr_t *la,
00056 in_port_t port)
00057 {
00058 isc_netaddr_t na;
00059 isc_result_t result;
00060
00061 result = lwaddr_netaddr_fromlwresaddr(&na, la);
00062 if (result != ISC_R_SUCCESS)
00063 return (result);
00064 isc_sockaddr_fromnetaddr(sa, &na, port);
00065 return (ISC_R_SUCCESS);
00066 }
00067
00068
00069
00070
00071
00072 isc_result_t
00073 lwaddr_lwresaddr_fromnetaddr(lwres_addr_t *la, isc_netaddr_t *na) {
00074 if (na->family != AF_INET && na->family != AF_INET6)
00075 return (ISC_R_FAMILYNOSUPPORT);
00076
00077 if (na->family == AF_INET) {
00078 la->family = LWRES_ADDRTYPE_V4;
00079 la->length = 4;
00080 memmove(la->address, &na->type.in, 4);
00081 } else {
00082 la->family = LWRES_ADDRTYPE_V6;
00083 la->length = 16;
00084 memmove(la->address, &na->type.in6, 16);
00085 }
00086 return (ISC_R_SUCCESS);
00087 }
00088
00089 isc_result_t
00090 lwaddr_lwresaddr_fromsockaddr(lwres_addr_t *la, isc_sockaddr_t *sa) {
00091 isc_netaddr_t na;
00092 isc_netaddr_fromsockaddr(&na, sa);
00093 return (lwaddr_lwresaddr_fromnetaddr(la, &na));
00094 }