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

📄 test_sresolv.c

📁 Sofia SIP is an open-source SIP User-Agent library, compliant with the IETF RFC3261 specification.
💻 C
📖 第 1 页 / 共 4 页
字号:
  char const *domain = "1.0.0.127.in-addr.arpa";  BEGIN();  TEST_1(sres_query(res, test_answer, ctx, sres_type_ptr, domain));  TEST_RUN(ctx);  result = ctx->result;  TEST_1(result != NULL);  TEST_1(result[0] != NULL);  rr = result[0]->sr_ptr;  TEST_1(rr != NULL);  TEST(rr->ptr_record->r_class, sres_class_in);  TEST(rr->ptr_record->r_type, sres_type_ptr);  TEST_S(rr->ptr_domain, "localhost.");  END();}int test_ptr_ipv4_sockaddr(sres_context_t *ctx){  sres_resolver_t *res = ctx->resolver;  sres_record_t **result;  sres_query_t *query;  const sres_ptr_record_t *rr;  struct sockaddr_in sin = {0};    su_inet_pton(AF_INET, "127.0.0.1", &sin.sin_addr);  sin.sin_family = AF_INET;  BEGIN();  query = sres_query_sockaddr(res, test_answer, ctx,				   sres_qtype_any, (struct sockaddr*)&sin);  TEST_1(query != NULL);  TEST_RUN(ctx);  result = ctx->result;    TEST_1(result != NULL);  TEST_1(result[0] != NULL);  rr = result[0]->sr_ptr;  TEST_1(rr != NULL);  TEST(rr->ptr_record->r_type, sres_type_ptr);  TEST(rr->ptr_record->r_class, sres_class_in);  TEST_S(rr->ptr_domain, "localhost.");  END();}#if HAVE_SIN6int test_ptr_ipv6(sres_context_t *ctx){  sres_resolver_t *res = ctx->resolver;  sres_record_t **result;  const sres_ptr_record_t *rr;  char const *domain =     "c.a.7.e.d.7.e.f.f.f.0.2.8.0.a.0.0.0.0.c.2.1.0.3.0.0.2.1.e.f.f.3.ip6.int";  BEGIN();  TEST_1(sres_query(res, test_answer, ctx, sres_type_ptr, domain));  TEST_RUN(ctx);  result = ctx->result;    TEST_1(result != NULL);  TEST_1(result[0] != NULL);  rr = result[0]->sr_ptr;  TEST_1(rr != NULL);  TEST(rr->ptr_record->r_type, sres_type_ptr);  TEST(rr->ptr_record->r_class, sres_class_in);  TEST_S(rr->ptr_domain, "sip01.example.com.");  END();}int test_ptr_ipv6_sockaddr(sres_context_t *ctx){  sres_resolver_t *res = ctx->resolver;  sres_record_t **result;  const sres_ptr_record_t *rr;  struct sockaddr_in6 sin6 = {0};  BEGIN();  su_inet_pton(AF_INET6, "3ffe:1200:3012:c000:0a08:20ff:fe7d:e7ac", 	       &sin6.sin6_addr);  sin6.sin6_family = AF_INET6;  ctx->query =     sres_query_sockaddr(res, test_answer, ctx,			     sres_type_ptr, (struct sockaddr*)&sin6);  TEST_1(ctx->query != NULL);  TEST_RUN(ctx);  result = ctx->result;    TEST_1(result != NULL);  TEST_1(result[0] != NULL);  rr = result[0]->sr_ptr;  TEST_1(rr != NULL);  TEST(rr->ptr_record->r_type, sres_type_ptr);  TEST(rr->ptr_record->r_class, sres_class_in);  TEST_S(rr->ptr_domain, "sip01.example.com.");  END();}#endif /* HAVE_SIN6 *//* Test sres_cached_answers(), sres_sort_answers(), sres_free_answers() */int test_cache(sres_context_t *ctx){  sres_resolver_t *res = ctx->resolver;  int ok = 0;  sres_record_t *sort_array[3];  sres_record_t **result;  sres_query_t *query;  const sres_record_t *rr = NULL;  const sres_a6_record_t *rr_a6;  const sres_aaaa_record_t *rr_aaaa;  const sres_cname_record_t *rr_cname;  const sres_ptr_record_t *rr_ptr;#if HAVE_SIN6  struct sockaddr_in6 sin6 = {0};#endif  char const *domain;  char buf[50] = {0};  int i, j;  BEGIN();  sres_query(res, test_answer_multi, ctx,		  sres_qtype_any, "example.com");  sres_query(res, test_answer_multi, ctx,		  sres_qtype_any, "_sips._tcp.example.com");  sres_query(res, test_answer_multi, ctx, 		  sres_qtype_any, "sip.example.com");  sres_query(res, test_answer_multi, ctx,		  sres_qtype_any, "subnet.example.com");#if HAVE_SIN6  sres_query(res, test_answer_multi, ctx,	     sres_type_aaaa, "mgw02.example.com");  su_inet_pton(AF_INET6,	       "3ffe:1200:3012:c000:0a08:20ff:fe7d:e7ac",	       &sin6.sin6_addr);  sin6.sin6_family = AF_INET6;  query = sres_query_sockaddr(res, test_answer_multi, ctx,			      sres_qtype_any, (struct sockaddr *)&sin6);  TEST_1(query != NULL);#endif  TEST_RUN(ctx);  /* For a chance, a fully qualified domain name with final "." */  domain = "example.com.";    result = sres_cached_answers(res, 			       sres_qtype_any,			       domain);    TEST_1(result != NULL);  for (i = 0; result[i] != NULL; i++) {    rr = result[i];    if (rr->sr_record->r_type == sres_type_naptr) {      const sres_naptr_record_t *rr_naptr = rr->sr_naptr;      switch(rr_naptr->na_order) {      case 20:        TEST(rr_naptr->na_record->r_type, sres_type_naptr);        TEST(rr_naptr->na_record->r_class, sres_class_in);        TEST(rr_naptr->na_record->r_ttl, 60);        TEST(rr_naptr->na_order, 20);        TEST(rr_naptr->na_prefer, 50);        TEST_S(rr_naptr->na_flags, "s");        TEST_S(rr_naptr->na_services, "SIPS+D2T");        TEST_S(rr_naptr->na_regexp, "");        TEST_S(rr_naptr->na_replace, "_sips._tcp.example.com.");        ok |= 1;        break;      case 40:        TEST(rr_naptr->na_record->r_type, sres_type_naptr);        TEST(rr_naptr->na_record->r_class, sres_class_in);        TEST(rr_naptr->na_record->r_ttl, 60);        TEST(rr_naptr->na_order, 40);        TEST(rr_naptr->na_prefer, 15);        TEST_S(rr_naptr->na_flags, "s");        TEST_S(rr_naptr->na_services, "SIP+D2U");        TEST_S(rr_naptr->na_regexp, "");        TEST_S(rr_naptr->na_replace, "_sip._udp.example.com.");        ok |= 2;        break;      case 50:        TEST(rr_naptr->na_record->r_type, sres_type_naptr);        TEST(rr_naptr->na_record->r_class, sres_class_in);        TEST(rr_naptr->na_record->r_ttl, 60);        TEST(rr_naptr->na_order, 50);        TEST(rr_naptr->na_prefer, 15);        TEST_S(rr_naptr->na_flags, "u");        TEST_S(rr_naptr->na_services, "TEST+D2U");        TEST_S(rr_naptr->na_regexp, 	       "/(tst:([^@]+@))?example.com$/\\1operator.com/i");        TEST_S(rr_naptr->na_replace, ".");        break;      case 80:        TEST(rr_naptr->na_record->r_type, sres_type_naptr);        TEST(rr_naptr->na_record->r_class, sres_class_in);        TEST(rr_naptr->na_record->r_ttl, 60);        TEST(rr_naptr->na_order, 80);        TEST(rr_naptr->na_prefer, 25);        TEST_S(rr_naptr->na_flags, "s");        TEST_S(rr_naptr->na_services, "SIP+D2T");        TEST_S(rr_naptr->na_regexp, "");        TEST_S(rr_naptr->na_replace, "_sip._tcp.example.com.");        ok |= 4;        break;      default:        TEST_1(0);      }    }  }    TEST(ok, 7);  /* Reverse order before sorting */  for (j = 0; j < --i; j++) {    sres_record_t *swap = result[j];    result[j] = result[i];    result[i] = swap;  }  /* Test sorting */  sres_sort_answers(res, result);  /* Sort all records with themselves */  for (i = 0; result[i]; i++) {    sort_array[0] = result[i], sort_array[1] = result[i], sort_array[2] = NULL;    sres_sort_answers(res, sort_array);  }    /* Test free */   for (i = 0; result[i]; i++) {    sres_free_answer(res, result[i]);    result[i] = NULL;  }  /* Test sres_free_answers() */  sres_free_answers(res, result);  result = sres_cached_answers(res, 			       sres_qtype_any,			       "_sips._tcp.example.com");    TEST_1(result != NULL);  ok = 0;  for (i = 0; result[i] != NULL; i++) {    sres_srv_record_t *rr_srv = result[i]->sr_srv;    TEST(rr_srv->srv_record->r_type, sres_type_srv);    switch(rr_srv->srv_priority) {    case 3:      TEST(rr_srv->srv_record->r_type, sres_type_srv);      TEST(rr_srv->srv_record->r_class, sres_class_in);      TEST(rr_srv->srv_record->r_ttl, 60);      TEST(rr_srv->srv_weight, 100);      TEST(rr_srv->srv_port, 5061);      TEST_S(rr_srv->srv_target, "sip00.example.com.");      ok |= 1;      break;    case 4:      TEST(rr_srv->srv_record->r_type, sres_type_srv);      TEST(rr_srv->srv_record->r_class, sres_class_in);      TEST(rr_srv->srv_record->r_ttl, 60);      TEST(rr_srv->srv_weight, 50);      TEST(rr_srv->srv_port, 5050);      TEST_S(rr_srv->srv_target, "sip02.example.com.");      ok |= 2;      break;    case 5:      TEST(rr_srv->srv_record->r_type, sres_type_srv);      TEST(rr_srv->srv_record->r_class, sres_class_in);      TEST(rr_srv->srv_record->r_ttl, 60);      TEST(rr_srv->srv_weight, 10);      TEST(rr_srv->srv_port, 5060);      TEST_S(rr_srv->srv_target, "sip01.example.com.");      ok |= 4;      break;    default:      TEST_1(0);    }  }  TEST(ok, 7);  /* Reverse order before sorting */  for (j = 0; j < --i; j++) {    sres_record_t *swap = result[j];    result[j] = result[i];    result[i] = swap;  }  sres_sort_answers(res, result);  sres_free_answers(res, result);  domain = "sip.example.com";  result = sres_cached_answers(res, 			       sres_qtype_any,			       domain);  TEST_1(result != NULL);  TEST_1(result[0] != NULL);  rr_cname = result[0]->sr_cname;  TEST(rr_cname->cn_record->r_type, sres_type_cname);  TEST(rr_cname->cn_record->r_class, sres_class_in);  TEST(rr_cname->cn_record->r_ttl, 60);  TEST_S(rr_cname->cn_cname, "sip00.example.com.");  sres_free_answers(res, result);#if HAVE_SIN6  domain = "subnet.example.com";  result = sres_cached_answers(res, 			       sres_qtype_any,			       domain);  TEST_1(result != NULL);  TEST_1(result[0] != NULL);  rr_a6 = result[0]->sr_a6;  TEST(rr_a6->a6_record->r_type, sres_type_a6);  TEST(rr_a6->a6_record->r_class, sres_class_in);  TEST(rr_a6->a6_record->r_ttl, 60);  TEST(rr_a6->a6_prelen, 0);  TEST_S(su_inet_ntop(AF_INET6, &rr_a6->a6_suffix, buf, sizeof(buf)), "3ff0::");  TEST_P(rr_a6->a6_prename, NULL);  sres_free_answers(res, result);  domain = "mgw02.example.com";  TEST_1(result = sres_cached_answers(res, sres_type_aaaa, domain));  TEST_1(rr_aaaa = result[0]->sr_aaaa);  TEST(rr_aaaa->aaaa_record->r_type, sres_type_aaaa);  TEST(rr_aaaa->aaaa_record->r_class, sres_class_in);  TEST(rr_aaaa->aaaa_record->r_ttl, 60);  TEST_S(su_inet_ntop(AF_INET6, &rr_aaaa->aaaa_addr, buf, sizeof(buf)),	 "3ffe:1200:3012:c000:206:5bff:fe55:462f");  sres_free_answers(res, result);  result = sres_cached_answers_sockaddr(res,                                         sres_type_ptr,                                        (struct sockaddr *)&sin6);    TEST_1(result != NULL);  rr_ptr = result[0]->sr_ptr;  TEST_1(rr_ptr != NULL);  TEST(rr_ptr->ptr_record->r_type, sres_type_ptr);  TEST(rr_ptr->ptr_record->r_class, sres_class_in);  TEST_S(rr_ptr->ptr_domain, "sip01.example.com.");      sres_free_answers(res, result);#endif /* HAVE_SIN6 */  END();}#if HAVE_SIN6int test_query_one_type(sres_context_t *ctx){  sres_resolver_t *res = ctx->resolver;  sres_record_t **result;  const sres_aaaa_record_t *rr_aaaa;  char buf[50] = {0};    BEGIN();  TEST_1(sres_query(res, test_answer, ctx,			 sres_type_aaaa, "mgw02.example.com"));  TEST_RUN(ctx);  TEST_1(result = ctx->result);  TEST_1(result[0] != NULL);  TEST_1(rr_aaaa = result[0]->sr_aaaa);  TEST(rr_aaaa->aaaa_record->r_type, sres_type_aaaa);  TEST(rr_aaaa->aaaa_record->r_class, sres_class_in);  TEST(rr_aaaa->aaaa_record->r_ttl, 60);  TEST_S(su_inet_ntop(AF_INET6, &rr_aaaa->aaaa_addr, buf, sizeof(buf)),	 "3ffe:1200:3012:c000:206:5bff:fe55:462f");  TEST_P(result[1], NULL);  END();}#endif /* HAVE_SIN6*/#ifdef _WIN32#include <fcntl.h>#endifint sink_make(sres_context_t *ctx){  char *tmpdir = getenv("TMPDIR");  char *template;  int fd;  sres_socket_t sink;  struct sockaddr_in sin[1];  socklen_t sinsize = sizeof sin;  FILE *f;    BEGIN();  sink = socket(AF_INET, SOCK_DGRAM, 0); TEST_1(sink != INVALID_SOCKET);  TEST(getsockname(sink, (struct sockaddr *)sin, &sinsize), 0);  sin->sin_addr.s_addr = htonl(INADDR_LOOPBACK);  TEST(bind(sink, (struct sockaddr *)sin, sinsize), 0);  TEST(getsockname(sink, (struct sockaddr *)sin, &sinsize), 0);  ctx->sink = sink;  template = su_sprintf(ctx->home, "%s/test_sresolv.XXXXXX", 			tmpdir ? tmpdir : "/tmp");  TEST_1(template);#ifndef _WIN32    fd = mkstemp(template); TEST_1(fd != -1);#else  fd = open(template, O_WRONLY); TEST_1(fd != -1);#endif    f = fdopen(fd, "w"); TEST_1(f);  fprintf(f, 	  "domain example.com\n"	  "search foo.bar.com\n"	  "port %u\n", 	  ntohs(sin->sin_port));  fclose(f);  ctx->sinkconf = template;  END();}#if 0int recv_sink(su_root_magic_t *rm, su_wait_t *w, sres_context_t *ctx){  union {    char bytes[8192];    unsigned short shorts[4096];  } buffer[1];  su_wait_events(w, ctx->sink);  recv(ctx->sink, buffer->bytes, sizeof buffer, 0);  return 0;}int sink_init(sres_context_t *ctx){  su_wait_t w[1];  BEGIN();  TEST(su_wait_create(w, ctx->sink, SU_WAIT_IN), 0);  ctx->sinkidx = su_root_register(ctx->root, w, recv_sink, ctx, 0);  TEST_1(ctx->sinkidx != 0);  END();}int sink_deinit(sres_context_t *ctx){  BEGIN();  if (ctx->sinkidx)    su_root_deregister(ctx->root, ctx->sinkidx);

⌨️ 快捷键说明

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