⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_sresolv.c

📁 Internet Phone, Chat, Conferencing
💻 C
📖 第 1 页 / 共 4 页
字号:
/* * This file is part of the Sofia-SIP package * * Copyright (C) 2005 Nokia Corporation. * * Contact: Pekka Pessi <pekka.pessi@nokia.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * *//**@internal * * @CFILE test_sresolv.c Test module for sresolv *  * @author Mikko Haataja <ext-Mikko.A.Haataja@nokia.com>, * @author Pekka Pessi <Pekka.Pessi@nokia.com>. * */#include "config.h"#if HAVE_SU_WAIT_Hstruct sres_context_s;#define SU_WAKEUP_ARG_T struct sres_context_s#include <sofia-sip/su_wait.h>#include <sofia-sip/su_time.h>#else#define _XOPEN_SOURCE (500)#include <stdint.h>#include <netinet/in.h>#include <arpa/inet.h>#include <poll.h>#include <errno.h>#endif#define TSTFLAGS tstflags#include <sofia-sip/tstdef.h>#include "sofia-sip/sresolv.h"#include <assert.h>#include <stdlib.h>#include <string.h>#include <stdio.h>#include <pthread.h>#include <unistd.h>#include <sofia-sip/su_alloc.h>#if HAVE_ALARM#include <unistd.h>#include <signal.h>#endifchar const name[] = "test_sresolv";struct sres_context_s{  su_home_t        home[1];  sres_resolver_t *resolver;  sres_query_t    *query;  sres_record_t  **result;  int              socket;  pthread_mutex_t  mutex[1];  int              timeout;  int              sink;  int              sinkidx;  char const      *sinkconf;  #if HAVE_SU_WAIT_H  su_root_t       *root;#else  int              ready;  int              n_sockets;  int             *sockets;  struct pollfd   *pollfds;#endif};static void test_answer(sres_context_t *ctx, sres_query_t *query,			sres_record_t **answer);static void test_answer_multi(sres_context_t *ctx, sres_query_t *query,			      sres_record_t **answer);static int tstflags = 0;#if 0staticint setblocking(int s, int blocking){  unsigned mode = fcntl(s, F_GETFL, 0);  if (mode < 0)     return -1;  if (blocking)     mode &= ~(O_NDELAY | O_NONBLOCK);  else    mode |= O_NDELAY | O_NONBLOCK;  return fcntl(s, F_SETFL, mode);}/** Test few assumptions about sockets */staticint test_socket(sres_context_t *ctx){  int af;  int s1, s2, s3, s4;  struct sockaddr_storage a[1];  struct sockaddr_storage a1[1], a2[1], a3[1], a4[1];  struct sockaddr_in *sin = (void *)a;  struct sockaddr_in *sin1 = (void *)a1, *sin2 = (void *)a2;  struct sockaddr_in *sin3 = (void *)a3, *sin4 = (void *)a4;  struct sockaddr *sa = (void *)a;  struct sockaddr *sa1 = (void *)a1, *sa2 = (void *)a2;  struct sockaddr *sa3 = (void *)a3, *sa4 = (void *)a4;  int alen, a1len, a2len, a3len, a4len;  char buf[16];  BEGIN();  af = AF_INET;  for (;;) {    TEST_1((s1 = socket(af, SOCK_DGRAM, 0)) != -1);    TEST_1((s2 = socket(af, SOCK_DGRAM, 0)) != -1);    TEST_1((s3 = socket(af, SOCK_DGRAM, 0)) != -1);    TEST_1((s4 = socket(af, SOCK_DGRAM, 0)) != -1);    TEST_1(setblocking(s1, 0) == 0);    TEST_1(setblocking(s2, 0) == 0);    TEST_1(setblocking(s3, 0) == 0);    TEST_1(setblocking(s4, 0) == 0);        memset(a, 0, sizeof a);    memset(a1, 0, sizeof a1);    memset(a2, 0, sizeof a2);    memset(a3, 0, sizeof a3);    memset(a4, 0, sizeof a4);#if HAVE_SA_LEN    a1->ss_len = a2->ss_len = a3->ss_len = a4->ss_len = sizeof a1;#endif    a1->ss_family = a2->ss_family = a3->ss_family = a4->ss_family = af;    if (af == AF_INET)      a1len = a2len = a3len = a4len = sizeof (struct sockaddr_in);    else      a1len = a2len = a3len = a4len = sizeof (struct sockaddr_in6);    if (af == AF_INET) {      TEST_1(inet_pton(af, "127.0.0.1", &sin3->sin_addr) > 0);      TEST_1(inet_pton(af, "127.0.0.1", &sin4->sin_addr) > 0);    } else {    }    TEST(bind(s3, (struct sockaddr *)a3, a3len), 0);    TEST(bind(s4, (struct sockaddr *)a4, a4len), 0);        alen = sizeof a;    TEST(getsockname(s3, (struct sockaddr *)a, &alen), 0);    sin3->sin_port = sin->sin_port;     memset(sin->sin_zero, 0, sizeof sin->sin_zero);    TEST(alen, a3len); TEST_M(a, a3, a3len);    alen = sizeof a;    TEST(getsockname(s4, (struct sockaddr *)a, &alen), 0);    sin4->sin_port = sin->sin_port;    memset(sin->sin_zero, 0, sizeof sin->sin_zero);    TEST(alen, a4len); TEST_M(a, a4, a4len);    TEST(connect(s1, sa3, a3len), 0);    TEST(getsockname(s1, (struct sockaddr *)a1, &a1len), 0);    TEST(connect(s2, sa4, a4len), 0);    TEST(getsockname(s2, (struct sockaddr *)a2, &a2len), 0);    TEST(sendto(s1, "foo", 3, 0, sa4, a4len), 3);    TEST(recvfrom(s4, buf, sizeof buf, 0, sa, &alen), 3);    TEST(sendto(s4, "bar", 3, 0, sa, alen), 3);    TEST(recvfrom(s2, buf, sizeof buf, 0, sa, &alen), -1);    TEST(recvfrom(s1, buf, sizeof buf, 0, sa, &alen), 3);    su_close(s1), su_close(s2), su_close(s3), su_close(s4);    break;  }  END();}#endifstatic unsigned offset;#define TEST_RUN(ctx) \  { sres_free_answers(ctx->resolver, ctx->result); ctx->result = NULL;	\    ctx->query = NULL; run(ctx); TEST_1(ctx->query); }#if HAVE_SU_WAIT_H#define BREAK(ctx) (su_root_break(ctx->root))static void run(sres_context_t *ctx){   if (ctx->timeout)    offset += 1 << 7;    su_root_run(ctx->root); }#else#define BREAK(ctx) (ctx->ready = 1)static void run(sres_context_t *ctx){  int i, n, events;  n = ctx->n_sockets;  for (ctx->ready = 0; !ctx->ready; ) {    events = poll(ctx->pollfds, n, ctx->timeout ? 100 : 500);          if (events)       for (i = 0; i < n; i++) {	if (ctx->pollfds[i].revents & POLLERR)	  sres_resolver_error(ctx->resolver, ctx->pollfds[i].fd);	if (ctx->pollfds[i].revents & POLLIN)	  sres_resolver_receive(ctx->resolver, ctx->pollfds[i].fd);      }    if (ctx->timeout) {      ctx->timeout <<= 1;      offset += ctx->timeout;    }            /* No harm is done (except wasted CPU) if timer is called more often */    sres_resolver_timer(ctx->resolver, ctx->socket);   }}#endifint test_soa(sres_context_t *ctx){  sres_resolver_t *res = ctx->resolver;  int s = ctx->socket;  sres_record_t **result;  const sres_soa_record_t *rr_soa;  char const *domain = "example.com";  BEGIN();#if HAVE_SU_WAIT_H  /* Deprecated compatibility function */  TEST_1(sres_query(res, test_answer, ctx, sres_type_soa, domain));#else  TEST_1(sres_query_make(res, test_answer, ctx, s, sres_type_soa, domain));#endif  TEST_RUN(ctx);  TEST_1(sres_query_make(res, test_answer, ctx, s, sres_type_soa, domain));  TEST_RUN(ctx);  TEST_1(result = sres_cached_answers(res, sres_type_soa, domain));    TEST_1(result != NULL);  TEST_1(result[0] != NULL);  rr_soa = result[0]->sr_soa;  TEST(rr_soa->soa_record->r_type, sres_type_soa);  TEST(rr_soa->soa_record->r_class, sres_class_in);  TEST_S(rr_soa->soa_mname, "ns.example.com.");  TEST_S(rr_soa->soa_rname, "root.example.com.");  TEST(rr_soa->soa_serial, 2002042901);  TEST(rr_soa->soa_refresh, 7200);  TEST(rr_soa->soa_retry, 600);  TEST(rr_soa->soa_expire, 36000000);  TEST(rr_soa->soa_minimum, 60);  sres_free_answers(res, result);  END();}int test_naptr(sres_context_t *ctx){  sres_resolver_t *res = ctx->resolver;  int s = ctx->socket;  sres_record_t **result;  const sres_naptr_record_t *rr;  char const *domain = "example.com";  int i;  BEGIN();  TEST_1(sres_query_make(res, test_answer, ctx, s, sres_type_naptr, domain));  TEST_RUN(ctx);  TEST_1(result = ctx->result);  TEST_1(result[0]);  for (i = 0; result[i] != NULL; i++) {    rr = (sres_naptr_record_t *) result[i]->sr_naptr;                                            switch(rr->na_order) {    case 20:      TEST(rr->na_record->r_type, sres_type_naptr);      TEST(rr->na_record->r_class, sres_class_in);      TEST(rr->na_record->r_ttl, 60);      TEST(rr->na_order, 20);      TEST(rr->na_prefer, 50);      TEST_S(rr->na_flags, "s");      TEST_S(rr->na_services, "SIPS+D2T");      TEST_S(rr->na_regexp, "");      TEST_S(rr->na_replace, "_sips._tcp.example.com.");      break;    case 40:      TEST(rr->na_record->r_type, sres_type_naptr);      TEST(rr->na_record->r_class, sres_class_in);      TEST(rr->na_record->r_ttl, 60);      TEST(rr->na_order, 40);      TEST(rr->na_prefer, 15);      TEST_S(rr->na_flags, "s");      TEST_S(rr->na_services, "SIP+D2U");      TEST_S(rr->na_regexp, "");      TEST_S(rr->na_replace, "_sip._udp.example.com.");      break;    case 50:      TEST(rr->na_record->r_type, sres_type_naptr);      TEST(rr->na_record->r_class, sres_class_in);      TEST(rr->na_record->r_ttl, 60);      TEST(rr->na_order, 50);      TEST(rr->na_prefer, 15);      TEST_S(rr->na_flags, "u");      TEST_S(rr->na_services, "TEST+D2U");      TEST_S(rr->na_regexp, "/(tst:([^@]+@))?example.com$/\\1operator.com/i");      TEST_S(rr->na_replace, ".");      break;    case 80:      TEST(rr->na_record->r_type, sres_type_naptr);      TEST(rr->na_record->r_class, sres_class_in);      TEST(rr->na_record->r_ttl, 60);      TEST(rr->na_order, 80);      TEST(rr->na_prefer, 25);      TEST_S(rr->na_flags, "s");      TEST_S(rr->na_services, "SIP+D2T");      TEST_S(rr->na_regexp, "");      TEST_S(rr->na_replace, "_sip._tcp.example.com.");      break;    default:      TEST_1(0);    }  }  sres_free_answers(res, ctx->result), ctx->result = NULL;  END();}char const longname[1026] =   "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.";char name2048[2049] =   "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"  "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"  "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"  "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"  "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"  "gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg"  "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"  "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"  "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"  "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"  "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"  "gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg"  "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"  "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"  "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"  "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"  "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"  "gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg"  "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"  "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"  "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"  "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"  "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"  "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"  "gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg"  "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh";int test_a(sres_context_t *ctx){  sres_resolver_t *res = ctx->resolver;  int s = ctx->socket;  sres_query_t *query;  sres_record_t **result;  const sres_a_record_t *rr_a;  char const *domain = "sip00.example.com";  char name1025[1026] = 		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"		  		  ".";

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -