?? lwtest.c
字號:
/* * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2002 Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. *//* $Id: lwtest.c,v 1.22.2.4.2.4 2004/03/08 04:04:37 marka Exp $ */#include <config.h>#include <assert.h>#include <stdlib.h>#include <string.h>#include <isc/net.h>#include <lwres/lwres.h>#include <lwres/netdb.h>#include <lwres/net.h>/* * XXX getnameinfo errors, which don't appear to be standard. */#define ENI_NOSERVNAME 1#define ENI_NOHOSTNAME 2#define ENI_MEMORY 3#define ENI_SYSTEM 4#define ENI_FAMILY 5#define ENI_SALEN 6#define ENI_NOSOCKET 7static int fails = 0;static voidCHECK(lwres_result_t val, const char *msg) { if (val != 0) { printf("I:%s returned %d\n", msg, val); exit(1); }}static unsigned char TESTSTRING[] = "This is a test. This is only a test. !!!";static lwres_context_t *ctx;static voidtest_noop(void) { lwres_result_t ret; lwres_lwpacket_t pkt, pkt2; lwres_nooprequest_t nooprequest, *nooprequest2; lwres_noopresponse_t noopresponse, *noopresponse2; lwres_buffer_t b; pkt.pktflags = 0; pkt.serial = 0x11223344; pkt.recvlength = 0x55667788; pkt.result = 0; nooprequest.datalength = strlen((char *)TESTSTRING); nooprequest.data = TESTSTRING; ret = lwres_nooprequest_render(ctx, &nooprequest, &pkt, &b); CHECK(ret, "lwres_nooprequest_render"); /* * Now, parse it into a new structure. */ lwres_buffer_first(&b); ret = lwres_lwpacket_parseheader(&b, &pkt2); CHECK(ret, "lwres_lwpacket_parseheader"); nooprequest2 = NULL; ret = lwres_nooprequest_parse(ctx, &b, &pkt2, &nooprequest2); CHECK(ret, "lwres_nooprequest_parse"); assert(nooprequest.datalength == nooprequest2->datalength); assert(memcmp(nooprequest.data, nooprequest2->data, nooprequest.datalength) == 0); lwres_nooprequest_free(ctx, &nooprequest2); lwres_context_freemem(ctx, b.base, b.length); b.base = NULL; b.length = 0; pkt.pktflags = 0; pkt.serial = 0x11223344; pkt.recvlength = 0x55667788; pkt.result = 0xdeadbeef; noopresponse.datalength = strlen((char *)TESTSTRING); noopresponse.data = TESTSTRING; ret = lwres_noopresponse_render(ctx, &noopresponse, &pkt, &b); CHECK(ret, "lwres_noopresponse_render"); /* * Now, parse it into a new structure. */ lwres_buffer_first(&b); ret = lwres_lwpacket_parseheader(&b, &pkt2); CHECK(ret, "lwres_lwpacket_parseheader"); noopresponse2 = NULL; ret = lwres_noopresponse_parse(ctx, &b, &pkt2, &noopresponse2); CHECK(ret, "lwres_noopresponse_parse"); assert(noopresponse.datalength == noopresponse2->datalength); assert(memcmp(noopresponse.data, noopresponse2->data, noopresponse.datalength) == 0); lwres_noopresponse_free(ctx, &noopresponse2); lwres_context_freemem(ctx, b.base, b.length); b.base = NULL; b.length = 0;}static voidtest_gabn(const char *target, lwres_result_t expected, const char *address, lwres_uint32_t af){ lwres_gabnresponse_t *res; unsigned char addrbuf[16]; lwres_addr_t *addr; char outbuf[64]; unsigned int len; lwres_result_t ret; res = NULL; ret = lwres_getaddrsbyname(ctx, target, LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6, &res); if (ret != expected) { printf("I:gabn(%s) failed: %d\n", target, ret); if (res != NULL) lwres_gabnresponse_free(ctx, &res); fails++; return; } if (ret == LWRES_R_SUCCESS) { if (af == LWRES_ADDRTYPE_V4) { len = 4; ret = inet_pton(AF_INET, address, addrbuf); assert(ret == 1); } else { len = 16; ret = inet_pton(AF_INET6, address, addrbuf); assert(ret == 1); } addr = LWRES_LIST_HEAD(res->addrs); if (addr == NULL) { printf("I:gabn(%s) returned empty list\n", target); fails++; return; } while (addr != NULL) { if (addr->family != af || addr->length != len || memcmp(addr->address, addrbuf, len) == 0) break; addr = LWRES_LIST_NEXT(addr, link); } if (addr == NULL) { addr = LWRES_LIST_HEAD(res->addrs); if (addr->family == LWRES_ADDRTYPE_V4) (void)inet_ntop(AF_INET, addr->address, outbuf, sizeof(outbuf)); else (void)inet_ntop(AF_INET6, addr->address, outbuf, sizeof(outbuf)); printf("I:gabn(%s) returned %s, expected %s\n", target, outbuf, address); fails++; return; } } if (res != NULL) lwres_gabnresponse_free(ctx, &res);}static voidtest_gnba(const char *target, lwres_uint32_t af, lwres_result_t expected, const char *name){ lwres_gnbaresponse_t *res; lwres_result_t ret; unsigned char addrbuf[16]; unsigned int len; if (af == LWRES_ADDRTYPE_V4) { len = 4; ret = inet_pton(AF_INET, target, addrbuf); assert(ret == 1); } else { len = 16; ret = inet_pton(AF_INET6, target, addrbuf); assert(ret == 1); } res = NULL; ret = lwres_getnamebyaddr(ctx, af, len, addrbuf, &res); if (ret != expected) { printf("I:gnba(%s) failed: %d\n", target, ret); if (res != NULL) lwres_gnbaresponse_free(ctx, &res); fails++; return; } if (ret == LWRES_R_SUCCESS && strcasecmp(res->realname, name) != 0) { printf("I:gnba(%s) returned %s, expected %s\n", target, res->realname, name); fails++; return; } if (res != NULL) lwres_gnbaresponse_free(ctx, &res);}static voidtest_gethostbyname(const char *name, const char *address) { struct hostent *hp; unsigned char addrbuf[16]; int ret; hp = gethostbyname(name); if (hp == NULL) { if (address == NULL && h_errno == HOST_NOT_FOUND) return; else if (h_errno != HOST_NOT_FOUND) { printf("I:gethostbyname(%s) failed: %s\n", name, hstrerror(h_errno)); fails++; return; } else { printf("I:gethostbyname(%s) returned not found\n", name); fails++; return; } } else { ret = inet_pton(AF_INET, address, addrbuf); assert(ret == 1); if (memcmp(hp->h_addr_list[0], addrbuf, hp->h_length) != 0) { char outbuf[16]; (void)inet_ntop(AF_INET, hp->h_addr_list[0], outbuf, sizeof(outbuf)); printf("I:gethostbyname(%s) returned %s, " "expected %s\n", name, outbuf, address); fails++; return; } }}static voidtest_gethostbyname2(const char *name, const char *address, int af) { struct hostent *hp; unsigned char addrbuf[16]; int len, ret; hp = gethostbyname2(name, af); if (hp == NULL) { if (address == NULL && h_errno == HOST_NOT_FOUND) return; else if (h_errno != HOST_NOT_FOUND) { printf("I:gethostbyname(%s) failed: %s\n", name, hstrerror(h_errno)); fails++; return; } else { printf("I:gethostbyname(%s) returned not found\n", name); fails++; return; } } else { if (af == AF_INET) len = 4; else len = 16; ret = inet_pton(af, address, addrbuf); assert(ret == 1); if (hp->h_addrtype != af) { printf("I:gethostbyname(%s) returned wrong family\n", name); fails++; return; } if (len != (int)hp->h_length || memcmp(hp->h_addr_list[0], addrbuf, hp->h_length) != 0) { char outbuf[16]; (void)inet_ntop(af, hp->h_addr_list[0], outbuf, sizeof(outbuf)); printf("I:gethostbyname(%s) returned %s, " "expected %s\n", name, outbuf, address); fails++; return; } }}static voidtest_getipnodebyname(const char *name, const char *address, int af, int v4map, int all){ struct hostent *hp; unsigned char addrbuf[16]; int len, ret; int error_num; int flags = 0; if (v4map) flags |= AI_V4MAPPED; if (all) flags |= AI_ALL; hp = getipnodebyname(name, af, flags, &error_num); if (hp == NULL) { if (address == NULL && error_num == HOST_NOT_FOUND) return; else if (error_num != HOST_NOT_FOUND) { printf("I:getipnodebyname(%s) failed: %d\n", name, error_num); fails++; return; } else { printf("I:getipnodebyname(%s) returned not found\n", name); fails++; return; } } else { if (af == AF_INET) len = 4; else len = 16; ret = inet_pton(af, address, addrbuf); assert(ret == 1); if (hp->h_addrtype != af) { printf("I:getipnodebyname(%s) returned wrong family\n", name); fails++; return; } if (len != (int)hp->h_length || memcmp(hp->h_addr_list[0], addrbuf, hp->h_length) != 0) { char outbuf[16]; (void)inet_ntop(af, hp->h_addr_list[0], outbuf, sizeof(outbuf)); printf("I:getipnodebyname(%s) returned %s, " "expected %s\n", name, outbuf, address); fails++; return; } freehostent(hp); }}static voidtest_gethostbyaddr(const char *address, int af, const char *name) { struct hostent *hp; char addrbuf[16]; int len, ret; if (af == AF_INET) len = 4; else len = 16; ret = inet_pton(af, address, addrbuf); assert(ret == 1); hp = gethostbyaddr(addrbuf, len, af); if (hp == NULL) {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -